<xs:schema targetNamespace="http://dtd.riege.com/scope/warehouse"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://dtd.riege.com/scope/warehouse"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wh="http://dtd.riege.com/scope/warehouse"
    xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd"
    elementFormDefault="qualified">

    <xs:annotation>
        <xs:documentation>Messages for communication between freight
            forwarders and cross-docking, handling agent warehouses
        </xs:documentation>
    </xs:annotation>

    <xs:element name="warehouseMessage">
        <xs:annotation>
            <xs:documentation>Message envelope, like Edifact UNB
            </xs:documentation>
        </xs:annotation>

        <xs:complexType>
            <xs:sequence>
                <xs:element name="messageID" type="xs:NMTOKEN">
                    <xs:annotation>
                        <xs:documentation>ID for the complete message, usually a technical
                            identifier
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="messageTimeStamp" type="dateTimeWithTimezone">
                    <xs:annotation>
                        <xs:documentation>
                            Message creation time. It is usually not required to update
                            this time stamp when you restart the message. May not be in the future.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="sender" type="xs:NMTOKEN">
                    <xs:annotation>
                        <xs:documentation>
                            Mutually agreed code of this messages sender
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="recipient" type="xs:NMTOKEN">
                    <xs:annotation>
                        <xs:documentation>
                            Mutually agreed code of the intended recipient
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element ref="warehouseShipment" minOccurs="0" maxOccurs="unbounded" />
                <xs:element name="deleteShipment" type="xs:NMTOKEN" minOccurs="0" maxOccurs="unbounded" />
                <xs:element ref="warehouseReceipt" minOccurs="0" maxOccurs="unbounded" />
                <xs:element ref="warehouseLoad" minOccurs="0" maxOccurs="unbounded" />
                <xs:element ref="screeningReport" minOccurs="0" maxOccurs="unbounded" />
                <xs:element ref="uldBuildOrder" minOccurs="0" maxOccurs="unbounded" />
                <xs:element ref="uldBuildResult" minOccurs="0" maxOccurs="unbounded" />
                <xs:element ref="warehouseReceiptAdvice" minOccurs="0" maxOccurs="unbounded" />
                <xs:element ref="warehouseManifest" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
            <xs:attribute name="schemaVersion" type="xs:decimal" use="required" fixed="6.1" />
        </xs:complexType>

        <xs:unique name="uniShipmentId">
            <xs:annotation>
                <xs:documentation>Same shipment may only be included once
                </xs:documentation>
            </xs:annotation>
            <xs:selector xpath="wh:warehouseShipmentSummary/wh:shipmentID" />
            <xs:field xpath="." />
        </xs:unique>
    </xs:element>

    <xs:element name="warehouseManifest">
        <xs:complexType>
            <xs:annotation>
                <xs:documentation>
                    Advice of a master or super-house manifest for the warehouse
                </xs:documentation>
            </xs:annotation>
            <xs:sequence>
                <xs:element name="shipmentID" type="xs:NMTOKEN">
                    <xs:annotation>
                        <xs:documentation>
                            The identifier of the master or super-house shipment with regard to the interface, may be a technical ID.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="references" type="references" />
                <xs:element name="exportAgent" type="address" />
                <xs:element name="warehouse" type="address" />
                <xs:element name="exportTerminal" type="address" minOccurs="0" />
                <xs:element name="importAgent" type="address" minOccurs="0" />
                <xs:element name="times" type="warehouseManifestTimes" minOccurs="0" />
                <xs:element name="consignments" type="warehouseManifestConsignments" />
                <xs:element name="remarks" type="xs:normalizedString" minOccurs="0" />
                <xs:element name="attachment" type="attachment" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="warehouseReceiptAdvice">
        <xs:complexType>
            <xs:annotation>
                <xs:documentation>
                    Advice of a truck arrival at the warehouse
                </xs:documentation>
            </xs:annotation>
            <xs:sequence>
                <xs:element name="receiptID" type="xs:NMTOKEN">
                    <xs:annotation>
                        <xs:documentation>
                            The identifier of this advice with regard to the interface, may be a technical ID.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="references" type="references" minOccurs="0" />
                <xs:element name="deliveringParty" type="address" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>
                            The party delivering the goods (usually trucking company)
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="deliveringPartyCustomer" type="address">
                    <xs:annotation>
                        <xs:documentation>
                            The party ordering the delivery of the goods (usually the export agent of the contained consignments)
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="warehouse" type="address" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>
                            The party where the goods are to be delivered
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="times" type="warehouseAdviceTimes" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>
                            Time intervals for pickup and delivery.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="totals" type="totals">
                    <xs:annotation>
                        <xs:documentation>
                            Total values of all goods contained in this advice
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="consignments" type="warehouseAdviceConsignments">
                    <xs:annotation>
                        <xs:documentation>
                            Details about the consignments in this advice
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="attachment" type="attachment" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="warehouseShipment">
        <xs:complexType>
            <xs:annotation>
                <xs:documentation>Shipment data, air-freight specific.
                    Include either exportAgent or importAgent
                </xs:documentation>
            </xs:annotation>
            <xs:sequence>
                <xs:element name="shipmentID" type="xs:NMTOKEN">
                    <xs:annotation>
                        <xs:documentation>
                            The identifier of this shipment with regard to the interface, may be
                            a technical ID.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="customs" type="customs" minOccurs="0" />
                <xs:element name="references" type="references" />
                <xs:element name="times" type="shipmentDateTimes" minOccurs="0" />
                <xs:element name="exportAgent" type="address" minOccurs="0" />
                <xs:element name="exportGateway" type="address" minOccurs="0" />
                <xs:element name="exportGatewayHandlingAgent" type="address" minOccurs="0" />
                <xs:element name="exportCarrierHandlingAgent" type="address" minOccurs="0" />
                <xs:element name="importTerminal" type="address" minOccurs="0" />
                <xs:element name="importGatewayHandlingAgent" type="address" minOccurs="0" />
                <xs:element name="importGateway" type="address" minOccurs="0" />
                <xs:element name="importAgent" type="address" minOccurs="0" />
                <xs:element name="shipper" type="address" />
                <xs:element name="consignee" type="address" />
                <xs:element name="customer" type="address" minOccurs="0" />
                <xs:element name="costCenter" type="xs:token" minOccurs="0" />
                <xs:element name="modeOfTransport" type="modeOfTransportType" minOccurs="0" />
                <xs:element name="placeOfReceipt" type="location" minOccurs="0" />
                <xs:element name="portOfDeparture" type="location" minOccurs="0" />
                <xs:element name="portOfDestination" type="location" minOccurs="0" />
                <xs:element name="finalDestination" type="location" minOccurs="0" />
                <xs:element name="totals" type="totals" />
                <xs:element name="packages" type="packages" />
                <xs:element name="natureOfGoods" type="xs:string" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Commodity description, e.g. spare parts
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="handlingInstructions" type="handlingInstructions" minOccurs="0" />
                <xs:element name="securityStatus" type="securityStatus" minOccurs="0" />
                <xs:element name="attachment" type="attachment" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>

        <xs:unique name="uniSHC">
            <xs:annotation>
                <xs:documentation>No duplicate SHCs allowed</xs:documentation>
            </xs:annotation>
            <xs:selector xpath="wh:handlingInstructions/wh:shc" />
            <xs:field xpath="." />
        </xs:unique>

    </xs:element>

    <xs:element name="warehouseReceipt">
        <xs:complexType>
            <xs:annotation>
                <xs:documentation>Documentation of a take-in into the warehouse
                </xs:documentation>
            </xs:annotation>
            <xs:sequence>
                <xs:element name="receiptID" type="xs:NMTOKEN">
                    <xs:annotation>
                        <xs:documentation>
                            The identifier of this receipt with regard to the interface, may be
                            a technical ID.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="receiptTimestamp" type="dateTimeWithTimezone">
                    <xs:annotation>
                        <xs:documentation>May not be in the future</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="references" type="references" />
                <xs:element name="customer" type="address" />
                <xs:element name="deliveringParty" type="address">
                    <xs:annotation>
                        <xs:documentation>This is typically the trucking company / haulier
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="deliveringPartyCustomer" type="address" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>This optional address identifies the party
                            on whose behalf of the deliveringParty is delivering
                            the cargo. Example: Peter (deliveringParty) owns a trucking company
                            and is doing a milk-run for a local forwarding company
                            (deliveringPartyCustomer). For air cargo security purposes
                            we need to keep track of these kinds of constellations.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="source" type="address" />
                <xs:element name="portOfDeparture" type="location" minOccurs="0" />
                <xs:element name="portOfDestination" type="location" minOccurs="0" />
                <xs:element name="totals" type="totals" />
                <xs:element name="natureOfGoods" type="xs:normalizedString" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Commodity description, e.g. spare parts
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="securityStatus" type="securityStatus" minOccurs="0" />
                <xs:element name="remarks" type="xs:normalizedString" minOccurs="0" />
                <xs:element name="attachment" type="attachment" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="warehouseLoad">
        <xs:complexType>
            <xs:annotation>
                <xs:documentation>Documentation of a take-out out of the warehouse
                </xs:documentation>
            </xs:annotation>
            <xs:sequence>
                <xs:element name="loadID" type="xs:NMTOKEN">
                    <xs:annotation>
                        <xs:documentation>
                            The identifier of this take-out with regard to the interface, may be
                            a technical ID.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="loadTimestamp" type="dateTimeWithTimezone" />
                <xs:element name="references" type="references" />
                <xs:element name="customer" type="address" />
                <xs:element name="loadingParty" type="address">
                    <xs:annotation>
                        <xs:documentation>This is typically the trucking company / haulier
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="portOfDeparture" type="location" minOccurs="0" />
                <xs:element name="portOfDestination" type="location" minOccurs="0" />
                <xs:element name="totals" type="totals" />
                <xs:element name="natureOfGoods" type="xs:normalizedString" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Commodity description, e.g. spare parts
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="remarks" type="xs:normalizedString" minOccurs="0" />
                <xs:element name="attachment" type="attachment" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="screeningReport">
        <xs:complexType>
            <xs:annotation>
                <xs:documentation>Result of an air cargo security screening
                </xs:documentation>
            </xs:annotation>
            <xs:sequence>
                <xs:element name="screeningID" type="xs:NMTOKEN">
                    <xs:annotation>
                        <xs:documentation>
                            The identifier of this screening report, may be a technical ID.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="shipmentID" type="xs:NMTOKEN" />
                <xs:element name="references" type="references" minOccurs="0" />
                <xs:element name="screeningTimestamp" type="dateTimeWithTimezone">
                    <xs:annotation>
                        <xs:documentation>May not be in the future</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="issuingParty" type="address" />
                <xs:element name="issuingPlace" type="location" minOccurs="0" />
                <xs:element name="securityStatus" type="securityStatus" minOccurs="0" />
                <xs:element name="remarks" type="xs:normalizedString" minOccurs="0" />
                <xs:element name="attachment" type="attachment" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="uldBuildOrder">
        <xs:complexType>
            <xs:annotation>
                <xs:documentation>Instructions for building ULDs</xs:documentation>
            </xs:annotation>
            <xs:sequence>
                <xs:element name="shipmentID" type="xs:NMTOKEN">
                    <xs:annotation>
                        <xs:documentation>
                            ID of the shipment ULDs should be built for. We do not support multi-master ULDs for now.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="references" type="references" />
                <xs:element name="exportAgent" type="address" />
                <xs:element name="warehouse" type="address" />
                <xs:element name="exportTerminal" type="address" minOccurs="0" />
                <xs:element name="importAgent" type="address" minOccurs="0" />
                <xs:element name="times" type="uldBuildOrderDateTimes" />
                <xs:element name="equipments" type="uldBuildOrderEquipments" />
                <xs:element name="consignments" type="wh:warehouseManifestConsignments" />
                <xs:element name="remarks" type="xs:normalizedString" minOccurs="0" />
            </xs:sequence>
        </xs:complexType>

        <xs:unique name="uniULDBuildOrderShipmentId">
            <xs:annotation>
                <xs:documentation>Same shipment may only be included once
                </xs:documentation>
            </xs:annotation>
            <xs:selector xpath="wh:consignments/wh:consignment/wh:shipmentID" />
            <xs:field xpath="." />
        </xs:unique>

    </xs:element>

    <xs:complexType name="address">
        <xs:annotation>
            <xs:documentation>
                While technically valid, name1-name3 and street1-street3 should be
                used consecutively, i.e. do not use street3 if the street2 element is
                is omitted.
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="addressID" type="addressIdentifier" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="name1" type="xs:string" minOccurs="0" />
            <xs:element name="name2" type="xs:string" minOccurs="0" />
            <xs:element name="name3" type="xs:string" minOccurs="0" />
            <xs:element name="street1" type="xs:string" minOccurs="0" />
            <xs:element name="street2" type="xs:string" minOccurs="0" />
            <xs:element name="street3" type="xs:string" minOccurs="0" />
            <xs:element name="city" minOccurs="0">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="zip" type="xs:string" />
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="state" minOccurs="0">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="code" type="xs:NMTOKEN">
                                <xs:annotation>
                                    <xs:documentation>Use ISO-3166-2 codes, e.g. WA for Washington
                                        State, USA
                                    </xs:documentation>
                                </xs:annotation>
                            </xs:attribute>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="country" minOccurs="0">
                <xs:complexType>
                    <xs:attribute name="code" use="required">
                        <xs:annotation>
                            <xs:documentation>Use ISO-3166-1 alpha 2 code, e.g. AT for
                                Austria
                            </xs:documentation>
                        </xs:annotation>
                        <xs:simpleType>
                            <xs:restriction base="xs:NMTOKEN">
                                <xs:length value="2" />
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="addressIdentifier">
        <xs:simpleContent>
            <xs:extension base="xs:token">
                <xs:attribute name="type" type="addressIdentifierType" use="required" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:simpleType name="addressIdentifierType">
        <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="euCargoDB">
                <xs:annotation>
                    <xs:documentation>
                        EU Cargo DB of Known Consignors, Regulated Agents, ACC3.
                        IDs look like this: DE/RA/11111-22
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="eori">
                <xs:annotation>
                    <xs:documentation>
                        Economic Operators Registration and Identification number.
                        I.e. customs ID used across the European Union, e.g. DE12345670000
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="iataAgent">
                <xs:annotation>
                    <xs:documentation>
                        IATA agent number, e.g. 22-1-7777777-1
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="other">
                <xs:annotation>
                    <xs:documentation>Address number in TMS, WMS, etc.
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="customs">
        <xs:attribute name="sciCode" type="xs:NMTOKEN" use="required" />
    </xs:complexType>

    <xs:complexType name="references">
        <xs:sequence>
            <xs:element name="houseDocumentNumber" type="xs:NMTOKEN" minOccurs="0" />
            <xs:element name="transportDocumentNumber" type="xs:NMTOKEN" minOccurs="0" />
            <xs:element name="reference" type="reference" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="reference">
        <xs:simpleContent>
            <xs:extension base="xs:token">
                <xs:attribute name="qual" use="required" type="xs:token" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="shipmentDateTimes">
        <xs:all>
            <xs:element name="estimatedTimeOfDeparture" type="dateTimeWithTimezone" minOccurs="0" />
            <xs:element name="requestedPickupTime" type="dateTimeWithTimezone" minOccurs="0" />
            <xs:element name="latestAcceptanceTime" type="wh:dateTimeWithTimezone" minOccurs="0" />
            <xs:element name="deadlineGateway" type="dateTimeWithTimezone" minOccurs="0" />
        </xs:all>
    </xs:complexType>

    <xs:complexType name="warehouseAdviceTimes">
        <xs:all>
            <xs:element name="requestedPickup" type="dateTimeInterval" minOccurs="0" />
            <xs:element name="requestedDelivery" type="dateTimeInterval" minOccurs="0" />
        </xs:all>
    </xs:complexType>

    <xs:complexType name="warehouseManifestTimes">
        <xs:all>
            <xs:element name="deadlineGateway" type="dateTimeWithTimezone" minOccurs="0" />
            <xs:element name="latestAcceptanceTime" type="dateTimeWithTimezone" minOccurs="0" />
            <xs:element name="estimatedTimeOfDeparture" type="dateTimeWithTimezone" minOccurs="0" />
        </xs:all>
    </xs:complexType>

    <xs:complexType name="uldBuildOrderDateTimes">
        <xs:all>
            <xs:element name="deadlineGateway" type="dateTimeWithTimezone" minOccurs="0" />
            <xs:element name="estimatedTimeOfDeparture" type="dateTimeWithTimezone" minOccurs="0" />
            <xs:element name="latestAcceptanceTime" type="dateTimeWithTimezone" minOccurs="0" />
        </xs:all>
    </xs:complexType>

    <xs:simpleType name="dateTimeWithTimezone">
        <xs:restriction base="xs:dateTime">
            <xs:pattern value=".*(Z|(\+|-)[0-9][0-9]:[0-9][0-9])" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="dateTimeInterval">
        <xs:sequence>
            <xs:element name="from" type="dateTimeWithTimezone" minOccurs="0" />
            <xs:element name="to" type="dateTimeWithTimezone" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="location">
        <xs:simpleContent>
            <xs:extension base="xs:token">
                <xs:attribute name="countryCode" use="required">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:length value="2" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="unLoCode">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:length value="5" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="iataCode">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:length value="3" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="totals">
        <xs:sequence>
            <xs:element name="amount" type="xs:positiveInteger" />
            <xs:element name="grossWeight" type="weight" />
            <xs:element name="volume" type="volume" minOccurs="0" />
            <xs:element name="chargeableWeight" type="weight" minOccurs="0" />
            <xs:element name="dangerousGoods" type="xs:boolean" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="uldTotals">
        <xs:sequence>
            <xs:element name="grossWeight" type="weight" />
            <xs:element name="volume" type="volume" minOccurs="0" />
            <xs:element name="dangerousGoods" type="xs:boolean" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="volume">
        <xs:simpleContent>
            <xs:extension base="xs:decimal">
                <xs:attribute name="unit" use="required" type="volumeUnit" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:simpleType name="volumeUnit">
        <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="LTR" />
            <xs:enumeration value="CMQ" />
            <xs:enumeration value="DMQ" />
            <xs:enumeration value="FTQ" />
            <xs:enumeration value="INQ" />
            <xs:enumeration value="MTQ" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="dimension">
        <xs:all>
            <xs:element name="length" type="xs:decimal" />
            <xs:element name="width" type="xs:decimal" />
            <xs:element name="height" type="xs:decimal" />
        </xs:all>
        <xs:attribute name="unit" type="lengthUnit" use="required" />
    </xs:complexType>

    <xs:simpleType name="lengthUnit">
        <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="CMT" />
            <xs:enumeration value="DMT" />
            <xs:enumeration value="FOT" />
            <xs:enumeration value="INH" />
            <xs:enumeration value="MTR" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="weight">
        <xs:simpleContent>
            <xs:extension base="xs:decimal">
                <xs:attribute name="unit" type="weightUnit" use="required" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:simpleType name="weightUnit">
        <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="GRM" />
            <xs:enumeration value="LBR" />
            <xs:enumeration value="KGM" />
            <xs:enumeration value="TNE" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="temperatureUnit">
        <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="CEL" />
            <xs:enumeration value="FAH" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="temperatureRange">
        <xs:sequence>
            <xs:element name="minimum" type="xs:decimal" minOccurs="0" />
            <xs:element name="maximum" type="xs:decimal" minOccurs="0" />
        </xs:sequence>
        <xs:attribute name="unit" type="temperatureUnit" />
    </xs:complexType>

    <xs:complexType name="handlingInstructions">
        <xs:choice minOccurs="1" maxOccurs="1">
            <xs:sequence>
                <xs:element name="shc" type="iataHandlingCode" minOccurs="0" maxOccurs="unbounded" />
                <xs:element name="remarks" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:choice>
    </xs:complexType>

    <xs:simpleType name="iataHandlingCode">
        <xs:restriction base="xs:NMTOKEN">
            <xs:pattern value="[A-Z]{3}" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="attachment">
        <xs:sequence>
            <xs:element name="fileName">
                <xs:annotation>
                    <xs:documentation>Physical file name, e.g. "myFile001.txt"
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:pattern value="[^\\\|:/$&gt;&lt;\?\*'\p{C}]{1,255}"></xs:pattern>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="displayName">
                <xs:annotation>
                    <xs:documentation>Logical file name, e.g. "DN 47110815"
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:minLength value="6" />
                        <xs:maxLength value="255" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="documentType" type="xs:NMTOKEN" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Denotes the type of document from a business perspective rather than a
                        technical one.
                        If not mutually agreed otherwise between parties exchanging the
                        documents it is recommended to use
                        UN Edifact 1001 document name codes in format 'unedifact-nnn'.
                        (See https://service.unece.org/trade/untdid/d16a/tred/tred1001.htm for
                        reference).

                        UN Edifact documents known by Scope 21.8ff:
                        49 (Damage certification),
                        105 (Purchase order),
                        173 (Authorisation to plan and ship orders),
                        271 (Packing list),
                        340 (Shipping instructions),
                        380 (Commercial invoice),
                        530 (Insurance certificate),
                        530 (Insurance policy),
                        550 (Insurance declaration sheet (bordereau)),
                        588 (Transport Means Security Report),
                        610 (Forwarding instructions),
                        632 (Goods receipt),
                        700 (Waybill),
                        703 (House waybill),
                        705 (Bill of lading),
                        714 (House bill of lading),
                        737 (Proof of delivery),
                        740 (Air waybill),
                        741 (Master air waybill),
                        861 (Certificate of origin),
                        890 (Dangerous goods declaration),
                        916 (Related document)

                        Additional documentTypes known by Scope:
                        'accountsPayable',
                        'certificate',
                        'customsDocument',
                        'customsAssessment',
                        'image',
                        'scopeDocument' (Document type to be used for outgoing document messages only.
                        Indicates that the document was created by Scope.)
                        'uploadedDocument' (Document type to be used for outgoing document
                        messages only. Indicates that the document was uploaded to
                        Scope.).

                        Deprecated (use unedifact-nnn instead):
                        'certificateOfOrigin' -> unedifact-861,
                        'commercialInvoice' -> unedifact-380,
                        'packingList' -> unedifact-271,
                        'proofOfDelivery' -> unedifact-737,
                        'other' -> unedifact-916,
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="mimeType" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>Use standard MIME types, e.g. "application/pdf"
                        or "image/png"
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:pattern value="[\p{Lu}\p{Ll}\p{N}\.]{1,127}/[\p{Lu}\p{Ll}\p{N}\.]{1,127}" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="characterSet" type="xs:NMTOKEN" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        This is usually not required for PDF documents or images. Use the
                        <em>Preferred MIME Name</em>
                        of the character set, e.g. "US-ASCII", "ISO-8859-1"
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="content" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Base64 encoded content. White-space will be
                        ignored.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="contentMimeType">
        <xs:restriction base="xs:NMTOKEN">
            <xs:pattern value="[A-Z0-9!#$\.\+\-^_]{1,127}/[A-Z0-9!#$\.\+\-^_]{1,127}" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="securityStatus">
        <xs:sequence>
            <xs:element name="securityReason" type="securityReason" minOccurs="0" />
            <xs:element name="issuer" type="issuingOrAcceptingSecurityParty" minOccurs="0" />
            <xs:element name="issuedTimestamp" type="dateTimeWithTimezone" minOccurs="0" />
            <xs:element name="acceptor" type="issuingOrAcceptingSecurityParty" minOccurs="0" />
            <xs:element name="remarks" type="xs:normalizedString" minOccurs="0" />
        </xs:sequence>
        <xs:attribute name="code" use="required" type="securityStatusCode" />
        <xs:attribute name="finalStatus" type="xs:boolean" default="true" />
    </xs:complexType>

    <xs:complexType name="securityParty">
        <xs:sequence>
            <xs:element name="name" type="xs:normalizedString" />
            <xs:element name="registrationNumber" type="securityRegistrationNumber" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="issuingOrAcceptingSecurityParty">
        <xs:complexContent>
            <xs:extension base="securityParty">
                <xs:sequence>
                    <xs:element name="issuingPerson" type="xs:normalizedString" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:simpleType name="securityStatusCode">
        <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="HR" />
            <xs:enumeration value="NSC" />
            <xs:enumeration value="SCO" />
            <xs:enumeration value="SHR" />
            <xs:enumeration value="SPX" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="securityReason">
        <xs:choice>
            <xs:element name="exemption" type="securityExemptionCode" />
            <xs:element name="knownConsignor" type="securityRegistrationNumber" />
            <xs:element name="screening" type="securityScreening" maxOccurs="unbounded" />
        </xs:choice>
    </xs:complexType>

    <xs:simpleType name="securityExemptionCode">
        <xs:annotation>
            <xs:documentation>
                Use IATA codes, e.g. "DIPL", "LFSM"
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:NMTOKEN">
            <xs:pattern value="[A-Z]{4}" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="securityScreening">
        <xs:sequence>
            <xs:element name="method" type="screeningMethodPieces" />
            <xs:element name="screeningParty" type="securityParty" minOccurs="0" />
            <xs:element name="timestamp" type="dateTimeWithTimezone" minOccurs="0" />
            <xs:element name="references" type="references" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="screeningMethodPieces">
        <xs:simpleContent>
            <xs:extension base="xs:NMTOKEN">
                <xs:attribute name="pieces" type="xs:positiveInteger" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="securityRegistrationNumber">
        <xs:simpleContent>
            <xs:extension base="xs:token">
                <xs:attribute name="registry" type="securityRegistry" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:simpleType name="securityRegistry">
        <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="euCargoDB" />
            <xs:enumeration value="other" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="packageMarkingType">
        <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="iata">
                <xs:annotation>
                    <xs:documentation>IATA 606 package identifier, which consists of
                        the IATA Air Waybill number (without any spaces or hyphens)
                        followed by a zero (0) and a four-digit running counter. E.g.
                        1296666666601234
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="forwarder">
                <xs:annotation>
                    <xs:documentation>Package identifier assigned by the forwarder.
                        This typically contains a reference to the House Waybill, but
                        forwarders are free to use whatever scheme they prefer.
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="shipper">
                <xs:annotation>
                    <xs:documentation>Package identifier assigned by the shipper. This
                        should be a real identifier (e.g. NVE-SSCC), not only some textual
                        marking.
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="other">
                <xs:annotation>
                    <xs:documentation>Any other markings on the package
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="packageMarking">
        <xs:simpleContent>
            <xs:extension base="xs:token">
                <xs:attribute name="type" type="packageMarkingType" use="required" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="packageMarkings">
        <xs:sequence>
            <xs:element name="packageMarking" type="packageMarking" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="packageType">
        <xs:simpleContent>
            <xs:extension base="xs:token">
                <xs:attribute name="code" use="required">
                    <xs:annotation>
                        <xs:documentation>Codes according to UNECE/CEFACT Trade
                            Facilitation Recommendation No.21
                        </xs:documentation>
                    </xs:annotation>
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:length value="2" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="package">
        <xs:sequence>
            <xs:element name="packageType" type="packageType" minOccurs="0" />
            <xs:element name="weight" type="weight" minOccurs="0" />
            <xs:element name="volume" type="volume" minOccurs="0" />
            <xs:element name="dangerousGoodsList" type="dangerousGoodsList" minOccurs="0" />
            <xs:element name="dimension" type="dimension" minOccurs="0" />
            <xs:element name="packageMarkings" type="packageMarkings" minOccurs="0" />
            <xs:element name="temperatureRange" type="temperatureRange" minOccurs="0" />
            <xs:element name="handlingInstructions" type="handlingInstructions" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="packages">
        <xs:sequence>
            <xs:element name="package" type="package" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="dangerousGoodsList">
        <xs:sequence>
            <xs:element name="dangerousGoods" type="dangerousGoods" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="dangerousGoods">
        <xs:sequence>
            <xs:element name="unNumber" type="xs:NMTOKEN" minOccurs="0" />
            <xs:element name="cls" type="xs:NMTOKEN" minOccurs="0" />
            <xs:element name="packingGroup" type="xs:NMTOKEN" minOccurs="0" />
            <xs:choice minOccurs="0">
                <xs:element name="netWeight" type="weight" minOccurs="0" />
                <xs:element name="netVolume" type="volume" minOccurs="0" />
            </xs:choice>
            <xs:element name="properShippingName" type="xs:token" minOccurs="0" />
            <xs:element name="technicalName" type="xs:token" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="warehouseAdviceConsignments">
        <xs:sequence>
            <xs:element name="consignment" type="warehouseAdviceConsignment" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="warehouseAdviceConsignment">
        <xs:sequence>
            <xs:element name="consignmentID" type="xs:NMTOKEN">
                <xs:annotation>
                    <xs:documentation>
                        ID for this consignment, eg. a transport order reference.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="shipmentID" type="xs:NMTOKEN" />
            <xs:element name="references" type="references" />
            <xs:element name="times" type="shipmentDateTimes" minOccurs="0" />
            <xs:element name="exportAgent" type="address" minOccurs="0" />
            <xs:element name="importAgent" type="address" minOccurs="0" />
            <xs:element name="shipper" type="address" minOccurs="0" />
            <xs:element name="consignee" type="address" minOccurs="0" />
            <xs:element name="customer" type="address" minOccurs="0" />
            <xs:element name="placeOfReceipt" type="location" minOccurs="0" />
            <xs:element name="portOfDeparture" type="location" minOccurs="0" />
            <xs:element name="portOfDestination" type="location" minOccurs="0" />
            <xs:element name="finalDestination" type="location" minOccurs="0" />
            <xs:element name="totals" type="totals" />
            <xs:element name="package" type="package" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="natureOfGoods" type="xs:token" minOccurs="0" />
            <xs:element name="handlingInstructions" type="handlingInstructions" minOccurs="0" />
            <xs:element name="attachment" type="attachment" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="warehouseManifestConsignments">
        <xs:sequence>
            <xs:element name="consignment" type="warehouseManifestConsignment" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="warehouseManifestConsignment">
        <xs:sequence>
            <xs:element name="shipmentID" type="xs:NMTOKEN" />
            <xs:element name="references" type="references" />
            <xs:element name="shipper" type="address" minOccurs="0" />
            <xs:element name="consignee" type="address" minOccurs="0" />
            <xs:element name="placeOfReceipt" type="location" minOccurs="0" />
            <xs:element name="finalDestination" type="location" minOccurs="0" />
            <xs:element name="totals" type="totals" />
            <xs:element name="handlingInstructions" type="handlingInstructions" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="uldBuildOrderEquipments">
        <xs:sequence>
            <xs:element name="equipment" type="uldBuildOrderEquipment" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="uldBuildOrderEquipment">
        <xs:sequence>
            <xs:element name="uldType" type="uldTypeCode" />
            <xs:element name="count" type="xs:positiveInteger" />
            <xs:element name="contour" type="uldContourCode" minOccurs="0" />
            <xs:element name="serialNumber" type="uldIdentifier" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>Instruct warehouse to use specific equipment</xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="remarks" type="xs:token" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="uldBuildResultEquipments">
        <xs:sequence>
            <xs:element name="equipment" type="uldBuildResultEquipment" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="uldBuildResultEquipment">
        <xs:sequence>
            <xs:element name="uldType" type="uldTypeCode" />
            <xs:element name="contour" type="uldContourCode" minOccurs="0" />
            <xs:element name="loadingIndicator" type="uldLoadingIndicator" minOccurs="0" />
            <xs:element name="serialNumber" type="uldIdentifier">
                <xs:annotation>
                    <xs:documentation>The used specific equipment</xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="consignments" type="uldBuildConsignments" />
            <xs:element name="totals" type="uldTotals" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Total values of all goods contained in this ULD
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="handlingInstructions" type="handlingInstructions" minOccurs="0" />
            <xs:element name="remarks" type="xs:token" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="uldBuildConsignments">
        <xs:sequence>
            <xs:element name="shipmentID" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:NMTOKEN">
                            <xs:attribute name="packages" type="xs:integer" />
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="uldTypeCode">
        <xs:restriction base="xs:NMTOKEN">
            <xs:minLength value="3" />
            <xs:maxLength value="3" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="uldContourCode">
        <xs:restriction base="xs:NMTOKEN">
            <xs:minLength value="2" />
            <xs:maxLength value="2" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="uldLoadingIndicator">
        <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="M">
                <xs:annotation>
                    <xs:documentation>Main Deck Loading only</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="N">
                <xs:annotation>
                    <xs:documentation>Nose Door Loading only</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="L">
                <xs:annotation>
                    <xs:documentation>ULD height below 160 cm</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="U">
                <xs:annotation>
                    <xs:documentation>ULD height between 160 cm and 244 cm</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="R">
                <xs:annotation>
                    <xs:documentation>ULD height above 244 cm</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="uldIdentifier">
        <xs:restriction base="xs:NMTOKEN">
            <xs:minLength value="9"></xs:minLength>
            <xs:maxLength value="10"></xs:maxLength>
        </xs:restriction>
    </xs:simpleType>

    <xs:element name="uldBuildResult">
        <xs:complexType>
            <xs:annotation>
                <xs:documentation>Results of a ULDs build</xs:documentation>
            </xs:annotation>
            <xs:sequence>
                <xs:element name="shipmentID" type="xs:NMTOKEN">
                    <xs:annotation>
                        <xs:documentation>
                            ID of the shipment ULDs is built for. We do not support multi-master ULDs for now.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="references" type="references" minOccurs="0" />
                <xs:element name="exportAgent" type="address" />
                <xs:element name="warehouse" type="address" />
                <xs:element name="uldBuildTime" type="dateTimeWithTimezone" minOccurs="0" />
                <xs:element name="equipments" type="uldBuildResultEquipments" />
                <xs:element name="remarks" type="xs:token" minOccurs="0" />
                <xs:element name="attachment" type="attachment" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
            <xs:attribute name="relatesTo">
                <xs:annotation>
                    <xs:documentation>The ULD Build order ID this result is related to
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="modeOfTransportType">
        <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="AIR" />
            <xs:enumeration value="RAIL" />
            <xs:enumeration value="ROAD" />
            <xs:enumeration value="SEA" />
        </xs:restriction>
    </xs:simpleType>

</xs:schema>
