Días de Trabajo
Días de Trabajo
POST: Actualizar días de trabajo
Descripción del API
Este endpoint permite actualizar la información de días de trabajo para uno o varios usuarios. Soporta actualizaciones en lote (batch) y permite modificar horarios, tiempos de descanso, horas planificadas y otros parámetros relacionados con el trabajo diario.
Endpoint
POST /api/should-work/update
Parámetros de entrada
| Atributo | Requerido | Tipo | Formato | Descripción | Ejemplo |
|---|---|---|---|---|---|
days | Sí | array | - | Array de objetos con la información de días a actualizar | Ver ejemplo |
days[].user_id | Sí | number | - | ID del usuario | 123 |
days[].date | Sí | string | YYYY-MM-DD | Fecha en formato YYYY-MM-DD | "2024-01-15" |
days[].blocked_reason | Sí | string | - | Motivo del bloqueo/modificación | "Ajuste de horario" |
days[].source | Sí | string | - | Origen de la modificación | "Breik", "SAP" |
days[].is_day_off | No | number | - | Indica si es día de descanso (1 o 0) | 0 |
days[].shift_date_start | No | string | YYYY-MM-DD | Fecha de inicio del turno | "2024-01-15" |
days[].shift_time_start | No | string | HH:mm:ss | Hora de inicio del turno | "08:00:00" |
days[].shift_date_end | No | string | YYYY-MM-DD | Fecha de fin del turno | "2024-01-15" |
days[].shift_time_end | No | string | HH:mm:ss | Hora de fin del turno | "17:00:00" |
days[].break_time | No | string | interval | Duración del almuerzo | "1 HOUR", "30 MINUTES" |
days[].rest_time | No | string | interval | Duración del descanso | "30 MINUTES", "1 HOUR" |
days[].planned_work_hours | No | string | interval | Horas de trabajo planificadas | "8 HOURS", "9 HOURS" |
Formatos de interval (PostgreSQL)
Los campos break_time, rest_time y planned_work_hours aceptan los siguientes formatos:
"X HOURS"- Ejemplo:"8 HOURS","9 HOURS""X MINUTES"- Ejemplo:"30 MINUTES","45 MINUTES""X HOURS Y MINUTES"- Ejemplo:"1 HOUR 30 MINUTES","8 HOURS 15 MINUTES"
JSON de ejemplo (entrada) - Caso simple
{
"days": [
{
"user_id": 123,
"date": "2024-01-15",
"blocked_reason": "Modificación de horario por evento",
"source": "Breik",
"is_day_off": 0,
"shift_date_start": "2024-01-15",
"shift_time_start": "08:00:00",
"shift_date_end": "2024-01-15",
"shift_time_end": "17:00:00",
"break_time": "1 HOUR",
"rest_time": "30 MINUTES",
"planned_work_hours": "9 HOURS"
}
]
}
JSON de ejemplo (entrada) - Batch (múltiples días)
{
"days": [
{
"user_id": 123,
"date": "2024-01-15",
"blocked_reason": "Ajuste de horario",
"source": "Breik",
"shift_time_start": "08:00:00",
"shift_time_end": "17:00:00",
"break_time": "1 HOUR",
"rest_time": "30 MINUTES",
"planned_work_hours": "8 HOURS"
},
{
"user_id": 123,
"date": "2024-01-16",
"blocked_reason": "Cambio de turno",
"source": "SAP",
"shift_time_start": "09:00:00",
"shift_time_end": "18:00:00",
"break_time": "1 HOUR 30 MINUTES",
"rest_time": "45 MINUTES",
"planned_work_hours": "9 HOURS"
},
{
"user_id": 456,
"date": "2024-01-17",
"blocked_reason": "Ajuste manual",
"source": "Breik",
"shift_time_start": "07:00:00",
"shift_time_end": "16:00:00",
"break_time": "1 HOUR",
"planned_work_hours": "8 HOURS"
}
]
}
Parámetros de salida
| Atributo | Tipo | Descripción | Ejemplo |
|---|---|---|---|
success | array | Array de objetos con los días actualizados exitosamente. | Ver ejemplo |
success[].id | integer | ID del registro actualizado. | 1 |
success[].user_id | integer | ID del usuario. | 123 |
success[].team_id | integer | ID del equipo. | 1 |
success[].date | string | Fecha en formato YYYY-MM-DD. | "2024-01-15" |
success[].blocked_reason | string | Motivo del bloqueo/modificación. | "Ajuste de horario" |
success[].is_blocked | boolean | Indica si el día está bloqueado. | true |
success[].update_user | integer | ID del usuario que realizó la actualización. | 456 |
success[].source | string | Origen de la modificación. | "Breik" |
success[].is_day_off | number | Indica si es día de descanso. | 0 |
success[].shift_date_start | string | Fecha de inicio del turno en formato ISO 8601. | "2024-01-15T00:00:00.000Z" |
success[].shift_time_start | string | Hora de inicio del turno. | "08:00:00" |
success[].shift_date_end | string | Fecha de fin del turno en formato ISO 8601. | "2024-01-15T00:00:00.000Z" |
success[].shift_time_end | string | Hora de fin del turno. | "17:00:00" |
success[].break_time | string | Duración del almuerzo. | "1 HOUR" |
success[].rest_time | string | Duración del descanso. | "30 MINUTES" |
success[].planned_work_hours | string | Horas de trabajo planificadas. | "9 HOURS" |
success[].updated_at | string | Fecha y hora de actualización en formato ISO 8601. | "2024-01-15T10:30:00.000Z" |
errors | array | Array de objetos con los errores encontrados. | Ver ejemplo |
errors[].user_id | integer | ID del usuario que generó el error. | 999 |
errors[].date | string | Fecha del día que generó el error. | "2024-01-20" |
errors[].error | string | Mensaje descriptivo del error. | "Usuario no encontrado" |
JSON de ejemplo (salida)
- Respuesta 200 OK (caso simple):
{
"success": [
{
"id": 1,
"user_id": 123,
"team_id": 1,
"date": "2024-01-15",
"blocked_reason": "Modificación de horario por evento",
"is_blocked": true,
"update_user": 456,
"source": "Breik",
"is_day_off": 0,
"shift_date_start": "2024-01-15T00:00:00.000Z",
"shift_time_start": "08:00:00",
"shift_date_end": "2024-01-15T00:00:00.000Z",
"shift_time_end": "17:00:00",
"break_time": "1 HOUR",
"rest_time": "30 MINUTES",
"planned_work_hours": "9 HOURS",
"updated_at": "2024-01-15T10:30:00.000Z"
}
],
"errors": []
}
- Respuesta 200 OK (batch - éxito completo):
{
"success": [
{
"id": 1,
"user_id": 123,
"team_id": 1,
"date": "2024-01-15",
"blocked_reason": "Ajuste de horario",
"is_blocked": true,
"update_user": 456,
"source": "Breik",
"shift_time_start": "08:00:00",
"shift_time_end": "17:00:00",
"break_time": "1 HOUR",
"rest_time": "30 MINUTES",
"planned_work_hours": "8 HOURS",
"updated_at": "2024-01-15T10:30:00.000Z"
},
{
"id": 2,
"user_id": 123,
"team_id": 1,
"date": "2024-01-16",
"blocked_reason": "Cambio de turno",
"is_blocked": true,
"update_user": 456,
"source": "SAP",
"shift_time_start": "09:00:00",
"shift_time_end": "18:00:00",
"break_time": "1 HOUR 30 MINUTES",
"rest_time": "45 MINUTES",
"planned_work_hours": "9 HOURS",
"updated_at": "2024-01-15T10:30:05.000Z"
},
{
"id": 3,
"user_id": 456,
"team_id": 1,
"date": "2024-01-17",
"blocked_reason": "Ajuste manual",
"is_blocked": true,
"update_user": 456,
"source": "Breik",
"shift_time_start": "07:00:00",
"shift_time_end": "16:00:00",
"break_time": "1 HOUR",
"planned_work_hours": "8 HOURS",
"updated_at": "2024-01-15T10:30:10.000Z"
}
],
"errors": []
}
- Respuesta 200 OK (batch - éxito parcial con errores):
{
"success": [
{
"id": 1,
"user_id": 123,
"team_id": 1,
"date": "2024-01-15",
"blocked_reason": "Ajuste de horario",
"is_blocked": true,
"update_user": 456,
"source": "Breik",
"shift_time_start": "08:00:00",
"shift_time_end": "17:00:00",
"updated_at": "2024-01-15T10:30:00.000Z"
}
],
"errors": [
{
"user_id": 999,
"date": "2024-01-20",
"error": "No se encontró un registro de should_work para el usuario 999 en la fecha 2024-01-20 del equipo 1"
}
]
}
Respuestas de error
Error 400: Validación fallida
Request inválido (campo obligatorio faltante)
{
"days": [
{
"user_id": 123,
"date": "2024-01-15"
}
]
}
Response 400 Bad Request
{
"statusCode": 400,
"message": [
"El campo blocked_reason es obligatorio",
"El campo source es obligatorio"
],
"error": "Bad Request"
}
Request inválido (formato de time incorrecto)
{
"days": [
{
"user_id": 123,
"date": "2024-01-15",
"blocked_reason": "Test",
"source": "Breik",
"shift_time_start": "8:00"
}
]
}
Response 400 Bad Request
{
"statusCode": 400,
"message": [
"El campo shift_time_start debe tener el formato time HH:mm:ss (ejemplo: 08:00:00, 17:30:00, 23:59:59)"
],
"error": "Bad Request"
}
Error 401: No autenticado
Response 401 Unauthorized
{
"statusCode": 401,
"message": "Unauthorized"
}