Method: scheduling.solveShiftScheduling

Risolve un problema di programmazione dei turni fisso a partire da SolveShiftSchedulingRequest specificato assegnando i dipendenti a turni in modo che le preferenze di pianificazione sono ingrandite e le violazioni dei vincoli di pianificazione sono ridotte al minimo.

Richiesta HTTP

POST https://optimization.googleapis.com/v1/scheduling:solveShiftScheduling

L'URL utilizza la sintassi di transcodifica gRPC.

Corpo della richiesta

Il corpo della richiesta contiene dati con la seguente struttura:

Rappresentazione JSON
{
  "requestId": string,
  "solveParameters": {
    object (SolveParameters)
  },
  "employees": [
    {
      object (Employee)
    }
  ],
  "shifts": [
    {
      object (Shift)
    }
  ],
  "coverageRequirements": [
    {
      object (CoverageRequirement)
    }
  ],
  "roleIds": [
    string
  ],
  "skillIds": [
    string
  ],
  "locationIds": [
    string
  ],
  "budgetRequirements": [
    {
      object (BudgetRequirement)
    }
  ],
  "assignmentsHint": [
    {
      object (ShiftAssignment)
    }
  ]
}
Campi
requestId

string

ID problema o richiesta.

solveParameters

object (SolveParameters)

Parametri per controllare una singola soluzione del problema.

employees[]

object (Employee)

Tutti i dipendenti disponibili da pianificare.

shifts[]

object (Shift)

Tutti i turni formano il programma.

coverageRequirements[]

object (CoverageRequirement)

Requisiti di copertura per l'intero orizzonte di pianificazione. Queste norme specificano il numero di dipendenti che devono svolgere ciascun ruolo o possedere una competenza, durante una finestra temporale o un elenco di ID turni. Tutti i requisiti di copertura devono essere specificati con finestre temporali o un elenco di ID turni (ma non entrambi). Le finestre temporali (se presenti) per i requisiti di copertura non possono sovrapporsi per ogni località specifica. Il livello di priorità predefinito per ciascuno di questi vincoli è PRIORITY_MANDATORY per i requisiti dei ruoli e PRIORITY_LOW per i requisiti delle competenze. Per ulteriori dettagli, consulta l'enum Priority.

roleIds[]

string

Elenco di tutti i ruoli possibili nella forza lavoro. Ogni dipendente deve avere almeno un ruolo che può essere assegnato per un turno. Un ruolo si riferisce a uno specifico incarico durante un turno (ad es. infermiere iscritto, dirigente chef, cameriere e così via). Quando un dipendente è assegnato a un turno, viene anche assegnato a un singolo ruolo specifico.

skillIds[]

string

Elenco di tutte le possibili competenze nella forza lavoro. Una competenza si riferisce a qualifiche aggiuntive che un dipendente può avere e che non riguardano un lavoro specifico assegnabile (ad esempio, certificazioni, lingue parlate e così via). Questo elenco può essere vuoto. Quando un dipendente viene assegnato a un turno, deve soddisfare tutte le competenze necessarie per quel turno.

locationIds[]

string

Elenco di tutte le posizioni possibili per l'insieme di turni nella programmazione. Questo elenco può essere vuoto. Specificare luoghi diversi può essere utile quando, ad esempio, un direttore infermieristico vuole pianificare molti infermieri in unità diverse dell'ospedale o, per un altro esempio, un direttore di hotel vuole programmare dipendenti in più hotel.

budgetRequirements[]

object (BudgetRequirement)

Specifica del budget per il problema di pianificazione. Il livello di priorità predefinito per ciascuno di questi requisiti è PRIORITY_LOW. Per ulteriori dettagli, consulta l'enum Priority.

assignmentsHint[]

object (ShiftAssignment)

Sposta le assegnazioni da usare come soluzione provvisoria (ovvero suggerimento per soluzione) al problema di pianificazione. I suggerimenti per i compiti vengono ignorati se il compito è in contraddizione con un turno non assegnabile o una richiesta di pianificazione.

