# Respuestas formulario (1) - [missing_questions_form]

### 🧾 Descripción

Este servicio identifica **qué preguntas no han sido completadas** dentro de un formulario del DocType:

**Check List del Supervisor Nacional 2**

El servicio analiza:

- Una **categoría** específica del formulario (Section Break).
- Un documento del Doctype, identificado por **name**.
- Obtiene **todos los campos relevantes** (Check, Data, Attach Image).
- Compara estos campos con los valores del documento
- Devuelve **solo los campos incompletos**, agrupados por categoría.

Se usa principalmente para:

✔ Validar formularios incompletos  
✔ Mostrar al usuario qué preguntas faltan llenar  
✔ Controlar flujos de supervisión/inspecciones

---

# 🚀 Endpoint

**POST** `/missing-questions-form`

---

# 📥 Parámetros del Request

<div class="_tableContainer_1rjym_1" id="bkmrk-campo-tipo-obligator"><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="1386" data-start="1071"><thead data-end="1122" data-start="1071"><tr data-end="1122" data-start="1071"><th data-col-size="sm" data-end="1084" data-start="1071">Campo</th><th data-col-size="sm" data-end="1093" data-start="1084">Tipo</th><th data-col-size="sm" data-end="1107" data-start="1093">Obligatorio</th><th data-col-size="md" data-end="1122" data-start="1107">Descripción</th></tr></thead><tbody data-end="1386" data-start="1175"><tr data-end="1277" data-start="1175"><td data-col-size="sm" data-end="1188" data-start="1175">category</td><td data-col-size="sm" data-end="1197" data-start="1188">string</td><td data-col-size="sm" data-end="1211" data-start="1197">✔ Sí</td><td data-col-size="md" data-end="1277" data-start="1211">Nombre de la sección del formulario (label del Section Break).</td></tr><tr data-end="1386" data-start="1278"><td data-col-size="sm" data-end="1291" data-start="1278">name</td><td data-col-size="sm" data-end="1300" data-start="1291">string</td><td data-col-size="sm" data-end="1314" data-start="1300">✔ Sí</td><td data-col-size="md" data-end="1386" data-start="1314">ID del documento del Doctype "Check List del Supervisor Nacional 2".</td></tr></tbody></table>

</div></div>### Ejemplo de request:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22category%22%3A-%22limpi"><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">"category"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Limpieza y Orden"</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"name"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"CHK-SUP-00015"</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

Utiliza autenticación interna a través de:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%24this-%3Egeneral-%3Eserv"><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-keyword">this</span>->general->ServiceErp()`</div></div>No requiere autenticación externa del usuario final.  
Toda la data se obtiene desde el ERP.

---

# 🧠 Flujo del Servicio (Resumen Técnico)

### 1️⃣ Validaciones iniciales

- Verifica que **category** no esté vacío.
- Verifica que **name** no esté vacío.

Si falta un campo → retorna error inmediato.

---

### 2️⃣ Obtiene estructura del formulario

GET al Doctype: `<span class="hljs-keyword">GET</span> <span class="hljs-operator">/</span>resource<span class="hljs-operator">/</span>DocType<span class="hljs-operator">/</span><span class="hljs-keyword">Check</span> List del Supervisor Nacional <span class="hljs-number">2</span>`

De ahí obtiene:

- Section Breaks
- Campos tipo Check
- Campos tipo Data
- Campos tipo Attach Image

Y construye un arreglo organizado por secciones:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%7B-%22nombre-de-secci%C3%B3n"><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>`{  "Nombre de Sección": {      "fields_name": { fieldname : label },      "data_name":   { fieldname : label },      "img_name":    { fieldname : label }  }}`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>**Se excluyen automáticamente:**

- porcentaje\_de\_imagen\_y\_presentación
- puntaje\_de\_imagen\_y\_presentación

---

### 3️⃣ Filtra solo la categoría solicitada

Busca dentro de todas las secciones y selecciona solo: `questions<span class="hljs-selector-attr">[category]</span>`

Si no existe → retorna vacío.

---

### 4️⃣ Obtiene valores del documento filtrado por name

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-get-%2Fresource%2Fcheck-"><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">`GET /resource/Check List del Supervisor Nacional <span class="hljs-number">2</span>?filters=<span class="hljs-string">[["name","=",<name>]]</span>`</div></div>Aquí obtiene los valores reales del formulario.

---

### 5️⃣ Determina qué preguntas faltan completar

Compara para cada campo: `<span class="hljs-built_in">si</span> campo == <span class="hljs-number">0</span> → está incompleto → se agrega a la lista`

Guarda:

- fieldnames faltantes
- Texto de la pregunta
- Identificación por sección

---

### 6️⃣ Retorna solo las preguntas faltantes

---

# 📤 Response 200 – Ejemplo Real

<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">"Missing Questions"</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-attr">"Limpieza y Orden"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>      <span class="hljs-string">"pregunta_1"</span><span class="hljs-punctuation">,</span>      <span class="hljs-string">"pregunta_3"</span>    <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>    <span class="hljs-attr">"questions"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>      <span class="hljs-string">"¿Los ambientes se encuentran limpios?"</span><span class="hljs-punctuation">,</span>      <span class="hljs-string">"¿El personal cumple con el orden establecido?"</span>    <span class="hljs-punctuation">]</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

### 1️⃣ category vacío

<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">"El campo category es requerido"</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️⃣ name vacío

<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">"El campo name es requerido"</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️⃣ El Doctype no responde

<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">"Ocurrio un error al consular"</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️⃣ Error en consulta de valores del documento

<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">"Ocurrio un error durante el proceso, intente de nuevo."</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

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

# 🗃 Estructuras Usadas

### 📌 DocType: Check List del Supervisor Nacional 2

Campos analizados:

- Section Break
- Check
- Data
- Attach Image

Se ignoran:

- porcentaje\_de\_imagen\_y\_presentación
- puntaje\_de\_imagen\_y\_presentación

---

# 🧩 Algoritmo en Pseudocódigo

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-validar%28category%29-va"><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>`validar(category)validar(name)doctype = GET DocType structurepreguntas = extraer_secciones_y_campos(doctype)selectedCategory = preguntas[category]campos = obtener_fieldnames(selectedCategory)valores = GET Documento ERP con esos camposmissing = []para cada campo en selectedCategory:    si valor == 0:        agregar a missingreturn missing`</td></tr></tbody></table>

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