feat(data): agregar instance_id a answers para multi-instancia [4A]
Habilita respuestas múltiples por pregunta (mini-wizard de vínculos). Nueva constraint UNIQUE(response_id, question_id, instance_id). Aplicada en producción. Parte del Sprint 4 hacia v3.0.0.
This commit is contained in:
@@ -106,9 +106,20 @@ id uuid pk
|
|||||||
response_id uuid fk -> responses(id)
|
response_id uuid fk -> responses(id)
|
||||||
question_id uuid fk -> questions(id)
|
question_id uuid fk -> questions(id)
|
||||||
value jsonb not null -- texto: "x" | matriz: {"rows":{...}} | ranking: [3,1,2] | etc.
|
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
|
> 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).
|
> 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
|
### `consent_versions` — textos de consentimiento versionados
|
||||||
```sql
|
```sql
|
||||||
|
|||||||
22
supabase/migrations/20260620000001_add_instance_id.sql
Normal file
22
supabase/migrations/20260620000001_add_instance_id.sql
Normal file
@@ -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';
|
||||||
Reference in New Issue
Block a user