Corpo della risposta

Risposta per l'API forza lavoro di pianificazione. Per ogni risposta, shiftAssignments sarà vuoto se il valore solutionStatus restituito è NOT_SOLVED_DEADLINE_EXCEEDED o INFEASIBLE. Se il valore solutionStatus restituito è OPTIMAL o FEASIBLE, viene restituito un compito valido in shiftAssignments. Per un'assegnazione di turni valida, vengono mantenute le seguenti proprietà:

  1. Ogni ID dipendente è contenuto nell'insieme di dipendenti indicato nella richiesta.
  2. Ogni ID ruolo assegnato al dipendente è contenuto nella serie di ID ruolo del dipendente specificato.
  3. Ogni ID variazione è contenuto nell'insieme di variazioni specificato nella richiesta.
  4. Ogni ID turno non è uno degli ID turno non assegnabili per un determinato dipendente.
  5. A un dipendente non verranno mai assegnati due turni che si sovrappongono.
  6. Per la pianificazione specificata, non viene violata nessuna delle limitazioni o delle richieste con livello di priorità PRIORITY_MANDATORY.

In caso di esito positivo, il corpo della risposta contiene dati con la seguente struttura:

Rappresentazione JSON
{
  "requestId": string,
  "solutionStatus": enum (SolutionStatus),
  "shiftAssignments": [
    {
      object (ShiftAssignment)
    }
  ],
  "statusMessage": string
}
Campi
requestId

string

L'ID della richiesta a cui è associata questa risposta.

solutionStatus

enum (SolutionStatus)

Stato della soluzione restituita. Se la soluzione non è FATTIBILE o OTTIMA, gli altri campi di questo protocollo potrebbero essere vuoti. Se lo stato è NOT_SOLVED_DEADLINE_EXCEEDED, il limite di tempo è stato raggiunto senza trovare una soluzione fattibile o senza determinare se esiste una soluzione fattibile. Le richieste potrebbero non essere fattibili se i vincoli del livello di priorità OBBLIGATORIO non possono essere soddisfatti.

shiftAssignments[]

object (ShiftAssignment)

Elenco di tutti i compiti. Ogni ShiftAssignment specifica un dipendente, il turno a cui è assegnato e il ruolo che deve svolgere per quel turno.

statusMessage

string

Se solutionStatus non è ottimale, questo campo può contenere informazioni aggiuntive sul risolutore.

SolveParameters

Parametri che controllano una singola soluzione del problema di pianificazione dei turni.

Rappresentazione JSON
{
  "timeLimit": string
}
Campi
timeLimit

string (Duration format)

Tempo massimo che il risolutore dovrebbe dedicare al problema. Se non viene configurato, il valore predefinito è 1 minuto.

Questo valore non rappresenta un limite rigido e non tiene conto dell'overhead di comunicazione. La latenza prevista per risolvere il problema potrebbe superare leggermente questo valore.

Durata in secondi con un massimo di nove cifre frazionarie e termina con "s". Esempio: "3.5s".

Dipendente

Un dipendente della forza lavoro da pianificare.

Rappresentazione JSON
{
  "id": string,
  "roleIds": [
    string
  ],
  "skillIds": [
    string
  ],
  "shiftPreferences": [
    {
      object (ShiftPreference)
    }
  ],
  "schedulingConstraints": [
    {
      object (SchedulingConstraint)
    }
  ],
  "resourceConstraints": [
    {
      object (ResourceConstraint)
    }
  ],
  "shiftRequests": [
    {
      object (ShiftRequest)
    }
  ],
  "hourlyContract": {
    object (HourlyContract)
  }
}
Campi
id

string

ID univoco assegnato a questo dipendente.

roleIds[]

string

ID ruolo eseguibili da questo dipendente. Deve essere specificato almeno un ruolo. Quando un dipendente è assegnato a un turno, viene anche assegnato a un singolo ruolo di questo elenco. Al dipendente potrebbero essere assegnati ruoli diversi durante la finestra di pianificazione.

