# Contrato de Trabajo(Url Contrato de trabajo PDF (1)) - [printContractPerDesignation]

## 🧾 Descripción

*Genera y descarga el **Contrato de Trabajo** correspondiente a un empleado, seleccionando de forma automática el **formato de contrato correcto** según:*

- Tipo de documento del empleado (DNI / PAS / CE)
- Modalidad laboral (Full time, Part time, Teletrabajo)
- Tipo de puesto (Ej. Conductor, Vigilante)
- Número de contratos previos
- Funciones asociadas al contrato (solo extranjeros)

El servicio determina internamente qué plantilla PDF debe usarse y devuelve el archivo final generado.

Es un servicio interno que consulta múltiples recursos del ERP:

- Employee
- Contrato de Trabajo
- Funciones del Contrato
- Otros contratos previos

---

## 🚀 Endpoint

<span style="color: rgb(224, 62, 45);">**`GET /print-contract-per-designation/{employee}`**</span>

### 📥 Parámetros de ruta

<div class="_tableContainer_1rjym_1" id="bkmrk-par%C3%A1metro-tipo-oblig"><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="1197" data-start="1017"><thead data-end="1070" data-start="1017"><tr data-end="1070" data-start="1017"><th data-col-size="sm" data-end="1030" data-start="1017">Parámetro</th><th data-col-size="sm" data-end="1041" data-start="1030">Tipo</th><th data-col-size="sm" data-end="1055" data-start="1041">Obligatorio</th><th data-col-size="sm" data-end="1070" data-start="1055">Descripción</th></tr></thead><tbody data-end="1197" data-start="1124"><tr data-end="1197" data-start="1124"><td data-col-size="sm" data-end="1136" data-start="1124">employee</td><td data-col-size="sm" data-end="1147" data-start="1136">string</td><td data-col-size="sm" data-end="1161" data-start="1147">Sí</td><td data-col-size="sm" data-end="1197" data-start="1161">Código único del empleado en ERP</td></tr></tbody></table>

</div></div>---

## 🔐 Seguridad

Requiere autenticación interna:

- Consulta ERP vía `dbErp()`
- Obtención de PDF vía `PDF::loadView()`

---

## 🧠 Flujo del Servicio (Resumen Real)

### **1️⃣ Validación del empleado**

Consulta al ERP:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-post-send-query-data"><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>`POST send-query-<span class="hljs-keyword">database</span><span class="hljs-keyword">FROM</span> tabEmployee<span class="hljs-keyword">WHERE</span> <span class="hljs-type">name</span> = employee<span class="hljs-keyword">SELECT</span> fecha_de_ingreso_real`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>Si no existe → retorna error: *"No existe empleado"*.

---

### **2️⃣ Obtiene el contrato activo más reciente**

Se buscan contratos con:

- `empleado = employee`
- `docstatus = 1`
- `fecha_de_ingreso_real = fecha_ingreso_empleado`
- Ordenado por creación descendente

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-post-send-query-data-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>`POST send<span class="hljs-operator">-</span>query<span class="hljs-operator">-</span>database<span class="hljs-keyword">FROM</span> tabContrato de Trabajo<span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span> tabEmployee`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>Si no existe contrato → retorna *"No cuenta con Contrato"*.

---

### **3️⃣ Obtiene funciones asociadas (solo extranjeros)**

Busca funciones del contrato:

<table border="1" id="bkmrk-from-tabtabla_funcio" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-keyword">FROM</span> tabtabla_funcion_extranjero<span class="hljs-keyword">WHERE</span> parent = contrato.name`</td></tr></tbody></table>

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--5"><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>Estas funciones se agregan al contrato en el PDF.

---

### **4️⃣ Determina el número de contratos previos**

Solo aplica a empleados con documento **PAS** o **CE**.

Consulta cantidad de contratos registrados después del ingreso real.

Esto permite determinar si el contrato es:

- Primer contrato
- Segundo contrato
- Tercer contrato
- Etc. (usando arreglo ordinal: primero, segundo, tercero, …)

---

### **5️⃣ Selección automática de la plantilla PDF**

En base a reglas:

