Modulo de Asistencia y Marcaciones (Asistencia)

Obtiene descarga boleta de pago (2) - [getDownloadBoletaPago]

🧾 Descripción

Este servicio valida si un empleado debe descargar obligatoriamente su boleta de pago del último mes antes de poder realizar acciones como:

El servicio evalúa:

  1. Si está dentro del rango de validación (solo del día 1 al 3 de cada mes).

  2. La fecha de ingreso del trabajador.

  3. Si tiene boleta generada el mes anterior.

  4. Si el mes correspondiente está habilitado para descarga.

  5. Si el empleado ya descargó la boleta (se revisa historial en MySQL).

  6. Si el empleado está PreActivo, no se valida la descarga.


🚀 Endpoint

GET /get-download-boleta-pago/{empleado}

📌 Parámetro obligatorio:


🔐 Seguridad


🧠 Flujo del Servicio (resumen)

1️⃣ Validación de fecha

Solo se ejecuta validación si el día actual está entre 1 y 3.
Si el día > 3 → se omite toda validación:

{ "status": true, "msn": "No está dentro del rango de fecha de validación" }

2️⃣ Obtener información del empleado

Consulta ERP:

SELECT fecha_de_ingreso_real, status FROM `tabEmployee` WHERE name = <empleado>

Si el empleado está PreActivo, no se valida boleta:

{ "status": true, "msn": "No validar descarga de boleta en PreActivo" }

3️⃣ Comparar fecha de ingreso vs fecha límite

Se calcula:

Solo se valida si el empleado ingresó antes del cierre del mes previo.


4️⃣ Verificar en MySQL si ya descargó la boleta

Consulta tabla historial_procesos_app:

WHERE empleado = ? AND proceso = 'NOMINA' AND month = <mes_anterior> AND year = <year_anterior>

Si no existe registro se sigue validación.


5️⃣ Validar si EXISTE boleta en ERP

Consulta Salary Slip del último mes:

SELECT posting_date FROM `tabSalary Slip` WHERE employee = ? AND posting_date between <primer_día_mes_anterior> AND <último_día_mes_anterior>

Si no tiene boleta:

{ "status": true, "msn": "No tiene boleta de pago por lo tanto no se valida" }

6️⃣ Validar si el mes está habilitado para descarga

Consulta:

SELECT name FROM `tabEstado Boleta Mensual` WHERE mes = <mes_texto> AND año = <year> AND habilitado = 1

Si está habilitado pero el trabajador NO la descargó, se bloquea:

{ "status": false, "msn": "Para poder registrar su marcación o realizar alguna solicitud, descargar su boleta pendiente del mes" }

7️⃣ Si pasa todas las validaciones → OK

{ "status": true, "msn": "Se ha descargado la boleta de pago" }

📥 Request

No usa body, solo el parámetro de ruta: empleado: string


📤 Response – Ejemplos

✔ Caso permitido (día fuera de rango)

{ "status": true, "msn": "No está dentro del rango de fecha de validación" }

✔ Empleado en PreActivo

{ "status": true, "msn": "No validar descarga de boleta en PreActivo" }

✔ No tiene boleta generada

{ "status": true, "msn": "No tiene boleta de pago por lo tanto no se valida" }

❌ No ha descargado la boleta y es obligatoria

{ "status": false, "msn": "Para poder registrar su marcación o realizar alguna solicitud, descargar su boleta pendiente del mes" }

✔ Todo correcto

{ "status": true, "msn": "Se ha descargado la boleta de pago" }

❗ Posibles errores

Error Descripción
Empleado no existe No se encuentra en ERP
No tiene boleta generada Salary Slip del mes anterior vacío
Boleta habilitada pero no descargada Bloquea marcación y solicitudes
Error en ERP o MySQL Respuesta capturada por el catch

🧩 Tablas consultadas

ERP (Frappe/ERPNext)

MySQL externo


🗃 Pseudocódigo del servicio

