# 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

**<span style="color: rgb(224, 62, 45);">POST /get-download-boleta-pago</span>**

### 📥 Parámetros

<div class="_tableContainer_1rjym_1" id="bkmrk-campo-tipo-requerido"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="1138" data-start="992"><thead data-end="1034" data-start="992"><tr data-end="1034" data-start="992"><th data-col-size="sm" data-end="1000" data-start="992">Campo</th><th data-col-size="sm" data-end="1007" data-start="1000">Tipo</th><th data-col-size="sm" data-end="1019" data-start="1007">Requerido</th><th data-col-size="sm" data-end="1034" data-start="1019">Descripción</th></tr></thead><tbody data-end="1138" data-start="1078"><tr data-end="1138" data-start="1078"><td data-col-size="sm" data-end="1089" data-start="1078">empleado</td><td data-col-size="sm" data-end="1098" data-start="1089">string</td><td data-col-size="sm" data-end="1103" data-start="1098">Sí</td><td data-col-size="sm" data-end="1138" data-start="1103">ID del empleado (Employee.name)</td></tr></tbody></table>

</div></div>---

# 🔐 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:

<table border="1" id="bkmrk-get-tabemployee-fiel" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`GET <span class="hljs-type">tabEmployee</span><span class="hljs-variable">fields</span> <span class="hljs-operator">=</span> [<span class="hljs-string">"fecha_de_ingreso_real"</span>, <span class="hljs-string">"status"</span>]`</td></tr></tbody></table>

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:

<table border="1" id="bkmrk-tabsalary-slip-where" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`tabSalary Slip<span class="hljs-keyword">WHERE</span> employee <span class="hljs-operator">=</span> empleado<span class="hljs-keyword">AND</span> posting_date <span class="hljs-keyword">BETWEEN</span> primer_día_mes_pasado <span class="hljs-keyword">AND</span> último_día_mes_pasado`</td></tr></tbody></table>

Si **no tiene boleta**, no se valida nada.

### 5️⃣ Valida si el mes está habilitado para descarga

Consulta:

<table border="1" id="bkmrk-tabestado-boleta-men" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`tabEstado Boleta Mensual<span class="hljs-type">WHERE</span> <span class="hljs-variable">mes</span> <span class="hljs-operator">=</span> <mes anterior en texto><span class="hljs-type">AND</span> <span class="hljs-variable">año</span> <span class="hljs-operator">=</span> <año><span class="hljs-type">AND</span> <span class="hljs-variable">habilitado</span> <span class="hljs-operator">=</span> <span class="hljs-number">1</span>`</td></tr></tbody></table>

### 6️⃣ Consulta si el usuario ya descargó la boleta

Busca en MySQL:

<table border="1" id="bkmrk-historial_procesos_a" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`historial_procesos_app<span class="hljs-type">WHERE</span> <span class="hljs-variable">empleado</span> <span class="hljs-operator">=</span> empleado<span class="hljs-type">AND</span> <span class="hljs-variable">proceso</span> <span class="hljs-operator">=</span> <span class="hljs-string">'NOMINA'</span><span class="hljs-type">AND</span> <span class="hljs-variable">month</span> <span class="hljs-operator">=</span> mes<span class="hljs-type">AND</span> <span class="hljs-variable">year</span> <span class="hljs-operator">=</span> año`</td></tr></tbody></table>

Si **no existe descarga previa** y el mes está habilitado → debe descargar.

---

# 📤 Respuestas Posibles

### ✔️ 1. No está en rango de validación

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22status%22%3A-true%2C-%22m"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"><table border="1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-punctuation">{</span>  <span class="hljs-attr">"status"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"msn"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"No está dentro del rango de fecha de validación"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>### ✔️ 2. Empleado PreActivo

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22status%22%3A-true%2C-%22m-1"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"><table border="1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-punctuation">{</span>  <span class="hljs-attr">"status"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"msn"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"No validar descarga de boleta en PreActivo"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>### ✔️ 3. No tiene boleta del mes

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22status%22%3A-true%2C-%22m-2"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"><table border="1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-punctuation">{</span>  <span class="hljs-attr">"status"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"msn"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"No tiene boleta de pago por lo tanto no se valida"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>### ❌ 4. Debe descargar la boleta (regla principal)

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22status%22%3A-false%2C-%22"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"><table border="1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-punctuation">{</span>  <span class="hljs-attr">"status"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">false</span></span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"msn"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Para poder registrar su marcación o realizar alguna solicitud, descargar su boleta pendiente del mes"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>### ✔️ 5. Ya descargó la boleta

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22status%22%3A-true%2C-%22m-3"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"><table border="1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-punctuation">{</span>  <span class="hljs-attr">"status"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"msn"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Se ha descargado la boleta de pago"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>### ✔️ 6. Error controlado

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22status%22%3A-true%2C-%22m-4"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"><table border="1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-punctuation">{</span>  <span class="hljs-attr">"status"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"msn"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Se ha descargado el contrato de trabajo"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>---

# 📚 Tablas y esquemas usados

### 🔹 Employee (ERP)

Campos utilizados:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-fecha_de_ingreso_rea"><div class="overflow-y-auto p-4" dir="ltr">`fecha_de_ingreso_real<span class="hljs-built_in">status</span>`</div></div>### 🔹 Salary Slip (ERP)

Campo utilizado: `<span class="hljs-attribute">posting_date</span>`

### 🔹 Estado Boleta Mensual (ERP)

Campos utilizados:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-mes-a%C3%B1o-habilitado"><div class="overflow-y-auto p-4" dir="ltr">`mes<span class="hljs-selector-tag">a</span>ñohabilitado`</div></div>### 🔹 historial\_procesos\_app (MySQL)

Campos usados:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-empleado-proceso-mon"><div class="overflow-y-auto p-4" dir="ltr">`empleadoproceso<span class="hljs-keyword">month</span><span class="hljs-keyword">year</span>`</div></div>---

# 🗃 Lógica en pseudocódigo

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-if-dia-%3E-3%3A-return-o"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"><table border="1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`if dia > 3:    return OKempleado = GET Employee[name]if empleado.status == PreActivo:    return OKfecha_ingreso < fin_mes_anterior ?if no tiene SalarySlip en mes anterior:    return OKmes_habilitado = GET EstadoBoletaMensual[mes,año]descarga = buscar en historial_procesos_appif mes_habilitado AND no descarga:    return OBLIGAR DESCARGAreturn OK`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>