﻿<?xml version="1.0" encoding="utf-8"?>

<!--
btwentyfour inhouse format v2.1

** Change history **
2024-05-23 KJ: #59469 Added manufacturer and factory parties to OrderMessage, OrderChangeMessage, OrderResponseMessage
2024-05-20 JA: #60527 taxIdentificationNumber attribute on invoice
2024-03-01 JA: #58960 Added quotes
2024-01-30 CK: #58295 Changed @lineNo, @parentLineNo from xs:int to xs:string
2023-12-29 JA: #58649 Added manufacturer and factory parties to despatchAdvice
2023-11-13 CK: #55408 Added SalesReportQuantity/@type 'SalesMinusReturn'
2023-09-01 CK: #56274 Changed orderChange/item/(@quantity,price) making them optional, removing PricedItemDetail.
2023-03-20 ZL: #51962 Added image/@ordinal
2022-10-03 LS: #49420 Added percent attribute to GlobalizedExtendedProperty
2022-09-02 IA: #48015 Added image/@target
2022-05-03 AD: #40807 Added b24Message/partyData, Party/@parentGln, @parentName, @isActive and Location/faxNumber, webAddress, latitude, longitude.
2022-03-11 CK: #38406 Added b24Message/generalText
2022-03-11 CK: #45619 Added salesReport/site/sale/@salesAssociate
2022-01-25 CK: #44052 Changed minOccurs for salesReport/site/item/price making it optional.
2022-01-24 CK: #44269 Added b24Message/returnAnnouncement.
2021-12-09 CK: #43461 Added DocumentReference/@documentType 'OriginalOrder'
2021-12-07 CK: #42814 Added b24Message/stockReport similar to salesReport but item/price being optional and adding item/quantity/quantityState
2021-09-07 MR: #37565 Added b24Message/taxControl. Added shipper and shipFrom to b24Message/(order|orderResponse|orderChange|invoice).
2021-05-04 CK: #37598 Renamed market attribute for pricat and price to country
2021-04-01 CK: #17705 Added market attribute to pricat and Price
2021-04-01 CK: #30619 Added attributes to GlobalizedExtendedProperty, changing pricat/item/dimension to GlobalizedExtendedProperty
                      - isPrimary
                      - market, location, target (dimensions)
                      - brand, series, unit (values)
2021-03-27 JA: #23453 OrderChangeMessage now allows zero (or more) item elements instead of at least one
2020-10-21 IA: #29919 Added netAmountIncTaxNotRounded in total, added AmountSummaryCharges
2020-04-14 CK: #22654 Added communicationEvent/log and payload, removed unused communicationEvent/message
2020-04-03 CK: #24300 Dropped maxLength restriction for CodedValue (and ExtendedProperty, GlobalizedExtendedProperty, GoodsClass)
2020-02-14 IA: #22151 Added attachment for Invoice
2019-12-18 MR: #20444 Added itemReference/@coding 'EAN11'
2019-12-04 IA: #19079 Added ExtendedProperty/@ordinal
2019-12-04 IA: #15921 Added b24Message/remittanceAdvice and b24Message/receivingAdvice
2019-09-17 CK: #18087 Added b24Message/relocationOfGoods and DocumentReference/@documentType 'RelocationOfGoods'
2019-08-08 MA: #13378 Added DocumentReference/@documentType 'SupplierImage'. Changed minOccurs/maxOccurs for property and dimension for type ItemPresentation
2019-06-03 IA: #13378 Added presentationCatalog/itemPresentation (replacing never used itemPresentation/folder).
2019-05-27 IA: #13644 Added ORDCHG as new message. Added DocumentReference/@documentType 'OrderChange'.
2019-03-21 CK: #14015 Added DocumentReference/@documentType 'CustomerOrder'
2019-03-20 CK: #14015 Added Account/@type 'BranchCode'
2018-08-27 CK: #11751 Added SalesReportQuantity/@type 'Cancel' of same sort as 'Sales' and 'Return' (i.e. not inventory).
2018-06-14 JA: #10633 Added DocumentReference/@documentType 'SupplierOrderDraft' and added orderType for orderResponseMessage 
2018-04-24 CK: #10636 Added DocumentReference/@documentType 'InvoiceNumber'
2018-02-14 CK: Changed DateOptTimeZ from regex to union
2018-01-30 CG: Added documenttype enumeration b24OrderDraft
2016-12-14 JS: Added support for typed parties in all messages
2016-09-01 JS: InventoryReport and SalesReport: documentReferene element added
                        despatchAdvice: property element added to package
                        All: lineId and parentLineId removed. Please use documentReferences instead
                        All: All dates has optional time
                        orderMessage: status on header and rows removed. confirmedQuantity removed. orderDate in header removed. Please use documentReference instead
                        orderResponseMessage: orderType removed. confirmedQuantity removed, use quantity instead. orderedQuantity and shippingDate added.
2015-11-18 JS: registry 'Buyer' added, PaymentDetails in Invoice is no longer required.
2015-10-15 JS: minOccurs=0 on invoice items
2015-05-29 JS: despatchAdvice: Package structure changed from hierarchy to flat. Attributes added to package: quantity, hierarchyIdentity, parentHierarchyIdentity.
2014-11-27 JS: Invoice message completed
2014-11-02 JS: Pricat message completed
2014-03-09 JS: Created
-->