if day > 3: return OK (no validar) empleado = GET Employee if empleado.status == PreActivo: return OK if fecha_ingreso < ultimo_dia_mes_anterior: verificar si ya descargó boleta en MySQL verificar si tiene boleta en ERP if no tiene: return OK verificar si mes habilitado if habilitado y no descargado: bloquear return OK

Obtiene descarga Renovación de contrato (2) - [getRenovacionContrato]

🧾 Descripción

Valida si un empleado debe descargar su renovación de contrato, según reglas internas de fecha y estado en el ERP.

Este servicio determina:

Se combina información del ERP y del registro histórico en MySQL2.


🚀 Endpoint

GET /get-renovacion-contrato/{empleado}

📌 El parámetro empleado es obligatorio (ID del Employee en ERP).


🔐 Seguridad

✔ Requiere autenticación interna vía dbErp() y tokens del ERP.
✔ Acceso restringido a servicios del backend.


🧠 Flujo del Servicio (Resumen)

  1. Verifica la fecha actual.

    • Si el día del mes es menor a 26 → No corresponde validar renovaciones.

  2. Obtiene datos del empleado.


    SELECT fecha_de_ingreso_real FROM tabEmployee WHERE name = {empleado}
  3. Determina si el empleado aplica para renovación:

    • Debe haber ingresado antes del último día del mes anterior.

  4. Busca renovaciones validadas del empleado:


    FROM tabSolicitud de Renovaciones doc JOIN tabTrabajadores pendiete de renovar tab WHERE doc.data_12 = <mes_actual_texto> AND doc.año = <año> AND tab.codigo = empleado AND tab.renueva = "Si" AND doc.estado_de_documento = "Validado"
  5. Si existe una renovación validada:

    • Consulta MySQL2 → tabla historial_procesos_app

    • Revisa si el usuario ya descargó su renovación:


      proceso = "descargaContratoRenovacion"
  6. Si no la descargó → bloquea ciertas funciones.

  7. Si todo está conforme → indica que la renovación fue descargada.


📥 Request

Parámetro de ruta

Campo Tipo Obligatorio Descripción
empleado string ID del Employee dentro del ERP

No tiene body.


📤 Response 200 – Ejemplos

✔ Caso 1 — No es día de validación

{ "status": true, "msn": "No es el día correcto para la renovación de contrato" }

✔ Caso 2 — Debe descargar renovación (bloqueo)

{ "status": false, "msn": "Para poder registrar su marcación o realizar alguna solicitud, descargar su renovación de contrato" }

✔ Caso 3 — Renovación descargada correctamente

{ "status": true, "msn": "Se ha descargado el contrato de trabajo" }

✔ Caso 4 — Error controlado

{ "status": true, "msn": "Se ha descargado el contrato de trabajo" }

❗ Posibles errores

Código Significado
status:false El empleado tiene renovación pendiente y no la descargó
status:true No aplica validación o ya cumplió con la descarga
Excepción Se devuelve un mensaje genérico indicando que el contrato fue descargado

📚 Tablas / Datos utilizados

ERP - tabEmployee

Campos usados:

ERP - tabSolicitud de Renovaciones

Campos usados:

ERP - tabTrabajadores pendiete de renovar

Campos usados:

MySQL2 - tabla historial_procesos_app

Procesos revisados:


🗃 Lógica en Pseudo-Código

if day(today) < 26: return OK("No es el día correcto") empleado = queryERP(Employee where name=empleado) if empleado.ingreso < ultimo_dia_mes_anterior: renov = queryERP(Solicitud de Renovaciones where codigo=empleado AND renueva="Si" AND estado="Validado" ) if renov exists: registro = queryMySQL(historial_procesos where proceso="descargaContratoRenovacion") if registro vacío: return ERROR("Debe descargar la renovación") return OK("Se ha descargado el contrato de trabajo")

Lista de Asistencias (1) - [getMarkingsApp]

🧾 Descripción