skillIds[]

string

ID delle competenze posseduti dal dipendente. Questo elenco può essere vuoto. Quando un dipendente è assegnato a un turno, utilizza qualsiasi sottoinsieme delle competenze elencate qui per coprire i requisiti di competenza per tutta la durata del turno assegnato.

shiftPreferences[]

object (ShiftPreference)

Sposta le preferenze di questo dipendente. I turni specificati qui rappresentano i turni a cui il dipendente preferirebbe essere assegnato durante la finestra di programmazione. Gli ID spostamento specificati in shiftPreferences devono essere univoci. Il risolutore cercherà di massimizzare la somma dei valori di ShiftPreference.preference su tutti i shiftPreferences soddisfatti.

schedulingConstraints[]

object (SchedulingConstraint)

Elenco dei vincoli di pianificazione per questo dipendente. Il livello di priorità predefinito per ciascuno di questi vincoli è PRIORITY_MEDIUM. Per ulteriori dettagli, consulta l'enum Priority.

resourceConstraints[]

object (ResourceConstraint)

Eventuali vincoli di pianificazione aggiuntivi non specificati in schedulingConstraints possono essere aggiunti qui a resourceConstraints. Un ResourceConstraint è una rappresentazione più astratta per limitare le risorse per un dipendente. Il livello di priorità predefinito per ciascuno di questi vincoli è PRIORITY_MEDIUM. Per ulteriori dettagli, consulta l'enum Priority.

shiftRequests[]

object (ShiftRequest)

Elenco di richieste di turni per il dipendente. La richiesta può fare in modo che un dipendente venga assegnato o meno a turni specifici. Qualsiasi assegnazione di pianificazione fissa per il dipendente può essere rappresentata con un elemento ShiftRequest con priorità PRIORITY_MANDATORY. Un ID turno può essere visualizzato al massimo in una richiesta di pianificazione per questo dipendente. Il livello di priorità predefinito per ciascuna di queste richieste è PRIORITY_LOW. Per ulteriori dettagli, consulta l'enum Priority.

hourlyContract

object (HourlyContract)

Contratto che specifica le tariffe orarie regolari e di straordinario del dipendente.

ShiftPreference

Una preferenza numerica per un determinato ID variazione.

Rappresentazione JSON
{
  "shiftId": string,
  "preference": integer
}
Campi
shiftId

string

ID spostamento per il quale è specificata la preferenza.

preference

integer

Valori di preferenza più alti indicano un cambiamento più desiderabile.

SchedulingConstraint

Vincolo di pianificazione specifico per un determinato dipendente. Il vincolo specificato viene applicato solo durante l'intervallo [startDateTime, endDateTime) specificato.

Rappresentazione JSON
{
  "priority": enum (Priority),
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },

  // Union field type can be only one of the following:
  "minimumMinutes": integer,
  "maximumMinutes": integer,
  "minimumConsecutiveWorkDays": integer,
  "maximumConsecutiveWorkDays": integer,
  "minimumShiftCount": integer,
  "maximumShiftCount": integer,
  "minimumRestMinutes": integer
  // End of list of possible types for union field type.
}
Campi
priority

enum (Priority)

Livello di priorità per questo vincolo di pianificazione. La priorità predefinita per tutti i vincoli di pianificazione è PRIORITY_MEDIUM.

startDateTime

object (DateTime)

L'ora di inizio in cui viene applicato questo vincolo di pianificazione (inclusa).

endDateTime

object (DateTime)

L'ora di fine in cui viene applicato questo vincolo di pianificazione (esclusa).

Campo unione type. Il tipo di vincolo specificato. Ogni vincolo viene applicato solo entro l'intervallo di tempo specificato sopra. type può essere solo uno dei seguenti:
minimumMinutes

integer

