<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">

  <!--
    CustomsHive Canonical Declaration Schema (XSD)
    ================================================
    XML ingestion contract for POST /api/declarations (Content-Type: application/xml)
    and the canonical ServiceBus queue (ContentType message property = "application/xml").

    Element names match C# property names (PascalCase). The ingestion service is
    case-insensitive for both JSON and XML inputs.
    Equivalent JSON schema: declaration.schema.json
  -->

  <xs:element name="CanonicalDeclaration" type="CanonicalDeclarationType"/>

  <!-- ═══════════════════════════════════════════════════════════════ -->
  <!--  Root                                                           -->
  <!-- ═══════════════════════════════════════════════════════════════ -->

  <xs:complexType name="CanonicalDeclarationType">
    <xs:sequence>
      <!-- Required -->
      <xs:element name="DeclarationType" type="DeclarationTypeEnum"/>
      <!-- Optional header fields -->
      <xs:element name="Regime"       type="xs:string"  minOccurs="0"/>
      <xs:element name="Ucr"          type="xs:string"  minOccurs="0"/>
      <xs:element name="ClientCode"   type="xs:string"  minOccurs="0"/>
      <!-- Sections -->
      <xs:element name="Parties"      type="CanonicalPartiesType"         minOccurs="0"/>
      <xs:element name="Shipment"     type="CanonicalShipmentType"        minOccurs="0"/>
      <xs:element name="Transport"    type="CanonicalTransportType"       minOccurs="0"/>
      <xs:element name="CustomsOffices" type="CanonicalOfficesType"       minOccurs="0"/>
      <xs:element name="AuthorisedLocationOfGoods" type="CanonicalLocationOfGoodsType" minOccurs="0"/>
      <xs:element name="LoadingLocation"           type="CanonicalLoadingLocationType"  minOccurs="0"/>
      <xs:element name="Totals"       type="CanonicalTotalsType"          minOccurs="0"/>
      <!-- Lists -->
      <xs:element name="Documents"    minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Document" type="CanonicalDocumentType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Authorisations" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Authorisation" type="CanonicalAuthorisationType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Guarantees" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Guarantee" type="CanonicalGuaranteeType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="HouseConsignments" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="HouseConsignment" type="CanonicalHouseConsignmentType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="GoodsItems" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="GoodsItem" type="CanonicalGoodsItemType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <!-- ═══════════════════════════════════════════════════════════════ -->
  <!--  Enum                                                           -->
  <!-- ═══════════════════════════════════════════════════════════════ -->

  <xs:simpleType name="DeclarationTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="IM"/>
      <xs:enumeration value="EX"/>
      <xs:enumeration value="T1"/>
      <xs:enumeration value="T2"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- ═══════════════════════════════════════════════════════════════ -->
  <!--  Parties                                                        -->
  <!-- ═══════════════════════════════════════════════════════════════ -->

  <xs:complexType name="CanonicalPartiesType">
    <xs:sequence>
      <xs:element name="Declarant"        type="CanonicalPartyType" minOccurs="0"/>
      <xs:element name="Representative"   type="CanonicalPartyType" minOccurs="0"/>
      <xs:element name="Exporter"         type="CanonicalPartyType" minOccurs="0"/>
      <xs:element name="Importer"         type="CanonicalPartyType" minOccurs="0"/>
      <!-- Top-level consignee for simple declarations; per-HC consignees go in HouseConsignment -->
      <xs:element name="Consignee"        type="CanonicalPartyType" minOccurs="0"/>
      <!-- T1/T2: typically the forwarder -->
      <xs:element name="Consignor"        type="CanonicalPartyType" minOccurs="0"/>
      <!-- T1/T2: holder of transit procedure; often same as Consignor -->
      <xs:element name="TransitPrincipal" type="CanonicalPartyType" minOccurs="0"/>
      <xs:element name="Buyer"            type="CanonicalPartyType" minOccurs="0"/>
      <xs:element name="Seller"           type="CanonicalPartyType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="CanonicalPartyType">
    <xs:sequence>
      <xs:element name="Eori"            type="xs:string" minOccurs="0"/>
      <xs:element name="VatNumber"       type="xs:string" minOccurs="0"/>
      <xs:element name="Name"            type="xs:string" minOccurs="0"/>
      <xs:element name="StreetAndNumber" type="xs:string" minOccurs="0"/>
      <xs:element name="Postcode"        type="xs:string" minOccurs="0"/>
      <xs:element name="City"            type="xs:string" minOccurs="0"/>
      <!-- ISO 3166-1 alpha-2 country code -->
      <xs:element name="Country"         type="xs:string" minOccurs="0"/>
      <xs:element name="ContactName"     type="xs:string" minOccurs="0"/>
      <xs:element name="ContactPhone"    type="xs:string" minOccurs="0"/>
      <xs:element name="ContactEmail"    type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- ═══════════════════════════════════════════════════════════════ -->
  <!--  Shipment                                                       -->
  <!-- ═══════════════════════════════════════════════════════════════ -->

  <xs:complexType name="CanonicalShipmentType">
    <xs:sequence>
      <xs:element name="InvoiceNumber"      type="xs:string"  minOccurs="0"/>
      <!-- ISO 8601 date, e.g. 2025-03-15 -->
      <xs:element name="InvoiceDate"        type="xs:string"  minOccurs="0"/>
      <!-- ISO 4217 currency code, e.g. EUR -->
      <xs:element name="Currency"           type="xs:string"  minOccurs="0"/>
      <xs:element name="TotalInvoiceAmount" type="xs:decimal" minOccurs="0"/>
      <xs:element name="ExchangeRateToEur"  type="xs:decimal" minOccurs="0"/>
      <!-- Incoterm code, e.g. DAP -->
      <xs:element name="Incoterm"           type="xs:string"  minOccurs="0"/>
      <xs:element name="IncotermLocation"   type="xs:string"  minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- ═══════════════════════════════════════════════════════════════ -->
  <!--  Transport                                                      -->
  <!-- ═══════════════════════════════════════════════════════════════ -->

  <xs:complexType name="CanonicalTransportType">
    <xs:sequence>
      <!-- EU transport mode code at border crossing -->
      <xs:element name="ModeAtBorder"              type="xs:integer" minOccurs="0"/>
      <xs:element name="BorderMeansId"             type="xs:string"  minOccurs="0"/>
      <!-- ISO 3166-1 alpha-2 country of registration -->
      <xs:element name="BorderMeansNationality"    type="xs:string"  minOccurs="0"/>
      <xs:element name="InlandMeansId"             type="xs:string"  minOccurs="0"/>
      <xs:element name="InlandMeansNationality"    type="xs:string"  minOccurs="0"/>
      <!-- Vehicle plate for T2 departure transport means -->
      <xs:element name="DepartureMeansId"          type="xs:string"  minOccurs="0"/>
      <xs:element name="DepartureMeansNationality" type="xs:string"  minOccurs="0"/>
      <xs:element name="DepartureMeansModeCode"    type="xs:integer" minOccurs="0"/>
      <xs:element name="DepartureMeansTypeCode"    type="xs:string"  minOccurs="0"/>
      <!-- Ordered list of ISO 3166-1 alpha-2 transit country codes -->
      <xs:element name="Route" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Country" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <!-- ═══════════════════════════════════════════════════════════════ -->
  <!--  Customs offices                                                -->
  <!-- ═══════════════════════════════════════════════════════════════ -->

  <xs:complexType name="CanonicalOfficesType">
    <xs:sequence>
      <xs:element name="Departure"   type="xs:string" minOccurs="0"/>
      <xs:element name="Export"      type="xs:string" minOccurs="0"/>
      <xs:element name="Exit"        type="xs:string" minOccurs="0"/>
      <xs:element name="Import"      type="xs:string" minOccurs="0"/>
      <xs:element name="Destination" type="xs:string" minOccurs="0"/>
      <xs:element name="Transit"     type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- ═══════════════════════════════════════════════════════════════ -->
  <!--  Location of goods / Loading location                           -->
  <!-- ═══════════════════════════════════════════════════════════════ -->

  <xs:complexType name="CanonicalLocationOfGoodsType">
    <xs:sequence>
      <xs:element name="TypeOfLocation"            type="xs:string" minOccurs="0"/>
      <xs:element name="QualifierOfIdentification" type="xs:string" minOccurs="0"/>
      <xs:element name="UnLocode"                  type="xs:string" minOccurs="0"/>
      <xs:element name="AuthorisationNumber"       type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="CanonicalLoadingLocationType">
    <xs:sequence>
      <xs:element name="LoadingPlace"               type="xs:string" minOccurs="0"/>
      <xs:element name="LoadingPlaceCode"           type="xs:string" minOccurs="0"/>
      <xs:element name="LoadingPlaceAdditionalCode" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- ═══════════════════════════════════════════════════════════════ -->
  <!--  Totals                                                         -->
  <!-- ═══════════════════════════════════════════════════════════════ -->

  <xs:complexType name="CanonicalTotalsType">
    <xs:sequence>
      <xs:element name="GrossMass"     type="xs:decimal" minOccurs="0"/>
      <xs:element name="NetMass"       type="xs:decimal" minOccurs="0"/>
      <xs:element name="Packages"      type="xs:integer" minOccurs="0"/>
      <xs:element name="InvoiceAmount" type="xs:decimal" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- ═══════════════════════════════════════════════════════════════ -->
  <!--  Document / Authorisation / Guarantee                           -->
  <!-- ═══════════════════════════════════════════════════════════════ -->

  <xs:complexType name="CanonicalDocumentType">
    <xs:sequence>
      <xs:element name="SequenceNumber" type="xs:integer" minOccurs="0"/>
      <xs:element name="Type"           type="xs:string"  minOccurs="0"/>
      <xs:element name="Reference"      type="xs:string"  minOccurs="0"/>
      <xs:element name="Date"           type="xs:string"  minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="CanonicalAuthorisationType">
    <xs:sequence>
      <xs:element name="Type"      type="xs:string" minOccurs="0"/>
      <xs:element name="Reference" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="CanonicalGuaranteeType">
    <xs:sequence>
      <xs:element name="SequenceNumber"  type="xs:integer" minOccurs="1"/>
      <xs:element name="Type"            type="xs:string"  minOccurs="0"/>
      <!-- Guarantee Reference Number -->
      <xs:element name="Grn"             type="xs:string"  minOccurs="0"/>
      <xs:element name="AccessCode"      type="xs:string"  minOccurs="0"/>
      <xs:element name="Amount"          type="xs:decimal" minOccurs="0"/>
      <xs:element name="Currency"        type="xs:string"  minOccurs="0"/>
      <xs:element name="PotCustomsDebt"  type="xs:string"  minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- ═══════════════════════════════════════════════════════════════ -->
  <!--  House consignment (T2 groupage)                                -->
  <!-- ═══════════════════════════════════════════════════════════════ -->

  <xs:complexType name="CanonicalHouseConsignmentType">
    <!--
      Sequence numbers are Navision/Qargo internal IDs — not sequential from 1.
      The generator preserves them as-is in the CC015C XML.
    -->
    <xs:sequence>
      <xs:element name="SequenceNumber"    type="xs:integer" minOccurs="1"/>
      <xs:element name="GrossMass"         type="xs:decimal" minOccurs="0"/>
      <xs:element name="ReferenceNumberUcr" type="xs:string" minOccurs="0"/>
      <xs:element name="Consignee"         type="CanonicalPartyType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- ═══════════════════════════════════════════════════════════════ -->
  <!--  Goods item                                                      -->
  <!-- ═══════════════════════════════════════════════════════════════ -->

  <xs:complexType name="CanonicalGoodsItemType">
    <xs:sequence>
      <xs:element name="SequenceNumber"              type="xs:integer" minOccurs="1"/>
      <xs:element name="DeclarationGoodsItemNumber"  type="xs:integer" minOccurs="0"/>
      <xs:element name="Description"                 type="xs:string"  minOccurs="0"/>
      <!-- Combined nomenclature code (8 or 10 digits) -->
      <xs:element name="CommodityCode"               type="xs:string"  minOccurs="0"/>
      <!-- ISO 3166-1 alpha-2 -->
      <xs:element name="CountryOfOrigin"             type="xs:string"  minOccurs="0"/>
      <xs:element name="GrossMass"                   type="xs:decimal" minOccurs="0"/>
      <xs:element name="NetMass"                     type="xs:decimal" minOccurs="0"/>
      <xs:element name="StatisticalValue"            type="xs:decimal" minOccurs="0"/>
      <!-- Links to HouseConsignment.SequenceNumber; absent for simple (non-groupage) declarations -->
      <xs:element name="HouseConsignmentSequence"    type="xs:integer" minOccurs="0"/>
      <xs:element name="Packages" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Package" type="CanonicalPackageType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="AdditionalReferences" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Document" type="CanonicalDocumentType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="PreviousDocuments" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Document" type="CanonicalDocumentType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="SupportingDocuments" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Document" type="CanonicalDocumentType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="UnitPrice"             type="xs:decimal" minOccurs="0"/>
      <xs:element name="TotalPrice"            type="xs:decimal" minOccurs="0"/>
      <xs:element name="ExtraCost"             type="xs:decimal" minOccurs="0"/>
      <xs:element name="SupplementaryUnit"     type="xs:string"  minOccurs="0"/>
      <xs:element name="SupplementaryQuantity" type="xs:decimal" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- ═══════════════════════════════════════════════════════════════ -->
  <!--  Package                                                        -->
  <!-- ═══════════════════════════════════════════════════════════════ -->

  <xs:complexType name="CanonicalPackageType">
    <xs:sequence>
      <!-- Package type code, e.g. CT, BX, PK -->
      <xs:element name="Type"          type="xs:string"  minOccurs="0"/>
      <xs:element name="Quantity"      type="xs:integer" minOccurs="0"/>
      <xs:element name="ShippingMarks" type="xs:string"  minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