Este servicio obtiene y consolida todas las asistencias de un empleado en un mes específico, calculando:

Además, toma en cuenta:

Es un endpoint fundamental para el módulo de Control de Asistencias dentro del aplicativo.


🚀 Endpoint

POST /get-markings-app

📥 Requiere parámetros obligatorios en el body:

{ "employee": "EMP-0001", "month": "02", "anio": "2025", "fechaIngreso": "2024-10-15" }


🔐 Seguridad

Requiere autenticación interna del sistema ERP mediante:


🧠 Flujo del Servicio (resumen real)

  1. Recibe parámetros del empleado y mes a consultar.

    employee, month, anio, fechaIngreso

  2. Calcula rango real del mes a evaluar, tomando en cuenta:

    • Si es el mes actual.

    • Si el empleado ingresó después del día 1.

    • Días previos al ingreso del trabajador.

  3. Carga feriados y domingos del archivo JSON:

    /public/recursos_humanos/holidays.json

  4. Determina cuántos días del mes son feriados o domingos dentro del rango permitido.

  5. Valida campos obligatorios.

  6. Consulta en el ERP todas las asistencias del empleado en el mes:

FROM tabAttendance WHERE employee = <empleado> AND attendance_date BETWEEN 1 y último día del mes AND status IN ('Present','Marcacion Incompleta','On Leave','Absent','Día de Descanso','Feriado')

  1. Recorre todas las asistencias y clasifica:

    • Present → Suma asistencia

    • On Leave → Permisos

    • Absent → Faltas

    • Feriado → Feriados

    • Día de Descanso → Descansos

    • Marcacion Incompleta → Marcaciones incompletas

  2. Calcula porcentaje de asistencia, considerando:

    • Días previos al ingreso.

    • Si el mes es el actual → hasta el día de hoy.

    • Casos especiales de permisos dominicales.

  3. Construye respuesta final con totales y fechas.


📥 Request Body

{ "employee": "EMP-0001", "month": "03", "anio": "2025", "fechaIngreso": "2024-10-10" }

📌 Todos son obligatorios.


📤 Response 200 – Ejemplo

{ "valor": true, "msn": "LISTA DE ASISTENCIAS", "data": { "porcentage": "92.55", "dias_aistidos": "25", "dias_totales": "27", "permisos": "1", "faltas": "0", "marcacion_incompleta": "1", "fechas_asistidas": [ "2025-03-01", "2025-03-02", "2025-03-03" ], "feriados": "1", "descansos": "4", "dias_permisos": [ "2025-03-08" ], "dias_tardanzas": [ "2025-03-15" ], "dias_faltas": [], "dias_feriados": [ "2025-03-29" ], "dias_descansos": [ "2025-03-02", "2025-03-09" ] } }


❗ Posibles Errores

1. Faltan parámetros obligatorios

{ "valor": false, "msn": "Complete todos los campos" }

2. No existe asistencia registrada

{ "valor": true, "msn": "LISTA DE ASISTENCIAS", "data": { "porcentage": "0", "dias_asistidos": "0", "dias_totales": "0", ... } }

3. Error interno inesperado

{ "valor": false, "msn": "Error inesperado en el servicio", "data": [] }


📚 Estructuras usadas

Attendance (tabAttendance)

Campos consultados:

Archivo holidays.json

Estructura:

{ "Sunday": ["2025-03-02", "2025-03-09"], "Holidays": ["2025-03-29"] }


🧩 Lógica en pseudo-código

input: employee, month, anio, fechaIngreso validar campos requeridos calcular fecha_inicio y fecha_fin según: - mes actual - fecha de ingreso del empleado cargar feriados y domingos (holidays.json) contar días dentro del rango consultar asistencias en ERP: SELECT attendance_date, status FROM tabAttendance WHERE employee = employee AND status IN (...) inicializar contadores foreach asistencia in resultado: clasificar según status acumular días, permisos, faltas, descansos, feriados calcular porcentaje de asistencia return { valor: true, data: {...} }