# Documento de Ingresos (Registrar Equipamiento (1)) - [store_equipament]

## 🧾 Descripción

*Registra o actualiza las tallas de **equipamiento de EPP** (botas, polo, pantalón) para un postulante, validando previamente:*

- Que el documento exista en el sistema.
- Que las tallas enviadas sean válidas según los rangos permitidos.
- Que el postulante exista.
- Que ya tenga o no un registro previo en **Triaje de Postulante 2**, para decidir entre **crear (POST)** o **actualizar (PUT)**.

*Es un servicio que integra:*

- Validaciones locales.
- Consulta de postulantes.
- Inserción o actualización en el ERP vía **ServiceErp()**.

---

# 🚀 Endpoint

**POST** <span style="color: rgb(224, 62, 45);">**`/store-equipament`**</span>

---

# 🔐 Seguridad

Requiere autenticación interna contra el ERP mediante:

- `ServiceErp()`
- `searchPostulanteByDocument()`

No hace validaciones de token en el controlador; se maneja internamente por los métodos usados.

---

# 🧠 Flujo del Servicio (explicación real)

1. **Lee los parámetros enviados en la petición**:
    
    
    - documento
    - botas
    - polo
    - pantalon
2. **Valida la estructura y tallas permitidas**:
    
    <div class="_tableContainer_1rjym_1"><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="1432" data-start="1287"><thead data-end="1319" data-start="1287"><tr data-end="1319" data-start="1287"><th data-col-size="sm" data-end="1298" data-start="1287">Elemento</th><th data-col-size="sm" data-end="1319" data-start="1298">Tallas permitidas</th></tr></thead><tbody data-end="1432" data-start="1359"><tr data-end="1376" data-start="1359"><td data-col-size="sm" data-end="1367" data-start="1359">botas</td><td data-col-size="sm" data-end="1376" data-start="1367">36–45</td></tr><tr data-end="1402" data-start="1380"><td data-col-size="sm" data-end="1387" data-start="1380">polo</td><td data-col-size="sm" data-end="1402" data-start="1387">S, M, L, XL</td></tr><tr data-end="1432" data-start="1406"><td data-col-size="sm" data-end="1417" data-start="1406">pantalón</td><td data-col-size="sm" data-end="1432" data-start="1417">S, M, L, XL</td></tr></tbody></table>
    
    </div></div>
3. **Busca al postulante por documento**:  
    Llama a:
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><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 class="hljs-built_in">searchPostulanteByDocument</span>($documento)`</div></div>Si no existe → retorna error.
4. **Busca si ya existe un registro de triaje activo en el ERP**:
    
    GET  
    `/resource/Triaje de Postulante 2`  
    con filtros:
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><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 class="hljs-attribute">documento</span> = <span class="hljs-variable">$documento</span>docstatus != <span class="hljs-number">2</span>`</div></div>
5. Dependiendo del resultado:
    
    
    - **No existe registro → crea uno (POST)**
    - **Sí existe → actualiza el existente (PUT)**
6. **Realiza el POST o PUT correspondiente** hacia el ERP.
7. **Si ERP devuelve error**, intenta decodificar `_server_messages` para obtener error real del ERP.
8. **Retorna respuesta final** indicando éxito o error.

---

# 📥 Request Body

Ejemplo:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22documento%22%3A-%221234"><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">"documento"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"12345678"</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"botas"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">42</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"polo"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"M"</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"pantalon"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"L"</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

### ✔️ Registro/Actualización exitosa

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22valor%22%3A-true%2C-%22ms"><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">true</span></span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"msn"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Equipamiento registrado con éxito"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div>### ❌ Documento no enviado

<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">"Falta enviar el documento"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div>### ❌ Talla inválida

<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">"Ingrese una talla de botas válida"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div>### ❌ Postulante no encontrado

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

</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div>### ❌ Error del ERP

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22valor%22%3A-false%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">"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">"Ocurrió un error al registrar el triaje del postulante"</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"data"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>    <span class="hljs-string">"PUT"</span><span class="hljs-punctuation">,</span>    <span class="hljs-punctuation">{</span> ...body... <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>    <span class="hljs-string">"URL del recurso usado"</span>  <span class="hljs-punctuation">]</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 del Servicio

