﻿<?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"/>
      <!-- Transit only (T1/T2): file this declaration automatically, without declarant review.
           Sending it on any other declaration type is an error, not a no-op. -->
      <xs:element name="AutoDispatch" type="xs:boolean" minOccurs="0"/>
      <!-- Safety and security: 0 none, 1 ENS+EXS, 2 ENS, 3 EXS. Export and transit. -->
      <xs:element name="SecurityCode" type="xs:int" minOccurs="0"/>
      <!-- Transit only; absent means 0. -->
      <xs:element name="BindingItinerary" type="xs:boolean" minOccurs="0"/>
      <!-- Transit only: yyyy-MM-dd, the limit for presenting the goods at destination.
           Absent means eight days out, which is what Navision itself sends. -->
      <xs:element name="LimitDate" 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 -->
      <!-- Header-level coded costs (e.g. AK air/insurance, CA transport) to apportion over items -->
      <xs:element name="Costs" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Cost" type="CanonicalCostType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <!-- Documents for the declaration as a whole, in lists named for the element each becomes.
           The names are the official ones: SupportingDocument, AdditionalReference and
           TransportDocument are what the AES and NCTS schemas call these. -->
      <xs:element name="SupportingDocuments" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="SupportingDocument" type="CanonicalDocumentType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="AdditionalReferences" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="AdditionalReference" type="CanonicalDocumentType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="TransportDocuments" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="TransportDocument" 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>
      <!-- Source documents embedded in the message (e.g. the pro-forma invoice PDF) -->
      <xs:element name="Attachments" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Attachment" type="CanonicalAttachmentType" 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"/>
      <!-- ISO 3166-1 alpha-2 country of the incoterm place -->
      <xs:element name="IncotermCountry"    type="xs:string"  minOccurs="0"/>
      <xs:element name="CountryOfDispatch"    type="xs:string" minOccurs="0"/>
      <xs:element name="CountryOfDestination" type="xs:string" minOccurs="0"/>
      <!-- Nature of transaction code (UCC DE 8/5), e.g. 11 = outright sale -->
      <xs:element name="NatureOfTransaction" type="xs:integer" minOccurs="0"/>
      <!-- Transport charges method of payment (UCC DE 4/2), e.g. H -->
      <xs:element name="TransportChargesMethodOfPayment" type="xs:string" minOccurs="0"/>
      <!-- Region within the country of dispatch (BE: 1/2/3, FR: department). Filed as
           originRegionCode on every export goods item. -->
      <xs:element name="RegionOfDispatch" 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"/>
      <!-- National goods-location code (e.g. Belgian BECUIZG000015) -->
      <xs:element name="LocationCode"              type="xs:string" minOccurs="0"/>
      <xs:element name="AuthorisationNumber"       type="xs:string" minOccurs="0"/>
      <!-- Free-address form: senders that only know a street address fill these;
           the declarant completes the coded identification in the review UI -->
      <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"/>
      <xs:element name="Country"                   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"/>
      <!-- Optional category: SD supporting, TD transport/previous, AU authorisation, RD additional reference -->
      <xs:element name="Category"       type="xs:string"  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="CanonicalAttachmentType">
    <xs:sequence>
      <xs:element name="FileName"    type="xs:string" minOccurs="0"/>
      <!-- MIME type, e.g. application/pdf -->
      <xs:element name="ContentType" type="xs:string" minOccurs="0"/>
      <!-- invoice (default) | packing_list | other -->
      <xs:element name="Kind"        type="xs:string" minOccurs="0"/>
      <!-- Base64-encoded file content -->
      <xs:element name="Data"        type="xs:base64Binary" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="CanonicalCostType">
    <xs:sequence>
      <!-- Cost code, e.g. AK, CA, FA -->
      <xs:element name="Code"     type="xs:string"  minOccurs="0"/>
      <xs:element name="Amount"   type="xs:decimal" minOccurs="0"/>
      <xs:element name="Currency" 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"/>
      <!-- Preferential origin claim (communityPreference 400 vs 100) -->
      <xs:element name="Preferential"                type="xs:boolean" minOccurs="0"/>
      <!-- Commercial invoice covering this item, when it differs per line -->
      <xs:element name="InvoiceNumber"               type="xs:string"  minOccurs="0"/>
      <!-- UCC DE 1/10 procedure codes, e.g. requested 40, previous 00 -->
      <xs:element name="RequestedProcedure"          type="xs:string"  minOccurs="0"/>
      <xs:element name="PreviousProcedure"           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="Containers" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Container" type="CanonicalContainerType" 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"/>
      <!-- Currency for this line, when it differs from the shipment's. Absent = the shipment's. -->
      <xs:element name="Currency"              type="xs:string"  minOccurs="0"/>
      <!-- UN dangerous-goods numbers (CL101). Export and transit only: IDMS has no such element. -->
      <xs:element name="UndgNumbers" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="UndgNumber" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </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:complexType name="CanonicalContainerType">
    <xs:sequence>
      <xs:element name="ContainerNumber" type="xs:string" minOccurs="0"/>
      <xs:element name="Seals" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Seal" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
