# 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

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

📌 Recibe un único parámetro:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22empleado%22%3A-%22emp-0"><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">"empleado"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"EMP-0001"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

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

# 🔐 Seguridad

- Requiere credenciales autorizadas para consumir la API del ERP.
- Utiliza internamente `dbErp()` para ejecutar consultas SQL seguras contra ERPNext.
- Accede a `mysql2` para 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:

<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 es el día correcto para la renovación de contrato"</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️⃣ Obtener fecha real de ingreso del empleado

Consulta al 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<span class="hljs-keyword">FROM</span> `tabEmployee`<span class="hljs-keyword">WHERE</span> name <span class="hljs-operator">=</span> <span class="hljs-operator"><</span>empleado<span class="hljs-operator">></span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div>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:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-select-doc.name-from"><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> doc.name<span class="hljs-keyword">FROM</span> `tabSolicitud de Renovaciones` doc<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span> `tabTrabajadores pendiete de renovar` tab <span class="hljs-keyword">ON</span> doc.name <span class="hljs-operator">=</span> tab.parent<span class="hljs-keyword">WHERE</span>     doc.data_12 <span class="hljs-operator">=</span> <span class="hljs-operator"><</span>mes_actual_texto<span class="hljs-operator">></span> <span class="hljs-keyword">AND</span>    doc.año <span class="hljs-operator">=</span> <span class="hljs-operator"><</span><span class="hljs-keyword">year</span><span class="hljs-operator">></span> <span class="hljs-keyword">AND</span>    tab.codigo <span class="hljs-operator">=</span> <span class="hljs-operator"><</span>empleado<span class="hljs-operator">></span> <span class="hljs-keyword">AND</span>    tab.renueva <span class="hljs-operator">=</span> <span class="hljs-string">'Si'</span> <span class="hljs-keyword">AND</span>    doc.estado_de_documento <span class="hljs-operator">=</span> <span class="hljs-string">'Validado'</span>`</td></tr></tbody></table>

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

### 5️⃣ Validar si el empleado YA descargó la renovación

Consulta en base de datos interna:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-historial_procesos_a"><div class="overflow-y-auto p-4" dir="ltr">`historial_procesos_app<span class="hljs-type">WHERE</span> <span class="hljs-variable">proceso</span> <span class="hljs-operator">=</span> <span class="hljs-string">'descargaContratoRenovacion'</span>  <span class="hljs-type">AND</span> <span class="hljs-variable">empleado</span> <span class="hljs-operator">=</span> <empleado>`</div></div>- Si **NO la descargó** → Bloquea acciones del app:

<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 renovación de contrato"</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️⃣ Si todo está correcto

Retorna éxito:

<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">"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>---

# 📥 Request Body

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22empleado%22%3A-%22emp-0-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">"empleado"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"EMP-0001"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

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

# 📤 Response 200 – Ejemplos

### ✔ Caso correcto (ya descargó renovación)

<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">"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>### ❌ Debe descargar renovación antes de usar el app

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22status%22%3A-false%2C-%22-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">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 renovación de contrato"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div>### ✔ Aún no es día válido

<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">"No es el día correcto para la renovación de contrato"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

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

# ❗ Posibles Errores

<div class="_tableContainer_1rjym_1" id="bkmrk-error-respuesta-d%C3%ADa-"><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="3937" data-start="3547"><thead data-end="3568" data-start="3547"><tr data-end="3568" data-start="3547"><th data-col-size="sm" data-end="3555" data-start="3547">Error</th><th data-col-size="md" data-end="3568" data-start="3555">Respuesta</th></tr></thead><tbody data-end="3937" data-start="3590"><tr data-end="3683" data-start="3590"><td data-col-size="sm" data-end="3623" data-start="3590">Día inválido para la operación</td><td data-col-size="md" data-end="3683" data-start="3623">`"No es el día correcto para la renovación de contrato"`</td></tr><tr data-end="3763" data-start="3684"><td data-col-size="sm" data-end="3719" data-start="3684">Empleado sin renovación validada</td><td data-col-size="md" data-end="3763" data-start="3719">`"Para poder registrar su marcación..."`</td></tr><tr data-end="3859" data-start="3764"><td data-col-size="sm" data-end="3796" data-start="3764">Error inesperado en ejecución</td><td data-col-size="md" data-end="3859" data-start="3796">Se devuelve mensaje genérico, pero siempre con status: true</td></tr><tr data-end="3937" data-start="3860"><td data-col-size="sm" data-end="3884" data-start="3860">No existe el empleado</td><td data-col-size="md" data-end="3937" data-start="3884">El flujo simplemente finaliza sin error explícito</td></tr></tbody></table>

</div></div>---

# 📚 Consultas y estructuras usadas

### ✔ ERP — Employee

Campos consultados:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22fecha_de_ingreso_"><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">"fecha_de_ingreso_real"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"date"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div>### ✔ ERP — Solicitud de Renovaciones

Consulta combinada mediante JOIN:

- `data_12` (mes)
- `año`
- `codigo`
- `renueva`
- `estado_de_documento`

### ✔ Base interna MySQL (mysql2)

Tabla: `<span class="hljs-attribute">historial_procesos_app</span>`

Campo crítico: `<span class="hljs-attr">proceso</span> = <span class="hljs-string">'descargaContratoRenovacion'</span>`

---

# 🗃 Lógica en Pseudo-código

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-if-%28dia_actual-%3C-26%29"><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">if</span> (dia_actual < <span class="hljs-number">26</span>)    <span class="hljs-keyword">return</span> <span class="hljs-string">"No es el día correcto"</span>empleado = GET fecha_ingreso_real FROM Employee<span class="hljs-keyword">if</span> fecha_ingreso < ultimo_dia_mes_anterior:    renovacion = GET renovacion_validada FROM SolicitudRenovaciones    <span class="hljs-keyword">if</span> renovacion existe:        descarga = buscar en historial_procesos_app        <span class="hljs-keyword">if</span> no hay descarga:            <span class="hljs-keyword">return</span> <span class="hljs-string">"Debe descargar renovación"</span><span class="hljs-keyword">return</span> <span class="hljs-string">"OK"</span>`</td></tr></tbody></table>

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