Skip to main content

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

AtributoRequeridoTipoFormatoDescripciónEjemplo
daysarray-Array de objetos con la información de días a actualizarVer ejemplo
days[].user_idnumber-ID del usuario123
days[].datestringYYYY-MM-DDFecha en formato YYYY-MM-DD"2024-01-15"
days[].blocked_reasonstring-Motivo del bloqueo/modificación"Ajuste de horario"
days[].sourcestring-Origen de la modificación"Breik", "SAP"
days[].is_day_offNonumber-Indica si es día de descanso (1 o 0)0
days[].shift_date_startNostringYYYY-MM-DDFecha de inicio del turno"2024-01-15"
days[].shift_time_startNostringHH:mm:ssHora de inicio del turno"08:00:00"
days[].shift_date_endNostringYYYY-MM-DDFecha de fin del turno"2024-01-15"
days[].shift_time_endNostringHH:mm:ssHora de fin del turno"17:00:00"
days[].break_timeNostringintervalDuración del almuerzo"1 HOUR", "30 MINUTES"
days[].rest_timeNostringintervalDuración del descanso"30 MINUTES", "1 HOUR"
days[].planned_work_hoursNostringintervalHoras 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

AtributoTipoDescripciónEjemplo
successarrayArray de objetos con los días actualizados exitosamente.Ver ejemplo
success[].idintegerID del registro actualizado.1
success[].user_idintegerID del usuario.123
success[].team_idintegerID del equipo.1
success[].datestringFecha en formato YYYY-MM-DD."2024-01-15"
success[].blocked_reasonstringMotivo del bloqueo/modificación."Ajuste de horario"
success[].is_blockedbooleanIndica si el día está bloqueado.true
success[].update_userintegerID del usuario que realizó la actualización.456
success[].sourcestringOrigen de la modificación."Breik"
success[].is_day_offnumberIndica si es día de descanso.0
success[].shift_date_startstringFecha de inicio del turno en formato ISO 8601."2024-01-15T00:00:00.000Z"
success[].shift_time_startstringHora de inicio del turno."08:00:00"
success[].shift_date_endstringFecha de fin del turno en formato ISO 8601."2024-01-15T00:00:00.000Z"
success[].shift_time_endstringHora de fin del turno."17:00:00"
success[].break_timestringDuración del almuerzo."1 HOUR"
success[].rest_timestringDuración del descanso."30 MINUTES"
success[].planned_work_hoursstringHoras de trabajo planificadas."9 HOURS"
success[].updated_atstringFecha y hora de actualización en formato ISO 8601."2024-01-15T10:30:00.000Z"
errorsarrayArray de objetos con los errores encontrados.Ver ejemplo
errors[].user_idintegerID del usuario que generó el error.999
errors[].datestringFecha del día que generó el error."2024-01-20"
errors[].errorstringMensaje 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"
}