Crear o actualizar lista de empleados (complejo)

Este endpoint es uno de los más complejos de Orquest, pues permite no solo crear o modificar la lista de empleados como tal, sino también todos los datos vinculados a estos: usuarios, contratos, asociaciones a servicio, etc.

PUT /api/v2/businesses/{businessId}/employees

A continuación, se expone una explicación detallada de cada uno de los campos que pueden conformar el cuerpo de la petición.

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

Los valores admitidos para los campos de tipo Enum se muestran en el desplegable de detalles.

Cuerpo de la petición

Análisis del JSON
"business": "string",
"lag": 0,
"partial": true,
"ignoreWithoutOuterId": false,
"ignoreServiceAssociations": false,
"ignoreContracts": false,
Detalles
  • business*: identificador externo configurado en Orquest para el negocio.

  • lag*: número de días previos a la fecha actual que se consideran al gestionar la petición.

  • partial: determina si se quiere resetear la información aplicada por los tipos de contrato. Es recomendable activarlo siempre.

  • ignoreWithoutOuterId: determina si se tienen en cuenta las entidades sin identificador de negocio.

  • ignoreServiceAssociations: determina si se actualizan las asociaciones a servicio del empleado. En caso de establecer true, no es necesario añadir información sobre asociaciones a servicio en la petición.

  • ignoreContracts: determina si se actualizan los contratos del empleado. En caso de establecer true, no es necesario añadir información sobre contratos en la petición.

Objeto person*

Incluye los datos personales del empleado identificado a través de su employeeId.

"person": {
      "name": "string",
      "surname": "string",
      "group": "string",
      "email": "string",
      "birthday": "yyyy-MM-dd",
      "employeeId": "string",
      "metadata": {},
      "seniority": "yyyy-MM-dd",
      "virtual": false
    }
Detalles
  • name*: nombre del empleado.

  • surname*: apellido(s) del empleado.

  • group: grupo al que pertenece el empleado.

  • email: el email de empleado, con formato correcto.

  • birthday: la fecha de nacimiento con formato yyyy-MM-dd.

  • employeeId*: identificador del empleado en el sistema externo.

  • metadata: datos adicionales sobre el empleado. La estructura de este campo debe ser previamente configurada a nivel de negocio por el equipo de Orquest.

  • seniority: antigüedad del empleado en formato yyyy-MM-dd.

  • virtual: determina si se trata de un empleado real o uno virtual utilizado, por ejemplo, para realizar simulaciones.

Objeto user

Incluye los datos que vinculan al empleado con un usuario de la aplicación de Orquest.

"user": {
      "username": "string",
      "email": "string",
      "nodes": [
        0
      ],
      "roles": [
        "string"
      ]
    }
Detalles
  • username*: nombre del usuario. Debe ser único.

  • email*: email del usuario. Debe ser único.

  • nodes: lista de identificadores internos de Orquest en los que el usuario va a tener visibilidad. Si no se indica ningún nodo, el usuario se vinculará al nodo raíz del negocio. Los nodos pueden consultarse aquí.

  • roles: lista de roles que se aplican al usuario. Estos roles se configuran a nivel de negocio.

Objeto serviceAssociations

Incluye la información relativa a las asociaciones a servicio establecidas para el empleado.

"serviceAssociations": [
      {
        "ownerProduct": "string",
        "product": "string",
        "from": "yyyy-MM-dd",
        "to": "yyyy-MM-dd",
        "splitPresence": true,
        "unplannable": true,
        "card": "string",
        "roles": [
          "string"
        ],
        "disponibility": [
          {
            "from": "yyyy-MM-dd",
            "to": "yyyy-MM-dd",
            "ranges": [
              {
                "dayType": "string",
                "startMinuteDay": 0,
                "duration": 0,
                "available": true
              }
            ],
            "type": "Enum",
            "timeFramePatternId": "string",
            "weekStart": 0,
            "blockedType": "Enum"
          }
        ],
        "regularCessions": [
          {
            "product": "string",
            "minutes": 0,
            "days": [
              "Enum"
            ]
          }
        ],
        "metadata": {},
        "id": "string"
      }
    ]
