{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "definitions": {
    "Place": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "title": "Nombre del lugar."
        },
        "iata": {
          "type": "string",
          "title": "Código IATA del lugar.",
          "minLength": 3,
          "maxLength": 3
        },
        "Country": {
          "type": "object",
          "title": "País al cual pertenece el lugar.",
          "properties": {
            "name": {
              "type": "string",
              "title": "Nombre del país."
            },
            "iata": {
              "type": [
                "string",
                "null"
              ],
              "minLength": 2,
              "maxLength": 2,
              "title": "Código IATA del país."
            },
            "Region": {
              "type": "string",
              "title": "Región al cual pertenece el país."
            }
          },
          "required": [
            "iata",
            "name"
          ]
        }
      },
      "required": [
        "name",
        "Country",
        "iata"
      ]
    }
  },
  "title": "Estructura de Package para ser guardado en TravelPAQ.",
  "properties": {
    "id": {
      "type": "string",
      "title": "Id del paquete."
    },
    "title": {
      "type": "string",
      "title": "Titulo del paquete."
    },
    "observations": {
      "type": "string",
      "title": "Observaciones del paquete."
    },
    "itinerary": {
      "type": "string",
      "title": "Itinerario del paquete."
    },
    "expiration_date": {
      "type": "string",
      "title": "Fecha de expiración del paquete."
    },
    "Category": {
      "type": "array",
      "title": "Lista de categorías.",
      "items": {
        "type": "object",
        "title": "Objeto categoría.",
        "properties": {
          "name": {
            "type": "string",
            "title": "Nombre de la categoría."
          }
        },
        "required": [
          "name"
        ]
      }
    },
    "Service": {
      "type": "array",
      "title": "Lista de servicios.",
      "description": "Todos los servicios que incluye el paquete en su precio final, se especifican aquí.",
      "items": {
        "type": "object",
        "title": "Objeto servicio.",
        "properties": {
          "ServiceKind": {
            "type": "object",
            "title": "Tipo de servicio.",
            "description": "Representa una agrupación de servicios bajo una misma nomenclatura.",
            "properties": {
              "detail": {
                "type": "string",
                "title": "Nombre de tipo de servicio."
              }
            },
            "required": [
              "detail"
            ]
          },
          "detail": {
            "type": "string",
            "title": "Detalles del servicio.",
            "description": "Descripción del servicio completa."
          }
        },
        "required": [
          "ServiceKind",
          "detail"
        ]
      }
    },
    "Departure": {
      "type": "object",
      "title": "Datos de salida y llegada.",
      "properties": {
        "Route": {
          "type": "array",
          "title": "Ruta.",
          "items": {
            "type": "object",
            "title": "Tramo.",
            "description": "Cada item representa un tramo del viaje.",
            "properties": {
              "direction": {
                "type": "integer",
                "title": "Dirección del viaje."
              },
              "DeparturePlace": {
                "type": "object",
                "title": "Lugar de salida del tramo.",
                "properties": {
                  "Place": {
                    "$ref": "#/definitions/Place"
                  }
                }
              },
              "travel_number": {
                "type": "string",
                "title": "Número de viaje."
              },
              "arrival_time": {
                "type": "string",
                "title": "Hora de llegada al ArrivalPlace."
              },
              "arrival_date": {
                "type": "string",
                "title": "Fecha de llegada al ArrivalPlace."
              },
              "TransportCompany": {
                "type": "object",
                "title": "Empresa de transporte.",
                "properties": {
                  "name": {
                    "type": "string",
                    "title": "Nombre de la empresa de transporte."
                  }
                },
                "required": [
                  "name"
                ]
              },
              "ArrivalPlace": {
                "type": "object",
                "title": "Lugar de llegada del tramo.",
                "properties": {
                  "Place": {
                    "$ref": "#/definitions/Place"
                  }
                }
              },
              "order_number": {
                "type": "integer",
                "title": "Orden del trama.",
                "description": "El orden es numero y ascendente de 1 en adelante. El orden se repite en base a si el tramo es de ida o de vuelta."
              },
              "departure_time": {
                "type": "string",
                "title": "Hora de salida desde el DeparturePlace."
              },
              "departure_date": {
                "type": "string",
                "title": "Fecha de salida desde el DeparturePlace."
              }
            },
            "required": [
              "direction",
              "DeparturePlace",
              "travel_number",
              "arrival_time",
              "TransportCompany",
              "ArrivalPlace",
              "order_number",
              "departure_time",
              "arrival_date",
              "departure_date"
            ]
          }
        },
        "Place": {
          "type": "object",
          "title": "Lugar de salida.",
          "description": "Desde este punto comienza el paquete.",
          "properties": {
            "Place": {
              "$ref": "#/definitions/Place"
            }
          }
        },
        "date": {
          "type": "string",
          "title": "Fecha de salida.",
          "description": "Fecha en la que comienza el paquete."
        },
        "transport_kind": {
          "type": "string",
          "enum": [
            "airline",
            "bus",
            "cruise"
          ],
          "title": "Tipo de transporte.",
          "description": "Puerde ser airline, bus o cruise."
        }
      },
      "required": [
        "Route",
        "Place",
        "date",
        "transport_kind"
      ]
    },
    "Place": {
      "type": "array",
      "title": "Lista de destinos.",
      "description": "Todos los destinos qeu recorre el paquete estan en esta lista.",
      "items": {
        "type": "object",
        "title": "Destino.",
        "description": "Cada item representa uno de los destino que recorre el paquete y en el orden de la lista es el orden de recorrida.",
        "properties": {
          "Place": {
            "$ref": "#/definitions/Place"
          }
        }
      }
    },
    "Accommodation": {
      "type": "array",
      "title": "Información de hospedaje.",
      "description": "Todos los hoteles que se visitan en cada uno de los destinos que recorre el paquete.",
      "items": {
        "type": "object",
        "title": "Alojamiento.",
        "properties": {
          "number_nights": {
            "type": "integer",
            "title": "Cantidad de noches en el hotel."
          },
          "check_in": {
            "type": "string",
            "title": "Fecha de check-in."
          },
          "check_out": {
            "type": "string",
            "title": "Fecha de check out.",
            "description": "Fecha de check-out"
          },
          "type_room": {
            "type": "string",
            "title": "Tipo de habitación."
          },
          "hotel_service": {
            "type": "string",
            "title": "Servicio del hotel."
          },
          "max_num_children": {
            "type": "integer",
            "title": "Servicio del hotel."
          },
          "children_age": {
            "type": "integer",
            "title": "Servicio del hotel."
          },
          "Hotel": {
            "type": "object",
            "title": "Lista de hoteles.",
            "description": "Todos los hoteles en el mismo orden de recorrida de los destinos.",
            "properties": {
              "star_rating": {
                "type": "integer",
                "minimum": 0,
                "maximum": 6,
                "title": "Número de estrellas del hotel."
              },
              "name": {
                "type": "string",
                "title": "Nombre del hotel."
              },
              "Place": {
                "type": "object",
                "title": "Destino al que pertenece el hotel.",
                "properties": {
                  "Place": {
                    "$ref": "#/definitions/Place"
                  }
                }
              }
            },
            "required": [
              "star_rating",
              "name",
              "Place"
            ]
          }
        }
      },
      "required": [
        "check_in",
        "check_out",
        "Hotel",
        "type_room",
        "hotel_service"
      ]
    },
    "Company": {
      "type": [
        "object",
        "null"
      ],
      "title": "Operador del paquete reservado.",
      "properties": {
        "id": {
          "type": "integer",
          "title": "Identificador del operador."
        },
        "n  ame": {
          "type": "string",
          "title": "Nombre del operador."
        },
        "cuit": {
          "type": "string",
          "title": "CUIT del operador."
        }
      },
      "required": [
        "id",
        "name",
        "cuit"
      ]
    },
    "Avail": {
      "type": [
        "object",
        "null"
      ],
      "title": "Disponibilidad del paquete.",
      "properties": {
        "seats": {
          "type": "integer",
          "title": "Cantidad de asientos disponibles."
        },
        "rooms": {
          "type": "integer",
          "title": "Cantidad de habiaciones disponibles."
        }
      },
      "required": [
        "seats",
        "rooms"
      ]
    },
    "Price": {
      "type": "object",
      "title": "Precio del paquete.",
      "description": "Contiene todos los detalles del precio del paquete.",
      "properties": {
        "Adult": {
          "type": "array",
          "title": "Tarifas adulto que contempla el paquete.",
          "description": "Este objeto contiene los detalles del precio total y su division por impuestos.",
          "items": {
            "type": "object",
            "title": "Alojamiento.",
            "properties": {
              "currency": {
                "type": "string",
                "title": "Tipo de moneda de venta del paquete."
              },
              "base": {
                "type": "integer",
                "title": "Base sobre la cual se calcula la tarifa."
              },
              "neto": {
                "type": "integer",
                "title": "Importe neto de la tarifa."
              },
              "tax": {
                "type": "integer",
                "title": "Impuestos que no son fiscales incluidos en la tarifa."
              },
              "vat": {
                "type": "integer",
                "title": "Cargas fiscales de la tarifa."
              },
              "max_number_children": {
                "type": "integer",
                "title": "Cantidad máxima de children que se pueden emparejar con esta tarifa adulto."
              }
            },
            "required": [
              "currency",
              "base",
              "neto",
              "tax",
              "vat",
              "max_number_children"
            ]
          }
        },
        "Children": {
          "type": "array",
          "title": "Tarifas adulto que contempla el paquete.",
          "description": "Este objeto contiene los detalles del precio total y su division por impuestos.",
          "items": {
            "type": "object",
            "title": "Alojamiento.",
            "properties": {
              "currency": {
                "type": "string",
                "title": "Tipo de moneda de venta del paquete para esta tarifa."
              },
              "neto": {
                "type": "integer",
                "title": "Importe neto de la tarifa children."
              },
              "tax": {
                "type": "integer",
                "title": "Impuestos que no son fiscales incluidos en la tarifa children."
              },
              "vat": {
                "type": "integer",
                "title": "Cargas fiscales de la tarifa children."
              },
              "max_num_children": {
                "type": "integer",
                "title": "Cantidad máxima de children que se pueden emparejar con esta tarifa children."
              },
              "age_from": {
                "type": "integer",
                "title": "Edad desde en el rango etario permitido para esta tarifa children."
              },
              "age_to": {
                "type": "integer",
                "title": "Edad hasta en el rango etario permitido para esta tarifa children."
              },
              "type_fare_support": {
                "type": "integer",
                "title": "Tarifa adulto con la cual puede ser combinada esta tarifa children."
              },
              "number_order": {
                "type": "integer",
                "title": "Número de orden de la tarifa para cuando el orden de los children conlleva a variar el precio."
              }
            },
            "required": [
              "currency",
              "neto",
              "tax",
              "vat",
              "max_number_children",
              "age_from",
              "age_to",
              "type_fare_support",
              "number_order"
            ]
          }
        }
      },
      "required": [
        "Adult",
        "Children"
      ]
    }
  },
  "required": [
    "Category",
    "Service",
    "title",
    "Departure",
    "id",
    "Place",
    "Price",
    "Accommodation",
    "Company",
    "Avail"
  ]
}