Skip to main content

Employee shift assignment feasibility check

Employee-assigned-to-shift-covers-demand-check

This process evaluates if employee shifts, in any combination, can meet specified demand intervals.

If some demands cannot be met, the feasibility report will include the unfulfilled demand intervals as warnings.

Consider this as a simplified rostering problem solution, designed for quick execution to highlight potential issues.

Warning Response Schema
title
required
string
Enum: "Employee-availability-check" "Demand-weekend-covered-by-employees-check" "Employee-minutes-weekly-check" "Employee-minutes-entire-roster-check" "Demand-covered-by-shift-templates-check" "Shift-is-covered-by-demand-check" "Employee-assigned-to-shift-covers-demand-check" "Shift-Templates-are-demand-relevant-check" "Shift-utilization-minimum-occurrence-check" "Locked-shift-task-requirements-check"
category
required
string

This category is always set to WARNING

description
required
string
required
Array of objects (violation)
{
  • "title": "Employee-availability-check",
  • "category": "string",
  • "description": "string",
  • "violations": [
    ]
}

The following fields are used in the "violation" object:

  • day
  • startTime
  • endTime
  • workType
  • numberOfEmployees
  • missingMinutes
Example Scenario

In this scenario, we consider four employees and four shifts. The shifts are:

  • Shift 1: 09:00 to 14:00
  • Shift 2: 12:00 to 15:00
  • Shift 3: 16:00 to 18:00
  • Shift 4: 17:00 to 21:00

The demands are:

  • Demand 1: Two employees from 09:00 to 15:00
  • Demand 2: Three employees from 17:00 to 21:00

These demands occur across different days:

  • Days 1 and 3: Demand 1
  • Days 2, 4, 5, 6, and 7: Demand 2

Given that Shift 1 covers the demand from 09:00-14:00 (outperforming Shift 2), it means Shift 2 can never be used, as the interval goes from 12:00, and not from 14:00, the demand can never be covered from 14-15 (The remainder of the demand from when Shift 1 ends).

Payload example
{
"jobInfo": {
"id": "xxx",
"organisationId": "xxx",
"scheduleType": "RECURRING",
"demandType": "TIME_DEMAND",
"planningHorizon": {
"startDate": "2022-01-01",
"nrOfWeeks": 1,
}
},
"shifts": [
{
"id": "Shift1",
"shiftTypes": [
"Day"
],
"intervals": [
{
"startTime": "09:00",
"endTime": "14:00",
"dayIndicator": 0,
"workTypeId": "1",
"breakMinutes": 30,
"assignmentId": "Assignment1",
"taskId": "Task1"
}
]
},
{
"id": "Shift2",
"shiftTypes": [
"Day"
],
"intervals": [
{
"startTime": "12:00",
"endTime": "15:00",
"dayIndicator": 0,
"workTypeId": "1",
"breakMinutes": 0,
"assignmentId": "Assignment1",
"taskId": "Task1"
}
]
},
{
"id": "Shift3",
"shiftTypes": [
"Evening"
],
"intervals": [
{
"startTime": "16:00",
"endTime": "18:00",
"dayIndicator": 0,
"workTypeId": "1",
"breakMinutes": 0
}
]
},
{
"id": "Shift4",
"shiftTypes": [
"Evening"
],
"intervals": [
{
"startTime": "17:00",
"endTime": "21:00",
"dayIndicator": 0,
"workTypeId": "1",
"breakMinutes": 0
}
]
}
],
"employees": [
{
"id": "1",
"attributes": [
{
"id": "personnel-group",
"values": ["PerGrpId1"]
}
],
"workTime": {
"weekHoursRules": {
"minWeekHours": 12,
"maxWeekHours": 40
}
},
"attributes": [
{
"id": "competences",
"values": ["Competence1", "Competence2", "Competence3"]
}
]
},
{
"id": "2",
"attributes": [
{
"id": "personnel-group",
"values": ["PerGrpId1"]
}
],
"workTime": {
"weekHoursRules": {
"minWeekHours": 12,
"maxWeekHours": 40
}
},
"attributes": [
{
"id": "competences",
"values": ["Competence1", "Competence2", "Competence3"]
}
]
},
{
"id": "3",
"attributes": [
{
"id": "personnel-group",
"values": ["PerGrpId1"]
}
],
"workTime": {
"weekHoursRules": {
"minWeekHours": 12,
"maxWeekHours": 40
}
},
"attributes": [
{
"id": "competences",
"values": ["Competence1", "Competence2", "Competence3"]
}
]
},
{
"id": "4",
"attributes": [
{
"id": "personnel-group",
"values": ["PerGrpId1"]
}
],
"workTime": {
"weekHoursRules": {
"minWeekHours": 12,
"maxWeekHours": 40
}
},
"attributes": [
{
"id": "competences",
"values": ["Competence1", "Competence2", "Competence3"]
}
]
}
],
"timeSlots": [
{
"id": "time-slot-1",
"startTime": "09:00",
"endTime": "15:00",
"workTypeId": "1",
"attributeRequirements": [
{
"id": "personnel-group",
"values": ["PerGrpId1"]
}
],
"assignmentId": "Assignment1",
"taskId": "Task1",
"attributeRequirements": [
{
"id": "competences",
"values": ["Competence1", "Competence2"]
}
]
},
{
"id": "time-slot-2",
"startTime": "17:00",
"endTime": "21:00",
"workTypeId": "1",
"attributeRequirements": [
{
"id": "personnel-group",
"values": ["PerGrpId1"]
}
],
}
],
"demands": [
{
"days": {
"dayIndexes": [
0,
2
]
},
"timeDemands": [
{
"timeSlotId": "time-slot-1",
"ideal": 2
}
"DemandId1"
]
},
{
"days": {
"dayIndexes": [
1,
3,
4,
5,
6
]
},
"timeDemands": [
{
"timeSlotId": "time-slot-2",
"ideal": 3
}
]
}
],
"configuration": {
"workTypes": [
{
"id": "1",
"name": "WORK",
"factor": 1.0
}
],
"tasks": [
{
"id": "Task1",
"name": "Intern revision"
}
]
}
}