Numero minimo di minuti in cui il dipendente può lavorare. Se al dipendente è assegnato un turno che si sovrappone (totalmente o parzialmente) all'intervallo di tempo, il numero di minuti in cui il turno si sovrappone alla finestra temporale è incluso in questo conteggio.

maximumMinutes

integer

Numero massimo di minuti in cui il dipendente può lavorare nella finestra temporale. Se al dipendente è assegnato un turno che si sovrappone (totalmente o parzialmente) all'intervallo di tempo, il numero di minuti in cui il turno si sovrappone alla finestra temporale è incluso in questo conteggio.

minimumConsecutiveWorkDays

integer

Numero minimo di giorni consecutivi in cui il dipendente può lavorare. Un dipendente lavora in un giorno specifico se è assegnato a un turno che inizia durante quella giornata. Nel conteggio è incluso qualsiasi turno assegnato al dipendente che inizia nella finestra temporale.

maximumConsecutiveWorkDays

integer

Numero massimo di giorni consecutivi in cui il dipendente può lavorare. Un dipendente lavora in un giorno specifico se è assegnato a un turno che inizia durante quella giornata. Nel conteggio è incluso qualsiasi turno assegnato al dipendente che inizia nella finestra temporale.

minimumShiftCount

integer

Numero minimo di turni che il dipendente può lavorare. Nel conteggio viene incluso qualsiasi turno assegnato al dipendente che si sovrappone completamente alla finestra temporale.

maximumShiftCount

integer

Numero massimo di turni che il dipendente può lavorare. Nel conteggio viene incluso qualsiasi turno assegnato al dipendente che si sovrappone completamente alla finestra temporale.

minimumRestMinutes

integer

Numero minimo di minuti in cui il dipendente deve riposare dopo la fine di un turno prima di essere assegnato a un altro turno. Questo vincolo si applica a ogni coppia di adattamenti completamente inclusi in [startDateTime, endDateTime].

Priorità

