<?xml version="1.0" encoding="UTF-8"?>
<!--
Schema for ShiftSolver problems.
Version : 1.0.32
-->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="SchedulingHorizon">
    <xs:complexType>
      <xs:all> 
        <xs:element name="StartDate"         type="xs:date"/>
        <xs:element name="EndDate"           type="xs:date"/>
        <xs:element name="IntervalLength"    type="xs:nonNegativeInteger"/>
        <xs:element name="DayRanges"         type="DayRanges"    minOccurs="0"/>
        <xs:element name="SkillGroups"       type="SkillGroups"  minOccurs="0"/>
        <xs:element name="Tasks"             type="Tasks"        minOccurs="0"/>
        <xs:element name="TaskGroups"        type="TaskGroups"   minOccurs="0"/>
        <xs:element name="ShiftTypes"        type="ShiftTypes"   minOccurs="0"/>
        <xs:element name="ShiftGroups"       type="ShiftGroups"  minOccurs="0"/>
        <xs:element name="Contracts"         type="Contracts"    minOccurs="0"/>
        <xs:element name="Employees"         type="Employees"    minOccurs="0"/>
        <xs:element name="CoverRequirements" type="CoverRequirements" minOccurs="0"/>
        <xs:element name="DayOffRequests"    type="DayOffRequests"    minOccurs="0"/> <!-- Obsolete -->
        <xs:element name="DayOnRequests"     type="DayOnRequests"     minOccurs="0"/> <!-- Obsolete -->
        <xs:element name="ShiftOffRequests"  type="ShiftOffRequests"  minOccurs="0"/> <!-- Obsolete -->
        <xs:element name="ShiftOnRequests"   type="ShiftOnRequests"   minOccurs="0"/> <!-- Obsolete -->
        <xs:element name="Requests"          type="Requests"          minOccurs="0"/>
        <xs:element name="FixedAssignments"  type="FixedAssignments"  minOccurs="0"/>
        <xs:element name="FixedShiftTasks"   type="FixedShiftTasks"   minOccurs="0"/>
      </xs:all>
      <xs:attribute name="ID" type="xs:string" use="optional"/>
      <xs:attribute name="InfoLabel" type="xs:string" use="optional"/>
    </xs:complexType>

    <!-- Define Keys to ensure no duplicate ID's within elements -->

    <xs:key name="SkillGroupID">
      <xs:selector xpath="SkillGroups/SkillGroup"/>
      <xs:field xpath="@ID"/>
    </xs:key>
    <xs:key name="TaskID">
      <xs:selector xpath="Tasks/Task"/>
      <xs:field xpath="@ID"/>
    </xs:key>
    <xs:key name="TaskGroupID">
      <xs:selector xpath="TaskGroups/TaskGroup"/>
      <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="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="DayRanges">
    <xs:sequence>
      <xs:element name="DayRange" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:all>
            <xs:element name="Date" type="xs:date" minOccurs="0"/>
            <xs:element name="Day"  type="xs:nonNegativeInteger" minOccurs="0"/> <!-- Starts at zero -->
            <xs:element name="StartTime" type="TimeOfDay" minOccurs="0"/> <!-- optional, defaults to 00:00  -->
            <xs:element name="EndTime"   type="TimeSpan"  minOccurs="0"/> <!-- optional, defaults to 1.00:00 -->
          </xs:all>
        </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="xs:string"/>
          </xs:sequence>
          <xs:attribute name="ID" type="ID" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="Tasks">
    <xs:sequence>
      <xs:element name="Task" maxOccurs="unbounded" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <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="AutoAllocate" type="xs:boolean" minOccurs="0"/>
            <xs:element name="Break"        type="xs:boolean" minOccurs="0"/>
          </xs:all>
          <xs:attribute name="ID" type="ID" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="TaskGroups">
    <xs:sequence>
      <xs:element name="TaskGroup" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Task" minOccurs="1" maxOccurs="unbounded" type="xs:string"/> <!-- Changed to string to allow break task ($b) to be included. -->
          </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="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="EndsAfter" type="TimeSpan"  minOccurs="0"/> <!-- Obsolete - use MaxStart and MinEnd instead -->
            <xs:element name="MinLength" type="nonNegativeDouble" minOccurs="0"/>
            <xs:element name="MaxLength" type="nonNegativeDouble" minOccurs="0"/>
            <xs:element name="MinStart"  type="TimeSpan" minOccurs="0"/>
            <xs:element name="MaxStart"  type="TimeSpan" minOccurs="0"/>
            <xs:element name="MinEnd"    type="TimeSpan" minOccurs="0"/>
            <xs:element name="MaxEnd"    type="TimeSpan" minOccurs="0"/>
            <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="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="Contracts">
    <xs:sequence>
      <xs:element name="Contract" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="Label"              type="xs:string"  minOccurs="0"/>
              <xs:element name="AllowTaskTransfers" type="xs:boolean" minOccurs="0"/>
              <xs:element name="MinRestTime" type="nonNegativeDouble" minOccurs="0"/>
              <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="Workload" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="TimeUnits" type="TimeUnits" minOccurs="1" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Patterns" minOccurs="0"> <!-- Obsolete -->
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Match" type="Match" minOccurs="1" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Sequence" type="Sequence" minOccurs="0"/>
              <xs:element name="ShiftStartTimes" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                      <xs:element name="Min"   type="ShiftStartTime"/>
                      <xs:element name="Max"   type="ShiftStartTime"/>
                      <xs:element name="Range" type="ShiftStartTimeRange"/>
                    </xs:choice>
                   </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="ShiftEndTimes" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                      <xs:element name="Min"   type="ShiftEndTime"/>
                      <xs:element name="Max"   type="ShiftEndTime"/>
                      <xs:element name="Range" type="ShiftEndTimeRange"/>
                    </xs:choice>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="ShiftStartEndTimes" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Shift" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:all>
                          <xs:element name="MinStart" type="TimeOfDay" minOccurs="0"/>
                          <xs:element name="MaxStart" type="TimeOfDay" minOccurs="0"/>
                          <xs:element name="MinEnd"   type="TimeSpan"  minOccurs="0"/>
                          <xs:element name="MaxEnd"   type="TimeSpan"  minOccurs="0"/>
                        </xs:all>
                        <xs:attribute name="date"      type="xs:date" use="optional"/>
                        <xs:attribute name="day"       type="xs:nonNegativeInteger" use="optional"/>
                        <xs:attribute name="startDate" type="xs:date" use="optional"/>
                        <xs:attribute name="endDate"   type="xs:date" use="optional"/>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="ShiftLengths" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                      <xs:element name="Min" type="ShiftLength"/>
                      <xs:element name="Max" type="ShiftLength"/>
                    </xs:choice>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="TaskLengths" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                      <xs:element name="Min" type="TaskLength"/>
                      <xs:element name="Max" type="TaskLength"/>
                    </xs:choice>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="BreakDefinitions" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="BreakDefinition" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:choice minOccurs="0" maxOccurs="unbounded">
                          <xs:element ref="DateOrDayIndex"/> 
                          <xs:element name="MinShiftLength" type="nonNegativeDouble"/>
                          <xs:element name="MaxShiftLength" type="nonNegativeDouble"/>
                          <xs:element name="MinShiftStart"  type="TimeSpan"/>
                          <xs:element name="MaxShiftStart"  type="TimeSpan"/> <!-- TimeSpan not TimeOfDay because it could be 1.00:00 -->
                          <xs:element name="MinShiftEnd"    type="TimeSpan"/>
                          <xs:element name="MaxShiftEnd"    type="TimeSpan"/>
                          <xs:element name="MinWorkLength"  type="nonNegativeDouble"/>
                          <xs:element name="MaxWorkLength"  type="nonNegativeDouble"/>
                          <xs:element name="Shift"          type="ID"/>
                          <xs:element name="Break"> <!-- Can have any number of Breaks -->
                            <xs:complexType>
                              <xs:all>
                                <xs:element name="Length"     type="positiveDouble"/>
                                <xs:element name="MinStart"   type="TimeSpan" minOccurs="0"/>
                                <xs:element name="MaxEnd"     type="TimeSpan" minOccurs="0"/>
                                <xs:element name="WorkLength" type="nonNegativeDouble" minOccurs="0"/> <!-- e.g if not the same as the Length e.g. don't count this as paid work -->
                                <xs:element name="MinWorkBefore" type="nonNegativeDouble" minOccurs="0"/>
                                <xs:element name="MaxWorkBefore" type="nonNegativeDouble" minOccurs="0"/>
                                <xs:element name="MinWorkAfter"  type="nonNegativeDouble" minOccurs="0"/>
                                <xs:element name="MaxWorkAfter"  type="nonNegativeDouble" minOccurs="0"/>
                              </xs:all>
                            </xs:complexType>
                          </xs:element>
                        </xs:choice>
                        <xs:attribute name="ID" type="xs:string" use="optional"/>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="SplitShifts" minOccurs="0">
                <xs:complexType>
                  <xs:all>
                    <xs:element name="MinShiftLength" type="nonNegativeDouble" minOccurs="0"/>
                    <xs:element name="MaxShiftLength" type="nonNegativeDouble" minOccurs="0"/>
                    <xs:element name="MinSplitLength" type="nonNegativeDouble" minOccurs="0"/>
                    <xs:element name="MaxSplitLength" type="nonNegativeDouble" minOccurs="0"/>
                  </xs:all>
                </xs:complexType>
              </xs:element>
              <xs:element name="UseIfNeeded" minOccurs="0">
                <xs:complexType>
                  <xs:attribute name="weight"     type="nonNegativeDouble" use="required"/>
                  <xs:attribute name="function"   type="Function"          use="optional"/>
                  <xs:attribute name="start"      type="xs:nonNegativeInteger" use="optional"/>
                  <xs:attribute name="startDate"  type="xs:date"               use="optional"/>
                  <xs:attribute name="end"        type="xs:nonNegativeInteger" use="optional"/>
                  <xs:attribute name="endDate"    type="xs:date"   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:complexType>
              </xs:element>
              <xs:element name="MinRestInPeriod" minOccurs="0">
                <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="required"/>  
                      <xs:attribute name="label"  type="xs:string" use="optional"/>
                      <xs:attribute name="splitShiftRest" type="xs:boolean" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="FixedDependentTasks">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Task" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:attribute name="taskID"         type="xs:string"         use="required"/>
                        <xs:attribute name="taskIDAfter"    type="xs:string"         use="required"/>
                        <xs:attribute name="durationAfter"  type="nonNegativeDouble" 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="TimeUnits">
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element name="Max"             type="MinMaxCountDoubleAndUnit"/>
        <xs:element name="Min"             type="MinMaxCountDoubleAndUnit"/>
        <xs:element name="PeriodStart"     type="xs:string"/>
        <xs:element name="PeriodEnd"       type="xs:string"/>
        <xs:element name="RegionStart"     type="xs:nonNegativeInteger"/> <!-- Obsolete -->
        <xs:element name="RegionStartDate" type="xs:date"/> <!-- Obsolete -->
        <xs:element name="RegionEnd"       type="xs:nonNegativeInteger"/> <!-- Obsolete -->
        <xs:element name="RegionEndDate"   type="xs:date"/> <!-- Obsolete -->
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="MinMaxCountDoubleAndUnit"> 
    <xs:all>
      <xs:element name="Count">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="nonNegativeDouble">
              <xs:attribute name="units" type="WorkUnit" use="optional"/>
              <xs:attribute name="byShiftEndTime" type="xs:boolean" use="optional"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element name="Weight" type="WeightAndFunction"/>
      <xs:element name="Label"  type="xs:string" minOccurs="0"/>
    </xs:all>
    <xs:attribute name="ID" 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>
  
  <xs:complexType name="ShiftStartTime"> 
    <xs:all>
      <xs:element name="Time"   type="TimeOfDay"/>
      <xs:element name="Weight" type="WeightAndFunction"/>
      <xs:element name="Label"  type="xs:string" minOccurs="0"/>
      <xs:element ref="DateOrDayIndex" minOccurs="0"/>      
    </xs:all>
  </xs:complexType>
  
  <xs:complexType name="ShiftStartTimeRange"> 
    <xs:all>
      <xs:element name="Min" type="TimeOfDay" minOccurs="0"/>
      <xs:element name="Max" type="TimeOfDay" minOccurs="0"/> 
    </xs:all>
    <xs:attribute name="date" type="xs:date" use="optional"/>
    <xs:attribute name="day" type="xs:nonNegativeInteger" use="optional"/>
  </xs:complexType>
  
  <xs:complexType name="ShiftEndTime"> 
    <xs:all>
      <xs:element name="Time"   type="TimeSpan"/>
      <xs:element name="Weight" type="WeightAndFunction"/>
      <xs:element name="Label"  type="xs:string" minOccurs="0"/>
      <xs:element ref="DateOrDayIndex" minOccurs="0"/>      
    </xs:all>
  </xs:complexType>
  
  <xs:complexType name="ShiftEndTimeRange"> 
    <xs:all>
      <xs:element name="Min" type="TimeSpan" minOccurs="0"/>
      <xs:element name="Max" type="TimeSpan" minOccurs="0"/> 
    </xs:all>
    <xs:attribute name="date" type="xs:date" use="optional"/>
    <xs:attribute name="day" type="xs:nonNegativeInteger" use="optional"/>
  </xs:complexType>
  
  <xs:complexType name="ShiftLength"> 
    <xs:all>
      <xs:element name="Length">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="nonNegativeDouble">
              <xs:attribute name="units" type="WorkUnit" use="optional"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element name="Weight" type="WeightAndFunction"/>
      <xs:element name="Label"  type="xs:string" minOccurs="0"/>
      <xs:element ref="DateOrDayIndex" minOccurs="0"/>      
    </xs:all>
  </xs:complexType>
  
  <xs:complexType name="TaskLength"> 
    <xs:all>
      <xs:element name="Task"   type="ID"/>
      <xs:element name="Length" type="nonNegativeDouble"/>
      <xs:element name="Weight" type="WeightAndFunction"/>
      <xs:element name="Label"  type="xs:string" minOccurs="0"/>
      <xs:element ref="DateOrDayIndex" minOccurs="0"/> <!-- The mono schema parser does not like this! -->
    </xs:all>
  </xs:complexType>
    
  <xs:element name="DateOrDayIndex" abstract="true"/>   
  <xs:element name="Date" type="xs:date" substitutionGroup="DateOrDayIndex"/>   
  <xs:element name="DayIndex" type="xs:nonNegativeInteger" substitutionGroup="DateOrDayIndex"/> <!-- Allow a day index to be used instead of a date -->

  <xs:complexType name="Sequence">
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element name="Max"           type="MinMaxSeq"/>
        <xs:element name="Min"           type="MinMaxSeq"/>
        <xs:element name="PeriodStart"   type="xs:string"/>
        <xs:element name="PeriodEnd"     type="xs:string"/>
        <xs:element name="Pattern"       type="SeqPattern"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="SeqPattern">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Start"         type="xs:string"/>
        <xs:element name="StartExcludes" type="xs:string"/>
      </xs:choice>
      <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element name="Shift"      type="xs:string"/>
        <xs:element name="NotShift"   type="xs:string"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="MinMaxSeq">
    <xs:attribute name="count"    type="xs:nonNegativeInteger" use="required"/>
    <xs:attribute name="weight"   type="nonNegativeDouble"     use="required"/>
    <xs:attribute name="function" type="Function"  use="optional"/>
    <xs:attribute name="label"    type="xs:string" use="optional"/>
  </xs:complexType>

  <xs:complexType name="DayIndexes"> <!-- Obsolete -->
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <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="Match"> <!-- Obsolete -->
    <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"> <!-- Obsolete -->
    <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="DayIndexes"/>
        <xs:element name="StartExcludes" type="DayIndexes"/>
      </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="MinMaxCountInteger"> <!-- Obsolete -->
    <xs:all>
      <xs:element name="Count"  type="xs:nonNegativeInteger"/>
      <xs:element name="Weight" type="WeightAndFunction"/>
      <xs:element name="Label"  type="xs:string" 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="required"/>
    <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="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="Name"       type="xs:string"/>
              <xs:element name="ValidTasks">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Task" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="ID">
                            <xs:attribute name="weight"   type="nonNegativeDouble" use="optional"/>
                            <xs:attribute name="function" type="FunctionCover"     use="optional"/>
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="ValidTaskTransfers">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="TaskGroup" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="Task" minOccurs="1" maxOccurs="unbounded" type="ID"/>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Skills">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Skill" type="xs:string" minOccurs="1" maxOccurs="unbounded"/> 
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="DependentTasks">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Task" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:attribute name="taskID"         type="xs:string"         use="required"/>
                        <xs:attribute name="taskIDBefore"   type="xs:string"         use="optional"/>
                        <xs:attribute name="durationBefore" type="nonNegativeDouble" use="optional"/>
                        <xs:attribute name="taskIDAfter"    type="xs:string"         use="optional"/>
                        <xs:attribute name="durationAfter"  type="nonNegativeDouble" use="optional"/>
                        <xs:attribute name="weight"         type="nonNegativeDouble" use="optional"/>
                        <xs:attribute name="label"          type="xs:string"         use="optional"/>
                      </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="CoverRequirements">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="CoverRequirement" minOccurs="0" maxOccurs="unbounded">  <!-- The old method -->
          <xs:complexType>
            <xs:sequence>
              <xs:choice>
                <xs:sequence>
                  <xs:element name="Start" type="DateTime"/>
                  <xs:element name="End"   type="DateTime"/>
                </xs:sequence> 
                <xs:sequence>
                  <xs:element name="Index" type="xs:nonNegativeInteger"/>
                </xs:sequence> 
              </xs:choice>
              <xs:element name="Cover" type="Cover" minOccurs="1" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Cov" minOccurs="0" maxOccurs="unbounded"> <!-- The new shorter method -->
          <xs:complexType>
            <xs:sequence>
              <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="Min"   type="CoverConstraint"/>
                <xs:element name="Max"   type="CoverConstraint"/>
              </xs:choice>
            </xs:sequence>
            <xs:attribute name="start"       type="xs:string"  use="required"/>
            <xs:attribute name="end"         type="xs:string"  use="required"/>
            <xs:attribute name="task"        type="xs:string"  use="required"/>
            <xs:attribute name="skill"       type="xs:string"  use="optional"/>
            <xs:attribute name="float"       type="xs:boolean" use="optional"/>
            <xs:attribute name="bydate"      type="xs:boolean" use="optional"/> 
            <xs:attribute name="byDateShiftEnd" type="xs:boolean" use="optional"/>
            <xs:attribute name="label"       type="xs:string"  use="optional"/>
            <xs:attribute name="ID"          type="xs:string"  use="optional"/>
            <xs:attribute name="consecutive" type="xs:boolean" use="optional"/>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
   
  <xs:complexType name="Cover">
    <xs:sequence>
      <xs:choice>
        <xs:element name="Skill"      type="xs:string" minOccurs="0"/>
        <xs:element name="SkillGroup" type="ID" minOccurs="0"/>
      </xs:choice>
      <xs:choice>
        <xs:element name="Task"      type="ID"/>
        <xs:element name="TaskGroup" type="ID"/>
      </xs:choice>
      <xs:element name="Min" type="CoverConstraint" minOccurs="0"/>
      <xs:element name="Max" type="CoverConstraint" minOccurs="0"/>
      <xs:element name="Label" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="ID"          type="xs:string"  use="optional"/>
    <xs:attribute name="consecutive" type="xs:boolean" use="optional"/>
  </xs:complexType>
  
  <xs:complexType name="CoverConstraint">
    <xs:simpleContent>
      <xs:extension base="nonNegativeDouble">
        <xs:attribute name="function" type="Function" use="optional"/>
        <xs:attribute name="weight" type="nonNegativeDouble" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  
  <xs:complexType name="TaskRequests">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="On"  type="TaskRequest"/>
        <xs:element name="Off" type="TaskRequest"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="TaskRequest">
    <xs:sequence>
      <xs:element name="Task" type="xs:string" minOccurs="1" maxOccurs="unbounded"/> <!-- Allow multiple ones? -->
      <xs:choice>
        <xs:element name="EmployeeID" type="ID"/>
        <xs:element name="Employee"   type="ID"/>
      </xs:choice>
      <xs:element name="Start" type="DateTime"/>
      <xs:element name="End"   type="DateTime"/>
    </xs:sequence>
    <xs:attribute name="weight" type="nonNegativeDouble" use="required"/>
  </xs:complexType>
  
  <xs:complexType name="DayOffRequests"> <!-- Obsolete -->
    <xs:sequence>
      <xs:element name="DayOff" type="DayOnOff" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>      

  <xs:complexType name="DayOnRequests"> <!-- Obsolete -->
    <xs:sequence>
      <xs:element name="DayOn" type="DayOnOff" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="DayOnOff"> <!-- Obsolete -->
    <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:all>
    <xs:attribute name="weight" type="nonNegativeDouble" use="required"/>
  </xs:complexType>

  <xs:complexType name="ShiftOffRequests"> <!-- Obsolete -->
    <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:all>
          <xs:attribute name="weight" type="nonNegativeDouble" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType> 
  
  <xs:complexType name="ShiftOnRequests"> <!-- Obsolete -->
    <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:all>
          <xs:attribute name="weight" type="nonNegativeDouble" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Requests">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="OnDay"    type="OnOffDay" minOccurs="0"/>
        <xs:element name="OffDay"   type="OnOffDay" minOccurs="0"/>
        <xs:element name="OnShift"  type="OnOffShift"  minOccurs="0"/>
        <xs:element name="OffShift" type="OnOffShift" minOccurs="0"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="OnOffDay">
    <xs:attribute name="employee" type="ID"                 use="required"/>
    <xs:attribute name="date"     type="xs:string"          use="optional"/>
    <xs:attribute name="weight"   type="nonNegativeDouble"  use="required"/>
  </xs:complexType>

  <xs:complexType name="OnOffShift">
    <xs:attribute name="employee" type="ID"                    use="required"/>
    <xs:attribute name="shift"    type="xs:string"             use="optional"/>
    <xs:attribute name="date"     type="xs:string"             use="optional"/>
    <xs:attribute name="weight"   type="nonNegativeDouble"     use="required"/>
  </xs:complexType>


  <!--
  <xs:complexType name="OnOffDay">
    <xs:all>
      <xs:element name="Employee" minOccurs="1" type="ID"/>
      <xs:element name="Date"     minOccurs="0" type="xs:date"/>
      <xs:element name="Day"      minOccurs="0" type="xs:nonNegativeInteger"/>
    </xs:all>
    <xs:attribute name="weight" type="nonNegativeDouble" use="required"/>
  </xs:complexType>
  -->

  <!--
  <xs:complexType name="OffShift">
    <xs:all>
      <xs:element name="Shift"       minOccurs="0" type="ID"/>
      <xs:element name="Employee"    minOccurs="1" type="ID"/>
      <xs:element name="Day"         minOccurs="0" type="xs:nonNegativeInteger"/>
      <xs:element name="Date"        minOccurs="0" type="xs:date"/>
    </xs:all>
    <xs:attribute name="weight" type="nonNegativeDouble" use="required"/>
  </xs:complexType>
  -->

  <!--
  <xs:complexType name="OnShift">
    <xs:all>
      <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="Employee"   minOccurs="1" type="ID"/>
      <xs:element name="Date"       minOccurs="0" type="xs:date"/>
      <xs:element name="Day"        minOccurs="0" type="xs:nonNegativeInteger"/> 
    </xs:all>
    <xs:attribute name="weight" type="nonNegativeDouble" use="required"/>
  </xs:complexType>
  -->
  
  <xs:complexType name="FixedAssignments">
    <xs:sequence>
      <xs:element name="Employee" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="EmployeeID" minOccurs="0" type="ID"/>
            <xs:element name="Employee"   minOccurs="0" type="ID"/>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="Shift">
                <xs:complexType>
                  <xs:sequence>
                    <xs:choice>
                      <xs:element name="Date" type="xs:date"/>
                      <xs:element name="Day"  type="xs:nonNegativeInteger"/> <!-- Starts at zero -->
                    </xs:choice>
                    <xs:element name="Start" minOccurs="1" maxOccurs="1" type="TimeOfDay"/>
                    <xs:element name="Task"  minOccurs="1" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="ID"     minOccurs="1" maxOccurs="1" type="xs:string"/>
                          <xs:element name="Length" minOccurs="1" maxOccurs="1" type="xs:nonNegativeInteger"/>
                        </xs:sequence>
                        <xs:attribute name="WorkLength" type="nonNegativeDouble" use="optional"/>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="ExternalID" type="xs:string"  use="optional"/>
                  <xs:attribute name="type"       type="xs:string"  use="optional"/>
                  <xs:attribute name="addBreaks"  type="xs:boolean" use="optional"/>
                </xs:complexType>
              </xs:element>
              <xs:element name="NoShift">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Start" type="DateTime"/>
                    <xs:element name="End"   type="DateTime"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </xs:sequence>
          <xs:attribute name="ID" type="xs:string" use="optional"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType> 
  
  <xs:complexType name="FixedShiftTasks">
    <xs:sequence>
      <xs:element name="FixedTask" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="1" maxOccurs="unbounded">
              <xs:element name="Employee" type="xs:string"/>
              <xs:element name="Day"      type="xs:nonNegativeInteger"/>
              <xs:element name="Date"     type="xs:date"/>
              <xs:element name="Task">
                <xs:complexType>
                  <xs:all>
                    <xs:element name="ID"        minOccurs="1" type="xs:string"/>
                    <xs:element name="Length"    minOccurs="1" type="nonNegativeDouble"/>
                    <xs:element name="StartTime" minOccurs="0" type="TimeOfDay"/>
                    <xs:element name="Start"     minOccurs="0" type="nonNegativeDouble"/>
                    <xs:element name="StartFromEnd" minOccurs="0" type="nonNegativeDouble"/>
                  </xs:all>
                 <xs:attribute name="splitShift" type="xs:nonNegativeInteger" use="optional"/>
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </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="TimeSpan"> <!-- e.g. 1.00:00, 19:30:00, 09:15,  -->
    <xs:restriction base="xs:string">
      <xs:pattern value="([0-9]{1,7}|([0-9]{1,7}\.)?(([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="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="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])"/>
    </xs:restriction>
  </xs:simpleType> 
  
  <xs:simpleType name="WorkUnit">
    <xs:restriction base="xs:string">
      <xs:pattern value="([Ss][Hh][Ii][Ff][Tt][Ll][Ee][Nn][Gg][Tt][Hh])|([Ww][Oo][Rr][Kk][Tt][Ii][Mm][Ee])"/>
    </xs:restriction>
  </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])"/>
    </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:simpleType name="positiveDouble">
    <xs:restriction base="xs:double">
      <xs:minExclusive value="0"/>
    </xs:restriction>
  </xs:simpleType>
  
</xs:schema> 

