{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "http://schema.ruter.no/saleresult.json",
    "type": "object",
    "title": "Saleresult MQTT Message",
    "description": "Result of sale made with the RuterSalg application",
    "required": [
        "paymentMethod",
        "mediaType",
        "vendorId",
        "eventTimestamp",
        "tickets"
    ],
    "properties": {
        "paymentMethod": {
            "$id": "#/properties/paymentMethod",
            "type": "integer",
            "title": "Payment method for sale"
        },
        "mediaType": {
            "$id": "#/properties/mediaType",
            "type": "integer",
            "title": "Media type for sale"
        },
        "vendorId": {
            "$id": "#/properties/vendorId",
            "type": "string",
            "title": "Vendor ID for sale"
        },
        "eventTimestamp": {
            "$id": "#/properties/eventTimestamp",
            "type": "string",
            "title": "Time of sale"
        },
        "tickets": {
            "$id": "#/properties/tickets",
            "type": "array",
            "title": "Tickets sold in this sale",
            "items": {
                "$id": "#/properties/tickets/items",
                "type": "object",
                "title": "Ticket",
                "required": [
                    "numberOfZonesToPay",
                    "passengers",
                    "price",
                    "startDate",
                    "zoneFrom",
                    "zoneTo",
                    "zoneVia",
                    "externalId",
                    "productTemplateId",
                    "selectedZones"
                ],
                "properties": {
                    "numberOfZonesToPay": {
                        "$id": "#/properties/tickets/items/properties/numberOfZonesToPay",
                        "type": "integer",
                        "title": "Number of zones to be paid for in this ticket"
                    },
                    "passengers": {
                        "$id": "#/properties/tickets/items/properties/passengers",
                        "type": "array",
                        "title": "Passengers in this Ticket",
                        "items": {
                            "$id": "#/properties/tickets/items/properties/passengers/items",
                            "type": "object",
                            "title": "Passenger",
                            "required": [
                                "numberOfPassengers",
                                "productId",
                                "profileId"
                            ],
                            "properties": {
                                "numberOfPassengers": {
                                    "$id": "#/properties/tickets/items/properties/passengers/items/properties/numberOfPassengers",
                                    "type": "integer",
                                    "title": "The quantity of this Passenger type"
                                },
                                "productId": {
                                    "$id": "#/properties/tickets/items/properties/passengers/items/properties/productId",
                                    "type": "integer",
                                    "title": "The ID of the product for this Passenger"
                                },
                                "profileId": {
                                    "$id": "#/properties/tickets/items/properties/passengers/items/properties/profileID",
                                    "type": "integer",
                                    "title": "The ID of the profile of this Passenger"
                                }
                            }
                        }
                    },
                    "price": {
                        "$id": "#/properties/tickets/items/properties/price",
                        "type": "integer",
                        "title": "The price of this ticket"
                    },
                    "startDate": {
                        "$id": "#/properties/tickets/items/properties/startDate",
                        "type": "string",
                        "title": "Start date of this ticket"
                    },
                    "zoneFrom": {
                        "$id": "#/properties/tickets/items/properties/zoneFrom",
                        "type": "string",
                        "title": "This tickets From zone"
                    },
                    "zoneTo": {
                        "$id": "#/properties/tickets/items/properties/zoneTo",
                        "type": ["string", "null"],
                        "title": "This tickets To zone"
                    },
                    "zoneVia": {
                        "$id": "#/properties/tickets/items/properties/zoneVia",
                        "title": "This tickets Via zone"
                    },
                    "externalID": {
                        "$id": "#/properties/tickets/items/properties/externalID",
                        "type": "string",
                        "title": "External ID of this Ticket"
                    },
                    "productTemplateID": {
                        "$id": "#/properties/tickets/items/properties/productTemplateID",
                        "type": "integer",
                        "title": "Product Template ID of this Ticket"
                    },
                    "selectedZones": {
                        "$id": "#/properties/tickets/items/properties/selectedZones",
                        "type": ["array", "null"],
                        "title": "Selected zones (for additional tickets only)",
                        "additionalItems": true,
                        "items": {
                            "$id": "#/properties/tickets/items/properties/selectedZones/items",
                            "type": "string",
                            "title": "Name of selected zone"
                        }
                    }
                }
            }
        }
    }
}
