diff --git a/DATA_MODEL.md b/DATA_MODEL.md index 002fbaa..1b7d7c0 100644 --- a/DATA_MODEL.md +++ b/DATA_MODEL.md @@ -106,9 +106,20 @@ id uuid pk response_id uuid fk -> responses(id) question_id uuid fk -> questions(id) value jsonb not null -- texto: "x" | matriz: {"rows":{...}} | ranking: [3,1,2] | etc. +instance_id text not null default 'default' + -- 'default' → preguntas normales (la gran mayoría) + -- 'familiar_1', 'familiar_2', ... → instancias del mini-wizard de vínculos (4A, Sprint 4) +UNIQUE (response_id, question_id, instance_id) -- constraint: answers_response_question_instance_key ``` > El texto libre (`text_long`) **no** se expone al store analítico crudo: la capa de reportes lee > categorías derivadas, no `value` crudo de preguntas abiertas (regla no negociable #4). +> +> **Patrón `instance_id` (v3.0.0):** la pregunta 4.1 ("¿Tenés familiar con discapacidad/adulto +> mayor a cargo?") dispara el mini-wizard. Por cada familiar declarado se genera un conjunto de +> respuestas para las preguntas 4.2, 4.3, etc., cada una con su propio `instance_id`. Las RPCs +> de dashboard que agregan datos de vínculo operan sobre filas donde `instance_id != 'default'`. +> Las RPCs existentes de v2 no se modifican: siguen usando `instance_id = 'default'` implícitamente +> (las preguntas de vínculo no estaban en el instrumento v2). ### `consent_versions` — textos de consentimiento versionados ```sql diff --git a/supabase/migrations/20260620000001_add_instance_id.sql b/supabase/migrations/20260620000001_add_instance_id.sql new file mode 100644 index 0000000..89d0a41 --- /dev/null +++ b/supabase/migrations/20260620000001_add_instance_id.sql @@ -0,0 +1,22 @@ +-- Sprint 4 (v3.0.0) — instance_id para respuestas multi-instancia +-- Habilita el mini-wizard de vínculos familiares (una respuesta por familiar) +-- Nombre original de constraint verificado: answers_response_id_question_id_key +-- (inline UNIQUE en CREATE TABLE, migración 20260531000001_create_tables.sql, sin renombrado posterior) + +-- 1. Agregar la columna con default para filas existentes +ALTER TABLE public.answers + ADD COLUMN IF NOT EXISTS instance_id text NOT NULL DEFAULT 'default'; + +-- 2. Eliminar la constraint única vieja +ALTER TABLE public.answers + DROP CONSTRAINT IF EXISTS answers_response_id_question_id_key; + +-- 3. Crear la nueva constraint que incluye instance_id +ALTER TABLE public.answers + ADD CONSTRAINT answers_response_question_instance_key + UNIQUE (response_id, question_id, instance_id); + +-- 4. Índice para consultas por instancia (análisis de vínculos) +CREATE INDEX IF NOT EXISTS idx_answers_instance + ON public.answers (question_id, instance_id) + WHERE instance_id != 'default';