<?xml version="1.0" encoding="UTF-8"?>
<!--
Version : 3.0.39
-->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="SchedulingPeriod">
    <xs:complexType>
      <xs:all> 
        <xs:element name="StartDate"         type="xs:date"/>
        <xs:element name="EndDate"           type="xs:date"/>
        <xs:element name="Skills"            type="Skills"       minOccurs="0"/>  <!-- Obsolete -->
        <xs:element name="SkillGroups"       type="SkillGroups"  minOccurs="0"/>
        <xs:element name="ShiftTypes"        type="ShiftTypes"   minOccurs="0"/>
        <xs:element name="ShiftGroups"       type="ShiftGroups"  minOccurs="0"/>
        <xs:element name="ShiftBlocks"       type="ShiftBlocks"  minOccurs="0"/>
        <xs:element name="Contracts"         type="Contracts"    minOccurs="0"/>
        <xs:element name="Employees"         type="Employees"    minOccurs="0"/>
        <xs:element name="Rules"             type="Rules"        minOccurs="0"/>
        <xs:element name="EmployeePairings"  type="EmployeePairings"  minOccurs="0"/>
        <xs:element name="CoverRequirements" type="CoverRequirements" minOccurs="0"/> 
        <xs:element name="CoverWeights"      type="CoverWeights"      minOccurs="0"/> 
        <xs:element name="DayOffRequests"    type="DayOffRequests"    minOccurs="0"/>  
        <xs:element name="DayOnRequests"     type="DayOnRequests"     minOccurs="0"/>  
        <xs:element name="ShiftOffRequests"  type="ShiftOffRequests"  minOccurs="0"/> 
        <xs:element name="ShiftOnRequests"   type="ShiftOnRequests"   minOccurs="0"/>  
        <xs:element name="FixedAssignments"  type="FixedAssignments"  minOccurs="0"/>
      </xs:all>
      <xs:attribute name="ID"             type="xs:string" use="optional"/>
      <xs:attribute name="OrganisationID" type="xs:string" use="optional"/> <!-- Obsolete -->
    </xs:complexType>

    <!-- Define Keys to ensure no duplicate ID's within elements -->
    <xs:key name="SkillID">    <!-- Obsolete -->
      <xs:selector xpath="Skills/Skill"/>
      <xs:field xpath="@ID"/>
    </xs:key>
    
    <xs:key name="SkillGroupID">
      <xs:selector xpath="SkillGroups/SkillGroup"/>
      <xs:field xpath="@ID"/>
    </xs:key>
    <xs:key name="ShiftID">
      <xs:selector xpath="ShiftTypes/Shift"/>
      <xs:field xpath="@ID"/>
    </xs:key>
    <xs:key name="ShiftGroupID">
      <xs:selector xpath="ShiftGroups/ShiftGroup"/>
      <xs:field xpath="@ID"/>
    </xs:key>
    <xs:key name="ShiftBlockID">
      <xs:selector xpath="ShiftBlocks/ShiftBlock"/>
      <xs:field xpath="@ID"/>
    </xs:key>
    <xs:key name="ContractID">
      <xs:selector xpath="Contracts/Contract"/>
      <xs:field xpath="@ID"/>
    </xs:key>
    <xs:key name="EmployeeID">
      <xs:selector xpath="Employees/Employee"/>
      <xs:field xpath="@ID"/>
    </xs:key>
   
  </xs:element>

  <xs:complexType name="Skills"> <!-- Obsolete -->
    <xs:sequence>
      <xs:element name="Skill" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:all>
            <xs:element name="Label" type="xs:string" minOccurs="1"/>
          </xs:all>
          <xs:attribute name="ID" type="ID" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="SkillGroups">
    <xs:sequence>
      <xs:element name="SkillGroup" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Skill" minOccurs="1" maxOccurs="unbounded" type="ID"/>
          </xs:sequence>
          <xs:attribute name="ID" type="ID" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="ShiftTypes">
    <xs:sequence>
      <xs:element name="Shift" maxOccurs="unbounded" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element name="StartTime"    type="TimeOfDay" minOccurs="0"/> 
            <xs:element name="EndTime"      type="TimeOfDay" minOccurs="0"/>
            <xs:element name="Duration"     type="xs:nonNegativeInteger" minOccurs="0"/>
            <xs:element name="Name"         type="xs:string" minOccurs="0"/>
            <xs:element name="Label"        type="xs:string" minOccurs="0"/>
            <xs:element name="Color"        type="xs:string" minOccurs="0"/>
            <xs:element name="TimeUnits"    type="nonNegativeDouble" minOccurs="0"/>
            <xs:element name="AutoAllocate" type="xs:boolean" minOccurs="0"/>
            <xs:element name="TimePeriods"  minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="TimePeriod" minOccurs="0" maxOccurs="unbounded" type="TimePeriod"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="Resources" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Resource" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="nonNegativeDouble">
                          <xs:attribute name="ID"   type="xs:string" use="optional"/>
                          <xs:attribute name="Cell" type="xs:nonNegativeInteger" use="optional"/> <!-- Obsolete -->
                          <xs:attribute name="Day"  type="xs:nonNegativeInteger" use="optional"/>
                          <xs:attribute name="Date" type="xs:date" use="optional"/>
                          <xs:attribute name="DayOfWeek" type="WeekDay" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:all>
          <xs:attribute name="ID" type="ID" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="ShiftGroups">
    <xs:sequence>
      <xs:element name="ShiftGroup" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Shift" minOccurs="1" maxOccurs="unbounded" type="ID"/>
          </xs:sequence>
          <xs:attribute name="ID" type="ID" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="ShiftBlocks">
    <xs:sequence>
      <xs:element name="ShiftBlock" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Shift" minOccurs="1" maxOccurs="unbounded" type="xs:string"/>
          </xs:sequence>
          <xs:attribute name="ID" type="ID" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="Contracts">
    <xs:sequence>
      <xs:element name="Contract" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:choice>
              <xs:element name="Label" type="xs:string"/>
              <xs:element name="Workload" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="TimeUnits" type="TimeUnits" minOccurs="1" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Patterns">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Match" type="Match" minOccurs="1" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Conditionals">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Conditional" type="Conditional" minOccurs="1" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="MultipleShiftsPerDay">
                <xs:complexType>
                  <xs:sequence minOccurs="0" maxOccurs="unbounded">
                    <xs:choice>
                      <xs:element name="ValidGroup">
                        <xs:complexType>
                          <xs:sequence>
                            <xs:element name="Shift" minOccurs="1" maxOccurs="unbounded" type="ID"/>
                          </xs:sequence>
                        </xs:complexType>
                      </xs:element>
                      <xs:element name="MinRestTime">
                        <xs:complexType>
                          <xs:simpleContent>
                            <xs:extension base="xs:double">
                              <xs:attribute name="shift"      type="xs:string" use="optional"/>
                              <xs:attribute name="shiftGroup" type="xs:string" use="optional"/>
                            </xs:extension>
                          </xs:simpleContent>
                        </xs:complexType>
                      </xs:element>
                    </xs:choice>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="MinRestTime">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:double">
                      <xs:attribute name="weight"     type="nonNegativeDouble" use="optional"/>  
                      <xs:attribute name="label"      type="xs:string" use="optional"/>
                      <xs:attribute name="shift"      type="xs:string" use="optional"/>
                      <xs:attribute name="shiftGroup" type="xs:string" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="DailyRest">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:double">
                      <xs:attribute name="dayStart"   type="TimeOfDay" use="optional"/>  
                      <xs:attribute name="weight"     type="nonNegativeDouble" use="optional"/>  
                      <xs:attribute name="label"      type="xs:string" use="optional"/>
                      <xs:attribute name="restShifts" type="xs:string" use="optional"/>
                      <xs:attribute name="nextDayException" type="xs:string" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="RestBetweenDates">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:double">
                      <xs:attribute name="start"      type="DateTime" use="required"/>
                      <xs:attribute name="end"        type="DateTime" use="required"/>
                      <xs:attribute name="weight"     type="nonNegativeDouble" use="optional"/>  
                      <xs:attribute name="label"      type="xs:string" use="optional"/>
                      <xs:attribute name="restShifts" type="xs:string" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="MinTot" type="TotSeq" minOccurs="0"/>
              <xs:element name="MaxTot" type="TotSeq" minOccurs="0"/>
              <xs:element name="MinSeq" type="TotSeq" minOccurs="0"/>
              <xs:element name="MaxSeq" type="TotSeq" minOccurs="0"/>
              <xs:element name="MaxWeekends" type="TotWeekends" minOccurs="0"/>
              <xs:element name="MinWeekends" type="TotWeekends" minOccurs="0"/>
              <xs:element name="ValidShifts" minOccurs="0">
                <xs:complexType>
                  <xs:attribute name="shift" type="xs:string" use="required"/>
                </xs:complexType>
              </xs:element>
              <xs:element name="NonValidShifts" minOccurs="0">
                <xs:complexType>
                  <xs:attribute name="shift" type="xs:string" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </xs:sequence>
          <xs:attribute name="ID" type="ID" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="Employees">
    <xs:sequence>
      <xs:element name="Employee" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="ContractID" type="ID"/>
              <xs:element name="InRoster"   type="xs:boolean"/> <!-- Obsolete -->
              <xs:element name="Name"       type="xs:string"/>
              <xs:element name="Skills">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Skill" type="ID" minOccurs="1" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="CoverResources">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="CoverResource" minOccurs="1" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="Shift" minOccurs="1" maxOccurs="unbounded">
                            <xs:complexType>
                              <xs:simpleContent>
                                <xs:extension base="nonNegativeDouble">
                                  <xs:attribute name="ID" type="xs:string" use="required"/>
                                </xs:extension>
                              </xs:simpleContent>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                        <xs:attribute name="ID" type="xs:string" use="required"/>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </xs:sequence>
          <xs:attribute name="ID" type="ID" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
    
  <xs:complexType name="Rules">
    <xs:sequence>
      <xs:element name="Rule" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="penalty" type="xs:string" use="required"/>
              <xs:attribute name="label"   type="xs:string" use="optional"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="EmployeePairings">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="Pair" type="EmployeePair"/>
      <xs:element name="NotPair" type="EmployeePair"/>
    </xs:choice>
  </xs:complexType>
  
  <xs:complexType name="EmployeePair">
    <xs:all>
      <xs:element name="Label"    type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Day"      type="xs:nonNegativeInteger" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Cell"     type="xs:nonNegativeInteger" minOccurs="0" maxOccurs="1"/> <!-- Obsolete -->
      <xs:element name="Days"     type="Indexes" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Cells"    type="Indexes" minOccurs="0" maxOccurs="1"/> <!-- Obsolete -->
      <xs:element name="Excludes" type="Indexes" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Weight"   type="nonNegativeDouble" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Matches" minOccurs="1" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Match" type="PairMatchAssignments" minOccurs="1" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:all>
  </xs:complexType>
    
  <xs:complexType name="PairMatchAssignments">
    <xs:sequence>
      <xs:element name="Assignment" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Employee" type="ID" minOccurs="1"/>
            <xs:choice minOccurs="1" maxOccurs="unbounded">
              <xs:element name="Shift">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string"> <!-- string instead of ID as can be * -->
                      <xs:attribute name="offset" type="xs:integer" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="ShiftGroup">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string"> <!-- string instead of ID as can be * -->
                      <xs:attribute name="offset" type="xs:integer" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="Indexes">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="Cell"      type="xs:nonNegativeInteger"/> <!-- Obsolete -->
      <xs:element name="Day"       type="xs:nonNegativeInteger"/>
      <xs:element name="DayOfWeek" type="WeekDay"/>
      <xs:element name="Date"      type="xs:date"/>
    </xs:choice>
  </xs:complexType>
  
  <xs:complexType name="TimeUnits">
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element name="Max"             type="MinMaxCountDouble"/>
        <xs:element name="Min"             type="MinMaxCountDouble"/>
        <xs:element name="RegionStart"     type="xs:nonNegativeInteger"/>
        <xs:element name="RegionStartDate" type="xs:date"/>
        <xs:element name="RegionEnd"       type="xs:nonNegativeInteger"/>
        <xs:element name="RegionEndDate"   type="xs:date"/>
        <xs:element name="ShiftGroup"      type="xs:string"/>
        <xs:element name="Resource"        type="xs:string"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="Match">
    <xs:sequence>
     <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element name="Max"             type="MinMaxCountInteger"/>
        <xs:element name="Min"             type="MinMaxCountInteger"/>
        <xs:element name="RegionStart"     type="xs:nonNegativeInteger"/>
        <xs:element name="RegionStartDate" type="xs:date"/>
        <xs:element name="RegionEnd"       type="xs:nonNegativeInteger"/>
        <xs:element name="RegionEndDate"   type="xs:date"/>
        <xs:element name="Pattern"         type="Pattern"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="Pattern">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Start"     type="xs:nonNegativeInteger"/>
        <xs:element name="StartDay"  type="WeekDay"/>
        <xs:element name="StartDate" type="xs:date"/>
        <xs:element name="Starts"    type="Indexes"/>
        <xs:element name="StartExcludes" type="Indexes"/>
      </xs:choice>
      <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element name="Shift"      type="xs:string"/> <!-- Type is string as it could be a day off i.e. '-' or '*' or '$' etc. -->
        <xs:element name="NotShift"   type="xs:string"/>
        <xs:element name="ShiftGroup" type="xs:string"/>
        <xs:element name="NotGroup"   type="xs:string"/> 
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="Conditional">
    <xs:all>
      <xs:element name="Label"  type="xs:string" minOccurs="0"/>
      <xs:element name="If"     type="xs:string"/>
      <xs:element name="Then"   type="xs:string"/>
      <xs:element name="Weight" type="nonNegativeDouble" minOccurs="0"/>
    </xs:all>
  </xs:complexType>
  
  <xs:complexType name="MinMaxCountInteger"> 
    <xs:all>
      <xs:element name="Count"  type="xs:nonNegativeInteger"/>
      <xs:element name="Weight" type="WeightAndFunction" minOccurs="0"/>
      <xs:element name="Label"  type="xs:string" minOccurs="0"/>
      <xs:element name="Var"    type="ID" minOccurs="0"/>
    </xs:all>
  </xs:complexType>
  
  <xs:complexType name="MinMaxCountDouble"> 
    <xs:all>
      <xs:element name="Count"  type="nonNegativeDouble"/>
      <xs:element name="Weight" type="WeightAndFunction" minOccurs="0"/>
      <xs:element name="Label"  type="xs:string" minOccurs="0"/>
      <xs:element name="Var"    type="ID" minOccurs="0"/>
    </xs:all>
  </xs:complexType>

  <xs:complexType name="TotSeq">
    <xs:attribute name="value"    type="xs:nonNegativeInteger" use="required"/>
    <xs:attribute name="weight"   type="nonNegativeDouble"     use="optional"/>
    <xs:attribute name="function" type="Function"  use="optional"/>
    <xs:attribute name="shift"    type="xs:string" use="optional"/>
    <xs:attribute name="label"    type="xs:string" use="optional"/>
    <xs:attribute name="start"    type="xs:string" use="optional"/>
    <xs:attribute name="end"      type="xs:string" use="optional"/>
  </xs:complexType>
  
  <xs:complexType name="TotWeekends">
    <xs:attribute name="value"       type="xs:nonNegativeInteger" use="required"/>
    <xs:attribute name="weight"      type="nonNegativeDouble"     use="optional"/>
    <xs:attribute name="function"    type="Function"   use="optional"/>
    <xs:attribute name="ignoreShift" type="xs:string"  use="optional"/>
    <xs:attribute name="label"       type="xs:string"  use="optional"/>
    <xs:attribute name="regionStart" type="xs:string"  use="optional"/>
    <xs:attribute name="regionEnd"   type="xs:string"  use="optional"/>
    <xs:attribute name="startDay"    type="WeekDay"    use="required"/>
    <xs:attribute name="endDay"      type="WeekDay"    use="required"/>
    <xs:attribute name="startTime"   type="TimeOfDay"  use="required"/>
    <xs:attribute name="endTime"     type="TimeOfDay"  use="required"/>
    <xs:attribute name="countShifts"    type="xs:boolean" use="optional"/>
    <xs:attribute name="shiftStartOnly" type="xs:boolean" use="optional"/>
    <xs:attribute name="isSeq"          type="xs:boolean" use="optional"/>
    <xs:attribute name="previousSeq"    type="xs:nonNegativeInteger" use="optional"/>
  </xs:complexType>
  
  <xs:complexType name="CoverRequirements">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="CoverReq">
        <xs:complexType>
          <xs:sequence>
            <xs:choice>
              <xs:element name="Date" type="xs:date"/>
              <xs:element name="Day"  type="WeekDayOrInt"/>
            </xs:choice>
            <xs:element name="Cover" type="Cover" minOccurs="1" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="DayOfWeekCover"> <!-- Obsolete -->
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Day"   type="WeekDay"/>
            <xs:element name="Cover" type="Cover" minOccurs="1" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="DateSpecificCover"> <!-- Obsolete -->
        <xs:complexType>
          <xs:sequence>
            <xs:choice>
              <xs:element name="Date" type="xs:date"/>
              <xs:element name="Day"  type="xs:nonNegativeInteger"/>
              <xs:element name="Cell" type="xs:nonNegativeInteger"/>
            </xs:choice>
            <xs:element name="Cover" type="Cover" minOccurs="1" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>
   
  <xs:complexType name="Cover">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Skill"      type="xs:string"/>
        <xs:element name="SkillGroup" type="xs:string"/>
        <xs:element name="TimePeriod" type="CoverTimePeriod"/>
        <xs:element name="Shift"      type="xs:string"/>
        <xs:element name="ShiftGroup" type="xs:string"/>
        <xs:element name="ShiftBlock" type="xs:string"/>
        <xs:element name="Min"        type="CoverConstraint"/>
        <xs:element name="Max"        type="CoverConstraint"/>
        <xs:element name="Preferred"  type="CoverConstraint"/> <!-- Obsolete -->
        <xs:element name="Label"      type="xs:string"/>
        <xs:element name="CoverResource" type="xs:string"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="CoverConstraint">
    <xs:simpleContent>
      <xs:extension base="nonNegativeDouble">
        <xs:attribute name="function" type="FunctionCover" use="optional"/>
        <xs:attribute name="weight" type="nonNegativeDouble" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  
  <xs:complexType name="TimePeriod">
    <xs:all>
      <xs:element name="Start" type="TimeOfDay" minOccurs="1"/>
      <xs:element name="End"   type="TimeOfDay" minOccurs="1"/>
    </xs:all>
  </xs:complexType>
  
  <xs:complexType name="CoverTimePeriod">
    <xs:all>
      <xs:element name="Start" type="TimeOfDay" minOccurs="1"/>
      <xs:element name="End"   type="TimeOfDay" minOccurs="1"/>
    </xs:all>
    <xs:attribute name="allowSplit" type="xs:boolean" use="optional"/>
    <xs:attribute name="shift"      type="xs:string"  use="optional"/>
    <xs:attribute name="shiftGroup" type="xs:string"  use="optional"/>
  </xs:complexType>
  
  <xs:complexType name="WeightAndFunction">
    <xs:simpleContent>
      <xs:extension base="nonNegativeDouble">
        <xs:attribute name="function" type="Function" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  
   <!-- Obsolete -->
  <xs:complexType name="WeightAndFunctionCover">
    <xs:simpleContent>
      <xs:extension base="nonNegativeDouble">
        <xs:attribute name="function" type="FunctionCover" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  
  <!-- Obsolete -->
  <xs:complexType name="CoverWeights"> 
    <xs:all>
      <xs:element name="PrefOverStaffing"  type="WeightAndFunctionCover" minOccurs="0"/>
      <xs:element name="PrefUnderStaffing" type="WeightAndFunctionCover" minOccurs="0"/>
      <xs:element name="MaxOverStaffing"   type="WeightAndFunctionCover" minOccurs="0"/> 
      <xs:element name="MinUnderStaffing"  type="WeightAndFunctionCover" minOccurs="0"/>
    </xs:all>
  </xs:complexType>
  
  <xs:complexType name="DayOffRequests">
    <xs:sequence>
      <xs:element name="DayOff" type="DayOnOff" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>      

  <xs:complexType name="DayOnRequests">
    <xs:sequence>
      <xs:element name="DayOn" type="DayOnOff" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="DayOnOff">
    <xs:all>
      <xs:element name="EmployeeID" minOccurs="1" type="ID"/>
      <xs:element name="Date"       minOccurs="0" type="xs:date"/>
      <xs:element name="Day"        minOccurs="0" type="xs:nonNegativeInteger"/> <!-- Starts at zero -->
      <xs:element name="Cell"       minOccurs="0" type="xs:nonNegativeInteger"/> <!-- Obsolete -->
    </xs:all>
    <xs:attribute name="weight" type="nonNegativeDouble" use="required"/>
  </xs:complexType>

  <xs:complexType name="ShiftOffRequests">
    <xs:sequence>
      <xs:element name="ShiftOff" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:all>
            <xs:element name="ShiftTypeID" minOccurs="0" type="ID"/>
            <xs:element name="Shift"       minOccurs="0" type="ID"/>
            <xs:element name="EmployeeID"  minOccurs="1" type="ID"/>
            <xs:element name="Date"        minOccurs="0" type="xs:date"/>
            <xs:element name="Day"         minOccurs="0" type="xs:nonNegativeInteger"/> <!-- Starts at zero -->
            <xs:element name="Cell"        minOccurs="0" type="xs:nonNegativeInteger"/> <!-- Obsolete -->
          </xs:all>
          <xs:attribute name="weight" type="nonNegativeDouble" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType> 
  
  <xs:complexType name="ShiftOnRequests">
    <xs:sequence>
      <xs:element name="ShiftOn" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:all>
            <xs:element name="ShiftTypeID"  minOccurs="0" type="ID"/>
            <xs:element name="Shift"        minOccurs="0" type="ID"/>
            <xs:element name="ShiftGroupID" minOccurs="0" type="ID"/>
            <xs:element name="ShiftGroup"   minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Shift" minOccurs="1" maxOccurs="unbounded" type="ID"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="EmployeeID" minOccurs="1" type="ID"/>
            <xs:element name="Date"       minOccurs="0" type="xs:date"/>
            <xs:element name="Day"        minOccurs="0" type="xs:nonNegativeInteger"/> <!-- Starts at zero -->
            <xs:element name="Cell"       minOccurs="0" type="xs:nonNegativeInteger"/> <!-- Obsolete -->
          </xs:all>
          <xs:attribute name="weight" type="nonNegativeDouble" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="FixedAssignments">
    <xs:sequence>
      <xs:element name="Employee" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="EmployeeID" type="ID"/>
            <xs:element name="Assign" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:all>
                  <xs:element name="Shift" type="xs:string"/> <!-- Not an ID as it could be '-' i.e. day off -->
                  <xs:element name="Date" minOccurs="0" type="xs:date"/>
                  <xs:element name="Day"  minOccurs="0" type="xs:nonNegativeInteger"/> <!-- Starts at zero -->
                  <xs:element name="Cell" minOccurs="0" type="xs:nonNegativeInteger"/> <!-- Obsolete -->
                </xs:all>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  
  <!-- xs:date is YYYY-MM-DD -->
  
  <!--  Seconds is optional in all these custom date and time types -->
  
  <xs:simpleType name="TimeOfDay"> <!-- e.g. 19:30:00, 09:15 -->
    <xs:restriction base="xs:string">
      <xs:pattern value="(([01]?[0-9])|(2[0-3])):[0-5]?[0-9](:[0-5]?[0-9])?"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="DateTime"> <!-- e.g. 2011-11-13T10:00:00, 2011-11-13T10:15 -->
    <xs:restriction base="xs:string">
      <xs:pattern value="((000[1-9])|(00[1-9][0-9])|(0[1-9][0-9]{2})|([1-9][0-9]{3}))-((0[1-9])|(1[012]))-((0[1-9])|([12][0-9])|(3[01]))T(([01][0-9])|(2[0-3])):[0-5][0-9](:[0-5][0-9])?"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="WeekDay">
    <xs:restriction base="xs:string">
      <xs:pattern value="([Ss][Uu][Nn][Dd][Aa][Yy])|([Mm][Oo][Nn][Dd][Aa][Yy])|([Tt][Uu][Ee][Ss][Dd][Aa][Yy])|([Ww][Ee][Dd][Nn][Ee][Ss][Dd][Aa][Yy])|([Tt][Hh][Uu][Rr][Ss][Dd][Aa][Yy])|([Ff][Rr][Ii][Dd][Aa][Yy])|([Ss][Aa][Tt][Uu][Rr][Dd][Aa][Yy])"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="Function">
    <xs:restriction base="xs:string">
      <xs:pattern value="([Ll][Ii][Nn][Ee][Aa][Rr])|([Qq][Uu][Aa][Dd][Rr][Aa][Tt][Ii][Cc])|([Cc][Oo][Nn][Ss][Tt][Aa][Nn][Tt])|([Cc][Oo][Nn][Ss][Tt][Rr][Aa][Ii][Nn][Tt])"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="WeekDayOrInt">
    <xs:union memberTypes="WeekDay xs:nonNegativeInteger"/>
  </xs:simpleType>

  <xs:simpleType name="FunctionCover">
    <xs:restriction base="xs:string">
      <xs:pattern value="([Ll][Ii][Nn][Ee][Aa][Rr])|([Qq][Uu][Aa][Dd][Rr][Aa][Tt][Ii][Cc])|([Cc][Oo][Nn][Ss][Tt][Rr][Aa][Ii][Nn][Tt])"/>
    </xs:restriction>
  </xs:simpleType>
    
  <xs:simpleType name="ID">
    <xs:restriction base="xs:string">
      <xs:pattern value="([a-zA-Z0-9._])+"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="nonNegativeDouble">
    <xs:restriction base="xs:double">
      <xs:minInclusive value="0"/>
    </xs:restriction>
  </xs:simpleType>
      
</xs:schema> 

