Modulo de Asistencia y Marcaciones (Horas Extras)
- Obtiene descarga boleta de pago (3) - [getDownloadBoletaPago]
- Obtiene descarga Renovación de contrato (3) - [getRenovacionContrato]
- Horas Extras del Mes (1) - [getMarkingsForEmployeePerMonth2]
Obtiene descarga boleta de pago (3) - [getDownloadBoletaPago]
🧾 Descripción
Valida si un empleado debe descargar su boleta de pago del mes anterior antes de poder registrar marcaciones o realizar solicitudes en el sistema.
La validación se aplica únicamente dentro de un periodo permitido (del día 1 al 3 del mes).
Este servicio combina datos entre:
-
Employee(ERP) -
Salary Slip(Boleta de pago, ERP) -
Estado Boleta Mensual(ERP) -
historial_procesos_app(Base MySQL interna)
Permite determinar si el usuario:
-
No debe validar nada.
-
No tiene boleta para ese mes.
-
Tiene boleta habilitada y aún no la descargó → Debe descargarla.
-
Ya descargó → Se libera el acceso.
🚀 Endpoint
POST /get-download-boleta-pago
📥 Parámetros
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| empleado | string | Sí | ID del empleado (Employee.name) |
🔐 Seguridad
El servicio requiere:
-
Acceso API válido al ERP (vía
dbErp()). -
Acceso a la base interna MySQL (
mysql2).
🧠 Flujo del Servicio (resumen real)
1️⃣ Verifica si está dentro del rango permitido
-
Solo valida del día 1 al 3.
-
Si el día es mayor a 3 → no valida nada.
2️⃣ Obtiene datos del empleado
Consulta:
GET tabEmployee
fields = ["fecha_de_ingreso_real", "status"] |
Si el empleado está PreActivo, no se valida boleta.
3️⃣ Determina el mes anterior
Se calcula:
-
Primer día del mes anterior
-
Último día del mes anterior
Se verifica que el empleado haya ingresado antes del fin del mes anterior.
4️⃣ Verifica si existe boleta del mes anterior
Consulta a ERP:
tabSalary Slip
WHERE employee = empleado
AND posting_date BETWEEN primer_día_mes_pasado AND último_día_mes_pasado |
Si no tiene boleta, no se valida nada.
5️⃣ Valida si el mes está habilitado para descarga
Consulta:
tabEstado Boleta Mensual
WHERE mes = <mes anterior en texto>
AND año = <año>
AND habilitado = 1 |
6️⃣ Consulta si el usuario ya descargó la boleta
Busca en MySQL:
historial_procesos_app
WHERE empleado = empleado
AND proceso = 'NOMINA'
AND month = mes
AND year = año |
Si no existe descarga previa y el mes está habilitado → debe descargar.
📤 Respuestas Posibles
✔️ 1. No está en rango de validación
✔️ 2. Empleado PreActivo
✔️ 3. No tiene boleta del mes
❌ 4. Debe descargar la boleta (regla principal)
✔️ 5. Ya descargó la boleta
✔️ 6. Error controlado
📚 Tablas y esquemas usados
🔹 Employee (ERP)
Campos utilizados:
🔹 Salary Slip (ERP)
Campo utilizado: posting_date
🔹 Estado Boleta Mensual (ERP)
Campos utilizados:
🔹 historial_procesos_app (MySQL)
Campos usados:
🗃 Lógica en pseudocódigo
Obtiene descarga Renovación de contrato (3) - [getRenovacionContrato]
🧾 Descripción
Valida si un empleado debe descargar la renovación de contrato antes de poder registrar marcaciones o realizar solicitudes dentro del aplicativo.
El servicio evalúa:
-
La fecha actual (solo aplica desde el día 26 de cada mes).
-
La fecha de ingreso del empleado.
-
Si el empleado tiene un proceso de renovación registrado y validado en ERP.
-
Si ya existe un registro de descarga previo en
historial_procesos_app.
Este servicio actúa como una regla de negocio obligatoria para habilitar o bloquear el uso del aplicativo.
🚀 Endpoint
POST /get-renovacion-contrato
📌 Recibe un único parámetro:
🔐 Seguridad
-
Requiere credenciales autorizadas para consumir la API del ERP.
-
Utiliza internamente
dbErp()para ejecutar consultas SQL seguras contra ERPNext. -
Accede a
mysql2para verificar registros de descargas.
🧠 Flujo del Servicio (Resumen Real)
1️⃣ Validación inicial por fecha
-
Solo permite validar renovación desde el día 26 del mes.
Si es antes:
2️⃣ Obtener fecha real de ingreso del empleado
Consulta al ERP:
Si no existe → el servicio simplemente finaliza sin error.
3️⃣ Determinar si el empleado ya debería tener renovación
-
Calcula el último día del mes anterior.
-
Si el ingreso es anterior a ese período, el empleado califica para renovación.
4️⃣ Consultar renovación en ERP (contratos validados)
Busca registros de:
-
Mes actual (en texto: Enero, Febrero…)
-
Año del mes previo
-
Código del empleado
-
renueva = Si -
estado_de_documento = Validado
Consulta ejecutada:
5️⃣ Validar si el empleado YA descargó la renovación
Consulta en base de datos interna:
-
Si NO la descargó → Bloquea acciones del app:
6️⃣ Si todo está correcto
Retorna éxito:
📥 Request Body
📤 Response 200 – Ejemplos
✔ Caso correcto (ya descargó renovación)
❌ Debe descargar renovación antes de usar el app
✔ Aún no es día válido
❗ Posibles Errores
| Error | Respuesta |
|---|---|
| Día inválido para la operación | "No es el día correcto para la renovación de contrato" |
| Empleado sin renovación validada | "Para poder registrar su marcación..." |
| Error inesperado en ejecución | Se devuelve mensaje genérico, pero siempre con status: true |
| No existe el empleado | El flujo simplemente finaliza sin error explícito |
📚 Consultas y estructuras usadas
✔ ERP — Employee
Campos consultados:
✔ ERP — Solicitud de Renovaciones
Consulta combinada mediante JOIN:
-
data_12(mes) -
año -
codigo -
renueva -
estado_de_documento
✔ Base interna MySQL (mysql2)
Tabla: historial_procesos_app
Campo crítico: proceso = 'descargaContratoRenovacion'
🗃 Lógica en Pseudo-código
Horas Extras del Mes (1) - [getMarkingsForEmployeePerMonth2]
🧾 Descripción
Obtiene y calcula todas las horas extras registradas para un empleado en un mes específico, detallando:
-
Horas al 25%
-
Horas al 35%
-
Horas al 100% (domingos y feriados)
-
Listado detallado por día
-
Total acumulado del periodo de corte mensual
El servicio consulta información desde varios recursos del ERP:
-
Cortes (tabCortes) → para determinar el rango mensual válido
-
Horas Extras (tabHoras Extras) → totales por mes
-
Marcaciones (tabMarcaciones) → registros por día
-
Archivo local de feriados:
holidays.json
🚀 Endpoint
POST /get-markings-employee-month
📥 Parámetros en el body
🔐 Seguridad
-
Requiere token interno del ERP (autenticación manejada por
ServiceErp()). -
Validación del request vía Laravel.
🧠 Flujo del Servicio (resumen real)
1️⃣ Obtiene el corte mensual
Consulta el recurso:
Si no existe corte → retorna error "No hay corte mensual para este mes".
2️⃣ Obtiene las horas extras acumuladas del mes
3️⃣ Obtiene las marcaciones dentro del periodo del corte
Si no hay marcaciones → retorna mensaje informativo.
4️⃣ Carga feriados desde archivo local
public/recursos_humanos/holidays.json
Feriados + domingos se consideran jornada al 100%.
5️⃣ Procesa cada marcación
Por cada registro:
-
Si es feriado/domingo → 100%
-
Si horas ≤ 2 → 25%
-
Si horas > 2
-
primeras 2h → 25%
-
resto → 35%
-
Cada día se estructura como:
6️⃣ Arma la respuesta final:
Incluye:
-
marcaciones: detalle por día -
horas25,horas35,horas100: de la tabla Horas Extras -
horas_acumuladas: sumatoria real de horas del mes