feat(schema): esquema declarativo + seed v3 del formulario [4B]

Extiende questions con instance_generator/instance_of/hint.
Instrumento v3 completo (10 secciones, 50 preguntas) como datos declarativos.
Operadores de flujo para multiple_choice: contains, eq_sole.
Flujo del formulario en el esquema, no en presentación (ADR-005).
Seed solo reemplaza catálogo; no toca evidencia de consentimiento (ADR-003).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
markosbenitez
2026-06-22 21:03:01 -03:00
parent 7e4991f960
commit aa893368cd

View File

@@ -12,7 +12,10 @@
--
-- ⚠ SOLO ENTORNOS DE DESARROLLO — nunca ejecutar en producción.
-- En producción: aplicar migraciones manualmente vía CLI del VPS.
-- El seed elimina respuestas y preguntas previas de las 3 encuestas.
-- El seed SOLO reemplaza catálogo (questions de las 3 encuestas vía
-- DELETE+INSERT). NUNCA toca answers/consent_records/responses — son
-- evidencia permanente (ADR-003); el trigger de inmutabilidad lo
-- impide y no se debe forzar. Reset de datos de prueba: TRUNCATE aparte.
--
-- Flujo declarativo (ADR-005 — lógica en datos, renderer es puro):
-- 3.1 = 'No' → oculta 3.23.5 (discapacidad propia no aplica)
@@ -255,20 +258,9 @@ BEGIN
FOREACH sid IN ARRAY survey_ids LOOP
-- ════════════════════════════════════════════════════════════
-- Limpiar datos previos en orden de dependencia FK (solo en dev).
-- consent_records es padre de responses (responses.consent_record_id → consent_records.id),
-- así que se borran los responses primero y se capturan sus consent_record_id para
-- eliminar esos registros recién después (huérfanos), nunca antes.
DELETE FROM public.answers
WHERE response_id IN (SELECT id FROM public.responses WHERE survey_id = sid);
WITH del_responses AS (
DELETE FROM public.responses WHERE survey_id = sid
RETURNING consent_record_id
)
DELETE FROM public.consent_records
WHERE id IN (SELECT consent_record_id FROM del_responses);
-- Catálogo: DELETE + INSERT para idempotencia (patrón original del seed v2.1).
-- Nunca toca answers/consent_records/responses — son evidencia permanente (ADR-003).
-- El reset de datos de prueba se hace por separado vía TRUNCATE, fuera de este seed.
DELETE FROM public.questions WHERE survey_id = sid;
-- ════════════════════════════════════════════════════════