Detalles
  • ownerProduct*: identificador externo del producto o sección al que pertenece el empleado.

  • product*: identificador externo del producto o sección donde va a trabajar el empleado. Puede ser igual al ownerProduct; si es distinto, se trata de una cesión.

  • from*: fecha de inicio de la asociación a servicio en formato yyyy-MM-dd.

  • to: fecha de finalización de la asociación a servicio en formato yyyy-MM-dd. Puede ser null, indicando que no hay fecha de fin establecida.

  • splitPresence: determina si se trata de un turno partido. El valor por defecto es true.

  • unplannable: determina si el empleado será ignorado por el planificador, por lo que deberá planificarse a mano. El valor por defecto es false.

  • card: identificador de la tarjeta del empleado en sistemas de fichajes.

  • roles: lista de identificadores de roles que se atribuirán al empleado en esta asociación a servicio.

  • disponibility: disponibilidad del empleado durante un intervalo concreto. Si no se define, la disponibilidad de un empleado es total. Para cambiarla, se deberá enviar la siguiente información.

    • from*: fecha de inicio del periodo de la disponibilidad en formato yyyy-MM-dd.

    • to: fecha de finalización del periodo de la disponibilidad en formato yyyy-MM-dd. Puede ser null siempre que la asociación a servicio también lo sea.

    • ranges*: lista de disponibilidades por tipo de día. Para cada tipo, incluye la siguiente información:

      • dayType*: tipo de día al que se aplica la disponibilidad. Puede ser un tipo de día del sistema (ALL, WEEKENDS, MONDAY, TUESDAY, WEDNESDAY, etc.) o uno definido a nivel de negocio.

      • startMinuteDay*: inicio de la disponibilidad en minutos a partir de las 00:00 en hora local. Por ejemplo, 600 para las 10:00.

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

      • available: determina si el empleado está disponible (true) o no disponible (false) en el rango y tipo de día indicados. El valor por defecto es true.

    • type: tipo de disponibilidad efectiva: DAY_TYPE, SHIFT_PATTERN o CALENDAR.

    • timeFramePatternId: identificador interno del patrón de turno o disponibilidad aplicado. Solo para disponibilidad de tipo SHIFT_PATTERN.

    • weekStart: semana de inicio. Solo para disponibilidad de tipo SHIFT_PATTERN.

    • blockedType: tipo de bloqueo aplicado al patrón (NONE, EXTENSIBLE_WORK, NON_EXTENSIBLE_WORK, EXTENSIBLE_TIME, NON_EXTENSIBLE_TIME, DAILY_WORKED, FREE, WORKING_HOURS). Solo para disponibilidad de tipo SHIFT_PATTERN.

  • regularCessions: determina si el empleado trabaja algunos días a la semana en otro producto o sección de manera sistemática. En caso de que existan cesiones regulares, se definen a través de los siguientes campos:

    • product*: identificador externo del producto o sección de destino donde el empleado va a trabajar.

    • minutes*: número de minutos que el empleado trabajará en el producto o sección de destino.

    • days*: lista de tipos de día que el empleado trabajará cedido. Posibles valores: MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY.

  • metadata: cualquier dato adicional relativo a la asociación a servicio. La estructura de estos metadatos debe ser configurada previamente por el equipo de Orquest.

  • id: identificador externo de la asociación a servicio. Debe ser único.

Objeto contracts

Incluye la información relativa a los contratos que se aplican al empleado, en términos de horas trabajadas, limitaciones laborales, etc.

"contracts": [
      {
        "from": "yyyy-MM-dd",
        "to": "yyyy-MM-dd",
        "regularMinutes": 0,
        "weeklyContract": true,
        "dailyContract": true,
        "countingDays": "Enum",
        "additionalMinutes": 0,
        "regularControlPeriod": "Enum",
        "regularPeriodMultiplier": 1,
        "regularPeriodStartDate": "yyyy-MM-dd",
        "additionalControlPeriod": "Enum",
        "additionalPeriodMultiplier": 1,
        "additionalPeriodStartDate": "yyyy-MM-dd",
        "calendarDaysOff": true,
        "numberOfHolidays": 0,
        "numberOfPublicHolidays": 0,
        "weeklyDaysInvolved": "Enum",
        "metadata": {},
        "costPerHour": 0,
        "personCategory": "string",
        "id": "string",
        "contractTypeId": "string",
        "completed": true,
        "additionalDailyContract": true,
        "additionalWeeklyContract": true,
        "regularCountingDayType": "string",
        "additionalCountingDayType": "string"
      }
    ]
