Extiende questions con instance_generator/instance_of/hint y documenta los operadores contains/eq_sole en conditional_rules (ADR-005). Reescribe seed.sql con el instrumento v3.0.0 completo: 10 secciones, 40 preguntas (2 consentimiento + 38), contenido 100% desde Formulario_Mapeo_Corregido.xlsx (versión autoritativa). Flujo declarativo en datos, no en presentación: 3.1='No' oculta 3.2-3.5; "Ninguna" en 4.1 salta a S10; "solo niño sin discapacidad" deja visibles 5.3, 8.4, 9.1, 9.4 y oculta el resto (decisión confirmada sobre el Excel corregido). SEED_SPEC.md reescrito como contrato v3.0.0. No ejecutado en producción — solo archivos de migración y seed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
48 lines
2.5 KiB
SQL
48 lines
2.5 KiB
SQL
-- Sprint 4 (v3.0.0) — Esquema declarativo del formulario wizard
|
|
-- Extiende questions con tres campos para soporte de instanciación y secciones.
|
|
-- Ver ADR-005: la lógica del flujo vive en datos, el frontend es un renderer.
|
|
|
|
-- 1. instance_generator: marca la pregunta que genera instancias del mini-wizard.
|
|
-- true en pregunta 4.1 (vínculos familiares); false en todas las demás.
|
|
ALTER TABLE public.questions
|
|
ADD COLUMN IF NOT EXISTS instance_generator boolean NOT NULL DEFAULT false;
|
|
|
|
-- 2. instance_of: código de la pregunta generadora de la que depende esta pregunta.
|
|
-- '4.1' en preguntas 4.2 y 4.3 (se repiten una vez por familiar declarado en 4.1).
|
|
-- NULL en todas las preguntas que no forman parte del mini-wizard.
|
|
ALTER TABLE public.questions
|
|
ADD COLUMN IF NOT EXISTS instance_of text;
|
|
|
|
-- 3. hint: texto auxiliar que el renderer muestra bajo el enunciado.
|
|
-- Para type='section': descripción del "porqué" de la sección (ADR-005 §4.2, Opción C).
|
|
-- Para preguntas regulares: hint de ayuda ("Podés marcar más de una opción", etc.).
|
|
-- NULL cuando no aplica.
|
|
ALTER TABLE public.questions
|
|
ADD COLUMN IF NOT EXISTS hint text;
|
|
|
|
-- ── Vocabulario extendido de conditional_rules (referencia para el motor de flujo) ──
|
|
--
|
|
-- Formato de cada regla:
|
|
-- { "if_question": CODE | CODE[], "op": OPERATOR, "value": VALUE, "action": ACTION }
|
|
--
|
|
-- Operadores:
|
|
-- "eq" — igualdad simple: la respuesta a if_question == value
|
|
-- "eq_any" — OR lógico: AL MENOS UNO de los if_question[] == value
|
|
-- "not_in" — la respuesta a if_question NO está en value (array de strings)
|
|
-- "contains" — la respuesta (multiple_choice) CONTIENE value como uno de los
|
|
-- elementos seleccionados; útil para detectar "Ninguna de las anteriores"
|
|
-- "eq_sole" — la respuesta (multiple_choice) tiene VALUE como ÚNICO elemento
|
|
-- seleccionado; usado para el recorrido "solo niño sin discapacidad"
|
|
--
|
|
-- Acciones:
|
|
-- "show" — mostrar esta pregunta/sección cuando la condición se cumple
|
|
-- "hide" — ocultar esta pregunta/sección cuando la condición se cumple
|
|
--
|
|
-- Semántica de auto-target: la regla afecta a la pregunta/sección que la porta.
|
|
-- Sin campo "target": una pregunta declara su propia condición de visibilidad.
|
|
--
|
|
-- Ejemplo — salto "Ninguna de las anteriores" en 4.1 oculta secciones S5-S7:
|
|
-- { "if_question": "4.1", "op": "not_in",
|
|
-- "value": ["Discapacidad propia", "Familiar con discapacidad", "Adulto mayor"],
|
|
-- "action": "hide" }
|