Résout un problème d'horaires fixes de la SolveShiftSchedulingRequest
donnée en affectant des employés à des quarts de travail de manière à maximiser les préférences d'emploi du temps et à minimiser les cas de non-respect des contraintes liés à la planification.
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 |
Identifiant du problème ou de la demande. |
solveParameters |
Paramètres permettant de contrôler une seule solution du problème. |
employees[] |
Tous les employés disponibles peuvent être programmés. |
shifts[] |
Tous les quarts de travail pour former le planning. |
coverageRequirements[] |
Exigences en termes de couverture pour l'ensemble de l'horizon de planification. Celles-ci indiquent le nombre d'employés devant occuper chaque fonction ou posséder une compétence pendant un créneau horaire ou via une liste d'identifiants d'équipes. Toutes les exigences de couverture doivent être spécifiées à l'aide de périodes ou d'une liste d'ID d'équipes (mais pas les deux). Les périodes (le cas échéant) correspondant aux exigences de couverture ne peuvent pas se chevaucher pour chaque zone géographique donnée. Le niveau de priorité par défaut pour chacune de ces contraintes est |
roleIds[] |
Liste de tous les rôles possibles au sein du personnel. Chaque employé doit avoir au moins un rôle auquel il peut être affecté pour une journée de travail. Un rôle fait référence à une attribution d'emploi spécifique pendant une quart de travail (par exemple, infirmier diplômé, chef exécutif, serveur, etc.). Lorsqu'un employé est affecté à un quart de travail, 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 à toutes les qualifications supplémentaires qu'un employé peut avoir qui n'ont pas trait à un poste attribuable spécifique (par exemple, des certifications, des langues parlées, etc.). Cette liste peut être vide. Lorsqu'un employé est affecté à un quart de travail, il doit posséder toutes les compétences nécessaires pour ce quart. |
locationIds[] |
Liste de tous les emplacements possibles pour l'ensemble des quarts de planning. Cette liste peut être vide. Il peut s'avérer utile de spécifier des emplacements différents lorsque, par exemple, une infirmière gérante souhaite prendre rendez-vous avec de nombreuses infirmières dans différentes unités d'un hôpital ou, par exemple, un directeur d'hôtel souhaite planifier des employés dans plusieurs hôtels. |
budgetRequirements[] |
Spécification du budget pour le problème de planification. Le niveau de priorité par défaut pour chacune de ces exigences est |
assignmentsHint[] |
Décalez les devoirs pour les utiliser comme solution provisoire (ou indice de solution) au problème de planification. Les indications d'attribution sont ignorées si l'attribution est contraire à une demande d'horaire non attribuable ou à une requête de planification. |
Corps de la réponse
Réponse de l'API de planification du personnel. Pour chaque réponse, shiftAssignments
sera vide si le solutionStatus
renvoyé est NOT_SOLVED_DEADLINE_EXCEEDED
ou INFEASIBLE
. Si le solutionStatus
renvoyé est OPTIMAL
ou FEASIBLE
, une attribution d'équipe valide est renvoyée dans shiftAssignments
. Pour une attribution de quarts valide, les propriétés suivantes sont conservées:
- Chaque ID d'employé fait partie de l'ensemble d'employés indiqué dans la requête.
- Chaque ID de rôle attribué à un employé est contenu dans l'ensemble d'ID de rôle de cet employé.
- Chaque ID d'équipe est contenu dans l'ensemble des quarts fourni dans la requête.
- Chaque ID d'équipe n'est pas un ID d'équipe non attribuable pour un employé donné.
- Un employé ne sera jamais affecté à deux quarts de travail qui se chevauchent.
- Pour le calendrier donné, aucune des contraintes ni aucune demande de 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 pas FEASIBLE ou OPTIMALE, d'autres champs de ce fichier proto peuvent être vides. Si l'état est NOT_SOLVED_DEADLINE_EXCEEDED, cela signifie que la limite de temps a été atteinte sans trouver de solution réalisable ni déterminer si une solution réalisable existe. Les demandes peuvent être impossibles si les contraintes de niveau de priorité OBLIGATOIRE ne peuvent pas toutes être satisfaites. |
shiftAssignments[] |
Liste de toutes les attributions. Chaque |
statusMessage |
Si |
SolveParameters
Paramètres qui contrôlent une solution unique pour le 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 cette règle n'est pas configurée, la valeur par défaut est de 1 minute. Cette valeur n'est pas une limite stricte et ne tient pas compte de la surcharge de communication. La latence attendue pour résoudre le problème peut légèrement dépasser cette valeur. Durée en secondes avec un maximum de neuf chiffres après la virgule, se terminant par " |
Employé
Un employé dont l'employé doit être programmé.
Représentation JSON |
---|
{ "id": string, "roleIds": [ string ], "skillIds": [ string ], "shiftPreferences": [ { object ( |
Champs | |
---|---|
id |
Identifiant unique attribué à cet employé. |
roleIds[] |
ID des rôles que cet employé peut exécuter. Au moins un rôle doit être spécifié. Lorsqu'un employé est affecté à un quart de travail, il se voit également attribuer un seul rôle à partir de cette liste. Différents rôles peuvent être affectés à l'employé au cours de la période de planification. |
skillIds[] |
Cet employé possède des ID de compétence. Cette liste peut être vide. Lorsqu'un employé est affecté à un quart de travail, il utilise un sous-ensemble des compétences énumérées ici pour couvrir les exigences de compétences pendant toute la durée de la période qui lui est assignée. |
shiftPreferences[] |
Changez les préférences de cet employé. Les quarts indiqués ici représentent les quarts auxquels l'employé aimerait être affecté pendant la fenêtre de planification. Les ID d'équipe indiqué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[] |
Toute contrainte de planification supplémentaire non spécifiée dans |
shiftRequests[] |
Liste des demandes d'horaires pour l'employé. La demande peut concerner l'affectation d'un employé ou l'absence d'affectation à des quarts de travail spécifiques. Toutes les attributions d'horaires fixes pour l'employé peuvent être représentées par un |
hourlyContract |
Contrat qui spécifie les taux horaires normaux et supplémentaires pour l'employé. |
ShiftPreference
Préférence numérique pour un ID d'équipe spécifique.
Représentation JSON |
---|
{ "shiftId": string, "preference": integer } |
Champs | |
---|---|
shiftId |
ID du décalage 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 pour un employé particulier. La contrainte spécifiée n'est appliquée que pendant l'intervalle donné [startDateTime,
endDateTime)
.
Représentation JSON |
---|
{ "priority": enum ( |
Champs | |
---|---|
priority |
Niveau de priorité de cette contrainte de planification. La priorité par défaut de toutes les contraintes de planification est |
startDateTime |
Heure de début d'application de cette contrainte de planification (incluse). |
endDateTime |
Heure de fin d'application de cette contrainte de planification (exclue). |
Champ d'union type . Type de contrainte spécifié. 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 pendant laquelle l'employé peut travailler. Si l'employé est affecté à un quart de travail qui chevauche (entièrement ou partiellement) le créneau horaire, le nombre de minutes correspondant au chevauchement du créneau horaire est inclus dans ce nombre. |
maximumMinutes |
Nombre maximal de minutes pendant lesquelles 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) le créneau horaire, le nombre de minutes correspondant au chevauchement du créneau horaire est inclus dans ce nombre. |
minimumConsecutiveWorkDays |
Nombre minimal de jours consécutifs pendant lesquels l'employé peut travailler. Un employé travaille un jour spécifique s'il est affecté à un quart de travail qui commence ce jour-là. Tous les quarts auxquels l'employé est affecté et qui débute dans le créneau horaire sont inclus dans ce décompte. |
maximumConsecutiveWorkDays |
Nombre maximal de jours consécutifs pendant lesquels l'employé peut travailler. Un employé travaille un jour spécifique s'il est affecté à un quart de travail qui commence ce jour-là. Tous les quarts auxquels l'employé est affecté et qui débute dans le créneau horaire sont inclus dans ce décompte. |
minimumShiftCount |
Nombre minimal d'équipes que l'employé peut effectuer. Tous les quarts auxquels l'employé est affecté et qui coïncide avec ce qui est indiqué dans le créneau horaire sont inclus dans ce nombre. |
maximumShiftCount |
Nombre maximal d'équipes que l'employé peut effectuer. Tous les quarts auxquels l'employé est affecté et qui coïncide avec ce qui est indiqué dans le créneau horaire sont inclus dans ce nombre. |
minimumRestMinutes |
Nombre minimal de minutes pendant lesquelles l'employé doit se reposer à la fin d'une quart de travail avant d'être affecté à un autre quart. Cette contrainte s'applique à chaque paire de décalages entièrement inclus dans [ |
Priorité
Niveau de priorité de toute contrainte sur l'emploi du temps d'un employé ou des exigences de couverture. Exemples : SchedulingConstraint
, ResourceConstraint
, ShiftRequest
et CoverageRequirement
. Étant donné qu'il peut y avoir des contraintes contradictoires, il n'est pas toujours possible de satisfaire toutes les contraintes. Chaque type de contrainte est associé à une priorité (donnée par l'utilisateur ou par défaut) qui informe le résolveur de l'importance relative de toutes les contraintes appliquées à une planification complète.
Enums | |
---|---|
PRIORITY_UNSPECIFIED |
Niveau de priorité inconnu. |
PRIORITY_LOW |
Niveau de priorité le plus bas. Les contraintes de cette priorité sont moins importantes que les autres. Ils sont les premiers à être pris en compte pour le non-respect des règles en l'absence de solution acceptable. |
PRIORITY_MEDIUM |
Niveau de priorité "Moyenne". Les contraintes de cette priorité sont plus importantes que celles de priorité PRIORITY_LOW , mais moins importantes que celles de priorité PRIORITY_HIGH . Si aucune solution réalisable ne peut être trouvée après avoir assoupli toutes les contraintes de priorité PRIORITY_LOW , les contraintes de priorité PRIORITY_MEDIUM sont alors considérées comme non conformes. |
PRIORITY_HIGH |
Niveau de priorité le plus élevé. Les contraintes de ce niveau de priorité sont les plus importantes. Ils sont les derniers à être pris en compte pour un cas de non-respect si aucune solution réalisable ne peut être trouvée après l'assouplissement des contraintes des niveaux de priorité inférieurs. |
PRIORITY_MANDATORY |
Niveau de priorité représentant 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ée par un employé. Il s'agit d'une version abstraite de SchedulingConstraint
, plus spécifique et plus flexible pour l'utilisateur. Ce message permet de spécifier de nombreuses contraintes de planification qui ne peuvent pas être spécifiées dans le SchedulingConstraint.type
.
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 au minimum et au maximum d'heures travaillées par un employé au cours d'une semaine spécifique, cette carte contiendra les quarts de travail de cette semaine et la durée de chaque quart en heures. Objet contenant une liste de paires |
minimumResourceUsage |
Utilisation minimale des ressources pour qu'une contrainte de ressource soit satisfaite. |
maximumResourceUsage |
Utilisation maximale des ressources pour qu'une contrainte de ressource soit satisfaite. |
ShiftRequest
Demande d'affectation ou de non-affectation d'un employé à des quarts de travail spécifiques.
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 demande de planification. |
type |
Type de demande (par exemple, demande à être attribuée ou non à un ensemble d'équipes) |
WorkStatus
Indique si un employé travaille ou non.
Enums | |
---|---|
WORK_STATUS_UNSPECIFIED |
État du travail inconnu. |
STATUS_WORK |
État représentant un employé qui travaille. |
STATUS_NOT_WORK |
État représentant un employé qui ne travaille pas. |
HourlyContract
Spécifie un taux horaire de base, des écarts de taux et des multiplicateurs d'heures supplémentaires pour déterminer la rémunération d'un employé. Notez que la réglementation en vigueur selon les pays peut nécessiter un calcul différent de la rémunération des heures supplémentaires. Le résolveur évalue la rémunération des heures supplémentaires soit pour minimiser un indicateur du coût total, soit pour respecter un budget (voir BudgetRequirement
). Il n'a pas vocation à être un outil de calcul de la paie.
Représentation JSON |
---|
{
"baseHourlyRate": number,
"hourlyRateShiftDifferentials": {
string: number,
...
},
"overtimePeriods": [
{
object ( |
Champs | |
---|---|
baseHourlyRate |
Rémunération pour le fait de travailler une heure sans heures supplémentaires. Si plusieurs tarifs s'appliquent à un employé, des différences de taux sont appliquées par rapport à ce taux horaire de base. En outre, s'il existe plusieurs tarifs, le tarif horaire de base doit correspondre au minimum. |
hourlyRateShiftDifferentials |
Différence de taux horaire, payé en plus de Objet contenant une liste de paires |
overtimePeriods[] |
Liste de toutes les périodes pour lesquelles des prolongations doivent être calculées. Ces périodes ne doivent pas se chevaucher. |
OvertimePeriod
Période fixe et récurrente (généralement de 168 heures ou sept périodes de 24 heures consécutives) utilisée pour déterminer le montant de la rémunération pour les heures supplémentaires. Chaque période est associée à un multiplicateur d'heures supplémentaires (par exemple, 1,5) par rapport aux baseHourlyRate
et à la limite du nombre d'heures considérées comme du travail normal (sans heures supplémentaires). Tout décalage qui chevauche la période startDateTime
(incluse) et endDateTime
(exclusif) est comptabilisé dans le nombre total d'heures travaillées au cours de cette 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 utilisé pour calculer le tarif horaire des heures supplémentaires (il doit être supérieur ou égal à 1). Le taux horaire des heures supplémentaires est généralement calculé comme suit : |
startDateTime |
Heure de début de la période de prolongation. Si une période de travail se chevauche cette fois-ci, les heures correspondantes sont comptabilisées à partir du |
endDateTime |
Heure de fin de la période de prolongation. En cas de chevauchement, les heures sont comptabilisées jusqu'à |
maximumRegularHours |
Nombre maximal d'heures de travail rémunérées à un taux normal (hors heures supplémentaires). Cette quantité doit être positive. |
Moment de la journée
Une 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 |
Identifiant unique attribué à ce décalage. |
locationId |
ID de la zone géographique où ce changement a lieu. Cette valeur n'est pas obligatoire. |
startDateTime |
Heure de début du quart de travail (incluse). |
endDateTime |
Heure de fin du décalage (exclusif). Actuellement, le résolveur n'autorise que les quarts de travail de moins de 24 heures. |
breakRules[] |
Liste des règles de non-respect des règles appliquées pendant le quart de travail. Une pause par |
BreakRule
Il s'agit d'une règle qui détermine le moment où une pause peut commencer pendant une période d'ajustement, ainsi que sa durée. La liste de toutes les coupures possibles qui sont prises en compte est déterminée par incréments de ruleIncrementMinutes
. Par exemple, si une règle d'interruption modélise une coupure de 30 minutes qui peut commencer entre 10:00 et 11:00, et que l'incrément de règle est de 20 minutes, la liste des coupures prises en compte est la suivante : [10:00, 10:30], [10:20, 10:50], [10:40, 11: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 |
Heure de début la plus tardive de la coupure publicitaire (incluse). Vous ne pouvez définir que |
durationMinutes |
Durée de la pause en minutes. |
ruleIncrementMinutes |
[Facultatif] Incrémentation en minutes de toutes les coupures publicitaires pouvant être prises en compte dans cette règle. 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 spécifique ne peuvent pas se chevaucher. Vous pouvez également fournir une liste d'ID d'équipes au lieu d'une période et d'un lieu. Seuls les employés pouvant être affectés à ce poste (ou qui possèdent les compétences spécifiques) 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 équipe en shiftIds
). En revanche, la couverture requise n'est pas respectée si, à un moment donné de la période (ou pour tous les quarts de travail de shiftIds
), le nombre d'employés est inférieur à targetEmployeeCount
pendant cette période. Un plus grand nombre d'employés que le targetEmployeeCount
répond toujours aux exigences, mais le résolveur réduit les effectifs en excè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 couverture requise (exclusive). S'il est défini, |
locationId |
Lieu dans lequel les employés sont nécessaires. |
shiftIds[] |
Si cette option est définie, les exigences de rôle et de compétences sont appliquées individuellement à chaque ID d'équipe de cette liste. Si les identifiants ShiftId ne sont pas vides, |
roleRequirements[] |
Nombre requis d'employés devant être affectés aux rôles spécifiés pendant la période. Au maximum, un |
skillRequirements[] |
Nombre requis d'employés possédant les compétences spécifiées qui sont affectées à des quarts de travail pendant la période. Au maximum, un |
RoleRequirement
Nombre requis d'employés devant être affectés au rôle spécifié pendant la période.
Représentation JSON |
---|
{
"roleId": string,
"targetEmployeeCount": integer,
"priority": enum ( |
Champs | |
---|---|
roleId |
ID du 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 le créneau horaire et possèdent les compétences spécifiées.
Représentation JSON |
---|
{
"skillId": string,
"targetEmployeeCount": integer,
"priority": enum ( |
Champs | |
---|---|
skillId |
ID de compétence requis pour cette condition. |
targetEmployeeCount |
Nombre souhaité d'employés possédant les compétences concernées et qui travaillent pendant cette période. |
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 de Si |
startDateTime |
Heure de début correspondant à la période d'application de ce budget. Si aucune heure de début n'est spécifiée, elle est définie sur l'heure de début la plus proche de tous les quarts de travail donnés. |
endDateTime |
Heure de fin correspondant à la période d'application de ce budget. Si aucune heure de fin n'est spécifiée, elle est définie sur l'heure de fin au plus tard de tous les quarts de travail donnés. |
priority |
Niveau de priorité permettant d'atteindre 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 les priorités des autres contraintes et que la valeur |
ShiftAssignment
Un employé pour une attribution de poste.
Représentation JSON |
---|
{
"employeeId": string,
"shiftId": string,
"roleId": string,
"breaks": [
{
object ( |
Champs | |
---|---|
employeeId |
ID de l'employé en cours d'attribution. |
shiftId |
Identifiant d'équipe attribué à l'employé. |
roleId |
Identifiant du rôle auquel l'employé est affecté pour le quart de travail. |
breaks[] |
Liste des pauses pour cette attribution d'équipe. |
Pause
Période au cours de 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 non spécifié pour la réponse. |
FEASIBLE |
Le calendrier renvoyé est réalisable, mais n'est peut-être pas 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 de niveau de priorité PRIORITY_MANDATORY ne peut pas être satisfait. |
NOT_SOLVED |
Aucun planning trouvé. |
NOT_SOLVED_DEADLINE_EXCEEDED |
Aucun planning trouvé dans le délai imparti. |