<?xml version="1.0" encoding="UTF-8"?>
<!--
Schema for ScheduleSolver problems.
Version : 1.14
-->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="ScheduleSolver">
    <xs:complexType>
      <xs:all>
        <xs:element name="StartDate"        type="xs:date"/>
        <xs:element name="EndDate"          type="xs:date"/>
        <!-- Obsolete -->
        <xs:element name="Shifts"           type="Shifts"       minOccurs="0"/>
        <xs:element name="Tasks"            type="Tasks"        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="Expressions"      type="Expressions"  minOccurs="0"/>
        <xs:element name="Requests"         type="Requests"     minOccurs="0"/>
        <xs:element name="FixedAssignments" type="FixedAssignments"  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="TaskID">
      <xs:selector xpath="Tasks/Task"/>
      <xs:field xpath="@ID"/>
    </xs:key>
    <xs:key name="ShiftID">
      <xs:selector xpath="Shifts/Shift"/>
      <xs:field xpath="@ID"/>
    </xs:key>
    <xs:key name="ShiftTypeID">
      <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>

  <!-- Obsolete -->
  <xs:complexType name="Shifts">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Shift" minOccurs="0" type="Task"/>
        <xs:element name="Task"  minOccurs="0" type="Task"/>
        <xs:element name="LinkedTask"  minOccurs="0" type="LinkedTask"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Tasks">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <!-- Obsolete -->
        <xs:element name="Shift" minOccurs="0" type="Task"/> 
        <xs:element name="Task"  minOccurs="0" type="Task"/>
        <xs:element name="LinkedTask"  minOccurs="0" type="LinkedTask"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Task">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Start"    type="DateTime" minOccurs="0"/>
        <xs:element name="End"      type="DateTime" minOccurs="0"/>
        <xs:element name="Worktime" minOccurs="0">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="nonNegativeDouble">
                <xs:attribute name="contract" type="xs:string" use="optional"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <xs:element name="UnassignedWeight" type="nonNegativeDouble" minOccurs="0"/>
        <xs:element name="AssignedWeight"   type="nonNegativeDouble" minOccurs="0"/>
        <xs:element name="ShiftType"        type="xs:string" minOccurs="0"/>
        <xs:element name="Skills"  minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Skill" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
            </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="required"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <!-- Obsolete -->
        <xs:element name="Length"   type="nonNegativeDouble" minOccurs="0"/>
        <xs:element name="Weight"   type="nonNegativeDouble" minOccurs="0"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="ID" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="LinkedTask">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Task"  minOccurs="0" type="Task"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="ID" type="ID" use="optional"/>
  </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="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="required"/>
                          <xs:attribute name="date" type="xs:string" use="optional"/>
                          <xs:attribute name="dayOfWeek" type="WeekDay" use="optional"/>
                          <!-- Obsolete -->
                          <xs:attribute name="Day" type="xs:nonNegativeInteger" use="optional"/>
                          <!-- Obsolete -->
                          <xs:attribute name="Date" type="xs:string" use="optional"/>
                          <!-- Obsolete -->
                          <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="0" 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="MultipleShiftsPerDay" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="ValidGroup" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:choice minOccurs="0" maxOccurs="unbounded">
                            <xs:element name="Shift" type="ID"/>
                          </xs:choice>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="on" type="xs:boolean" use="optional"/>
                </xs:complexType>
              </xs:element>
              <xs:element name="MultipleTasksPerShift" minOccurs="0">
                <xs:complexType>
                  <xs:attribute name="on" type="xs:boolean" use="optional"/>
                </xs:complexType>
              </xs:element>
              <xs:element name="MinRestTime" minOccurs="0">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:double">
                      <xs:attribute name="restPeriods" type="xs:nonNegativeInteger" use="optional"/>
                      <xs:attribute name="restShifts"  type="xs:string"             use="optional"/>
                      <xs:attribute name="shifts"      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="MinTotWeekends" type="MinMaxWeekends" minOccurs="0"/>
              <xs:element name="MaxTotWeekends" type="MinMaxWeekends" minOccurs="0"/>
              <xs:element name="MinSeqWeekends" type="MinMaxWeekends" minOccurs="0"/>
              <xs:element name="MaxSeqWeekends" type="MinMaxWeekends" minOccurs="0"/>
              <!-- Obsolete -->
              <xs:element name="MaxWeekends"    type="MinMaxWeekends" minOccurs="0"/>
              <!-- Obsolete -->
              <xs:element name="MinWeekends"    type="MinMaxWeekends" 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">
                <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="MinShiftLength"/>
                      <xs:element name="Max" type="MaxShiftLength"/>
                    </xs:choice>
                  </xs:sequence>
                </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" type="MinRestInPeriod" minOccurs="0"/>
              <!-- Obsolete -->
              <xs:element name="RestBetweenDates" type="MinRestInPeriod" minOccurs="0"/>
              <xs:element name="DailyRest" minOccurs="0">
                <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"/>
                      <!-- Obsolete -->
                      <xs:attribute name="nextDayException"  type="xs:string"  use="optional"/>
                      <xs:attribute name="nextDayExceptions" type="xs:string"  use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </xs:sequence>
          <xs:attribute name="ID" type="xs:string" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Expressions">
    <xs:sequence>
      <xs:element name="Expr" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:all>
            <xs:element name="Label"      type="xs:string"  minOccurs="0"/>
            <xs:element name="Constraint" type="xs:string"/>
            <xs:element name="Penalty"    type="xs:string"/>
          </xs:all>
          <xs:attribute name="ID" type="xs:string" use="optional"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="EmptyElement">
  </xs:complexType>

  <xs:complexType name="TimeUnits">
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element name="Min"             type="MinCountDoubleAndUnit"/>
        <xs:element name="Max"             type="MaxCountDoubleAndUnit"/>
        <xs:element name="PeriodStart"     type="xs:string"/>
        <xs:element name="PeriodEnd"       type="xs:string"/>
        <!-- Obsolete -->
        <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"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="MinCountDoubleAndUnit">
    <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:element name="Resource"  type="xs:string" minOccurs="0"/>
    </xs:all>
    <xs:attribute name="ID" type="xs:string" use="optional"/>
  </xs:complexType>

  <xs:complexType name="MaxCountDoubleAndUnit">
    <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>
      <!-- Weight is optional in max because it can be a hard constraint -->
      <xs:element name="Weight" type="WeightAndFunction" minOccurs="0"/>
      <xs:element name="Label"  type="xs:string" minOccurs="0"/>
      <xs:element name="Resource"  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" minOccurs="0"/>
      <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" minOccurs="0"/>
      <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="MinShiftLength">
    <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="MaxShiftLength">
    <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" minOccurs="0"/>
      <xs:element name="Label"  type="xs:string" minOccurs="0"/>
      <xs:element ref="DateOrDayIndex" minOccurs="0"/>
    </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="MinMaxWeekends">
    <xs:attribute name="value"	        use="required"	type="xs:nonNegativeInteger"/>
    <xs:attribute name="startTime"	    use="required"	type="TimeOfDay"/>
    <xs:attribute name="startDay"	      use="required"	type="WeekDay"/>
    <xs:attribute name="endTime"	      use="required"	type="TimeOfDay"/>
    <xs:attribute name="endDay"	        use="required"	type="WeekDay"/>
    <xs:attribute name="weight"	        use="required"	type="nonNegativeDouble"/>
    <!-- Obsolete -->
    <xs:attribute name="ignoreShift"	  use="optional"	type="xs:string"/>
    <xs:attribute name="restShifts"	    use="optional"	type="xs:string"/>
    <!-- Obsolete -->
    <xs:attribute name="countShifts"	  use="optional"	type="xs:boolean"/>
    <xs:attribute name="shiftStartOnly" use="optional"	type="xs:boolean"/>
    <!-- Obsolete --> 
    <xs:attribute name="regionStart"	  use="optional"	type="xs:string"/>
    <!-- Obsolete -->
    <xs:attribute name="regionEnd"	    use="optional"	type="xs:string"/> 
    <xs:attribute name="periodStart"	  use="optional"	type="xs:string"/>
    <xs:attribute name="periodEnd"	    use="optional"	type="xs:string"/>
    <xs:attribute name="label"	        use="optional"	type="xs:string"/>
    <xs:attribute name="function"       use="optional"  type="Function"/>
    <xs:attribute name="previousSeq"	  use="optional"	type="xs:nonNegativeInteger"/>
    <xs:attribute name="isSeq"      	  use="optional"	type="xs:boolean"/>
  </xs:complexType>
  
  <xs:complexType name="MinRestInPeriod">
    <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="splitShiftRest" type="xs:boolean" use="optional"/>
        <xs:attribute name="restShifts"     type="xs:string"  use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </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="xs:string"/>
              <xs:element name="Name"       type="xs:string"/>
              <xs:element name="Skills">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Skill"  minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:string">
                            <xs:attribute name="penaltyForUsing"    type="nonNegativeDouble" use="optional"/>
                            <xs:attribute name="penaltyForNotUsing" type="nonNegativeDouble" use="optional"/>
                          </xs:extension>
                        </xs:simpleContent>
                      </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="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"/>
        <!-- Obsolete -->
        <xs:element name="OnShift"  type="OnOffShiftType"  minOccurs="0"/>
        <!-- Obsolete -->
        <xs:element name="OffShift" type="OnOffShiftType"  minOccurs="0"/> 
        <xs:element name="OnShiftType"  type="OnOffShiftType"  minOccurs="0"/>
        <xs:element name="OffShiftType" type="OnOffShiftType" 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="required"/>
    <xs:attribute name="weight"   type="nonNegativeDouble"  use="required"/>
  </xs:complexType>

  <xs:complexType name="OnOffShiftType">
    <xs:attribute name="employee" type="ID"                    use="required"/>
    <xs:attribute name="shift"    type="xs:string"             use="required"/>
    <xs:attribute name="date"     type="xs:string"             use="required"/>
    <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>
            <!-- Obsolete -->
            <xs:element name="EmployeeID" minOccurs="0" type="ID"/> 
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <!-- Obsolete -->
              <xs:element name="Shift"> 
                <xs:complexType>
                  <xs:attribute name="ID" type="xs:string"/>
                  <xs:attribute name="shiftID" type="xs:string"/>
                </xs:complexType>
              </xs:element>
              <xs:element name="Task">
                <xs:complexType>
                  <xs:attribute name="ID" type="xs:string"/>
                  <xs:attribute name="shiftID" type="xs:string"/>
                </xs:complexType>
              </xs:element>
              <!-- Obsolete -->
              <xs:element name="NotShift"> 
                <xs:complexType>
                  <xs:attribute name="ID" type="xs:string"/>
                </xs:complexType>
              </xs:element>
              <xs:element name="NotTask">
                <xs:complexType>
                  <xs:attribute name="ID" type="xs:string"/>
                </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: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>