Detalles
  • from*: fecha de inicio del contrato en formato yyyy-MM-dd.

  • to: fecha de finalización del contrato en formato yyyy-MM-dd. Puede enviarse como null si no hay una fecha de fin establecida.

  • regularMinutes*: horas ordinarias (en minutos) establecidas en el contrato. El valor se interpreta en función de la base horaria definida: anual, semanal o diaria.

  • weeklyContract*: determina si las horas ordinarias del contrato se definen de manera semanal (true).

  • dailyContract: determina si las horas ordinarias del contrato se definen de manera diaria (true). Si el contrato no es diario ni semanal, se asume que es anual.

  • countingDays: en un contrato diario, indica qué días computan como trabajados. Su valor puede ser MONDAY_SUNDAY, MONDAY_SATURDAY, LABOR_DAYS, LABOR_MONDAY_SATURDAY o WEEKENDS_AND_HOLIDAYS.

  • additionalMinutes*: horas complementarias (en minutos) establecidas en el contrato. El valor se interpreta en función de la base horaria definida: anual, semanal o diaria.

  • regularControlPeriod*: periodo de control para las horas ordinarias establecidas en el contrato. Puede ser WEEKLY, MONTHLY o YEARLY.

  • regularPeriodMultiplier: índice multiplicador para regularControlPeriod. Por ejemplo, si se establece 2 con regularControlPeriod semanal, determinaría que se trata de una quincena. Su valor por defecto es 1 y admite valor null o cualquier número entero igual o mayor que 1.

  • regularPeriodStartDate: fecha de inicio de regularControlPeriod en formato yyyy-MM-dd. Esta fecha se tiene en cuenta para un valor de regularPeriodMultiplier mayor que 1; si el valor del multiplicador es igual a 1, la fecha se ignora.

  • additionalControlPeriod*: periodo de control para las horas complementarias. Puede ser WEEKLY, MONTHLY o YEARLY.

  • additionalPeriodMultiplier: índice multiplicador para additionalControlPeriod. Por ejemplo, si se establece 2 con additionalControlPeriod semanal, determinaría que se trata de una quincena. Su valor por defecto es 1 y admite valor null o cualquier número entero igual o mayor que 1.

  • additionalPeriodStartDate: fecha de inicio de additionalControlPeriod en formato yyyy-MM-dd. Esta fecha se tiene en cuenta para un valor de additionalPeriodMultiplier mayor que 1; si el valor del multiplicador es igual a 1, la fecha se ignora.

  • calendarDaysOff*: determina si las vacaciones serán procesadas en días naturales (true) o laborables (false).

  • numberOfHolidays*: número de días de vacaciones que tiene el empleado en su contrato.

  • numberOfPublicHolidays*: número de días festivos que tiene el empleado en su contrato.

  • weeklyDaysInvolved*: días de la semana que serán computables (tipo de semana). Este campo puede definirse como MONDAY_SUNDAY, MONDAY_SATURDAY, LABOR_DAYS, LABOR_MONDAY_SATURDAY o WEEKENDS_AND_HOLIDAYS.

  • metadata: cualquier dato adicional relativo al contrato. La estructura de estos metadatos debe ser configurada previamente por el equipo de Orquest.

  • costPerHour: coste del empleado por hora trabajada.

  • personCategory*: identificador externo de la categoría del empleado. Pueden consultarse aquí.

  • id: identificador externo del contrato. Debe ser único. Limitado a 200 caracteres.

  • contractTypeId: identificador del tipo de contrato que se aplica. Si se añade, las características del contrato serán sobrescritas por aquellas del tipo de contrato (más información aquí). Si no se especifica, se podrán aplicar filtros de tipo de contrato para asignarle uno.

  • completed: determina si el contrato está liquidado o no. Si se envía true y la fecha de finalización del contrato, se considerará liquidado en esa fecha; si no se incluye fecha de fin, el contrato se considerará liquidado en la fecha de la petición.

  • additionalDailyContract: determina si las horas complementarias del contrato se definen de manera diaria (true).

  • additionalWeeklyContract: determina si las horas complementarias del contrato se definen de manera semanal (true). Si tanto additionalWeeklyContract como additionalDailyContract se envían como false, se asume que el contrato es anual.

  • regularCountingDayType: tipo de día que se establece para las horas ordinarias de un contrato diario. Puede ser un tipo de día del sistema (ALL, WEEKENDS, MONDAY, TUESDAY, WEDNESDAY, etc.) o uno definido a nivel de negocio.

  • additionalCountingDayType: tipo de día que se establece para las horas complementarias en un contrato diario. Puede ser un tipo de día del sistema (ALL, WEEKENDS, MONDAY, TUESDAY, WEDNESDAY, etc.) o uno definido a nivel de negocio.

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:

