Praesenti
API

Asignaciones de Turnos

Las asignaciones permiten definir qué turnos cumplen los empleados durante un período determinado. Cada asignación tiene una fecha de inicio y se mantiene vigente hasta que comienza una nueva asignación.

Obtener todas las asignaciones

Obtiene la lista completa de asignaciones de turnos ordenadas por fecha de vigencia descendente. El listado no incluye el detalle de turnos y empleados (employeeShifts viene en null); para eso usá GET /shift-assignments/:assignment_id.

Método: GET /shift-assignments

Respuesta exitosa (200)

[
  {
    "id": 101,
    "createdAt": "2026-07-01T10:00:00.000Z",
    "updatedAt": "2026-07-01T10:00:00.000Z",
    "deletedAt": null,
    "validFrom": "2026-07-01T00:00:00-03:00",
    "employeeShifts": null
  }
]

Códigos de respuesta

CódigoDescripción
200Exitoso
500Error interno del servidor

Obtener una asignación específica

Obtiene el detalle completo de una asignación por ID. Los turnos fijos se agrupan en fixedShifts por nombre de grupo, y los rotativos en rotationShifts, con un grupo por cada fecha de inicio de rotación.

Método: GET /shift-assignments/:assignment_id

Parámetros

ParámetroTipoDescripción
assignment_idstringID de la asignación

Respuesta exitosa (200)

{
  "id": 101,
  "createdAt": "2026-07-01T10:00:00.000Z",
  "updatedAt": "2026-07-01T10:00:00.000Z",
  "deletedAt": null,
  "validFrom": "2026-07-01T00:00:00-03:00",
  "fixedShifts": {
    "grupo-a": {
      "employees": [
        {
          "id": 161,
          "createdAt": "2026-04-14T19:07:49.049Z",
          "updatedAt": "2026-06-26T14:14:25.243Z",
          "deletedAt": null,
          "name": "Juan Sanchez",
          "mobileID": null,
          "mobileEnabled": false,
          "faceRecognition": null,
          "internalID": 12,
          "dni": 11223322,
          "email": null,
          "phoneNumber": null,
          "category": {
            "id": 78,
            "createdAt": "2026-04-14T19:07:48.957Z",
            "updatedAt": "2026-04-14T19:07:48.957Z",
            "deletedAt": null,
            "name": "SECRETARIA",
            "areaID": 42,
            "area": {
              "id": 42,
              "createdAt": "2026-04-14T19:07:48.946Z",
              "updatedAt": "2026-04-14T19:07:48.946Z",
              "deletedAt": null,
              "name": "ADMINISTRACION",
              "colorCode": "#D4E3C7"
            }
          },
          "archived": false
        }
      ],
      "shifts": [
        {
          "id": 44,
          "createdAt": "2026-07-10T09:00:00.000Z",
          "updatedAt": "2026-07-10T09:00:00.000Z",
          "deletedAt": null,
          "name": "Turno Manana",
          "startsAt": 480,
          "endsAt": 1020,
          "availableDays": 62
        }
      ]
    }
  },
  "rotationShifts": [
    {
      "shift": {
        "id": 12,
        "createdAt": "2026-07-01T08:00:00.000Z",
        "updatedAt": "2026-07-01T08:00:00.000Z",
        "deletedAt": null,
        "name": "Rotativo 4x2",
        "steps": [
          {
            "id": 201,
            "createdAt": "2026-07-01T08:00:00.000Z",
            "updatedAt": "2026-07-01T08:00:00.000Z",
            "deletedAt": null,
            "order": 1,
            "name": "Dia",
            "dayOff": false,
            "startsAt": 480,
            "endsAt": 960,
            "duration": 4
          }
        ]
      },
      "groups": [
        {
          "rotationStartDate": "2026-06-25T00:00:00-03:00",
          "employees": []
        }
      ]
    }
  ]
}

En groups[].employees los empleados tienen el mismo formato que en fixedShifts.

Códigos de respuesta

CódigoDescripción
200Exitoso
404Asignación no encontrada
500Error interno del servidor

Obtener la última asignación

Obtiene la última asignación por validFrom, con el mismo formato que GET /shift-assignments/:assignment_id. Puede filtrarse por asignaciones activas.

