Actualizar la configuración de una etapa

Este endpoint permite actualizar la configuración definida para la etapa de una propuesta de necesidades: sus reglas de productividad, la distribución de empleados y los límites de plantilla.

PUT /api/v1/businesses/{businessId}/products/{productId}/needs-config/seasons/{seasonId}/proposals/{proposalId}/steps/{stepId}

En la URL de la petición, deben especificarse los identificadores externos de las diferentes entidades (negocio, producto, temporada, propuesta y etapa).

A continuación, se expone una explicación detallada de cada uno de los campos que pueden conformar el cuerpo de la petición, siendo algunos de ellos obligatorios para que esta se realice de manera exitosa.

Los campos obligatorios están marcados con un asterisco (*).

Cuerpo de la petición

Análisis del JSON
{
  "type": "PRODUCTIVITY",
  "productivityBands": [
    {
      "dayType": "string",
      "dayTypeNode": "string",
      "startMinute": 0,
      "duration": 0,
      "salesBrackets": [
        {
          "minSales": 0,
          "maxSales": 0,
          "productivity": 0,
          "minVariable": 0,
          "maxVariable": 0
        }
      ]
    }
  ],
  "employeeDistributionBands": [
    {
      "dayType": "string",
      "dayTypeNode": "string",
      "startMinute": 0,
      "duration": 0,
      "distributions": [
        {
          "totalEmployees": 0,
          "locations": [
            {
              "id": "string",
              "zone": "string",
              "employees": 0
            }
          ]
        }
      ]
    }
  ],
  "employeeLimits": [
    {
      "dayType": "string",
      "dayTypeNode": "string",
      "bands": [
        {
          "startMinute": 0,
          "duration": 0,
          "minPersons": 0,
          "maxPersons": 0
        }
      ]
    }
  ]
}
Detalles
  • type*: tipo de la etapa. Debe coincidir con el tipo real de la etapa.

  • productivityBands: reglas de productividad de la etapa. Para cada regla, se incluye la siguiente información:

    • dayType*: nombre del tipo de día, tal y como lo devuelve la configuración de necesidades del producto.

    • dayTypeNode: identificador externo del nodo en el que está definido el tipo de día, tal y como lo devuelve la configuración de necesidades del producto. Solo es necesario cuando en el producto hay dos tipos de día con el mismo nombre.

    • startMinute*: minutos desde la medianoche en hora local. Los valores a partir de 1440 representan la madrugada del día siguiente.

    • duration*: duración del intervalo en minutos.

    • salesBrackets: tramos para los que se definen las reglas de productividad. Los tramos para un mismo tipo de día no pueden solaparse. Para cada tramo se incluye la siguiente información:

      • minSales*: límite inferior del rango de ventas. Uno de los tramos de la banda debe empezar en 0.

      • maxSales*: límite superior del rango de ventas. El motor elige el tramo por su límite inferior, por lo que el más alto se extiende hasta el infinito.

      • productivity*: número de empleados cuando la etapa es de productividad simple y unidades de demanda por empleado cuando no lo es.

      • minVariable: límite inferior de las necesidades variables del tramo. null significa que no hay límite.

      • maxVariable: límite superior de las necesidades variables del tramo. null significa que no hay límite.

  • employeeDistributionBands: reglas de distribución de empleados de la etapa. Para cada banda se incluye la siguiente información:

    • dayType*: nombre del tipo de día, tal y como lo devuelve la configuración de necesidades del producto.

    • dayTypeNode: identificador externo del nodo en el que está definido el tipo de día, tal y como lo devuelve la configuración de necesidades del producto. Solo es necesario cuando en el producto hay dos tipos de día con el mismo nombre.

    • startMinute*: minutos desde la medianoche en hora local.

    • duration*: duración del intervalo en minutos.

    • distributions: distribución por número de empleados necesarios. Los tramos de un mismo tipo de día no pueden solaparse. Para cada tramo se incluye la siguiente información:

      • totalEmployees*: número total de empleados que se van a repartir.

      • locations: reparto de ese número de empleados entre las diferentes tareas. Para cada tarea se incluye la siguiente información:

        • id*: identificador externo de la tarea.

        • zone: identificador externo de la zona de la tarea. Si no se indica, se tomará la zona por defecto del servicio.

        • employees*: número de empleados asignados a la tarea.

  • employeeLimits: límites de empleados de la etapa. Para cada bloque se incluye la siguiente información:

    • dayType*: nombre del tipo de día, tal y como lo devuelve la configuración de necesidades del producto.

    • dayTypeNode: identificador externo del nodo en el que está definido el tipo de día, tal y como lo devuelve la configuración de necesidades del producto. Solo es necesario cuando en el producto hay dos tipos de día con el mismo nombre.

    • bands*: límites por franja horaria. Los tramos de un mismo tipo de día no pueden solaparse. Para cada tramo se incluye la siguiente información:

      • startMinute*: minutos desde la medianoche en hora local.

      • duration*: duración del intervalo en minutos.

      • minPersons: número mínimo de personas. null significa que no hay mínimo, pero al menos uno de los dos límites debe estar presente.

      • maxPersons: número máximo de personas. null significa que no hay máximo, pero al menos uno de los dos límites debe estar presente.

