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>
This commit is contained in:
47
supabase/migrations/20260620000002_form_schema_v3.sql
Normal file
47
supabase/migrations/20260620000002_form_schema_v3.sql
Normal file
@@ -0,0 +1,47 @@
|
||||
-- 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" }
|
||||
2400
supabase/seed.sql
2400
supabase/seed.sql
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user