Cet exemple s'appuie sur l'exemple de planification infirmière pour modéliser une rémunération régulière et des heures supplémentaires, soumise à une exigence budgétaire. En plus des les contraintes de planification pour les infirmiers, il existe un budget de 10 000 dollars pour un de planification. Tous les infirmiers sont rémunérés à l'heure un différentiel horaire de 10 $/h pour les quarts de travail à partir de 19 heures. Toutes les heures travaillé après 40 heures est payée 1,5 fois le taux horaire de base moyen (c'est-à-dire, (50 € + 60 €)/2=55 €).
Rémunération régulière et compensation des heures supplémentaires
Le taux horaire de base, les différentiels d’ajustement
et les multiplicateurs des heures supplémentaires sont
représentée par le champ hourlyContract
dans employee. Dans un
contrat horaire, le baseHourlyRate
et le
hourlyRateShiftDifferentials
permet de modéliser la rémunération pour un flux régulier (hors heures supplémentaires)
travail. Ces valeurs sont également utilisées pour estimer un tarif horaire de base moyen pour
rémunération des heures supplémentaires lorsque des overtimePeriods
sont fournis. Généralement des heures supplémentaires
période correspond à une semaine, et plusieurs périodes supplémentaires peuvent être fournies tant que
ne se chevauchent pas. Le contrat horaire de la première infirmière (Adam) est
représenté par:
{
"employees": [{
"id": "Adam",
"roleIds": ["Registered Nurse"],
...
scheduling constraints
...
"hourlyContract": {
"baseHourlyRate": 50,
"hourlyRateShiftDifferentials": {
"2023-05-01 19hr": 10,
"2023-05-02 19hr": 10,
"2023-05-03 19hr": 10,
"2023-05-04 19hr": 10
},
"overtimePeriods": [
{
"overtimeMultiplier": 1.5,
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5
},
"maximumRegularHours": 40
}
]
}
}
}
Exemple avec les quatre employés et leur contrat horaire
{
"employees": [
{
"id": "Adam",
"roleIds": [
"Registered Nurse"
],
"schedulingConstraints": [
{
"priority": "PRIORITY_HIGH",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"minimumRestMinutes": 720
},
{
"priority": "PRIORITY_MEDIUM",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"maximumMinutes": 2160
}
],
"hourlyContract": {
"baseHourlyRate": 50,
"hourlyRateShiftDifferentials": {
"2023-05-01 19h": 10,
"2023-05-02 19h": 10,
"2023-05-03 19h": 10,
"2023-05-04 19h": 10
},
"overtimePeriods": [
{
"overtimeMultiplier": 1.5,
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5
},
"maximumRegularHours": 40
}
]
}
},
{
"id": "Grace",
"roleIds": [
"Registered Nurse"
],
"schedulingConstraints": [
{
"priority": "PRIORITY_HIGH",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"minimumRestMinutes": 720
},
{
"priority": "PRIORITY_MEDIUM",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"maximumMinutes": 2160
}
],
"hourlyContract": {
"baseHourlyRate": 50,
"hourlyRateShiftDifferentials": {
"2023-05-01 19h": 10,
"2023-05-02 19h": 10,
"2023-05-03 19h": 10,
"2023-05-04 19h": 10
},
"overtimePeriods": [
{
"overtimeMultiplier": 1.5,
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5
},
"maximumRegularHours": 40
}
]
}
},
{
"id": "James",
"roleIds": [
"Registered Nurse"
],
"schedulingConstraints": [
{
"priority": "PRIORITY_HIGH",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"minimumRestMinutes": 720
},
{
"priority": "PRIORITY_MEDIUM",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"maximumMinutes": 2160
}
],
"hourlyContract": {
"baseHourlyRate": 50,
"hourlyRateShiftDifferentials": {
"2023-05-01 19h": 10,
"2023-05-02 19h": 10,
"2023-05-03 19h": 10,
"2023-05-04 19h": 10
},
"overtimePeriods": [
{
"overtimeMultiplier": 1.5,
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5
},
"maximumRegularHours": 40
}
]
}
},
{
"id": "Alonso",
"roleIds": [
"Registered Nurse"
],
"schedulingConstraints": [
{
"priority": "PRIORITY_HIGH",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"minimumRestMinutes": 720
},
{
"priority": "PRIORITY_MEDIUM",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"maximumMinutes": 2160
}
],
"hourlyContract": {
"baseHourlyRate": 50,
"hourlyRateShiftDifferentials": {
"2023-05-01 19h": 10,
"2023-05-02 19h": 10,
"2023-05-03 19h": 10,
"2023-05-04 19h": 10
},
"overtimePeriods": [
{
"overtimeMultiplier": 1.5,
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5
},
"maximumRegularHours": 40
}
]
}
}
]
}
Conditions à respecter en termes de budget
Le budget total de 10 000 $est représenté par une budget requis. Les heures de début et de fin sont sont facultatives et, si elles sont fournies, n'incluent que les quarts et les périodes supplémentaires durant cette période. sont prises en compte dans le cadre de cette contrainte budgétaire. La représentation correspondante pour la première infirmière (Adam) peut être remplacé par:
{
"totalBudget": 10000,
"priority": "PRIORITY_HIGH"
}
Exemple de requête complète
{
"employees": [
{
"id": "Adam",
"roleIds": [
"Registered Nurse"
],
"schedulingConstraints": [
{
"priority": "PRIORITY_HIGH",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"minimumRestMinutes": 720
},
{
"priority": "PRIORITY_MEDIUM",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"maximumMinutes": 2160
}
],
"hourlyContract": {
"baseHourlyRate": 50,
"hourlyRateShiftDifferentials": {
"2023-05-01 19h": 10,
"2023-05-02 19h": 10,
"2023-05-03 19h": 10,
"2023-05-04 19h": 10
},
"overtimePeriods": [
{
"overtimeMultiplier": 1.5,
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5
},
"maximumRegularHours": 40
}
]
}
},
{
"id": "Grace",
"roleIds": [
"Registered Nurse"
],
"schedulingConstraints": [
{
"priority": "PRIORITY_HIGH",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"minimumRestMinutes": 720
},
{
"priority": "PRIORITY_MEDIUM",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"maximumMinutes": 2160
}
],
"hourlyContract": {
"baseHourlyRate": 50,
"hourlyRateShiftDifferentials": {
"2023-05-01 19h": 10,
"2023-05-02 19h": 10,
"2023-05-03 19h": 10,
"2023-05-04 19h": 10
},
"overtimePeriods": [
{
"overtimeMultiplier": 1.5,
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5
},
"maximumRegularHours": 40
}
]
}
},
{
"id": "James",
"roleIds": [
"Registered Nurse"
],
"schedulingConstraints": [
{
"priority": "PRIORITY_HIGH",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"minimumRestMinutes": 720
},
{
"priority": "PRIORITY_MEDIUM",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"maximumMinutes": 2160
}
],
"hourlyContract": {
"baseHourlyRate": 50,
"hourlyRateShiftDifferentials": {
"2023-05-01 19h": 10,
"2023-05-02 19h": 10,
"2023-05-03 19h": 10,
"2023-05-04 19h": 10
},
"overtimePeriods": [
{
"overtimeMultiplier": 1.5,
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5
},
"maximumRegularHours": 40
}
]
}
},
{
"id": "Alonso",
"roleIds": [
"Registered Nurse"
],
"schedulingConstraints": [
{
"priority": "PRIORITY_HIGH",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"minimumRestMinutes": 720
},
{
"priority": "PRIORITY_MEDIUM",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"maximumMinutes": 2160
}
],
"hourlyContract": {
"baseHourlyRate": 50,
"hourlyRateShiftDifferentials": {
"2023-05-01 19h": 10,
"2023-05-02 19h": 10,
"2023-05-03 19h": 10,
"2023-05-04 19h": 10
},
"overtimePeriods": [
{
"overtimeMultiplier": 1.5,
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5
},
"maximumRegularHours": 40
}
]
}
}
],
"shifts": [
{
"id": "2023-05-01 7h",
"locationId": "department",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 19
}
},
{
"id": "2023-05-01 13h",
"locationId": "department",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 13
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 2,
"hours": 1
}
},
{
"id": "2023-05-01 19h",
"locationId": "department",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 19
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 2,
"hours": 7
}
},
{
"id": "2023-05-02 7h",
"locationId": "department",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 2,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 2,
"hours": 19
}
},
{
"id": "2023-05-02 13h",
"locationId": "department",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 2,
"hours": 13
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 3,
"hours": 1
}
},
{
"id": "2023-05-02 19h",
"locationId": "department",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 2,
"hours": 19
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 3,
"hours": 7
}
},
{
"id": "2023-05-03 7h",
"locationId": "department",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 3,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 3,
"hours": 19
}
},
{
"id": "2023-05-03 13h",
"locationId": "department",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 3,
"hours": 13
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 4,
"hours": 1
}
},
{
"id": "2023-05-03 19h",
"locationId": "department",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 3,
"hours": 19
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 4,
"hours": 7
}
},
{
"id": "2023-05-04 7h",
"locationId": "department",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 4,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 4,
"hours": 19
}
},
{
"id": "2023-05-04 13h",
"locationId": "department",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 4,
"hours": 13
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 1
}
},
{
"id": "2023-05-04 19h",
"locationId": "department",
"startDateTime": {
"year": 2023,
"month": 5,
"day": 4,
"hours": 19
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
}
}
],
"coverageRequirements": [
{
"startDateTime": {
"year": 2023,
"month": 5,
"day": 1,
"hours": 7
},
"endDateTime": {
"year": 2023,
"month": 5,
"day": 5,
"hours": 7
},
"locationId": "department",
"roleRequirements": [
{
"roleId": "Registered Nurse",
"targetEmployeeCount": 2,
"priority": "PRIORITY_MANDATORY"
}
]
}
],
"roleIds": [
"Registered Nurse"
],
"locationIds": [
"department"
],
"budgetRequirements": [
{
"totalBudget": 10000,
"priority": "PRIORITY_HIGH"
}
]
}
Exemple de réponse
La réponse du résolveur comprend l'affectation des infirmières à des équipes et la l'état d'avancement de la procédure d'optimisation. Par exemple, les quarts attribués au premier employé sont renvoyés comme suit:
{
"solutionStatus": "OPTIMAL",
"shiftAssignments": [
{
"employeeId": "Adam",
"shiftId": "2023-05-01 7hr",
"roleId": "Registered Nurse"
},
{
"employeeId": "Adam",
"shiftId": "2023-05-02 7hr",
"roleId": "Registered Nurse"
},
{
"employeeId": "Adam",
"shiftId": "2023-05-03 7hr",
"roleId": "Registered Nurse"
},
{
"employeeId": "Adam",
"shiftId": "2023-05-04 7hr",
"roleId": "Registered Nurse"
},
... ]
}
Exemple de réponse complète
{
"solutionStatus": "OPTIMAL",
"shiftAssignments": [
{
"employeeId": "Adam",
"shiftId": "2023-05-01 7h",
"roleId": "Registered Nurse"
},
{
"employeeId": "Adam",
"shiftId": "2023-05-02 7h",
"roleId": "Registered Nurse"
},
{
"employeeId": "Adam",
"shiftId": "2023-05-03 7h",
"roleId": "Registered Nurse"
},
{
"employeeId": "Adam",
"shiftId": "2023-05-04 7h",
"roleId": "Registered Nurse"
},
{
"employeeId": "Grace",
"shiftId": "2023-05-01 19h",
"roleId": "Registered Nurse"
},
{
"employeeId": "Grace",
"shiftId": "2023-05-02 19h",
"roleId": "Registered Nurse"
},
{
"employeeId": "Grace",
"shiftId": "2023-05-03 19h",
"roleId": "Registered Nurse"
},
{
"employeeId": "Grace",
"shiftId": "2023-05-04 19h",
"roleId": "Registered Nurse"
},
{
"employeeId": "James",
"shiftId": "2023-05-01 19h",
"roleId": "Registered Nurse"
},
{
"employeeId": "James",
"shiftId": "2023-05-02 19h",
"roleId": "Registered Nurse"
},
{
"employeeId": "James",
"shiftId": "2023-05-03 19h",
"roleId": "Registered Nurse"
},
{
"employeeId": "James",
"shiftId": "2023-05-04 19h",
"roleId": "Registered Nurse"
},
{
"employeeId": "We",
"shiftId": "2023-05-01 7h",
"roleId": "Registered Nurse"
},
{
"employeeId": "We",
"shiftId": "2023-05-02 7h",
"roleId": "Registered Nurse"
},
{
"employeeId": "We",
"shiftId": "2023-05-03 7h",
"roleId": "Registered Nurse"
},
{
"employeeId": "We",
"shiftId": "2023-05-04 7h",
"roleId": "Registered Nurse"
}
]
}