Ejemplo de la petición

Una vez realizado el análisis de los distintos campos, se muestra un ejemplo del cuerpo de la petición:

PUT /api/v1/businesses/BUSINESSID/products/STORE_0815/needs-config/seasons/SUMMER_2026/proposals/VARIABLE_HOURS/steps/PRODUCTIVITY_SALES
{
    "type": "PRODUCTIVITY",
    "productivityBands": [
        {
            "dayType": "ALL",
            "startMinute": 540,
            "duration": 300,
            "salesBrackets": [
                {
                    "minSales": 0,
                    "maxSales": 400,
                    "productivity": 1
                },
                {
                    "minSales": 400,
                    "maxSales": 1500,
                    "productivity": 2
                }
            ]
        }
    ],
    "employeeDistributionBands": [
        {
            "dayType": "ALL",
            "startMinute": 540,
            "duration": 660,
            "distributions": [
                {
                    "totalEmployees": 1,
                    "locations": [
                        {
                            "id": "03",
                            "employees": 1
                        }
                    ]
                },
                {
                    "totalEmployees": 2,
                    "locations": [
                        {
                            "id": "03",
                            "employees": 1
                        },
                        {
                            "id": "02",
                            "employees": 1
                        }
                    ]
                }
            ]
        }
    ],
    "employeeLimits": [
        {
            "dayType": "ALL",
            "bands": [
                {
                    "startMinute": 540,
                    "duration": 300,
                    "maxPersons": 4
                },
                {
                    "startMinute": 840,
                    "duration": 360,
                    "minPersons": 2,
                    "maxPersons": 5
                }
            ]
        }
    ]
}

Si todos los datos de la petición son correctos, se reemplaza por completo la configuración almacenada de la etapa PRODUCTIVITY_SALES por la enviada.

Consideraciones

Esta petición reemplaza el estado completo de la etapa. Enviar una entidad como lista vacía (o no enviarla) borra la configuración existente. Este comportamiento va a ser corregido para que, si no se envía la entidad o se envía null, permanezca la configuración que hubiera definida en el sistema.

La respuesta, si la petición es correcta, es el estado tal y como ha quedado guardado: tiene la misma estructura que la respuesta del endpoint de consulta.

Esta petición está sujeta a una funcionalidad que debe estar activada a nivel de negocio. En caso de duda, se recomienda consultar con el equipo de Orquest.

Códigos de error

Además de los errores comunes, este endpoint puede devolver los siguientes códigos:

Código Mensaje Descripción

404 Not Found

The needs configuration write api is not enabled

La funcionalidad de escritura de configuración de necesidades no está activada para el negocio.

The product has no season with that id

La temporada indicada en la URL no existe.

The proposal is not active in that season

La propuesta indicada en la URL no existe.

The proposal has no writable step with that id

La etapa indicada en la URL no existe en la propuesta o su tipo todavía no está soportado por esta petición.

400 Bad Request

The step '<step>' is of type <type> but the request declares <type>

El campo type de la petición no coincide con el tipo real de la etapa.

The step '<step>', productivity band <dayType> [<start>,<end>) has an invalid interval

Una regla de productividad tiene startMinute fuera de rango.

The step '<step>', productivity band <dayType> [<start>,<end>) has an invalid interval

Una regla de productividad tiene duration fuera de rango. Se devuelve el mismo mensaje que en el caso anterior, distinguibles solo por la causa (INVALID_START_MINUTE frente a INVALID_DURATION).

The step '<step>', productivity band <dayType> [<start>,<end>) has an invalid interval

Una regla (de productividad, de distribución o de límites) representa un intervalo que se extiende más de dos días.

The step '<step>', productivity band <dayType> [<start>,<end>) refers to the day type '<dayType>', which the product cannot use

Una regla hace referencia a un tipo de día (dayType) que el producto no puede utilizar, según su configuración de necesidades.

The step '<step>', productivity band <dayType> [<start>,<end>) refers to the day type '<dayType>', which the product sees defined on the nodes [<nodes>]; name the node to tell them apart