<div class="_tableContainer_1rjym_1" id="bkmrk-condici%C3%B3n-plantilla-"><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="3167" data-start="2587"><thead data-end="2612" data-start="2587"><tr data-end="2612" data-start="2587"><th data-col-size="md" data-end="2599" data-start="2587">Condición</th><th data-col-size="md" data-end="2612" data-start="2599">Plantilla</th></tr></thead><tbody data-end="3167" data-start="2639"><tr data-end="2700" data-start="2639"><td data-col-size="md" data-end="2676" data-start="2639">modalidad\_de\_trabajo = Teletrabajo</td><td data-col-size="md" data-end="2700" data-start="2676">contrato\_teletrabajo</td></tr><tr data-end="2768" data-start="2701"><td data-col-size="md" data-end="2730" data-start="2701">labor contiene "CONDUCTOR"</td><td data-col-size="md" data-end="2768" data-start="2730">contrato\_conductor\_interprovincial</td></tr><tr data-end="2823" data-start="2769"><td data-col-size="md" data-end="2791" data-start="2769">labor = "VIGILANTE"</td><td data-col-size="md" data-end="2823" data-start="2791">contrato\_full\_time\_vigilante</td></tr><tr data-end="2888" data-start="2824"><td data-col-size="md" data-end="2865" data-start="2824">tipo\_doc PAS o CE, **primer contrato**</td><td data-col-size="md" data-end="2888" data-start="2865">contrato\_extranjero</td></tr><tr data-end="2979" data-start="2889"><td data-col-size="md" data-end="2932" data-start="2889">tipo\_doc PAS o CE, **más de 1 contrato**</td><td data-col-size="md" data-end="2979" data-start="2932">contrato\_extranjero\_mas\_de\_segundo\_contrato</td></tr><tr data-end="3065" data-start="2980"><td data-col-size="md" data-end="3031" data-start="2980">tipo\_contrato = PART TIME, labor=CALL CENTER ATC</td><td data-col-size="md" data-end="3065" data-start="3031">contrato\_call\_center\_part\_time</td></tr><tr data-end="3116" data-start="3066"><td data-col-size="md" data-end="3094" data-start="3066">tipo\_contrato = PART TIME</td><td data-col-size="md" data-end="3116" data-start="3094">contrato\_part\_time</td></tr><tr data-end="3167" data-start="3117"><td data-col-size="md" data-end="3145" data-start="3117">tipo\_contrato = FULL TIME</td><td data-col-size="md" data-end="3167" data-start="3145">contrato\_full\_time</td></tr></tbody></table>

</div></div>El método retorna el PDF con:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-pdf%3A%3Aloadview%28...%29-%3E"><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>`PDF::<span class="hljs-title function_ invoke__">loadView</span>(...)-><span class="hljs-title function_ invoke__">download</span>();`</td></tr></tbody></table>

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

## 📤 Response – Archivo PDF

Retorna directamente la descarga del contrato correspondiente.

Si ocurre algún error, retorna un JSON:

### ✔️ Empleado válido, pero sin contrato

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22valor%22%3A-false%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">"valor"</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">"No cuenta con 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>### ❌ Empleado no encontrado

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22valor%22%3A-false%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">"valor"</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">"No existe empleado"</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-descripci%C3%B3n-em"><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="3906" data-start="3617"><thead data-end="3640" data-start="3617"><tr data-end="3640" data-start="3617"><th data-col-size="sm" data-end="3625" data-start="3617">Error</th><th data-col-size="sm" data-end="3640" data-start="3625">Descripción</th></tr></thead><tbody data-end="3906" data-start="3665"><tr data-end="3719" data-start="3665"><td data-col-size="sm" data-end="3686" data-start="3665">Empleado no existe</td><td data-col-size="sm" data-end="3719" data-start="3686">No se encontró en tabEmployee</td></tr><tr data-end="3790" data-start="3720"><td data-col-size="sm" data-end="3750" data-start="3720">No tiene contratos vigentes</td><td data-col-size="sm" data-end="3790" data-start="3750">No existe Contrato de Trabajo activo</td></tr><tr data-end="3839" data-start="3791"><td data-col-size="sm" data-end="3806" data-start="3791">Error DB ERP</td><td data-col-size="sm" data-end="3839" data-start="3806">Respuesta inesperada en dbErp</td></tr><tr data-end="3906" data-start="3840"><td data-col-size="sm" data-end="3866" data-start="3840">Plantilla no encontrada</td><td data-col-size="sm" data-end="3906" data-start="3866">Error al cargar vista PDF (muy raro)</td></tr></tbody></table>

</div></div>---

## 📚 Tablas y Campos Utilizados

### **Employee (GET)**

Campos usados:

<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>### **Contrato de Trabajo**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22name%22%3A-%22string%22%2C-"><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">"name"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"string"</span><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>  <span class="hljs-attr">"empleado"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"string"</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"labor"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"string"</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"tipo_de_documento"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"string"</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"modalidad_de_trabajo"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"string"</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"tipo_de_contrato"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"string"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>### **Funciones del Contrato (Extranjeros)**

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

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

## 🗃 Lógica en Pseudocódigo

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-employeedata-%3D-get-e"><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>`employeeData = GET Employee where name = employeeif not exists: return errorcontract = GET Contrato where empleado=employee and activoif not exists: return errorfunciones = GET Funciones where parent=contractif doc PAS/CE:    countPrevious = GET Contratos after ingreso real    determinar ordinalseleccionar plantilla PDF según reglasreturn descargar PDF`</td></tr></tbody></table>

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