<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns="http://www.eyetrack.com.au/schema"
           targetNamespace="http://www.eyetrack.com.au/schema"
           elementFormDefault="unqualified">

  <xs:element name="ContentVersion" type="xs:decimal"/>

  <xs:element name="SendingApplication" type="xs:string"/>

  <xs:element name="Authentication" type="xs:string"/>

  <xs:element name="Code" type="nonEmptyString"/>

  <xs:simpleType name="nonEmptyString">
    <xs:restriction base="xs:string">
      <xs:minLength value="1"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="Quantity" type="gtZeroInt"/>

  <xs:simpleType name="gtZeroInt">
    <xs:restriction base="xs:integer">
      <xs:minExclusive value="0"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="SourceCode" type="xs:string"/>

  <xs:element name="SourceDescription" type="xs:string"/>

  <xs:element name="Description" type="xs:string"/>

  <xs:element name="Barcode" type="xs:string"/>

  <xs:element name="TimingInformation" type="TimingInformation"/>

  <xs:element name="SupplierInformation" type="SupplierInformation"/>

  <xs:element name="DeliveryInformation" type="DeliveryInformation"/>

  <xs:element name="InvoiceInformation" type="InvoiceInformation"/>

  <xs:element name="TrackingInformation" type="TrackingInformation"/>

  <xs:element name="RemakeInformation" type="RemakeInformation"/>

  <xs:element name="LabelInformation" type="LabelInformation"/>

  <xs:element name="FinancialDefinition" type="FinancialDefinition"/>

  <xs:complexType name="TimingInformation">
    <xs:sequence>
      <xs:element ref="EndCustomerOrderTimestamp"/>
      <xs:element ref="CurrentOrderTimestamp"/>
      <xs:element minOccurs="0" ref="RequiredByTimestamp"/>
      <xs:element ref="PriorityLevel"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="EndCustomerOrderTimestamp" type="xs:dateTime"/>
  <xs:element name="CurrentOrderTimestamp" type="xs:dateTime"/>
  <xs:element name="RequiredByTimestamp" type="xs:dateTime"/>
  <xs:element name="PriorityLevel" type="xs:integer"/>

  <xs:simpleType name="PhoneNumber">
    <xs:restriction base="xs:string">      
      <xs:pattern value="(^[0-9\+\(]{1})(\d|\)|\s)+"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="EmailAddress">
    <xs:restriction base="xs:string">
      <xs:pattern value="(|[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:complexType name="PhoneNumbers">
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="PhoneNumber"/>
      </xs:sequence>
  </xs:complexType>

  <xs:element name="PhoneNumber" type="PhoneNumber"/>
  
  <xs:complexType name="Address">
    <xs:sequence>
      <xs:element ref="AddressLine1"/>
      <xs:element ref="AddressLine2"/>
      <xs:element ref="AddressLine3"/>
      <xs:element ref="AddressLine4"/>
      <xs:element ref="AddressLine5"/>
      <xs:element ref="AddressLine6"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="AddressLine1" type="xs:string"/>
  <xs:element name="AddressLine2" type="xs:string"/>
  <xs:element name="AddressLine3" type="xs:string"/>
  <xs:element name="AddressLine4" type="xs:string"/>
  <xs:element name="AddressLine5" type="xs:string"/>
  <xs:element name="AddressLine6" type="xs:string"/>
  
  <xs:complexType name="ContactDetails">
    <xs:sequence>
      <xs:element minOccurs="0" ref="PhoneNumbers"/>
      <xs:element minOccurs="0" ref="EmailAddress"/>
      <xs:element minOccurs="0" ref="Address"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="PhoneNumbers" type="PhoneNumbers"/>
  <xs:element name="EmailAddress" type="EmailAddress"/>
  <xs:element name="Address" type="Address"/>

  <xs:element name="ContactDetails" type="ContactDetails"/>

  <xs:group name="Person">
    <xs:sequence>
      <xs:element ref="Title"/>
      <xs:element ref="FirstName"/>
      <xs:element ref="LastName"/>
      <xs:element minOccurs="0" ref="DateOfBirth"/>
      <xs:element minOccurs="0" ref="Gender"/>
    </xs:sequence>
  </xs:group>

  <xs:element name="Title" type="xs:string"/>
  <xs:element name="FirstName" type="xs:string"/>
  <xs:element name="LastName" type="xs:string"/>
  <xs:element name="DateOfBirth" type="xs:date"/>
  <xs:element name="Gender">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="MALE|FEMALE"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <xs:complexType name="Organisation">
    <xs:sequence>
      <xs:element maxOccurs="1" ref="Code"/>
    </xs:sequence>
  </xs:complexType>
  
  <xs:element name="Organisation" type="Organisation"/>

  <xs:complexType name="SupplierInformation">
    <xs:sequence>
      <xs:element ref="Organisation"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="DeliveryInformation">
    <xs:sequence>
      <xs:element ref="Organisation"/>
      <xs:element ref="ContactDetails"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="InvoiceInformation">
    <xs:sequence>
      <xs:element ref="Organisation"/>
      <xs:element ref="ContactDetails"/>
    </xs:sequence>
  </xs:complexType>

  <xs:simpleType name="TrackingItemTypes">
    <xs:restriction base="xs:string">
      <xs:pattern value="END_CUSTOMER_UNIQUE_ID|END_CUSTOMER_REFERENCE|EYETRACK_REFERENCE">
        <xs:annotation>
          <xs:documentation>The only allowable values for the TrackingItemTypes are listed here</xs:documentation>
        </xs:annotation>
      </xs:pattern>
      <xs:enumeration value="END_CUSTOMER_UNIQUE_ID">
        <xs:annotation>
          <xs:documentation>The End Customer Unique ID *MUST* be permanently unique for a given Company Code</xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="END_CUSTOMER_REFERENCE">
        <xs:annotation>
          <xs:documentation>The End Customer Reference does not have to be unique</xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="EYETRACK_REFERENCE">
        <xs:annotation>
          <xs:documentation>The Eyetrack Reference is assigned by EyeTrack</xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="TrackingItem">
    <xs:sequence>
      <xs:element ref="TrackingItemType"/>
      <xs:element ref="TrackingItemValue"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="TrackingItemType" type="TrackingItemTypes"/>
  <xs:element name="TrackingItemValue" type="nonEmptyString"/>
  
  <xs:complexType name="TrackingInformation">
    <xs:sequence>
      <xs:element maxOccurs="unbounded" ref="TrackingItem"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="RemakeInformation">
    <xs:sequence>
      <xs:element ref="RemakeNumber"/>
      <xs:element ref="PreviousOrder"/>
      <xs:element ref="OriginalOrder"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="RemakeNumber" type="gtZeroInt"/>

  <xs:element name="PreviousOrder">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="TrackingInformation"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="OriginalOrder">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="TrackingInformation"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="TrackingItem" type="TrackingItem"/>

  <xs:complexType name="LabelItem">
    <xs:sequence>
      <xs:element ref="LabelItemType"/>
      <xs:element ref="LabelItemValue"/>
    </xs:sequence>
  </xs:complexType>

  <xs:simpleType name="LabelItemTypes">
    <xs:restriction base="xs:string">
      <xs:enumeration value="BARCODE_1"/>
      <!--
      <xs:enumeration value="BARCODE_2"/>
      <xs:enumeration value="BARCODE_3"/>
      -->
      <xs:enumeration value="BARCODE_1_DESCRIPTION"/>
      <!--
      <xs:enumeration value="BARCODE_2_DESCRIPTION"/>
      <xs:enumeration value="BARCODE_3_DESCRIPTION"/>
      -->
    </xs:restriction>
  </xs:simpleType>
  
  <xs:element name="LabelItemType" type="LabelItemTypes"/>
  <xs:element name="LabelItemValue" type="nonEmptyString"/>

  <xs:complexType name="LabelInformation">
    <xs:sequence>
      <xs:element maxOccurs="unbounded" ref="LabelItem"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="LabelItem" type="LabelItem"/>

  <xs:complexType name="FinancialDefinition">
    <xs:sequence>
      <xs:element minOccurs="0" ref="ExpectedCostExTax"/>
      <xs:element minOccurs="0" ref="ExpectedCostTax"/>
    </xs:sequence>
  </xs:complexType>

  <xs:simpleType name="gtZeroDec">
    <xs:restriction base="xs:decimal">
      <xs:minExclusive value="0"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="gteqZeroDec">
    <xs:restriction base="xs:decimal">
      <xs:minInclusive value="0"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="ExpectedCostExTax" type="gteqZeroDec"/>
  <xs:element name="ExpectedCostTax" type="gteqZeroDec"/>
  
</xs:schema>