Una regla hace referencia a un tipo de día que el producto ve definido en más de un nodo, sin indicar dayTypeNode para distinguirlos.

The step '<step>' has overlapping productivity bands for the day type <dayType>: [<start>,<end>) and [<start>,<end>)

Dos reglas de productividad del mismo tipo de día se solapan.

The step '<step>', productivity band <dayType> [<start>,<end>) has no sales brackets

Una regla de productividad no tiene ningún tramo de ventas (salesBrackets vacío).

The step '<step>', productivity band <dayType> [<start>,<end>) has two brackets starting at <value>

Dos tramos de ventas de la misma regla empiezan en el mismo valor de minSales.

The step '<step>', productivity band <dayType> [<start>,<end>) has no bracket starting at zero sales

Ningún tramo de ventas de la regla empieza en cero.

The step '<step>', productivity band <dayType> [<start>,<end>) has a bracket ending at <value> sales followed by one starting at <value>

Dos tramos de ventas consecutivos de la regla dejan un hueco entre ellos.

The step '<step>', productivity band <dayType> [<start>,<end>) has a bracket with a productivity of <value>

Un tramo de ventas tiene un valor de productivity no válido.

The step '<step>', productivity band <dayType> [<start>,<end>) has a bracket with the sales range [<min>,<max>]

Un tramo de ventas tiene minSales y maxSales incoherentes entre sí.

The step '<step>', productivity band <dayType> [<start>,<end>) has a bracket with the variable bounds [<min>,<max>]

Un tramo de ventas tiene minVariable y maxVariable incoherentes entre sí.

The step '<step>' has overlapping distribution bands for the day type <dayType>: [<start>,<end>) and [<start>,<end>)

Dos reglas de distribución de empleados del mismo tipo de día se solapan.

The step '<step>', employee distribution band <dayType> [<start>,<end>) has two brackets for <count> employees

Dos tramos de distribución de la misma regla están definidos para el mismo número de totalEmployees.

The step '<step>', employee distribution band <dayType> [<start>,<end>) has no bracket for one employee

Ningún tramo de distribución de la regla cubre el caso de un solo empleado.

The step '<step>', employee distribution band <dayType> [<start>,<end>) goes up to <count> employees but has no bracket for [<count>]

Los tramos de distribución de la regla dejan huecos en la progresión de plantilla (por ejemplo, hay tramo para 1, 3 y 4 empleados, pero no para 2).

The step '<step>', employee distribution band <dayType> [<start>,<end>) gives the location '<location>' <count> employees for a staffing of <count>, fewer than the <count> of a smaller one

Una tarea recibe menos personas en un tramo de mayor plantilla total que en uno de plantilla menor.

The step '<step>', employee distribution band <dayType> [<start>,<end>) has a bracket for <count> employees

Un tramo de distribución tiene un valor de totalEmployees no válido, o asigna un número negativo de empleados a una tarea en locations.

The step '<step>', employee distribution band <dayType> [<start>,<end>) repeats the location '<location>' in the bracket for <count> employees

Un tramo de distribución repite la misma tarea más de una vez en locations.

The product <product> has no location '<location>' in the zone <zone>

Una tarea indicada en locations no existe en la zona indicada, dentro del producto.

The location '<location>' is a system or deleted one, and the needs generator discards it

Una tarea indicada en locations es una tarea de sistema o está eliminada, por lo que el generador de necesidades la descarta.

The step '<step>' is not allowed to use the location '<location>'

La etapa no admite la tarea indicada en locations.

The step '<step>', employee distribution band <dayType> [<start>,<end>) distributes <count> employees over variable locations in the bracket for <count>

La suma de empleados repartidos entre las tareas variables de un tramo no coincide con su totalEmployees.

The step '<step>' has the day type <dayType> defined twice, and a step can only have one limit per day type

Hay dos bloques de employeeLimits para el mismo tipo de día.

The step '<step>', employee limits of <dayType> has no bands

Un bloque de límites no tiene ninguna regla (bands vacío).

The step '<step>', employee limits of <dayType> has overlapping bands: [<start>,<end>) and [<start>,<end>)

Dos reglas del mismo bloque de límites se solapan.

The step '<step>', employee limits of <dayType> has a band [<start>,<end>) with neither a minimum nor a maximum

Una regla de límites no tiene ni minPersons ni maxPersons.

The step '<step>', employee limits of <dayType> has a band [<start>,<end>) with a negative limit

Una regla de límites tiene un valor negativo en minPersons o maxPersons.

The step '<step>', employee limits of <dayType> has a band [<start>,<end>) whose minimum <value> is above its maximum <value>

Una regla de límites tiene minPersons mayor que maxPersons.

Enlaces de interés