[
    {
        "business": "BUSINESSID",
        "lag": 0,
        "partial": false,
        "ignoreWithoutOuterId": false,
        "ignoreServiceAssociations": false,
        "ignoreContracts": false,
        "person": {
            "name": "Eva",
            "surname": "García",
            "birthday": "1987-05-07",
            "employeeId": "170326",
            "virtual": false
        },
        "user": {
            "username": "egarcia",
            "email": "egarcia@mail.com",
            "nodes": [
                10101
            ],
            "roles": [
                "Manager"
            ]
        },
        "serviceAssociations": [
            {
                "ownerProduct": "0001-G",
                "product": "0001-G",
                "from": "2026-01-01",
                "to": null,
                "disponibility": [
                    {
                        "from": "2026-01-01",
                        "ranges": [
                            {
                                "dayType": "ALL",
                                "startMinuteDay": 0,
                                "duration": 1440,
                                "available": false
                            }
                        ],
                        "type": "SHIFT_PATTERN",
                        "timeFramePatternId": "d01e1e08-b2e4-48d1",
                        "weekStart": 1,
                        "blockedType": "NON_EXTENSIBLE_TIME"
                    }
                ]
            }
        ],
        "contracts": [
            {
                "from": "2026-01-15",
                "to": null,
                "regularMinutes": 360,
                "weeklyContract": false,
                "dailyContract": true,
                "countingDays": "WEEKENDS_AND_HOLIDAYS",
                "additionalMinutes": 120,
                "regularControlPeriod": "MONTHLY",
                "regularPeriodMultiplier": 1,
                "regularPeriodStartDate": "2026-01-15",
                "additionalControlPeriod": "MONTHLY",
                "additionalPeriodMultiplier": 1,
                "additionalPeriodStartDate": "2026-01-15",
                "calendarDaysOff": true,
                "numberOfHolidays": 10,
                "numberOfPublicHolidays": 10,
                "weeklyDaysInvolved": "LABOR_DAYS",
                "costPerHour": 200.34,
                "personCategory": "AV",
                "completed": false,
                "additionalDailyContract": true,
                "additionalWeeklyContract": false,
                "regularCountingDayType": "WEEKENDS",
                "additionalCountingDayType": "WEEKENDS"
            }
        ]
    }
]

Aspectos que tener en cuenta

Cada entidad de la lista tiene su propio estado, es decir, cada elemento se actualiza de manera independiente.

No se permiten más de 30 elementos en el cuerpo de la petición.

Validación de usuario

Si se incluyen datos del objeto user, se valida la existencia de ese usuario en Orquest, de modo que se establecen los siguientes escenarios:

  • Si el usuario no existe, se crea y se vincula al empleado.

  • Si el usuario existe y ya está vinculado al empleado de la petición, se actualiza la información. El campo username no se actualiza, solo email, nodes y roles.

  • Si el usuario existe y está vinculado a otro empleado, la operación se cancela y la petición devuelve un error 409 Conflict.

Si el formato de la dirección de correo electrónico no es válido, la petición devolverá un error 406 Not Acceptable indicando User email is not valid.

En roles, el nombre del rol debe coincidir exactamente con el que está configurado en el sistema: Configuración de negocio > Roles. Si alguno de los roles no coincide con los que están definidos a nivel de negocio, la petición devolverá un error 409 Conflict indicando en el mensaje some role is not valid.

Tanto nodes como roles definidos previamente permanecen cuando se realiza la petición sin estos campos de usuario.

Un usuario de integraciones podrá asignar cualquier rol definido a nivel de negocio.

Si la categoría de empleado (personCategory) especificada en el cuerpo de la petición no existe en el sistema, se crea automáticamente una nueva categoría (Configuración de negocio > Categorías de empleado). En este caso, el nombre y el identificador externo de la nueva categoría coincidirán con el valor proporcionado en este campo. Por lo tanto, es recomendable revisar las categorías existentes antes de realizar la petición para evitar la creación innecesaria de categorías adicionales.

Enlaces de interés

¿Qué es un empleado?

¿Qué es una asociación a servicio?

¿Qué es un contrato? ¿Y un tipo de contrato?