Praesenti
API

Turnos

Los turnos fijos se utilizan cuando el empleado cumple siempre el mismo horario en los mismos días de la semana.

startsAt y endsAt se expresan en minutos desde la medianoche (por ejemplo, 480 = 08:00 y 1020 = 17:00; el máximo es 1440).

availableDays indica en qué días de la semana aplica el turno. Es la suma de los valores de cada día: lunes = 32, martes = 16, miércoles = 8, jueves = 4, viernes = 2, sábado = 1 y domingo = 64. Por ejemplo, de lunes a viernes es 32 + 16 + 8 + 4 + 2 = 62.

Los turnos tienen versiones: cuando se modifica un turno que ya está usado en una asignación, se crea una nueva versión con otro id. Los endpoints de consulta devuelven siempre la última versión.

Obtener todos los turnos

Obtiene la lista de turnos fijos vigentes (última versión de cada uno) de la organización.

Método: GET /shifts

Parámetros de Query

ParámetroTipoRequeridoDescripción
shift_assignment_idstring❌ID de una asignación de turnos. Si se envía, cambia el formato de la respuesta (ver más abajo)

Respuesta exitosa (200)

[
  {
    "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
  }
]

Si se envía shift_assignment_id, la respuesta es un objeto cuyas claves son IDs de turno. Incluye los turnos usados en esa asignación y los turnos vigentes. deleted es true cuando el turno usado en la asignación ya no tiene una versión vigente.

{
  "44": {
    "shift": {
      "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
    },
    "deleted": false
  }
}

Códigos de respuesta

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

Obtener un turno específico

Obtiene la última versión de un turno a partir del ID de cualquiera de sus versiones.

Método: GET /shifts/:id

Parámetros

ParámetroTipoDescripción
idstringID del turno

Respuesta exitosa (200)

{
  "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
}

Códigos de respuesta

CódigoDescripción
200Exitoso
404ID no encontrado
500Error interno del servidor

Crear un nuevo turno

Crea un nuevo turno en la organización con los datos proporcionados. name es obligatorio (hasta 80 caracteres) y no puede repetirse; availableDays es obligatorio y distinto de 0.

Método: POST /shifts

Body requerido

{
  "name": "Turno Manana",
  "startsAt": 480,
  "endsAt": 1020,
  "availableDays": 62
}

Respuesta exitosa (201)

{
  "id": 45,
  "createdAt": "2026-07-10T10:15:42.582-03:00",
  "updatedAt": "2026-07-10T10:15:42.582-03:00",
  "deletedAt": null,
  "name": "Turno Manana",
  "startsAt": 480,
  "endsAt": 1020,
  "availableDays": 62
}

Códigos de respuesta

CódigoDescripción
201Turno creado exitosamente
400Solicitud inválida
409Ya existe un turno con ese nombre
500Error interno del servidor

Actualizar un turno

Actualiza los datos de un turno existente. Se deben enviar todos los campos del turno.

Si el turno no está usado en ninguna asignación, se modifica directamente. Si ya está usado, se crea una nueva versión del turno (con otro id, que es el que devuelve la respuesta) y las asignaciones existentes siguen usando la versión anterior, salvo que se indique otra cosa:

  • shiftAssignmentIDs: IDs de las asignaciones que deben pasar a usar la nueva versión. Si se envía, tiene que incluir también todas las asignaciones posteriores que usan el turno; si no, la API responde 400.
  • createNewVersion: si es true, la última asignación de turnos pasa a usar la nueva versión. Si esa asignación empieza hoy, se modifica; si no, se crea una nueva asignación a partir de hoy, copia de la última.

Método: PUT /shifts/:id

Parámetros

ParámetroTipoDescripción
idstringID del turno

Body

{
  "name": "Turno Manana Actualizado",
  "startsAt": 510,
  "endsAt": 1050,
  "availableDays": 62,
  "shiftAssignmentIDs": [101, 102],
  "createNewVersion": false
}

Respuesta exitosa (200)

{
  "id": 45,
  "createdAt": "2026-07-10T10:15:42.582-03:00",
  "updatedAt": "2026-07-10T11:02:11.001-03:00",
  "deletedAt": null,
  "name": "Turno Manana Actualizado",
  "startsAt": 510,
  "endsAt": 1050,
  "availableDays": 62
}

Códigos de respuesta

CódigoDescripción
200Actualizado exitosamente
400Solicitud inválida o shiftAssignmentIDs incompleto
404Turno o asignación no encontrados
409Ya existe un turno con ese nombre
500Error interno del servidor

Eliminar un turno

Elimina un turno por ID. Cuando el turno está usado en asignaciones, se pueden enviar sus IDs en shiftAssignmentIDs para quitarlo también de esas asignaciones (con la misma regla que al actualizar: tienen que incluirse todas las asignaciones posteriores que lo usan). Si se envía createNewVersion: true, el turno se quita de la última asignación; si esa asignación no empieza hoy, se crea una nueva a partir de hoy sin el turno.

Método: DELETE /shifts/:id

Parámetros

ParámetroTipoDescripción
idstringID del turno

Body opcional

{
  "shiftAssignmentIDs": [101, 102],
  "createNewVersion": false
}

Respuesta exitosa (200)

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

Códigos de respuesta

CódigoDescripción
200Eliminado exitosamente
400Solicitud inválida
404Turno no encontrado
500Error interno del servidor