Método: GET /shift-assignments/last

Parámetros

ParámetroTipoRequeridoDescripción
activestring❌Si es true, devuelve solo asignaciones con validFrom <= ahora

Respuesta exitosa (200)

{
  "id": 102,
  "createdAt": "2026-07-15T10:00:00.000Z",
  "updatedAt": "2026-07-15T10:00:00.000Z",
  "deletedAt": null,
  "validFrom": "2026-07-15T00:00:00-03:00",
  "fixedShifts": {},
  "rotationShifts": []
}

Códigos de respuesta

CódigoDescripción
200Exitoso
404No hay asignaciones que cumplan
500Error interno del servidor

Crear una nueva asignación

Crea una asignación de turnos fijos y/o rotativos para empleados a partir de una fecha. La asignación siempre empieza a las 00:00 (en la zona horaria de la organización) del día indicado en validFrom.

  • fixedShifts es un objeto cuyas claves son nombres de grupo. Cada grupo asigna todos los turnos de fixedShiftIDs a todos los empleados de employeeIDs.
  • rotationShifts asigna turnos rotativos. Cada grupo indica desde qué fecha empieza la rotación (rotationStartDate, que no puede ser posterior a validFrom) y qué empleados la cumplen.
  • Un empleado no puede tener turnos fijos y rotativos a la vez, ni más de un turno rotativo, ni el mismo turno fijo repetido.
  • No se pueden asignar empleados archivados.
  • validFrom no puede ser anterior a seis meses antes de la fecha de creación de la organización.
  • No se puede crear una asignación si ya existe otra que empieza en un día posterior.

Método: POST /shift-assignments

Body requerido

{
  "validFrom": "2026-08-01T00:00:00-03:00",
  "fixedShifts": {
    "grupo-a": {
      "employeeIDs": [161, 162],
      "fixedShiftIDs": [44]
    }
  },
  "rotationShifts": [
    {
      "rotationShiftID": 12,
      "groups": [
        {
          "rotationStartDate": "2026-07-25T00:00:00-03:00",
          "employeeIDs": [170, 171]
        }
      ]
    }
  ]
}

Respuesta exitosa (200)

Retorna el ID de la asignación creada.

{
  "assignmentID": 120
}

Códigos de respuesta

CódigoDescripción
200Asignación creada exitosamente
400Solicitud inválida, fecha demasiado antigua, empleado archivado, empleado asignado dos veces o rotationStartDate posterior a validFrom
404Empleado o turno no encontrado
409Ya existe una asignación que empieza en un día posterior
500Error interno del servidor

Actualizar una asignación

Actualiza una asignación existente por ID. La actualización reemplaza todos los valores actuales con los nuevos que se envíen, por eso mismo se deben enviar todos los datos.

Si createNewVersion es true y validFrom cambia, en lugar de modificar la asignación se crea una nueva a partir de esa fecha, y la respuesta devuelve el ID de la nueva.

Método: PUT /shift-assignments/:assignment_id

Body

{
  "createNewVersion": false,
  "validFrom": "2026-08-05T00:00:00-03:00",
  "fixedShifts": {
    "grupo-a": {
      "employeeIDs": [161],
      "fixedShiftIDs": [45]
    }
  },
  "rotationShifts": []
}

Respuesta exitosa (200)

{
  "assignmentID": 120
}

Códigos de respuesta

CódigoDescripción
200Actualizado exitosamente
400Solicitud inválida, fecha demasiado antigua o empleado con turnos fijos y rotativos a la vez
404Asignación, empleado o turno no encontrado
409Ya hay otra asignación ese día, la nueva fecha cruza otra asignación o ya existe una asignación futura pendiente
500Error interno del servidor

Eliminar una asignación

Elimina una asignación de turnos por ID. Solo se puede eliminar la última asignación (la de validFrom más reciente).

Método: DELETE /shift-assignments/:assignment_id

Respuesta exitosa (200)

{
  "message": "deleted successfuly",
  "deleted": true
}

Códigos de respuesta

CódigoDescripción
200Eliminado exitosamente
400La asignación no es la última
404Asignación no encontrada
500Error interno del servidor