Il livello di priorità per qualsiasi vincolo nella pianificazione di un dipendente o nei requisiti di copertura. Sono inclusi SchedulingConstraint, ResourceConstraint, ShiftRequest e CoverageRequirement. Poiché potrebbero esserci vincoli in conflitto, non è sempre possibile soddisfare tutti i vincoli. Di conseguenza, ogni tipo di vincolo ha una priorità (dall'utente o predefinita) che informa il risolutore dell'importanza relativa di tutti i vincoli assegnati a una pianificazione completa.

Enum
PRIORITY_UNSPECIFIED Livello di priorità sconosciuto.
PRIORITY_LOW Il livello di priorità più basso. I vincoli con questa priorità sono meno importanti degli altri. Sono i primi a essere presi in considerazione per violazione se non è possibile trovare una soluzione fattibile.
PRIORITY_MEDIUM Livello di priorità medio. I vincoli con questa priorità sono più importanti dei vincoli con priorità PRIORITY_LOW, ma meno importanti dei vincoli con priorità PRIORITY_HIGH. Se non è possibile trovare una soluzione fattibile dopo aver allentato tutti i vincoli con priorità PRIORITY_LOW, i vincoli con priorità PRIORITY_MEDIUM vengono considerati i successivi per la violazione.
PRIORITY_HIGH Il livello di priorità più alto. I vincoli con questo livello di priorità sono i più importanti. Sono gli ultimi a essere considerati per violazione se non è possibile trovare una soluzione fattibile dopo aver allentato i vincoli dei livelli di priorità inferiori.
PRIORITY_MANDATORY Livello di priorità che rappresenta qualcosa che non può essere violato dal risolutore. Se il risolutore restituisce SolutionStatus.INFEASIBLE, la causa potrebbe essere un numero eccessivo di vincoli PRIORITY_MANDATORY.

ResourceConstraint

Un vincolo generale che limita la quantità di una determinata "risorsa" utilizzata da un dipendente. Si tratta di una versione astratta dello standard SchedulingConstraint più specifico e più flessibile per l'utente. Questo messaggio consente di specificare molti vincoli di pianificazione che non possono essere specificati in SchedulingConstraint.type.

Rappresentazione JSON
{
  "priority": enum (Priority),
  "resourceUsages": {
    string: number,
    ...
  },
  "minimumResourceUsage": number,
  "maximumResourceUsage": number
}
Campi
priority

enum (Priority)

Livello di priorità di questo vincolo della risorsa. La priorità predefinita per tutti i vincoli delle risorse è PRIORITY_MEDIUM.

resourceUsages

map (key: string, value: number)

Quantità di risorse utilizzata dai turni. Ad esempio, se questo vincolo si applica alle ore minime e massime lavorate da un dipendente in una determinata settimana, questa mappa conterrà i turni che si verificano in quella settimana e la durata di ogni turno in ore.

Un oggetto contenente un elenco di "key": value coppie. Esempio: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

minimumResourceUsage

number

Utilizzo minimo delle risorse per soddisfare un vincolo delle risorse.

maximumResourceUsage

number

Utilizzo massimo delle risorse per soddisfare un vincolo delle risorse.

ShiftRequest

La richiesta di un dipendente di essere assegnata o meno a turni specifici.

Rappresentazione JSON
{
  "priority": enum (Priority),
  "shiftIds": [
    string
  ],
  "type": enum (WorkStatus)
}
Campi
priority

enum (Priority)

Livello di priorità di questa richiesta di pianificazione. La priorità predefinita per tutte le richieste di pianificazione è PRIORITY_LOW.

shiftIds[]

string

Gli ID delle variazioni della richiesta di pianificazione.

type

enum (WorkStatus)

Tipo di richiesta, ad esempio se la richiesta è assegnata o meno all'insieme di turni.

WorkStatus

Che un dipendente lavori o meno.

Enum
WORK_STATUS_UNSPECIFIED Stato del lavoro sconosciuto.
STATUS_WORK Stato che rappresenta un dipendente che lavora.
STATUS_NOT_WORK Stato che rappresenta un dipendente non lavorativo.

HourlyContract

Specifica una tariffa oraria di base, differenziali di tariffa e moltiplicatori di straordinari per determinare la retribuzione per un dipendente. Tieni presente che le normative vigenti in luoghi diversi potrebbero richiedere un calcolo diverso dell'indennità per gli straordinari. Il risolutore approssima la retribuzione degli straordinari per ridurre al minimo un'approssimazione del costo totale o soddisfare un budget (vedi BudgetRequirement). Non è inteso come uno strumento per calcolare le buste paga.

Rappresentazione JSON
{
  "baseHourlyRate": number,
  "hourlyRateShiftDifferentials": {
    string: number,
    ...
  },
  "overtimePeriods": [
    {
      object (OvertimePeriod)
    }
  ]
}
Campi
baseHourlyRate

number

Il compenso per il lavoro di un'ora non straordinaria. Se al dipendente si applicano più tariffe, vengono applicate differenze di tariffa rispetto a questa tariffa oraria di base. Inoltre, se sono presenti più tariffe, la tariffa oraria di base deve essere quella minima tra queste.

hourlyRateShiftDifferentials

map (key: string, value: number)

Il differenziale della tariffa oraria, pagato in aggiunta al baseHourlyRate. Ad esempio, se la tariffa oraria di base è di 30 $/ora, "shift_1" viene pagato a una tariffa di 40 $/h e "shift_2" viene pagato a una tariffa di 45 $/ora, quindi la rappresentazione proto è: baseHourlyRate: 30 hourlyRateShiftDifferentials {key: "shift_1" value: 10} hourlyRateShiftDifferentials {key: "shift_2" value: 15}.

Un oggetto contenente un elenco di "key": value coppie. Esempio: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

overtimePeriods[]

object (OvertimePeriod)

Un elenco di tutti i periodi per i quali è necessario calcolare il tempo straordinario. Questi periodi non devono sovrapporsi.

OvertimePeriod

Periodo fisso e ricorrente (in genere 168 ore o sette periodi consecutivi di 24 ore) utilizzato per determinare l'importo della compensazione per gli straordinari. Ogni periodo ha un moltiplicatore degli straordinari (ad es. 1.5) rispetto al baseHourlyRate e a un limite al numero di ore considerate lavorative regolari (non straordinari). Qualsiasi turno che si sovrappone alla finestra di tempo startDateTime (incluso) e endDateTime (escluso) viene conteggiato nel numero totale di ore lavorate nel periodo. Se la sovrapposizione è parziale, vengono conteggiate solo le ore che si sovrappongono.

Rappresentazione JSON
{
  "overtimeMultiplier": number,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "maximumRegularHours": number
}
Campi
overtimeMultiplier

number

Moltiplicatore per calcolare la tariffa oraria straordinaria (deve essere maggiore o uguale a 1,0). In genere, la tariffa oraria relativa agli straordinari viene calcolata come baseHourlyRate * overtimeMultiplier. Se sono previste più tariffe tramite hourlyRateShiftDifferentials, il risolutore approssima la tariffa oraria degli straordinari con una media semplice delle tariffe applicabili durante il periodo di straordinari. Nota: le normative di paesi diversi potrebbero richiedere un calcolo diverso dell'indennità per gli straordinari. Il risolutore approssima la retribuzione degli straordinari per ridurre al minimo un indiretto del costo totale o per soddisfare un budget, ma non è inteso come uno strumento per calcolare le buste paga.

startDateTime

object (DateTime)

Ora di inizio del periodo di tempo straordinario. Se un turno si sovrappone in questo orario, le ore di questo spostamento vengono conteggiate a partire da startDateTime.

endDateTime

object (DateTime)

Ora di fine del periodo di tempo straordinario. Se un turno si sovrappone a questo orario, le ore di questo turno vengono conteggiate fino a endDateTime.

maximumRegularHours

number

Numero massimo di ore di lavoro pagate con una tariffa regolare (non straordinario). Questa quantità deve essere positiva.

Maiusc

Un turno specifica una finestra temporale fissa in cui i dipendenti possono lavorare.

Rappresentazione JSON
{
  "id": string,
  "locationId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "breakRules": [
    {
      object (BreakRule)
    }
  ]
}
Campi
id