<xs:schema id="CommerceMessage"
           targetNamespace="http://btwentyfour.com/schemas/commerce/2.1"
           xmlns="http://btwentyfour.com/schemas/commerce/2.1"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">

  <xs:element name="b24Message">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element ref="pricat" />
        <xs:element ref="order" />
        <xs:element ref="orderResponse" />
        <xs:element ref="orderChange" />
        <xs:element ref="despatchAdvice" />
        <xs:element ref="invoice" />
        <xs:element ref="salesReport" />
        <xs:element ref="stockReport" />
        <xs:element ref="inventoryReport" />
        <xs:element ref="relocationOfGoods" />
        <xs:element ref="communicationEvent" />
        <xs:element ref="presentationCatalog" />
        <xs:element ref="remittanceAdvice" />
        <xs:element ref="receivingAdvice" />
        <xs:element ref="taxControl" />
        <xs:element ref="partyData" />
        <xs:element ref="returnAnnouncement" />
        <xs:element ref="generalText" />
        <xs:element ref="quotes" />
      </xs:choice>
      <xs:attribute name="messageId" type="xs:string" />
      <xs:attribute name="messageDate" type="DateOptTimeZ" />
    </xs:complexType>
  </xs:element>

  <!-- Message and detail Bases -->
  <xs:complexType name="Message" abstract="true">
    <xs:sequence>
      <xs:element name="sender" type="Party" />
      <xs:element name="recipient" type="Party" />

      <!--<xs:element name="party" type="TypedParty" minOccurs="0" maxOccurs="unbounded" />-->

      <xs:element name="documentReference" type="DocumentReference" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>

    <xs:attribute name="messageId" type="xs:int" />
    <xs:attribute name="messageDate" type="DateOptTimeZ" />

    <xs:attribute name="text" type="xs:string" />

    <xs:attribute name="environment">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="Production" />
          <xs:enumeration value="Test" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="Party">
    <xs:sequence>
      <xs:element name="location" type="Location" minOccurs="0" />
      <xs:element name="reference" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="phoneNumber" type="xs:string" minOccurs="0" />
            <xs:element name="emailAddress" type="xs:string" minOccurs="0" />
            <xs:element name="property" type="CodedValue" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
          <xs:attribute name="id" type="xs:string" />
          <xs:attribute name="name" type="xs:string" />
        </xs:complexType>
      </xs:element>
      <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>

    <xs:attribute name="gln" type="GLN" />
    <xs:attribute name="key" type="GUID" />

    <xs:attribute name="name" type="xs:string" />
    <xs:attribute name="contact" type="xs:string" />
    <xs:attribute name="reference" type="xs:string" />
    <xs:attribute name="department" type="xs:string" />
    <xs:attribute name="orgNo" type="xs:string" />
    <xs:attribute name="vatNo" type="xs:string" />

    <xs:attribute name="parentGln" type="GLN" />
    <xs:attribute name="parentName" type="xs:string" />
  </xs:complexType>

  <!--<xs:complexType name="TypedParty">
    <xs:complexContent>
      <xs:extension base="Party">
        <xs:attribute name="type" type="PartyType" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:simpleType name="PartyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="DeliveryParty" />
      <xs:enumeration value="Invoicee" />
      <xs:enumeration value="ResellerGroup" />
      <xs:enumeration value="UltimateConsignee" />
      <xs:enumeration value="SellerRepresentative" />
      <xs:enumeration value="OrderedBy" />
      <xs:enumeration value="UltimateCustomer" />
      <xs:enumeration value="ShipFrom" />
      <xs:enumeration value="Shipper" />
    </xs:restriction>
  </xs:simpleType>-->

  <xs:simpleType name="GLN">
    <xs:restriction base="xs:string">
      <!--
        1234567890123    - Proper GLN, 13-digit
        7340117802900-E4 - Btwentyfour internal, 13-digit +2
        Whatever         - Invalid GLN
        -->
      <xs:pattern value="([0-9]{13})|([0-9]{13}-[0-9a-zA-Z]{2})|(.*)" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="GUID">
    <xs:restriction base="xs:string">
      <xs:pattern value="([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})|(\{[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\})" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="Latitude">
    <xs:restriction base="xs:decimal">
      <xs:minInclusive value="-90"/>
      <xs:maxInclusive value="90"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="Longitude">
    <xs:restriction base="xs:decimal">
      <xs:minInclusive value="-180"/>
      <xs:maxInclusive value="180"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="Location">
    <xs:sequence>
      <xs:element name="address" type="xs:string" minOccurs="0" />
      <xs:element name="coAddress" type="xs:string" minOccurs="0" />
      <xs:element name="city" minOccurs="0" type="CodedValue" />
      <xs:element name="state" minOccurs="0" type="CodedValue" />
      <xs:element name="country" type="CodedValue" minOccurs="0" />
      <xs:element name="telephoneNumber" type="xs:string" minOccurs="0" />
      <xs:element name="emailAddress" type="xs:string" minOccurs="0" />
      <xs:element name="faxNumber" type="xs:string" minOccurs="0" />
      <xs:element name="webAddress" type="xs:string" minOccurs="0" />
      <xs:element name="latitude" type="Latitude" minOccurs="0" />
      <xs:element name="longitude" type="Longitude" minOccurs="0" />
      <xs:element name="property" type="CodedValue" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="DocumentReference">
    <xs:sequence>
      <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="documentType" type="DocumentReferenceDocumentType" use="required" />
    <xs:attribute name="id">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:minLength value="1" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="date" type="DateOptTimeZ" />
    <xs:attribute name="lineNo" type="xs:string" />
    <xs:attribute name="parentLineNo" type="xs:string" />
  </xs:complexType>

  <xs:simpleType name="DocumentReferenceDocumentType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="BuyerOrder" />
      <xs:enumeration value="ContractOrder" />
      <xs:enumeration value="SupplierOrder" />
      <xs:enumeration value="BuyerContract" />
      <xs:enumeration value="Invoice" />
      <xs:enumeration value="DeliveryNote" />
      <xs:enumeration value="b24Order" />
      <xs:enumeration value="PackingList" />
      <xs:enumeration value="BillOfLading" />
      <xs:enumeration value="DespatchAdvice" />
      <xs:enumeration value="Shipment" />
      <xs:enumeration value="b24Cart" />
      <xs:enumeration value="InventoryReport" />
      <xs:enumeration value="SalesReport" />
      <xs:enumeration value="b24OrderDraft" />
      <xs:enumeration value="InvoiceNumber" />
      <xs:enumeration value="SupplierOrderDraft" />
      <xs:enumeration value="CustomerOrder" />
      <xs:enumeration value="OrderChange" />
      <xs:enumeration value="SupplierImage" />
      <xs:enumeration value="RelocationOfGoods" />
      <xs:enumeration value="RemittanceAdvice" />
      <xs:enumeration value="ReceivingAdvice" />
      <xs:enumeration value="TaxControl" />
      <xs:enumeration value="PreviousTaxControl" />
      <xs:enumeration value="InvoiceBatch" />
      <xs:enumeration value="OriginalOrder" />
      <xs:enumeration value="StockReport" />
      <xs:enumeration value="PartyData" />
      <xs:enumeration value="ReturnAnnouncement" />
      <xs:enumeration value="AgreementNumber" />
      <xs:enumeration value="GeneralText" />
      <xs:enumeration value="Quotes" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="Attachment">
    <xs:sequence>
      <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="fileName" type="xs:string" />
    <xs:attribute name="mimeType" type="xs:string" />
    <xs:attribute name="embeddedObject" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="NamedValue">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="name" type="xs:string" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="CodedValue">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="code" >
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:maxLength value="100" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="ExtendedProperty">
    <xs:simpleContent>
      <xs:extension base="CodedValue">
        <xs:attribute name="name" type="xs:string" use="required" />
        <xs:attribute name="set" type="xs:string" />
        <xs:attribute name="registry" type="Registry" />
        <xs:attribute name="ordinal" type="xs:int" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="GlobalizedExtendedProperty">
    <xs:simpleContent>
      <xs:extension base="ExtendedProperty">
        <xs:attribute name="isPrimary" type="xs:boolean" />
        <!-- Dimensions, together with name, set, registry -->
        <xs:attribute name="language" type="xs:language" />
        <xs:attribute name="market" type="xs:string" />
        <xs:attribute name="location" type="xs:string" />
        <xs:attribute name="target" type="GLN" />
        <!-- Values, together with code, ordinal, Value -->
        <xs:attribute name="brand" type="xs:string" />
        <xs:attribute name="series" type="xs:string" />
        <xs:attribute name="unit" type="xs:string" />
        <xs:attribute name="percent">
          <xs:simpleType>
            <xs:restriction base="xs:decimal">
              <xs:fractionDigits value="2" />
              <xs:minInclusive value="0"/>
              <xs:maxInclusive value="100"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="GoodsClass">
    <xs:simpleContent>
      <xs:extension base="CodedValue">
        <xs:attribute name="set" type="xs:string" />
        <xs:attribute name="registry" type="Registry" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="Detail">
    <xs:sequence>
      <xs:element name="documentReference" type="DocumentReference" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="property" type="GlobalizedExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="ItemDetail">
    <xs:complexContent>
      <xs:extension base="Detail">
        <xs:sequence>
          <xs:element name="supplier" type="Party" minOccurs="0" />
          <xs:element name="manufacturer" type="Party" minOccurs="0" />
          <xs:element name="dimension" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
          <xs:element name="itemReference" type="ItemReference" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="id" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="ItemDetailRequiredId">
    <xs:complexContent>
      <xs:extension base="Detail">
        <xs:sequence>
          <xs:element name="supplier" type="Party" minOccurs="0" />
          <xs:element name="manufacturer" type="Party" minOccurs="0" />
          <xs:element name="dimension" type="GlobalizedExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
          <xs:element name="itemReference" type="ItemReference" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="id" type="xs:string" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="ItemReference">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="registry" type="Registry" />

        <xs:attribute name="coding">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="EAN14" />
              <xs:enumeration value="EAN13" />
              <xs:enumeration value="EAN11" />
              <xs:enumeration value="EAN8" />
              <xs:enumeration value="ISBN" />
              <xs:enumeration value="UPCA" />
              <xs:enumeration value="UPCE" />
              <xs:enumeration value="CODE39" />
              <xs:enumeration value="QR" />
              <xs:enumeration value="OTHER" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>

        <xs:attribute name="name" type="xs:string" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="Price">
    <xs:sequence>
      <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>

    <xs:attribute name="type" type="xs:string" />
    <xs:attribute name="value" type="xs:decimal" />
    <xs:attribute name="currency" type="xs:string" />
    <xs:attribute name="country" type="xs:string" />
  </xs:complexType>

  <!-- PRICAT -->

  <xs:element name="pricat">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="supplier" type="Party" minOccurs="1" />
            <xs:element name="buyer" type="Party" minOccurs="0" />

            <xs:choice maxOccurs="unbounded">
              <xs:element name="item" type="PricatDetail" />
            </xs:choice>
          </xs:sequence>

          <xs:attribute name="validFrom" type="DateOptTimeZ" />
          <xs:attribute name="validTo"  type="DateOptTimeZ" />
          <xs:attribute name="preOrderTo" type="DateOptTimeZ" />

          <xs:attribute name="route" type="xs:string" />
          <xs:attribute name="currency" type="xs:string" />
          <xs:attribute name="country" type="xs:string" />

          <xs:attribute name="composition">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="Complete" />
                <xs:enumeration value="Product" />
                <xs:enumeration value="Price" />
                <xs:enumeration value="Market" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="PricatDetail">
    <xs:complexContent>
      <xs:extension base="ItemDetailRequiredId">
        <xs:sequence>
          <xs:element name="goodsClass" type="GoodsClass" minOccurs="0" maxOccurs="unbounded" />
          <xs:element name="priceBase" type="PriceBase" minOccurs="0" maxOccurs="unbounded" />
          <xs:element name="priceBracket" type="PriceBracket" minOccurs="0" maxOccurs="unbounded" />
          <xs:element name="kitMember" type="KitMember" minOccurs="0" maxOccurs="unbounded" />

          <xs:element name="presentation" minOccurs="0">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="image" type="Image" minOccurs="0" maxOccurs="unbounded" />
              </xs:sequence>
              <xs:attribute name="path" type="xs:string" />
              <xs:attribute name="text" type="xs:string" />
              <xs:attribute name="id" type="xs:string" />
            </xs:complexType>
          </xs:element>
        </xs:sequence>

        <xs:attribute name="inSelection" type="xs:boolean" />
        <xs:attribute name="action">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="Add" />
              <xs:enumeration value="Change" />
              <xs:enumeration value="Delete" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Image">
    <xs:sequence>
      <xs:element name="property" type="GlobalizedExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="url" type="xs:string" />
    <xs:attribute name="size" type="xs:string" />
    <xs:attribute name="text" type="xs:string" />
    <xs:attribute name="index" type="xs:string" />
    <xs:attribute name="ordinal" type="xs:int" />
    <xs:attribute name="imageBankId" type="xs:string" />
    <xs:attribute name="action">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="Add" />
          <xs:enumeration value="Delete" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="isPrimary" type="xs:boolean" />
    <xs:attribute name="target" type="GLN" />
  </xs:complexType>

  <xs:complexType name="KitMember">
    <xs:sequence>
      <xs:element name="kitChoice" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="itemReference" type="ItemReference" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>

    <xs:attribute name="quantity" type="xs:int" use="required" />
    <xs:attribute name="name" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="PriceBase">
    <xs:sequence>
      <xs:element name="price" type="Price" maxOccurs="unbounded" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="validOrderDateFrom" type="DateOptTimeZ" />
    <xs:attribute name="validOrderDateTo" type="DateOptTimeZ" />
  </xs:complexType>

  <xs:complexType name="PriceBracket">
    <xs:complexContent>
      <xs:extension base="PriceBase">
        <xs:attribute name="type" type="xs:string" />
        <xs:attribute name="quantity" type="xs:integer" use="required" />
        <xs:attribute name="validShipDateFrom" type="DateOptTimeZ" />
        <xs:attribute name="validShipDateTo" type="DateOptTimeZ" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--TODO: Deprecated, remove -->
  <xs:simpleType name="PriceType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="GrossPrice" />
      <xs:enumeration value="NetPrice" />
    </xs:restriction>
  </xs:simpleType>

  <!-- ORDERS -->

  <xs:complexType name="OrderMessage">
    <xs:complexContent>
      <xs:extension base="Message">
        <xs:sequence>
          <xs:element name="supplier" type="Party" minOccurs="1" />
          <xs:element name="buyer" type="Party" minOccurs="1" />
          <xs:element name="shipper" type="Party" minOccurs="0" />
          <xs:element name="shipFrom" type="Party" minOccurs="0" />
          <xs:element name="consignee" type="Party" minOccurs="0" />
          <xs:element name="manufacturer" type="Party" minOccurs="0" />
          <xs:element name="factory" type="Party" minOccurs="0" />

          <xs:element name="item" type="OrderItemDetail" maxOccurs="unbounded" />
        </xs:sequence>

        <xs:attribute name="orderType" type="xs:string" />
        <xs:attribute name="currency" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:element name="order" type="OrderMessage" />

  <xs:complexType name="OrderItemBase">
    <xs:complexContent>
      <xs:extension base="ItemDetail">
        <xs:attribute name="deliveryDate" type="DateOptTimeZ" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="OrderItemDetail">
    <xs:complexContent>
      <xs:extension base="OrderItemBase">
        <xs:sequence>
          <xs:element name="price" type="Price" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="quantity" type="xs:decimal" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- ORDRSP -->

  <xs:complexType name="OrderResponseMessage">
    <xs:complexContent>
      <xs:extension base="Message">
        <xs:sequence>
          <xs:element name="supplier" type="Party" minOccurs="1" />
          <xs:element name="buyer" type="Party" minOccurs="1" />
          <xs:element name="shipper" type="Party" minOccurs="0" />
          <xs:element name="shipFrom" type="Party" minOccurs="0" />
          <xs:element name="consignee" type="Party" minOccurs="0" />
          <xs:element name="manufacturer" type="Party" minOccurs="0" />
          <xs:element name="factory" type="Party" minOccurs="0" />

          <xs:element name="item" type="OrderResponseItemDetail" maxOccurs="unbounded" />
        </xs:sequence>

        <xs:attribute name="status" type="xs:string" />
        <xs:attribute name="orderType" type="xs:string" />
        <xs:attribute name="currency" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="OrderResponseItemDetail">
    <xs:complexContent>
      <xs:extension base="OrderItemDetail">
        <xs:attribute name="orderedQuantity" type="xs:decimal" />
        <xs:attribute name="requestedDeliveryDate" type="DateOptTimeZ" />
        <xs:attribute name="shippingDate" type="DateOptTimeZ" />
        <xs:attribute name="status" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:element name="orderResponse" type="OrderResponseMessage" />
  
  <!--ORDCHG -->

  <xs:complexType name="OrderChangeMessage">
    <xs:complexContent>
      <xs:extension base="Message">
        <xs:sequence>
          <xs:element name="supplier" type="Party" minOccurs="1" />
          <xs:element name="buyer" type="Party" minOccurs="1" />
          <xs:element name="shipper" type="Party" minOccurs="0" />
          <xs:element name="shipFrom" type="Party" minOccurs="0" />
          <xs:element name="consignee" type="Party" minOccurs="0" />
          <xs:element name="manufacturer" type="Party" minOccurs="0" />
          <xs:element name="factory" type="Party" minOccurs="0" />

          <xs:element name="item" type="OrderChangeItemDetail" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>

        <xs:attribute name="orderType" type="xs:string" />
        <xs:attribute name="currency" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:element name="orderChange" type="OrderChangeMessage" />

  <xs:complexType name="OrderChangeItemDetail">
    <xs:complexContent>
      <xs:extension base="OrderItemBase">
        <xs:sequence>
          <xs:element name="price" type="Price" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="quantity" type="xs:decimal" use="optional" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--DESADV -->

  <xs:element name="despatchAdvice">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="supplier" type="Party" minOccurs="1" />
            <xs:element name="buyer" type="Party" minOccurs="1" />
            <xs:element name="shipper" type="Party" minOccurs="0" />
            <xs:element name="shipFrom" type="Party" minOccurs="0" />
            <xs:element name="consignee" type="Party" minOccurs="0"  />
            <xs:element name="manufacturer" type="Party" minOccurs="0" />
            <xs:element name="factory" type="Party" minOccurs="0" />

            <xs:element name="package" type="DespatchAdvicePackage" maxOccurs="unbounded" />
          </xs:sequence>

          <xs:attribute name="estimatedDeliveryDate" type="DateOptTimeZ" />
          <xs:attribute name="deliveryDate" type="DateOptTimeZ" />
          <xs:attribute name="shippingDate" type="DateOptTimeZ" />
          <xs:attribute name="shipmentNumber" type="xs:string" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="DespatchAdvicePackage">
    <xs:sequence>
      <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="item" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:complexContent>
            <xs:extension base="ItemDetail">
              <xs:attribute name="quantity" type="xs:decimal" use="required" />
              <xs:attribute name="countryOfOrigin" type="xs:string" />
            </xs:extension>
          </xs:complexContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>

    <xs:attribute name="packageType" type="xs:string" use="required" />

    <xs:attribute name="quantity" type="xs:int" />
    <xs:attribute name="hierarchyIdentity" type="xs:int" />
    <xs:attribute name="parentHierarchyIdentity" type="xs:int" />

    <xs:attribute name="SSCC" type="xs:string" />
    <xs:attribute name="trackingUrl" type="xs:string" />
  </xs:complexType>

  <!-- RECADV -->

  <xs:element name="receivingAdvice">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="supplier" type="Party" minOccurs="1" />
            <xs:element name="buyer" type="Party" minOccurs="1" />
            <xs:element name="shipper" type="Party" minOccurs="0" />
            <xs:element name="shipFrom" type="Party" minOccurs="0" />
            <xs:element name="consignee" type="Party" minOccurs="0"  />

            <xs:element name="package" type="ReceivingAdvicePackage" maxOccurs="unbounded" />
          </xs:sequence>

          <xs:attribute name="deliveryDate" type="DateOptTimeZ" />
          <xs:attribute name="receivedDate" type="DateOptTimeZ" />
          <xs:attribute name="shipmentNumber" type="xs:string" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="ReceivingAdvicePackage">
    <xs:sequence>
      <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="item" type="ReceivedAdviceItemDetail" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>

    <xs:attribute name="packageType" type="xs:string" use="required" />
    <xs:attribute name="quantity" type="xs:int" />
    <xs:attribute name="hierarchyIdentity" type="xs:int" />
    <xs:attribute name="parentHierarchyIdentity" type="xs:int" />
    <xs:attribute name="SSCC" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="ReceivedAdviceItemDetail">
    <xs:complexContent>
      <xs:extension base="ItemDetail">
        <xs:sequence>
          <xs:element name="variance" type="Variance" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="quantity" type="xs:decimal" use="required" />
        <xs:attribute name="orderedQuantity" type="xs:decimal" />
        <xs:attribute name="receivedQuantity" type="xs:decimal" use="required" />
        <xs:attribute name="acceptedQuantity" type="xs:decimal" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Variance">
    <xs:sequence>
      <xs:element name="property" type="GlobalizedExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="quantity" type="xs:decimal" use="required" />
  </xs:complexType>
  
  <!-- INVOIC -->

  <xs:element name="invoice">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="attachment" type="Attachment" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="supplier" type="Party" minOccurs="1" />
            <xs:element name="buyer" type="Party" minOccurs="1" />
            <xs:element name="shipper" type="Party" minOccurs="0" />
            <xs:element name="shipFrom" type="Party" minOccurs="0" />
            <xs:element name="consignee" type="Party" minOccurs="0" />

            <xs:choice maxOccurs="unbounded" minOccurs="0">
              <xs:element name="item" type="InvoiceItemDetail" />
              <xs:element name="text" type="Detail" />
              <xs:element name="subTotal" type="InvoiceSubTotalDetail" />
              <xs:element name="allowance" type="InvoicePricedDetail" />
              <xs:element name="charge" type="InvoicePricedDetail" />
            </xs:choice>

            <xs:element name="allowances" type="AmountSummary" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="charges" type="AmountSummaryCharges" minOccurs="0" maxOccurs="unbounded" />

            <xs:element name="taxes" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:attribute name="name" type="xs:string" />
                <xs:attribute name="code" type="xs:string" />
                <xs:attribute name="rate" type="xs:decimal" />
                <xs:attribute name="amount" type="xs:decimal" />
                <xs:attribute name="taxableAmount" type="xs:decimal" />
                <xs:attribute name="taxableAmountBC" type="xs:decimal" />
                <xs:attribute name="amountBC" type="xs:decimal" />
                <xs:attribute name="taxIdentificationNumber" type="xs:string" />
              </xs:complexType>
            </xs:element>

            <xs:element name="total">
              <xs:complexType>
                <xs:attribute name="grossAmount" type="xs:decimal" />
                <xs:attribute name="allowanceAmount" type="xs:decimal" />
                <xs:attribute name="chargeAmount" type="xs:decimal" />
                <xs:attribute name="netAmount" type="xs:decimal" />
                <xs:attribute name="taxableAmount" type="xs:decimal" />
                <xs:attribute name="nonTaxableAmount" type="xs:decimal" />
                <xs:attribute name="taxAmount" type="xs:decimal" />
                <xs:attribute name="rounding" type="xs:decimal" />
                <xs:attribute name="netAmountIncTax" type="xs:decimal" />
                <xs:attribute name="netAmountIncTaxNotRounded" type="xs:decimal" />
              </xs:complexType>
            </xs:element>

            <xs:element name="paymentDetails" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="account" type="Account" maxOccurs="unbounded" />
                </xs:sequence>

                <xs:attribute name="dueDate" type="DateOptTimeZ" />
                <xs:attribute name="paymentTerms" type="xs:string" />
                <xs:attribute name="penaltyInterestRate" type="xs:double" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>

          <xs:attribute name="type" use="required">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="Debit" />
                <xs:enumeration value="Credit" />
                <xs:enumeration value="Interest" />
                <xs:enumeration value="Proforma" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          <xs:attribute name="invoiceDate" type="DateOptTimeZ" />
          <xs:attribute name="invoiceNumber" type="xs:string" />
          <xs:attribute name="currency" type="xs:string" use="required" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="InvoicePricedDetail">
    <xs:complexContent>
      <xs:extension base="Detail">
        <xs:sequence>
          <xs:element name="price" type="InvoicePrice" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="quantity" type="xs:integer" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="InvoicePricedItemDetail">
    <xs:complexContent>
      <xs:extension base="ItemDetail">
        <xs:sequence>
          <xs:element name="price" type="InvoicePrice" maxOccurs="unbounded" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="InvoicePrice">
    <xs:sequence>
      <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>

    <xs:attribute name="currency" type="xs:string" />

    <xs:attribute name="unitGrossAmount" type="xs:decimal" />
    <xs:attribute name="unitNetAmount" type="xs:decimal" />
    <xs:attribute name="grossAmount" type="xs:decimal" />
    <xs:attribute name="grossAmountIncTax" type="xs:decimal" />
    <xs:attribute name="allowancePercent" type="xs:decimal" />
    <xs:attribute name="allowanceAmount" type="xs:decimal" />
    <xs:attribute name="chargePercent" type="xs:decimal" />
    <xs:attribute name="chargeAmount" type="xs:decimal" />
    <xs:attribute name="netAmount" type="xs:decimal" />
    <xs:attribute name="netAmountIncTax" type="xs:decimal" />
    <xs:attribute name="taxAmount" type="xs:decimal" />
    <xs:attribute name="taxRate" type="xs:decimal" />
  </xs:complexType>

  <xs:complexType name="AmountSummary">
    <xs:attribute name="name" type="xs:string" />
    <xs:attribute name="code" type="xs:string" />
    <xs:attribute name="percent" type="xs:decimal" />
    <xs:attribute name="amount" type="xs:decimal" />
  </xs:complexType>
  
  <xs:complexType name="AmountSummaryCharges">
    <xs:attribute name="name" type="xs:string" />
    <xs:attribute name="code" type="xs:string" />
    <xs:attribute name="percent" type="xs:decimal" />
    <xs:attribute name="amount" type="xs:decimal" />
    <xs:attribute name="amountIncTax" type="xs:decimal" />
    <xs:attribute name="taxRate" type="xs:decimal" />
    <xs:attribute name="taxAmount" type="xs:decimal" />
  </xs:complexType>

  <xs:complexType name="InvoiceItemDetail">
    <xs:complexContent>
      <xs:extension base="InvoicePricedItemDetail">
        <xs:attribute name="quantity" type="xs:decimal" use="required" />
        <xs:attribute name="unitPriceBase" type="xs:decimal" />
        <xs:attribute name="unitOfMeasure" type="xs:string" />
        <xs:attribute name="orderedQuantity" type="xs:decimal" />
        <xs:attribute name="backOrderQuantity" type="xs:decimal" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="InvoiceSubTotalDetail">
    <xs:complexContent>
      <xs:extension base="Detail">
        <xs:attribute name="amount" type="xs:decimal" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Account">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="type">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="SE.BG" />
              <xs:enumeration value="SE.PG" />
              <xs:enumeration value="IBAN" />
              <xs:enumeration value="BIC" />
              <xs:enumeration value="Bank" />
              <xs:enumeration value="Swift" />
              <xs:enumeration value="BranchCode" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bankName" type="xs:string" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <!-- TAXCON -->

  <xs:element name="taxControl">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="supplier" type="Party" minOccurs="1" />
            <xs:element name="buyer" type="Party" minOccurs="1" />
            <xs:element name="buyerAgent" type="Party" minOccurs="0" />
            <xs:element name="supplierAgent" type="Party" minOccurs="0" />
            <xs:element name="taxCollector" type="Party" minOccurs="0" />

            <xs:element name="taxControlDetails" type="TaxControlDetails" maxOccurs="unbounded" />
          </xs:sequence>

          <xs:attribute name="type" default="TaxDeclaration">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="TaxDeclaration" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="TaxControlDetails">
    <xs:sequence>
      <xs:element name="documentReference" type="DocumentReference" />
      <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="taxControlDocument" type="TaxControlDocument" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="TaxControlDocument">
    <xs:sequence>
      <xs:element name="total">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
          <xs:attribute name="taxableAmount" type="xs:decimal" />
          <xs:attribute name="nonTaxableAmount" type="xs:decimal" />
          <xs:attribute name="amount" type="xs:decimal" />
          <xs:attribute name="monetaryAmount" type="xs:decimal" />
          <xs:attribute name="netAmountIncTax" type="xs:decimal" />
        </xs:complexType>
      </xs:element>

      <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />

      <xs:element name="taxes" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="name" type="xs:string" />
          <xs:attribute name="code" type="xs:string" />
          <xs:attribute name="rateCategory" use="required">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="Mixed" />
                <xs:enumeration value="Exempt" />
                <xs:enumeration value="Lower" />
                <xs:enumeration value="Standard" />
                <xs:enumeration value="Zero" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          <xs:attribute name="rate" type="xs:decimal" />
          <xs:attribute name="amount" type="xs:decimal" />
          <xs:attribute name="taxableAmount" type="xs:decimal" />
          <xs:attribute name="currency" type="xs:string" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>

    <xs:attribute name="type" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="Debit" />
          <xs:enumeration value="Credit" />
          <xs:enumeration value="Interest" />
          <xs:enumeration value="Proforma" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>

    <xs:attribute name="currency" type="xs:string" />
  </xs:complexType>

  <!-- REMADV -->

  <xs:element name="remittanceAdvice">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="supplier" type="Party" minOccurs="1" />
            <xs:element name="buyer" type="Party" minOccurs="1" />
            <xs:element name="receivingAccount" type="Account" minOccurs="0" />
            <xs:element name="payingAccount" type="Account" minOccurs="0" />
            <xs:element name="accountingDocument" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
                  <xs:element name="documentReference" type="DocumentReference" />
                  <xs:element name="total" type="RemittanceAdviceTotal" minOccurs="0" />
                </xs:sequence>
                <xs:attribute name="currency" type="xs:string" use="required" />
                <xs:attribute name="paymentDate" type="DateOptTimeZ" />
                <xs:attribute name="invoiceType" use="required">
                  <xs:simpleType>
                    <xs:restriction base="xs:string">
                      <xs:enumeration value="Debit" />
                      <xs:enumeration value="Credit" />
                      <xs:enumeration value="Interest" />
                      <xs:enumeration value="Proforma" />
                    </xs:restriction>
                  </xs:simpleType>
                </xs:attribute>
              </xs:complexType>
            </xs:element>
            <xs:element name="total" type="RemittanceAdviceTotal" minOccurs="0" />
          </xs:sequence>
          <xs:attribute name="currency" type="xs:string" use="required" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="RemittanceAdviceTotal">
    <xs:sequence>
      <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="allowanceAmount" type="xs:decimal" />
    <xs:attribute name="taxableAmount" type="xs:decimal" />
    <xs:attribute name="nonTaxableAmount" type="xs:decimal" />
    <xs:attribute name="taxAmount" type="xs:decimal" />
    <xs:attribute name="adjustmentAmount" type="xs:decimal" />
    <xs:attribute name="netAmountIncTax" type="xs:decimal" />
    <xs:attribute name="remittedAmount" type="xs:decimal" />
  </xs:complexType>

  <!-- SLSRPT -->

  <xs:element name="salesReport">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="buyer" type="Party" minOccurs="0" />

            <xs:element name="site" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="location" type="Party" />
                  <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
                  <xs:element name="sale" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="documentReference" type="DocumentReference" minOccurs="0" maxOccurs="unbounded" />
                        <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
                        <xs:element name="item" type="SalesReportItemDetail" maxOccurs="unbounded" />
                      </xs:sequence>
                      <xs:attribute name="date" type="DateOptTimeZ" />
                      <xs:attribute name="dateTo" type="DateOptTimeZ" />
                      <xs:attribute name="id" type="xs:string" />
                      <xs:attribute name="salesAssociate" type="xs:string" />
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
                <xs:attribute name="name" type="xs:string" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="dateFrom" type="DateOptTimeZ" />
          <xs:attribute name="dateTo" type="DateOptTimeZ" />
          <xs:attribute name="type" type="SalesReportType" default="SellThrough" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="SalesReportItemDetail">
    <xs:complexContent>
      <xs:extension base="ItemDetail">
        <xs:sequence>
          <xs:element name="price" type="Price" minOccurs="0" maxOccurs="unbounded" />
          <xs:element name="quantity" type="SalesReportQuantity" maxOccurs="unbounded" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="SalesReportQuantity">
    <xs:simpleContent>
      <xs:extension base="xs:decimal">
        <xs:attribute name="type">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="Sales" />
              <xs:enumeration value="Return" />
              <xs:enumeration value="OnHand" />
              <xs:enumeration value="OnOrder" />
              <xs:enumeration value="InTrasit" />
              <xs:enumeration value="Received" />
              <xs:enumeration value="Invented" />
              <xs:enumeration value="Target" />
              <xs:enumeration value="Cancel" />
              <xs:enumeration value="SalesMinusReturn" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:simpleType name="SalesReportType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="SellThrough" />
      <xs:enumeration value="SellIn" />
    </xs:restriction>
  </xs:simpleType>

  <!-- STKRPT -->

  <xs:element name="stockReport">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="supplier" type="Party" minOccurs="0" />
            <xs:element name="buyer" type="Party" minOccurs="0" />

            <xs:element name="site" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="location" type="Party" />
                  <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
                  <xs:element name="stock" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="documentReference" type="DocumentReference" minOccurs="0" maxOccurs="unbounded" />
                        <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
                        <xs:element name="item" type="StockReportItemDetail" maxOccurs="unbounded" />
                      </xs:sequence>
                      <xs:attribute name="date" type="DateOptTimeZ" />
                      <xs:attribute name="id" type="xs:string" />
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
                <xs:attribute name="name" type="xs:string" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="dateFrom" type="DateOptTimeZ" />
          <xs:attribute name="dateTo" type="DateOptTimeZ" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="StockReportItemDetail">
    <xs:complexContent>
      <xs:extension base="ItemDetail">
        <xs:sequence>
          <xs:element name="price" type="Price" minOccurs="0" maxOccurs="unbounded" />
          <xs:element name="quantity" type="StockReportQuantityState" maxOccurs="unbounded" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="StockReportQuantityState">
    <xs:complexContent>
      <xs:extension base="StockReportQuantity">
        <xs:sequence>
          <xs:element name="quantityState" type="StockReportQuantity" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="StockReportQuantity">
    <xs:attribute name="type" type="xs:string" />
    <xs:attribute name="value" type="xs:decimal" />
  </xs:complexType>

  <!-- INVRPT -->

  <xs:element name="inventoryReport">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="supplier" type="Party" minOccurs="0" />
            <xs:element name="buyer" type="Party" minOccurs="0" />

            <xs:element name="site" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="location" type="Party" />
                  <xs:element name="item" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:complexContent>
                        <xs:extension base="ItemDetail">
                          <xs:sequence>
                            <xs:element name="incoming" minOccurs="0" maxOccurs="unbounded">
                              <xs:complexType>
                                <xs:attribute name="date" type="DateOptTimeZ" />
                                <xs:attribute name="quantity" type="xs:decimal" use="required" />
                              </xs:complexType>
                            </xs:element>
                          </xs:sequence>
                          <xs:attribute name="quantity" type="xs:decimal" use="required" />
                          <xs:attribute name="allocQuantity" type="xs:decimal" />
                          <xs:attribute name="targetQuantity" type="xs:decimal" />
                        </xs:extension>
                      </xs:complexContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
                <xs:attribute name="name" type="xs:string" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <!-- RELOCATIONOFGOODS -->

  <xs:element name="relocationOfGoods">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="supplier" type="Party" minOccurs="0" />
            <xs:element name="buyer" type="Party" minOccurs="0" />
            <xs:element name="shipFrom" type="Party" minOccurs="0" />
            <xs:element name="shipTo" type="Party" minOccurs="0" />
            <xs:element name="shipper" type="Party" minOccurs="0" />

            <xs:element name="item" maxOccurs="unbounded">
              <xs:complexType>
                <xs:complexContent>
                  <xs:extension base="ItemDetail">
                    <xs:attribute name="inTransitQuantity" type="xs:decimal" />
                  </xs:extension>
                </xs:complexContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="dateFrom" type="DateOptTimeZ" />
          <xs:attribute name="dateTo" type="DateOptTimeZ" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <!-- RETURNANNOUNCEMENT -->

  <xs:element name="returnAnnouncement">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="supplier" type="Party" />
            <xs:element name="buyer" type="Party" />
            <xs:element name="site" type="Party" minOccurs="0" />
            <xs:element name="item" type="ReturnAnnouncementItemDetail" maxOccurs="unbounded" />
          </xs:sequence>
          <xs:attribute name="currency" type="xs:string" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="ReturnAnnouncementItemDetail">
    <xs:complexContent>
      <xs:extension base="ItemDetail">
        <xs:sequence>
          <xs:element name="price" type="Price" minOccurs="0" maxOccurs="unbounded" />
          <xs:element name="quantity" type="ReturnAnnouncementQuantity" maxOccurs="unbounded" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="ReturnAnnouncementQuantity">
    <xs:sequence>
      <xs:element name="quantityReason" type="ReturnAnnouncementQuantityReason" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="type" type="xs:string" />
    <xs:attribute name="value" type="xs:decimal" />
  </xs:complexType>

  <xs:complexType name="ReturnAnnouncementQuantityReason">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="code" type="xs:string" />
        <xs:attribute name="value" type="xs:decimal" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <!-- COMMUNICATIONEVENT -->

  <xs:element name="communicationEvent">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="log" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <!-- For referencing items by documentReference -->
                    <xs:attribute name="documentType" type="DocumentReferenceDocumentType" />
                    <xs:attribute name="id" type="xs:string" />
                    <xs:attribute name="date" type="DateOptTimeZ" />
                    <xs:attribute name="lineNo" type="xs:string" />
                    <xs:attribute name="parentLineNo" type="xs:string" />
                    <!-- For referencing location by XPath -->
                    <xs:attribute name="xpath" type="xs:string" />
                    <!-- For human readable location reference -->
                    <xs:attribute name="location" type="xs:string" />
                    <!-- Comma-separated list of related properties (elements, attributes) -->
                    <xs:attribute name="properties" type="xs:string" />
                    <!-- Log severity -->
                    <xs:attribute name="severity" type="Severity" />
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
            <xs:element name="payload" minOccurs="0" maxOccurs="1">
              <xs:complexType>
                <xs:choice>
                  <xs:element name="binary" type="xs:base64Binary" />
                  <xs:element name="cdata" type="xs:string" />
                  <xs:element name="xml">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:any processContents="skip" />
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                </xs:choice>
                <xs:attribute name="contentType" type="xs:string" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>

          <xs:attribute name="refId" type="xs:string" />
          <xs:attribute name="messageClass" type="xs:string">
            <xs:annotation>
              <xs:documentation>
                PRICAT, ORDERS, ORDRSP, DESADV, INVOIC, SLSRPT, INVRPT, RELOCA, REMADV, RECADV, COMEVE, PRECAT, PARCAT, COMEVE, ORDRFT, INDRFT
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="outcome">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="Received" />
                <xs:enumeration value="Delivered" />
                <xs:enumeration value="Validated" />
                <xs:enumeration value="OnHold" />
                <xs:enumeration value="Discarded" />
                <xs:enumeration value="NotReceived" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          <xs:attribute name="severity" type="Severity" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="Severity">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Information" />
      <xs:enumeration value="Warning" />
      <xs:enumeration value="Error" />
    </xs:restriction>
  </xs:simpleType>

  <!-- PRESENTATIONCATALOG -->

  <xs:element name="presentationCatalog">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="supplier" type="Party" minOccurs="1" />
            <xs:element name="itemPresentation" type="ItemPresentation" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="ItemPresentation">
    <xs:sequence>
      <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="dimension" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="image" type="Image" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <!-- GENERALTEXT -->

  <xs:element name="generalText">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="supplier" type="Party" minOccurs="0" />
            <xs:element name="buyer" type="Party" minOccurs="0" />

            <xs:element name="shipper" type="Party" minOccurs="0" />
            <xs:element name="shipFrom" type="Party" minOccurs="0" />
            <xs:element name="shipTo" type="Party" minOccurs="0" />
            <xs:element name="consignee" type="Party" minOccurs="0" />

            <xs:element name="manufacturer" type="Party" minOccurs="0" />
            <xs:element name="location" type="Party" minOccurs="0" />
            <xs:element name="site" type="Party" minOccurs="0" />

            <xs:element name="buyerAgent" type="Party" minOccurs="0" />
            <xs:element name="supplierAgent" type="Party" minOccurs="0" />
            <xs:element name="taxCollector" type="Party" minOccurs="0" />

            <xs:element name="freeText" type="FreeText" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="FreeText">
    <xs:simpleContent>
      <xs:extension base="CodedValue">
        <xs:attribute name="type" type="xs:string" />
        <xs:attribute name="language" type="xs:language" />
        <xs:attribute name="registry" type="Registry" />
        <xs:attribute name="lineNo" type="xs:int" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <!-- -->

  <xs:simpleType name="Registry">
    <xs:restriction base="xs:string">
      <xs:enumeration value="b24" />
      <xs:enumeration value="Supplier" />
      <xs:enumeration value="Manufacturer" />
      <xs:enumeration value="Buyer" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="DateOptTimeZ">
    <xs:union memberTypes="xs:date xs:dateTime" />
  </xs:simpleType>
  
  <!--PARTYDATA-->

  <xs:element name="partyData">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="party" type="PartyDataParty" minOccurs="1" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="PartyDataParty">
    <xs:complexContent>
      <xs:extension base="Party">
        <xs:attribute name="isActive" type="xs:boolean" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- QUOTES -->

  <xs:element name="quotes">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Message">
          <xs:sequence>
            <xs:element name="supplier" type="Party" minOccurs="1" />
            <xs:element name="buyer" type="Party" minOccurs="1" />
            <xs:element name="site" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="location" type="Party" />
                  <xs:element name="property" type="ExtendedProperty" minOccurs="0" maxOccurs="unbounded" />
                  <xs:element name="item" type="QuotesItemDetail" maxOccurs="unbounded" />
                </xs:sequence>
                <xs:attribute name="name" type="xs:string" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="type" type="xs:string" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="QuotesItemDetail">
    <xs:complexContent>
      <xs:extension base="ItemDetailRequiredId">
        <xs:sequence>
          <xs:element name="quantity" minOccurs="0" maxOccurs="unbounded">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="quantityState" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:attribute name="type" type="xs:string" />
                    <xs:attribute name="value" type="xs:decimal" />
                  </xs:complexType>
                </xs:element>
                <xs:element name="date" minOccurs="0">
                  <xs:complexType>
                    <xs:attribute name="type" type="xs:string" />
                    <xs:attribute name="value" type="DateOptTimeZ" />
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
              <xs:attribute name="type" type="xs:string" />
              <xs:attribute name="value" type="xs:decimal" />
            </xs:complexType>
          </xs:element>
          <xs:element name="priceBracket" type="QuotesPriceBracket" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="action" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="QuotesPriceBracket">
    <xs:complexContent>
      <xs:extension base="PriceBase">
        <xs:attribute name="type" type="xs:string" />
        <xs:attribute name="validShipDateFrom" type="DateOptTimeZ" />
        <xs:attribute name="validShipDateTo" type="DateOptTimeZ" />
        <xs:attribute name="quantity" type="xs:integer" />
        <xs:attribute name="code" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

</xs:schema>
