Files
motor-de-encuestas/supabase/migrations/20260620000002_form_schema_v3.sql
markosbenitez 7e4991f960 feat(schema): esquema declarativo + seed v3 del formulario [4B]
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>
2026-06-22 17:21:11 -03:00

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" }