<div class="_tableContainer_1rjym_1" id="bkmrk-tipo-ejemplo-documen"><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="3343" data-start="2950"><thead data-end="2968" data-start="2950"><tr data-end="2968" data-start="2950"><th data-col-size="sm" data-end="2957" data-start="2950">Tipo</th><th data-col-size="md" data-end="2968" data-start="2957">Ejemplo</th></tr></thead><tbody data-end="3343" data-start="2988"><tr data-end="3044" data-start="2988"><td data-col-size="sm" data-end="3011" data-start="2988">Documento no enviado</td><td data-col-size="md" data-end="3044" data-start="3011">`"Falta enviar el documento"`</td></tr><tr data-end="3104" data-start="3045"><td data-col-size="sm" data-end="3063" data-start="3045">Talla no válida</td><td data-col-size="md" data-end="3104" data-start="3063">`"Ingrese una talla de botas válida"`</td></tr><tr data-end="3195" data-start="3105"><td data-col-size="sm" data-end="3132" data-start="3105">Postulante no encontrado</td><td data-col-size="md" data-end="3195" data-start="3132">respuesta directa del servicio `searchPostulanteByDocument`</td></tr><tr data-end="3284" data-start="3196"><td data-col-size="sm" data-end="3231" data-start="3196">Error al crear/actualizar en ERP</td><td data-col-size="md" data-end="3284" data-start="3231">Mensaje del `_server_messages` o mensaje genérico</td></tr><tr data-end="3343" data-start="3285"><td data-col-size="sm" data-end="3304" data-start="3285">Error inesperado</td><td data-col-size="md" data-end="3343" data-start="3304">Devuelve el error capturado del ERP</td></tr></tbody></table>

</div></div>---

# 🗃 ERP: Documentos involucrados

### **Triaje de Postulante 2 (GET / POST / PUT)**

Campos usados:

<div class="_tableContainer_1rjym_1" id="bkmrk-campo-tipo-documento"><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="3600" data-start="3453"><thead data-end="3469" data-start="3453"><tr data-end="3469" data-start="3453"><th data-col-size="sm" data-end="3461" data-start="3453">Campo</th><th data-col-size="sm" data-end="3469" data-start="3461">Tipo</th></tr></thead><tbody data-end="3600" data-start="3487"><tr data-end="3509" data-start="3487"><td data-col-size="sm" data-end="3499" data-start="3487">documento</td><td data-col-size="sm" data-end="3509" data-start="3499">string</td></tr><tr data-end="3525" data-start="3510"><td data-col-size="sm" data-end="3518" data-start="3510">botas</td><td data-col-size="sm" data-end="3525" data-start="3518">int</td></tr><tr data-end="3543" data-start="3526"><td data-col-size="sm" data-end="3533" data-start="3526">polo</td><td data-col-size="sm" data-end="3543" data-start="3533">string</td></tr><tr data-end="3565" data-start="3544"><td data-col-size="sm" data-end="3555" data-start="3544">pantalon</td><td data-col-size="sm" data-end="3565" data-start="3555">string</td></tr><tr data-end="3600" data-start="3566"><td data-col-size="sm" data-end="3573" data-start="3566">name</td><td data-col-size="sm" data-end="3600" data-start="3573">string (clave para PUT)</td></tr></tbody></table>

</div></div>---

# 🧩 Lógica en Pseudocódigo

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-read-document%2C-botas"><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>`read document, botas, polo, pantalonvalidate documentvalidate botas in [<span class="hljs-number">36.</span><span class="hljs-number">.45</span>]validate polo in [S,M,L,XL]validate pantalon in [S,M,L,XL]postulante = searchPostulanteByDocument(document)<span class="hljs-keyword">if</span> postulante.invalid:    <span class="hljs-keyword">return</span> <span class="hljs-type">error</span><span class="hljs-variable">triaje</span> <span class="hljs-operator">=</span> GET TriajeDePostulante2 where documento=document and docstatus != <span class="hljs-number">2</span><span class="hljs-keyword">if</span> triaje exists:    method = <span class="hljs-type">PUT</span>    <span class="hljs-variable">url</span> <span class="hljs-operator">=</span> recurso + <span class="hljs-string">"/"</span> + triaje.name<span class="hljs-keyword">else</span>:    method = <span class="hljs-type">POST</span>    <span class="hljs-variable">url</span> <span class="hljs-operator">=</span> <span class="hljs-type">recurso</span><span class="hljs-variable">body</span> <span class="hljs-operator">=</span> {    documento, botas, polo, pantalon}result = CALL ERP with method, body, url<span class="hljs-keyword">if</span> result.error:    <span class="hljs-keyword">return</span> readable ERP error<span class="hljs-keyword">return</span> success`</td></tr></tbody></table>

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