string

ID univoco assegnato a questo spostamento.

locationId

string

ID località in cui è stato applicato questo turno. Può essere vuoto.

startDateTime

object (DateTime)

L'ora di inizio del turno (inclusa).

endDateTime

object (DateTime)

L'ora di fine del turno (esclusa). Attualmente, il risolutore ammette solo turni di durata inferiore a 24 ore.

breakRules[]

object (BreakRule)

Un elenco di regole di interruzione che si verificano durante il turno. Ai dipendenti che svolgono questo turno viene assegnata una pausa ogni break_rule, durante la quale non coprono la domanda per il ruolo che stanno svolgendo. Ogni finestra temporale di BreakRule deve essere completamente inclusa nel periodo di questo turno.

BreakRule

Una regola che determina quando può iniziare una pausa all'interno di un turno e la sua durata. L'elenco di tutte le possibili interruzioni prese in considerazione viene determinato in incrementi di ruleIncrementMinutes. Ad esempio, se una regola di interruzione modella un'interruzione di 30 minuti che può iniziare tra le 10:00 e le 11:00 e l'incremento della regola è di 20 minuti, le interruzioni considerate sono: [10:00, 10:30], [10:20, 10:50], [10:40, 11:1].

Rappresentazione JSON
{
  "earliestStartTime": {
    object (DateTime)
  },
  "latestStartTime": {
    object (DateTime)
  },
  "durationMinutes": integer,
  "ruleIncrementMinutes": integer
}
Campi
earliestStartTime

object (DateTime)

