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ámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
shift_assignment_id | string | ❌ | 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ódigo | Descripción |
|---|---|
| 200 | Exitoso |
| 500 | Error 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ámetro | Tipo | Descripción |
|---|---|---|
id | string | ID 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ódigo | Descripción |
|---|---|
| 200 | Exitoso |
| 404 | ID no encontrado |
| 500 | Error 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ódigo | Descripción |
|---|---|
| 201 | Turno creado exitosamente |
| 400 | Solicitud inválida |
| 409 | Ya existe un turno con ese nombre |
| 500 | Error 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 estrue, 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ámetro | Tipo | Descripción |
|---|---|---|
id | string | ID 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ódigo | Descripción |
|---|---|
| 200 | Actualizado exitosamente |
| 400 | Solicitud inválida o shiftAssignmentIDs incompleto |
| 404 | Turno o asignación no encontrados |
| 409 | Ya existe un turno con ese nombre |
| 500 | Error 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ámetro | Tipo | Descripción |
|---|---|---|
id | string | ID del turno |
Body opcional
{
"shiftAssignmentIDs": [101, 102],
"createNewVersion": false
}Respuesta exitosa (200)
{
"message": "deleted successfuly",
"deleted": true
}Códigos de respuesta
| Código | Descripción |
|---|---|
| 200 | Eliminado exitosamente |
| 400 | Solicitud inválida |
| 404 | Turno no encontrado |
| 500 | Error interno del servidor |

