# Obtiene descarga boleta de pago (1,2,3,4,5,6,7,8) - [getDownloadBoletaPago]

## 🧾 **Descripción General**

*Este servicio valida si un empleado debe descargar su boleta de pago (Salary Slip) correspondiente al mes anterior.*  
*La validación depende:*

- Del **día del mes actual**
- Del **estado del empleado**
- De si existe o no una boleta generada
- De si dicha boleta está habilitada
- De si ya registró una descarga previa

*La lógica se usa para **bloquear marcaciones o solicitudes** cuando un trabajador tiene una boleta pendiente por descargar.*

---

# 🚀 **Endpoint**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-get-%2Fget-download-bo"><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">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr"><span style="color: rgb(224, 62, 45);">**`<span class="hljs-keyword">GET</span> /<span class="hljs-keyword">get</span>-download-boleta-pago/{empleado}`**</span></div></div>**Parámetro Path:**

<div class="_tableContainer_1rjym_1" id="bkmrk-par%C3%A1metro-tipo-reque"><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="1013" data-start="833"><thead data-end="881" data-start="833"><tr data-end="881" data-start="833"><th data-col-size="sm" data-end="845" data-start="833">Parámetro</th><th data-col-size="sm" data-end="854" data-start="845">Tipo</th><th data-col-size="sm" data-end="866" data-start="854">Requerido</th><th data-col-size="md" data-end="881" data-start="866">Descripción</th></tr></thead><tbody data-end="1013" data-start="930"><tr data-end="1013" data-start="930"><td data-col-size="sm" data-end="941" data-start="930">empleado</td><td data-col-size="sm" data-end="950" data-start="941">string</td><td data-col-size="sm" data-end="962" data-start="950">Sí</td><td data-col-size="md" data-end="1013" data-start="962">Código del empleado (Employee.name en ERPNext).</td></tr></tbody></table>

</div></div>---

# 🔐 **Seguridad**

No usa autenticación dentro de esta función, pero depende de endpoints internos ERPNext vía <span style="color: rgb(224, 62, 45);">**`dbErp`**</span>.  
Se recomienda incluirlo dentro de rutas protegidas.

---

# 🧠 **Flujo Lógico (Resumen Ejecutivo)**

1. **Validación de fechas**
    
    
    - Si el día actual es mayor a **3**, no se hace validación → se retorna éxito.
2. **Consultar datos del empleado**
    
    
    - Obtiene desde ERP:
        
        
        - <span style="color: rgb(224, 62, 45);">**`fecha_de_ingreso_real`**</span>
        - <span style="color: rgb(224, 62, 45);">**`status`**</span>
3. **Casos especiales por estado**
    
    
    - Si el empleado está en **PreActivo**, no se valida.
4. **Determinar si corresponde validar**
    
    
    - Calcula el **último día del mes anterior**.
    - Si el ingreso del trabajador es posterior a ese mes → no se valida.
5. **Validar si existe boleta generada**
    
    
    - Consulta Salary Slip del mes anterior.
    - Si no existe boleta → no corresponde validar.
6. **Validar si la boleta mensual está habilitada (Estado Boleta Mensual)**
    
    
    - Revisa si está habilitada para ese mes.
7. **Verificar si ya descargó boleta**
    
    
    - Revisa tabla <span style="color: rgb(224, 62, 45);">**`historial_procesos_app`** </span>en MySQL.
    - Si no descargó → retorna mensaje de pendiente.
8. **Caso final**
    
    
    - Si todo está correcto → retorna éxito.

---

# 📥 **Request**

Sin body.  
Solo recibe el parámetro <span style="color: rgb(224, 62, 45);">**`{empleado}`**</span> en la URL.

---

# 📤 **Responses**

### ✔️ 200 – No corresponde validación (día mayor a 3)

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--5"><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">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div><table border="1" id="bkmrk-%7B-%22status%22%3A-true%2C-%22m" 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>

---

### ✔️ 200 – Empleado en PreActivo

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--7"><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">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div><table border="1" id="bkmrk-%7B-%22status%22%3A-true%2C-%22m-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>

---

### ✔️ 200 – No corresponde validación (ingresó después)

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--9"><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">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div><table border="1" id="bkmrk-%7B-%22status%22%3A-true%2C-%22m-2" 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>

---

### ❌ 200 – Boleta pendiente por descargar (validación negativa)

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--11"><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">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div><table border="1" id="bkmrk-%7B-%22status%22%3A-false%2C-%22" 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>

---

### ✔️ 200 – Boleta descargada previamente

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--13"><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">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div><table border="1" id="bkmrk-%7B-%22status%22%3A-true%2C-%22m-3" 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>

---

### ✔️ 200 – Error capturado (retorna como éxito)

<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>> *Este mensaje parece incorrecto para el contexto (habla de contrato en vez de boleta), pero se documenta tal como el código lo retorna.*

---

# 📚 **Lógica de Consultas Usadas**

## 1. Obtener datos del empleado

Consulta a ERP:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-select-fecha_de_ingr"><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-keyword">SELECT</span> fecha_de_ingreso_real, status<span class="hljs-keyword">FROM</span> `tabEmployee`<span class="hljs-keyword">WHERE</span> <span class="hljs-type">name</span> = %(<span class="hljs-type">name</span>)s`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>## 2. Validar Salary Slip del mes anterior

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-select-posting_date-"><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-variable constant_">SELECT</span> posting_date<span class="hljs-variable constant_">FROM</span> <span class="hljs-string">`tabSalary Slip`</span><span class="hljs-variable constant_">WHERE</span> employee = <span class="hljs-string">%(employee)</span>s  <span class="hljs-variable constant_">AND</span> posting_date <span class="hljs-variable constant_">BETWEEN</span> <span class="hljs-string">%(fecha_inicio)</span>s <span class="hljs-variable constant_">AND</span> <span class="hljs-string">%(fecha_fin)</span>s`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>## 3. Validar estado de boleta (habilitado)

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-select-name-from-%60ta"><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-keyword">SELECT</span> <span class="hljs-type">name</span><span class="hljs-keyword">FROM</span> `tabEstado Boleta Mensual`<span class="hljs-keyword">WHERE</span> mes = %(mes)s <span class="hljs-keyword">AND</span> año = %(año)s <span class="hljs-keyword">AND</span> habilitado = <span class="hljs-number">1</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>## 4. Validar si el empleado ya descargó su boleta

Tabla: **historial\_procesos\_app (mysql2)**  
Filtro:

- proceso = NOMINA
- employee
- month
- year

---

# 🧩 **Posibles Errores de Diseño (para tu control interno)**

- El `catch` retorna mensaje incorrecto: *“Se ha descargado el contrato de trabajo”*.
- En validación final siempre retorna “status: true” aunque haya fallas.
- Se usa `POST` en algunas consultas SQL cuando debería ser `GET`.

(Solo informativo; no se incluye en documentación oficial si no lo deseas.)