# Formularios y firma digital Cómo se definen los formularios, cómo se envían y cómo se firman. Es transversal: lo usan el turnero, los domicilios y los envíos sueltos. ## Definición Un formulario es una fila en `lab_formularios`. Su estructura está en la columna `esquema`, un JSON con la lista de campos: ```json [ {"id": "_sep1", "tipo": "separador", "label": "Datos del paciente"}, {"id": "_nom", "tipo": "linked", "linked_key": "nombre_completo", "label": "Nombre"}, {"id": "_sint", "tipo": "checkbox", "label": "Síntomas", "options": ["Fiebre", "Tos"]}, {"id": "_fir", "tipo": "firma_profesional", "label": "Firma del profesional"} ] ``` ### Tipos de campo | Tipo | Qué es | |---|---| | `separador` | Encabezado de sección; admite `condicion` | | `parrafo` | Texto fijo (consentimientos, notas legales) | | `texto`, `textarea`, `numero` | Entrada libre | | `fecha`, `fecha_hoy`, `hora` | Fechas y horas | | `radio`, `checkbox`, `select` | Opciones | | `linked` | Se autocompleta con un dato del paciente vía `linked_key` | | `firma` | Firma del paciente | | `firma_profesional` | Firma del profesional | ### Secciones condicionales Un separador puede depender de otro campo: ```json {"id": "_sep_ins", "tipo": "separador", "label": "Insulina · Minuto 0", "condicion": {"campo_id": "_examen", "valores": ["Insulina"]}} ``` La sección y **todos sus campos** se ocultan si la condición no se cumple. Los campos heredan el estado mediante el atributo `data-sep-id`. ## Las dos vías de envío Un mismo formulario se firma por dos caminos, con tablas y tokens distintos: | Vía | Tabla | Token | Respuestas | |---|---|---|---| | Turnero | `turnero_consentimientos` | UUID → `?token=` | `datos_respuestas` | | Domicilios y envíos | `lab_form_envios` | 64 hex → `?t=` | `datos_cliente` | Las dos las muestra `ver_formulario_enviado.php`, que distingue **por el formato del token**. De ahí que existan dos parámetros para lo que parece lo mismo. `form_cliente.php` detecta tokens con formato UUID y redirige a `ver_formulario_enviado.php` — necesario porque la plantilla de WhatsApp aprobada en Meta apunta a la primera página. ## Parámetros del visor | Parámetro | Efecto | |---|---| | `token` | Consentimiento del turnero (UUID) | | `t` | Envío de formulario (64 hex) | | `id` | Acceso interno con sesión | | `embed=1` | Modo embebido; **activa el filtrado de secciones** | | `compact=1` | Grilla de campos y tarjetas de toma | | `zoom` | Escala | | `autoprint=1` | Abre el diálogo de impresión | > `embed=1` no es cosmético: sin él no se aplica el filtrado de secciones de tomas prolongadas y el documento muestra secciones que no corresponden. Bandeja e historial lo pasan siempre. ## Firma ### Del paciente Se dibuja en un canvas y se guarda como imagen en `datos_cliente['_svg']`. También se admite pad biométrico Topaz. ### Del profesional Se dibuja igual, pero además queda **quién firmó**. Hay tres endpoints según el contexto: | Endpoint | Contexto | |---|---| | `modules/turnero/api/guardar_toma.php` | Tomas prolongadas — una firma por toma | | `modules/turnero/api/firmar_profesional_consentimiento.php` | Consentimientos del turnero | | `api/lab/firmar_profesional.php` | Envíos de formularios | La identidad se guarda como `_pro_nombre` y `_pro_cedula`; en tomas prolongadas, además por campo (`_tm30_f_pro_nombre`), porque cada toma puede firmarla alguien distinto. De dónde sale la identidad: ``` admin_users.cedula → personal en general lab_enfermeras.numero_documento → enfermeros (vía admin_users.enfermera_id) ``` > Al mostrar un documento firmado **no se usa un valor por defecto**: si no quedó guardado quién firmó, se muestra vacío. Antes se caía al usuario de la sesión actual, lo que atribuía la firma a quien simplemente estaba mirando el documento. ## Precarga desde una visita anterior `modules/turnero/api/get_formulario_anterior.php` devuelve las respuestas del último formulario firmado del mismo paciente, para no reescribir la historia clínica en cada visita. Excluye deliberadamente firmas e identidad del profesional anterior: cada visita se firma de nuevo, con la fecha de hoy y quien atienda. ## Diseñador `lab_formulario_builder.php` permite armar el esquema desde la interfaz, sin escribir JSON a mano.