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