La prima ora di inizio della pausa (inclusa). È possibile impostare solo hours e minutes.

latestStartTime

object (DateTime)

L'ultima ora di inizio della pausa (inclusa). È possibile impostare solo hours e minutes.

durationMinutes

integer

Durata dell'interruzione in minuti.

ruleIncrementMinutes

integer

[Facoltativo] Incremento del tempo in minuti per tutte le interruzioni che possono essere considerate in questa regola per le interruzioni. Se non viene configurato, il valore predefinito è durationMinutes.

CoverageRequirement

Un requisito di copertura specifica il numero di dipendenti necessari per un insieme di ruoli e/o competenze durante una particolare finestra temporale e in una determinata località. Gli intervalli DateTime in una determinata località non possono sovrapporsi. In alternativa, è possibile fornire un elenco di ID turni al posto di una finestra temporale e di una località. Solo i dipendenti che possono essere assegnati a un ruolo specifico (o che possiedono una competenza specifica) possono soddisfare questo requisito.

Per un determinato ruolo e/o competenza, il requisito di copertura viene soddisfatto quando almeno targetEmployeeCount di dipendenti lavora in ogni momento della finestra temporale (o per ogni turno nel seguente paese: shiftIds). Al contrario, il requisito di copertura viene violato se in qualsiasi momento della finestra temporale (o per uno qualsiasi dei turni in shiftIds) ci sono meno di targetEmployeeCount dipendenti che lavorano durante la finestra temporale. Un numero maggiore di dipendenti che lavorano rispetto a targetEmployeeCount soddisfa comunque il requisito, ma il risolutore riduce al minimo l'impiego eccessivo di personale.

Rappresentazione JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "locationId": string,
  "shiftIds": [
    string
  ],
  "roleRequirements": [
    {
      object (RoleRequirement)
    }
  ],
  "skillRequirements": [
    {
      object (SkillRequirement)
    }
  ]
}
Campi
startDateTime

object (DateTime)

L'ora di inizio del requisito di copertura (incluso). Se impostato, il campo shiftIds deve essere vuoto.

endDateTime

object (DateTime)

L'ora di fine del requisito di copertura (esclusa). Se impostato, il campo shiftIds deve essere vuoto.

locationId

string

Località in cui sono necessari i dipendenti. Il campo shiftIds non è vuoto.

shiftIds[]

string

Se impostato, i requisiti di ruolo e competenza vengono applicati singolarmente a ogni ID turno in questo elenco. Se i valori shiftId non sono vuoti, i campi startDateTime, endDateTime e locationId devono essere vuoti.

roleRequirements[]

object (RoleRequirement)

Numero richiesto di dipendenti da assegnare ai ruoli specificati durante l'intervallo di tempo. È necessario specificare al massimo un role_requirement per ogni ID ruolo. Il livello di priorità predefinito per ciascuno dei requisiti è PRIORITY_MANDATORY. Questi vincoli vengono violati se in qualsiasi momento durante l'intervallo di tempo viene assegnato un numero di dipendenti inferiore a targetEmployeeCount.

skillRequirements[]

object (SkillRequirement)

Numero richiesto di dipendenti con le competenze specificate assegnate ai turni durante l'intervallo di tempo. È necessario specificare al massimo un skill_requirement per ogni ID competenza. Il livello di priorità predefinito per ciascuno dei requisiti è PRIORITY_LOW. Questi vincoli vengono violati se meno di targetEmployeeCount dipendenti possiedono le competenze richieste in un dato momento durante l'intervallo di tempo.

RoleRequirement

Numero obbligatorio di dipendenti da assegnare al ruolo specificato durante l'intervallo di tempo.

Rappresentazione JSON
{
  "roleId": string,
  "targetEmployeeCount": integer,
  "priority": enum (Priority)
}
Campi
roleId

string

ID ruolo per il requisito.

targetEmployeeCount

integer

Numero desiderato di dipendenti assegnati al ruolo durante la finestra temporale.

priority

