Résolution d'un problème fixe de planification des quarts à partir du SolveShiftSchedulingRequest
donné en affectant des employés à des quarts de sorte que les employés les préférences de planification sont
maximisées et les cas de non-respect des contraintes de planification sont minimisés.
Requête HTTP
POST https://optimization.googleapis.com/v1/scheduling:solveShiftScheduling
L'URL utilise la syntaxe de transcodage gRPC.
Corps de la requête
Le corps de la requête contient des données présentant la structure suivante :
Représentation JSON |
---|
{ "requestId": string, "solveParameters": { object ( |
Champs | |
---|---|
requestId |
Problème ou identifiant de la demande. |
solveParameters |
Paramètres permettant de contrôler une seule solution du problème. |
employees[] |
Tous les employés disponibles doivent être programmés. |
shifts[] |
Toutes les périodes de travail constituent le planning. |
coverageRequirements[] |
Exigences de couverture pour l'ensemble de l'horizon de planification. Ceux-ci indiquent le nombre d'employés qui doivent assumer chaque rôle ou posséder une compétence particulière au cours d'une période donnée ou d'une liste d'ID d'équipes. Toutes les exigences de couverture doivent être spécifiées soit à l'aide de périodes, soit à l'aide d'une liste d'ID d'équipes, mais pas des deux. Les périodes (le cas échéant) correspondant aux exigences de couverture ne peuvent pas se chevaucher pour chaque emplacement. Le niveau de priorité par défaut pour chacune de ces contraintes est |
roleIds[] |
Liste de tous les rôles possibles pour l'ensemble du personnel. Chaque employé doit avoir au moins un rôle auquel il peut être assigné pour un quart de travail. Un rôle fait référence à un poste spécifique attribué au cours d'une équipe (infirmière diplômée, chef exécutif, serveur, etc.). Lorsqu'un employé est affecté à un poste, il se voit également attribuer un rôle spécifique. |
skillIds[] |
Liste de toutes les compétences possibles pour l'ensemble du personnel. Une compétence fait référence à toute qualification supplémentaire qu'un employé peut avoir et qui ne concerne pas un emploi spécifique qui peut lui être attribué (certifications, langues parlées, etc.). Cette liste peut être vide. Lorsqu'un employé est affecté à un poste, il doit posséder toutes les compétences nécessaires pour ce poste. |
locationIds[] |
Liste de tous les lieux possibles pour l'ensemble des quarts de la planification. Cette liste peut être vide. Il peut s'avérer utile de spécifier des lieux différents lorsque, par exemple, un infirmier en chef souhaite réserver des horaires à plusieurs membres du personnel d'un hôpital ou, dans un autre exemple, un directeur d'hôtel qui souhaite planifier des employés dans plusieurs hôtels. |
budgetRequirements[] |
Spécification de budget pour le problème de planification. Le niveau de priorité par défaut pour chacune de ces exigences est |
assignmentsHint[] |
Décalez les affectations à utiliser comme solution provisoire (c’est-à-dire une indice de solution) au problème de planification. Les indications d'attribution sont ignorées si l'attribution contredit un quart de travail non attribuable ou une demande de planification. |
Corps de la réponse
Réponse pour l'API de planification du personnel. Pour chaque réponse, shiftAssignments
sera vide si la valeur solutionStatus
renvoyée est NOT_SOLVED_DEADLINE_EXCEEDED
ou INFEASIBLE
. Si la valeur solutionStatus
renvoyée est OPTIMAL
ou FEASIBLE
, une attribution d'équipe valide est renvoyée dans shiftAssignments
. Pour que l'attribution d'un ajustement soit valide, les propriétés suivantes sont conservées:
- Chaque identifiant d'employé est contenu dans l'ensemble d'employés indiqué dans la demande.
- Chaque ID de rôle attribué à l'employé est contenu dans l'ensemble des ID de rôle de l'employé en question.
- Chaque ID d'équipe est contenu dans l'ensemble des quarts fourni dans la requête.
- Chaque ID d'équipe n'est pas l'un des ID non attribuables pour l'employé donné.
- Un employé ne sera jamais affecté à deux quarts de travail qui se chevauchent.
- Pour la planification donnée, aucune des contraintes ni des requêtes avec le niveau de priorité
PRIORITY_MANDATORY
n'est enfreinte.
Si la requête aboutit, le corps de la réponse contient des données qui ont la structure suivante :
Représentation JSON |
---|
{ "requestId": string, "solutionStatus": enum ( |
Champs | |
---|---|
requestId |
ID de la requête à laquelle cette réponse est associée. |
solutionStatus |
État de la solution renvoyée. Si la solution n'est ni FÉASIBLE, ni OPTIMALE, les autres champs de ce fichier proto peuvent être vides. Si l'état est NOT_SOLVED_DEADLINE_EXCEEDED, cela signifie que le délai a été atteint sans que nous ayons trouvé de solution réalisable ni déterminé si une solution est réalisable. Les requêtes peuvent être impossibles si les contraintes du niveau de priorité MANDATORY ne peuvent pas toutes être satisfaites. |
shiftAssignments[] |
Liste de toutes les attributions. Chaque |
statusMessage |
Si |
SolveParameters
Paramètres qui contrôlent une seule solution du problème de planification des équipes.
Représentation JSON |
---|
{ "timeLimit": string } |
Champs | |
---|---|
timeLimit |
Temps maximal que le résolveur doit consacrer au problème. Si ce champ n'est pas spécifié, la valeur par défaut est de 1 minute. Cette valeur n'est pas une limite stricte et ne tient pas compte des frais de communication. La latence attendue pour résoudre le problème peut dépasser légèrement cette valeur. Durée en secondes avec neuf chiffres au maximum après la virgule et se terminant par " |
Employé
Un employé du personnel à planifier un rendez-vous.
Représentation JSON |
---|
{ "id": string, "roleIds": [ string ], "skillIds": [ string ], "shiftPreferences": [ { object ( |
Champs | |
---|---|
id |
Identifiant unique attribué à cet employé. |
roleIds[] |
ID de rôle que cet employé peut exécuter. Vous devez spécifier au moins un rôle. Lorsqu'un employé est affecté à un poste, il se voit également attribuer un seul rôle parmi cette liste. Différents rôles peuvent être attribués à l'employé au cours de la période de planification. |
skillIds[] |
ID de compétence de cet employé. Cette liste peut être vide. Lorsqu'un employé est affecté à un quart de travail, il utilise n'importe quel sous-ensemble des compétences listées ici pour couvrir les exigences en matière de compétences pendant toute la durée du poste assigné. |
shiftPreferences[] |
Modifiez les préférences de cet employé. Les quarts spécifiés ici représentent des quarts auxquels l'employé préférerait être affecté pendant la période de planification. Les ID d'horaires spécifiés dans |
schedulingConstraints[] |
Liste des contraintes de planification pour cet employé. Le niveau de priorité par défaut pour chacune de ces contraintes est |
resourceConstraints[] |
Toutes les contraintes de planification supplémentaires non spécifiées dans |
shiftRequests[] |
Liste des demandes d'équipes de l'employé. Il est possible de demander à un employé d'être affecté ou non à des périodes de travail spécifiques. Toutes les attributions d'emploi du temps fixes pour l'employé peuvent être représentées par un élément |
hourlyContract |
Contrat qui spécifie le taux horaire normal et les heures supplémentaires pour l'employé. |
ShiftPreference
Préférence numérique pour un ID d'ajustement particulier.
Représentation JSON |
---|
{ "shiftId": string, "preference": integer } |
Champs | |
---|---|
shiftId |
Identifiant Shift pour lequel la préférence est spécifiée. |
preference |
Des valeurs de préférence plus élevées indiquent un changement plus souhaitable. |
SchedulingConstraint
Contrainte de planification spécifique à un employé particulier. La contrainte spécifiée n'est appliquée que pendant l'intervalle [startDateTime,
endDateTime)
donné.
Représentation JSON |
---|
{ "priority": enum ( |
Champs | |
---|---|
priority |
Niveau de priorité pour cette contrainte de planification. La priorité par défaut de toutes les contraintes de planification est |
startDateTime |
Heure de début à laquelle cette contrainte de planification s'applique (incluse). |
endDateTime |
Heure de fin d'application de cette contrainte de planification (exclue). |
Champ d'union type . Type de contrainte spécifiée. Chaque contrainte n'est appliquée que pendant la période spécifiée ci-dessus. type ne peut être qu'un des éléments suivants : |
|
minimumMinutes |
Durée minimale de travail (en minutes) de l'employé. Si l'employé est affecté à un quart de travail qui chevauche (entièrement ou partiellement) la fenêtre horaire, le nombre de minutes de chevauchement de la période de travail est inclus dans ce décompte. |
maximumMinutes |
Durée maximale (en minutes) pendant laquelle l'employé peut travailler dans la fenêtre de temps. Si l'employé est affecté à un quart de travail qui chevauche (entièrement ou partiellement) la fenêtre horaire, le nombre de minutes de chevauchement de la période de travail est inclus dans ce décompte. |
minimumConsecutiveWorkDays |
Nombre minimal de jours consécutifs pendant lesquels l'employé peut travailler. Un employé travaille un jour précis s'il est affecté à un quart de travail qui commence ce jour-là. Tout quart de travail auquel l'employé est attribué et qui commence dans la fenêtre de temps est inclus dans ce décompte. |
maximumConsecutiveWorkDays |
Nombre maximal de jours consécutifs pendant lesquels l'employé peut travailler. Un employé travaille un jour précis s'il est affecté à un quart de travail qui commence ce jour-là. Tout quart de travail auquel l'employé est attribué et qui commence dans la fenêtre de temps est inclus dans ce décompte. |
minimumShiftCount |
Nombre minimal d'heures de travail que l'employé peut effectuer. Tous les horaires auxquels l'employé est affecté et qui chevauchent entièrement la période est inclus dans ce décompte. |
maximumShiftCount |
Nombre maximal d'heures de travail autorisées par l'employé. Tous les horaires auxquels l'employé est affecté et qui chevauchent entièrement la période est inclus dans ce décompte. |
minimumRestMinutes |
Nombre minimal de minutes pendant lesquelles l'employé doit se reposer après la fin d'un quart de travail avant d'être affecté à un autre quart. Cette contrainte s'applique à chaque paire de quarts de travail entièrement incluse dans [ |
Priorité
Niveau de priorité de toute contrainte liée au planning d'un employé ou aux exigences de couverture. (par exemple, SchedulingConstraint
, ResourceConstraint
, ShiftRequest
et CoverageRequirement
). Comme il peut y avoir des contraintes contradictoires, il n'est pas toujours possible de satisfaire toutes les contraintes. Ainsi, chaque type de contrainte a une priorité (donnée par l'utilisateur ou par défaut) qui informe le résolveur de l'importance relative de toutes les contraintes données pour un calendrier complet.
Enums | |
---|---|
PRIORITY_UNSPECIFIED |
Niveau de priorité inconnu. |
PRIORITY_LOW |
Niveau de priorité le plus bas. Les contraintes avec cette priorité sont moins importantes que les autres. Ils sont les premiers à être considérés comme non conformes si aucune solution plausible n'est trouvée. |
PRIORITY_MEDIUM |
Niveau de priorité moyen. Les contraintes avec cette priorité sont plus importantes que les contraintes de priorité PRIORITY_LOW , mais moins importantes que les contraintes de priorité PRIORITY_HIGH . Si aucune solution réalisable ne peut être trouvée après avoir assoupli toutes les contraintes avec la priorité PRIORITY_LOW , alors les contraintes de priorité PRIORITY_MEDIUM sont considérées comme la prochaine violation. |
PRIORITY_HIGH |
Niveau de priorité le plus élevé. Les contraintes avec ce niveau de priorité sont les plus importantes. Ils sont les derniers à considérer comme non-respect des règles si aucune solution réalisable n'est trouvée après l'assouplissement des contraintes des niveaux de priorité inférieurs. |
PRIORITY_MANDATORY |
Niveau de priorité qui représente un élément que le résolveur ne peut pas violer. Si le résolveur renvoie SolutionStatus.INFEASIBLE , cela peut être dû à un trop grand nombre de contraintes PRIORITY_MANDATORY . |
ResourceConstraint
Contrainte générale qui limite la quantité d'une certaine "ressource" utilisés par un employé. Il s'agit d'une version abstraite de SchedulingConstraint
, plus spécifique, et plus flexible pour l'utilisateur. De nombreuses contraintes de planification qui ne peuvent pas être spécifiées dans SchedulingConstraint.type
peuvent être spécifiées à l'aide de ce message.
Représentation JSON |
---|
{
"priority": enum ( |
Champs | |
---|---|
priority |
Niveau de priorité de cette contrainte de ressource. La priorité par défaut pour toutes les contraintes de ressources est |
resourceUsages |
Quantité de ressources utilisée par les équipes. Par exemple, si cette contrainte s'applique aux heures minimum et maximum de travail d'un employé au cours d'une semaine spécifique, cette carte contiendra les quarts de travail qui se produisent au cours de cette semaine et la durée de chaque équipe en heures. Objet contenant une liste de paires |
minimumResourceUsage |
Utilisation minimale des ressources pour respecter une contrainte de ressource. |
maximumResourceUsage |
Utilisation maximale des ressources pour qu'une contrainte de ressource soit respectée. |
ShiftRequest
Demande d'affectation ou de non-affectation à des équipes spécifiques d'un employé.
Représentation JSON |
---|
{ "priority": enum ( |
Champs | |
---|---|
priority |
Niveau de priorité de cette demande de planification. La priorité par défaut de toutes les requêtes de planification est |
shiftIds[] |
ID des équipes de la requête de planification. |
type |
Type de demande, par exemple, si la demande est attribuée ou non à l'ensemble d'équipes. |
WorkStatus
Indique si un employé travaille ou non.
Enums | |
---|---|
WORK_STATUS_UNSPECIFIED |
État professionnel inconnu. |
STATUS_WORK |
Statut représentant un employé qui travaille. |
STATUS_NOT_WORK |
Statut représentant un employé qui ne travaille pas. |
HourlyContract
Spécifie un tarif horaire de base, des différentiels de taux et des multiplicateurs d'heures supplémentaires pour déterminer la rémunération d'un employé. Notez que les réglementations en fonction du pays peuvent nécessiter un calcul différent pour la rémunération des heures supplémentaires. Le résolveur évalue la rémunération des heures supplémentaires de façon à minimiser un indicateur du coût total ou à respecter un budget (voir BudgetRequirement
). Il n'est pas destiné à être utilisé comme outil de calcul des salaires.
Représentation JSON |
---|
{
"baseHourlyRate": number,
"hourlyRateShiftDifferentials": {
string: number,
...
},
"overtimePeriods": [
{
object ( |
Champs | |
---|---|
baseHourlyRate |
Rémunération pour le travail effectué en dehors des heures supplémentaires. Si plusieurs taux s'appliquent à l'employé, des différentiels de taux sont appliqués par rapport à ce tarif horaire de base. En outre, s'il existe plusieurs tarifs, le tarif horaire de base doit être le plus faible de ces tarifs. |
hourlyRateShiftDifferentials |
Différence de tarif horaire, payé en plus de Objet contenant une liste de paires |
overtimePeriods[] |
Liste de toutes les périodes pour lesquelles des heures supplémentaires doivent être calculées. Ces périodes ne doivent pas se chevaucher. |
OvertimePeriod
Période fixe et récurrente régulièrement (généralement 168 heures ou sept périodes consécutives de 24 heures) utilisée pour déterminer le montant de la rémunération des heures supplémentaires. Chaque période a un multiplicateur de heures supplémentaires (par exemple, 1,5) par rapport au baseHourlyRate
et une limite du nombre d'heures considérées comme du travail régulier (hors heures supplémentaires). Tout quart de travail qui chevauche la fenêtre de temps startDateTime
(incluse) et endDateTime
(exclue) est comptabilisé dans le nombre total d'heures travaillées dans la période. Si le chevauchement est partiel, seules les heures qui se chevauchent sont comptabilisées.
Représentation JSON |
---|
{ "overtimeMultiplier": number, "startDateTime": { object ( |
Champs | |
---|---|
overtimeMultiplier |
Multiplicateur pour calculer le taux horaire des heures supplémentaires (il doit être supérieur ou égal à 1,0). Le tarif horaire des heures supplémentaires est généralement calculé comme suit : |
startDateTime |
Heure de début de la période de prolongation. Si un quart de travail chevauche ce créneau horaire, les heures correspondantes sont comptabilisés à partir du |
endDateTime |
Heure de fin de la période de prolongation. Si un quart de travail chevauche cette période, les heures correspondantes sont comptabilisées jusqu'à |
maximumRegularHours |
Nombre maximal d'heures de travail payées à un taux normal (hors heures supplémentaires). Cette quantité doit être positive. |
Maj
Un quart de travail spécifie une fenêtre de temps fixe pendant laquelle les employés peuvent travailler.
Représentation JSON |
---|
{ "id": string, "locationId": string, "startDateTime": { object ( |
Champs | |
---|---|
id |
ID unique attribué à ce changement. |
locationId |
ID de la zone géographique où ce travail de changement est effectué. Cette valeur n'est pas obligatoire. |
startDateTime |
Heure de début du quart de travail (incluse). |
endDateTime |
Heure de fin du quart de travail (exclue). Actuellement, le résolveur n'accepte que les équipes de moins de 24 heures. |
breakRules[] |
Liste des règles de non-respect des règles appliquées pendant le quart de travail. Les employés qui effectuent ce quart de travail bénéficient d'une pause par |
BreakRule
Règle qui détermine à quel moment une pause peut commencer au sein d'un quart de travail et sa durée. La liste de toutes les coupures possibles prises en compte est déterminée par incréments de ruleIncrementMinutes
. Par exemple, si une règle de rupture modélise une pause de 30 minutes qui peut commencer entre 10:00 et 11:00, et que l'incrément de la règle est de 20 minutes, la liste des sauts pris en compte est : [10:00, 10:30], [10:20, 10:50], [10:1, 0], 1:1, 1.
Représentation JSON |
---|
{ "earliestStartTime": { object ( |
Champs | |
---|---|
earliestStartTime |
Heure de début au plus tôt de la coupure (incluse). Vous ne pouvez définir que |
latestStartTime |
Dernière heure de début de la pause (incluse). Vous ne pouvez définir que |
durationMinutes |
Durée de la pause en minutes. |
ruleIncrementMinutes |
[Facultatif] Incrément de temps en minutes pour tous les sauts pris en compte dans cette règle de rupture. Si ce champ n'est pas défini, la valeur par défaut est |
CoverageRequirement
Une exigence de couverture spécifie le nombre d'employés requis pour un ensemble de rôles et/ou de compétences pendant une période donnée et dans un lieu donné. Les intervalles DateTime d'un emplacement particulier ne peuvent pas se chevaucher. Vous pouvez également fournir une liste des ID d'équipes au lieu d'une période et d'un lieu. Seuls les employés pouvant être affectés à un rôle spécifique (ou possédant la compétence spécifique) peuvent répondre à cette exigence.
Pour un poste et/ou une compétence donnés, l'exigence de couverture est remplie lorsqu'au moins targetEmployeeCount
employés travaillent à tout moment de la période (ou pour chaque quart de travail du shiftIds
). En revanche, l'exigence de couverture n'est pas respectée si, à un moment donné de la période (ou pour l'une des périodes de travail du shiftIds
), moins de targetEmployeeCount
employés travaillent au cours de cette période. Le nombre d'employés actifs est supérieur au nombre de targetEmployeeCount
, mais le résolveur limite le nombre d'employés.
Représentation JSON |
---|
{ "startDateTime": { object ( |
Champs | |
---|---|
startDateTime |
Heure de début de la couverture requise (incluse). S'il est défini, |
endDateTime |
Heure de fin de la condition de couverture (exclue). S'il est défini, |
locationId |
Lieu où les employés sont nécessaires. |
shiftIds[] |
S'ils sont définis, les exigences de poste et de compétences sont appliquées individuellement à chaque ID d'équipe de cette liste. Si les valeurs "shiftId" ne sont pas vides, les champs |
roleRequirements[] |
Nombre requis d'employés à attribuer aux rôles spécifiés pendant la période. Vous ne devez indiquer qu'un seul élément |
skillRequirements[] |
Nombre requis d'employés possédant les compétences spécifiées et affectés à des équipes pendant la période. Vous ne devez indiquer qu'un seul élément |
RoleRequirement
Nombre requis d'employés à attribuer au rôle spécifié pendant la période.
Représentation JSON |
---|
{
"roleId": string,
"targetEmployeeCount": integer,
"priority": enum ( |
Champs | |
---|---|
roleId |
ID de rôle pour l'exigence. |
targetEmployeeCount |
Nombre souhaité d'employés affectés au rôle pendant la période. |
priority |
Niveau de priorité pour cette contrainte d'exigence. La priorité par défaut pour toutes les contraintes de ressources est |
SkillRequirement
Nombre requis d'employés qui travaillent pendant la période donnée et possèdent les compétences spécifiées.
Représentation JSON |
---|
{
"skillId": string,
"targetEmployeeCount": integer,
"priority": enum ( |
Champs | |
---|---|
skillId |
ID de compétence pour la condition. |
targetEmployeeCount |
Nombre souhaité d'employés ayant la compétence donnée et travaillant pendant la fenêtre de temps. |
priority |
Niveau de priorité pour cette contrainte d'exigence. La priorité par défaut pour toutes les contraintes de ressources est |
BudgetRequirement
Exigences budgétaires pour un intervalle donné.
Représentation JSON |
---|
{ "totalBudget": number, "startDateTime": { object ( |
Champs | |
---|---|
totalBudget |
Budget total pour l'intervalle donné. Vous devez indiquer un budget total si la priorité est Si |
startDateTime |
Heure de début à laquelle ce budget s'applique. Si aucune heure de début n'est spécifiée, elle est définie comme étant l'heure de début la plus proche pour toutes les périodes de travail données. |
endDateTime |
Heure de fin à laquelle ce budget s'applique. Si aucune heure de fin n'est spécifiée, elle est définie comme étant la dernière heure de fin de toutes les périodes de travail données. |
priority |
Niveau de priorité pour respecter le budget requis au cours de la période spécifiée. La priorité par défaut est Notez que si cette priorité est plus élevée que d'autres priorités de contraintes et que |
ShiftAssignment
Attribuer un rôle à un employé
Représentation JSON |
---|
{
"employeeId": string,
"shiftId": string,
"roleId": string,
"breaks": [
{
object ( |
Champs | |
---|---|
employeeId |
ID de l'employé en cours d'attribution. |
shiftId |
ID d'équipe attribué à l'employé. |
roleId |
ID de rôle attribué à l'employé pour le quart de travail. |
breaks[] |
Liste des pauses pour cette attribution de quarts. |
Pause
Période pendant laquelle un employé interrompt son travail pendant un quart de travail.
Représentation JSON |
---|
{
"startDateTime": {
object ( |
Champs | |
---|---|
startDateTime |
Heure de début d'une pause. |
durationMinutes |
Durée de la pause en minutes. |
SolutionStatus
État de la solution (planification) fourni dans la réponse d'un résolveur.
Enums | |
---|---|
SOLUTION_STATUS_UNSPECIFIED |
État de la réponse non spécifié. |
FEASIBLE |
Le calendrier renvoyé est faisable, mais peut ne pas être optimal. |
OPTIMAL |
Le calendrier renvoyé est optimal. |
INFEASIBLE |
Il n'existe aucun calendrier réalisable pour les contraintes données. Le résolveur peut renvoyer cette valeur si un sous-ensemble des contraintes avec le niveau de priorité PRIORITY_MANDATORY ne peut pas être satisfait. |
NOT_SOLVED |
Aucune programmation n'a été trouvée. |
NOT_SOLVED_DEADLINE_EXCEEDED |
Aucune planification n'a été trouvée dans le délai indiqué. |