enum (Priority)

Livello di priorità per questo vincolo di requisito. La priorità predefinita per tutti i vincoli delle risorse è PRIORITY_MANDATORY.

SkillRequirement

Numero richiesto di dipendenti che lavorano nell'intervallo di tempo e possiedono la competenza specificata.

Rappresentazione JSON
{
  "skillId": string,
  "targetEmployeeCount": integer,
  "priority": enum (Priority)
}
Campi
skillId

string

ID competenza per il requisito.

targetEmployeeCount

integer

Numero desiderato di dipendenti con le competenze specifiche che lavorano nell'intervallo di tempo.

priority

enum (Priority)

Livello di priorità per questo vincolo di requisito. La priorità predefinita per tutti i vincoli delle risorse è PRIORITY_LOW.

BudgetRequirement

Requisiti di budget per un determinato intervallo.

Rappresentazione JSON
{
  "totalBudget": number,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "priority": enum (Priority)
}
Campi
totalBudget

number

Budget totale per l'intervallo specificato. È necessario specificare un budget totale se la priorità è PRIORITY_MANDATORY.

Se il criterio totalBudget non viene impostato, il costo totale della pianificazione viene ridotto al minimo in base al valore priority specificato. Ad esempio, se il priority per il budget è PRIORITY_MEDIUM, il risolutore ridurrà al minimo il costo prima di ridurre qualsiasi violazione dei vincoli con priorità PRIORITY_LOW.

startDateTime

object (DateTime)

Ora di inizio durante il quale si applica il budget. Se l'ora di inizio non è specificata, viene impostata come la prima ora di inizio di tutti i turni specificati.

endDateTime

object (DateTime)

Ora di fine per l'applicazione del budget. Se l'ora di fine non è specificata, viene impostata come l'ultima ora di fine di tutti i turni.

priority

enum (Priority)

Livello di priorità per soddisfare il requisito di budget durante l'intervallo di tempo specificato. La priorità predefinita è PRIORITY_LOW. Se la priorità è impostata su PRIORITY_MANDATORY, è necessario impostare totalBudget.

Tieni presente che se questa priorità è superiore ad altre priorità di vincolo e se totalBudget è stretto, la programmazione risultante potrebbe violare in modo significativo i vincoli o i requisiti di copertura dei dipendenti.

ShiftAssignment

Un dipendente a cui assegnare il ruolo di turno.

Rappresentazione JSON
{
  "employeeId": string,
  "shiftId": string,
  "roleId": string,
  "breaks": [
    {
      object (Break)
    }
  ]
}
Campi
employeeId

string

L'ID dipendente assegnato.

shiftId

string

ID spostamento assegnato al dipendente.

roleId

string

ID ruolo a cui è assegnato il dipendente per il turno.

breaks[]

object (Break)

Elenco delle pause per questo compito di turno.

Pausa

Un periodo di tempo in cui un dipendente interrompe il proprio lavoro durante un turno.

Rappresentazione JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "durationMinutes": integer
}
Campi
startDateTime

object (DateTime)

L'ora di inizio di una pausa.

durationMinutes

integer

Durata dell'interruzione in minuti.

SolutionStatus

Stato della soluzione (ovvero una pianificazione) fornito nella risposta di un risolutore.

Enum
SOLUTION_STATUS_UNSPECIFIED Stato non specificato per la risposta.
FEASIBLE La pianificazione restituita è fattibile, ma potrebbe non essere ottimale.
OPTIMAL La pianificazione restituita è ottimale.
INFEASIBLE Non esiste alcuna pianificazione fattibile per i vincoli specificati. Il risolutore potrebbe restituire questo valore se non è possibile soddisfare un sottoinsieme dei vincoli con livello di priorità PRIORITY_MANDATORY.
NOT_SOLVED Nessuna pianificazione trovata.
NOT_SOLVED_DEADLINE_EXCEEDED Nessuna pianificazione trovata entro il limite di tempo specificato.