diff --git a/SEED_SPEC.md b/SEED_SPEC.md index 4084040..94a4adf 100644 --- a/SEED_SPEC.md +++ b/SEED_SPEC.md @@ -1,105 +1,119 @@ -# SEED_SPEC.md — Contrato del instrumento "Mapeo de cuidadores" +# SEED_SPEC.md — Contrato del instrumento "Mapeo de Cuidadores" v2 -> Inventario completo y autoritativo de la encuesta, extraído del mockup real -> (`formulario_mapeo.html`). Reemplaza el seed inventado de la Etapa 1 (que tenía 9 de 34 preguntas y -> el supuesto incorrecto C1→G4). Claude Code reescribe `seed.sql` a partir de ESTE contrato. +> Versión 2 — incorpora revisión de la colega (Jun 2026). Reemplaza la v1 (34 preguntas). +> 44 preguntas · 8 secciones · Códigos únicos corregidos. +> Claude Code reescribe `seed.sql` a partir de ESTE contrato. -## Convenciones (decisiones cerradas) -- **Mapeo de tipos al esquema:** radio→`single_choice`, checkbox→`multiple_choice`, escala 1-5→ - `rating`, textarea→`text_long`. -- **`conditional_rules` viven en la pregunta DEPENDIENTE** (cada pregunta condicional declara su - propia condición de visibilidad: `{if_question, op:'eq', value, action:'show'}`). El motor, al - decidir si renderiza X, mira las reglas de X. (Resuelve la ambigüedad que el agente había dejado.) -- **B1/C1/D1 son `single_choice` de 3 opciones** (Sí / No / Prefiero no decir), **NO `yes_no`**. - Solo el valor **"Sí"** dispara el bloque condicional; "No" y "Prefiero no decir" lo ocultan. -- **`is_sensitive = true`** en toda pregunta que elicita salud/discapacidad/diagnóstico (marcadas - abajo). La encuesta entera es `data_sensitivity = 'sensible'`. +## Convenciones +- Tipos: radio→`single_choice`, checkbox→`multiple_choice`, escala 1-5→`rating`, + texto libre largo→`text_long`, texto corto→`text_short`. +- **`conditional_rules` en la pregunta DEPENDIENTE** (cada pregunta declara su propia condición). +- Los 3 triggers (1.1, 1.6, 1.13) son `single_choice` de 3 opciones; solo **"Sí"** dispara el bloque. +- `is_sensitive=true` en preguntas de salud/discapacidad/diagnóstico (marcadas ✅). +- `3.4` (salary) — `is_sensitive=true` + analyst-only (ADR-001 addendum): nunca en vistas org_admin. +- RE-INDEX: las preguntas marcadas son candidatas a índice compuesto (metodología TBD Sprint 3). -## Estructura condicional (3 bloques, el resto siempre visible) -- **cond-B** — visible si `B1 = 'Sí'` → contiene B2, B3, B4, B5 -- **cond-C** — visible si `C1 = 'Sí'` → contiene C2, C3, C4, C5 -- **cond-D** — visible si `D1 = 'Sí'` → contiene D2, D3, D4, D5 -- Secciones A (datos generales), E (rol cuidador), F (económico), G (bienestar), H (necesidades): - **top-level, siempre visibles.** +## Estructura condicional (3 bloques) +- **cond-disc-propia** — 1.1='Sí' → muestra 1.2, 1.3, 1.4, 1.5 +- **cond-familiar** — 1.6='Sí' → muestra 1.7, 1.8, 1.9, 1.10, 1.11, 1.12 +- **cond-adulto-mayor** — 1.13='Sí' → muestra 1.14, 1.15, 1.16 +- Secciones A, 2, 3, 4, 5, 6, cierre: **top-level, siempre visibles.** --- -## Sección 0 — Datos Generales (top-level, cuasi-identificadores) -| Code | Tipo | Pregunta | Opciones | -|---|---|---|---| -| A1 | single_choice | ¿En qué área o gerencia trabajás? | Operaciones/Producción · Comercial/Ventas · Administración/Finanzas · RRHH/Cultura · Tecnología/Sistemas · Logística/Distribución · Otra área | -| A2 | single_choice | ¿Cuántos años tenés? | Menos de 25 · 25-34 · 35-44 · 45-54 · 55+ · Prefiero no decir | -| A3 | single_choice | ¿Con qué género te identificás? | Femenino · Masculino · No binario/Otro · Prefiero no decir | -| A4 | single_choice | ¿Cuál es tu modalidad de trabajo actual? | Presencial · Remoto · Híbrido | +## Sección A — Datos Generales (top-level) +| Code | Tipo | Pregunta | Opciones | Notas | +|---|---|---|---|---| +| A1 | text_short | País* | — (texto libre) | qi_country (futuro) | +| A2 | text_short | Ciudad* | — (texto libre) | qi_city (futuro) | +| A3 | text_short | Sucursal o sede | — (texto libre) | opcional | +| A4 | single_choice | ¿En qué área o gerencia trabajás?* | Operaciones/Producción · Comercial/Ventas · Administración/Finanzas · Recursos Humanos/Cultura · Tecnología/Sistemas · Logística/Distribución · Otra área | qi_sector | +| A5 | single_choice | ¿Cuántos años tenés? | Menos de 25 años · 25 a 34 años · 35 a 44 años · 45 a 54 años · 55 años o más · Prefiero no decir | qi_age_bucket | +| A6 | single_choice | ¿Con qué género te identificás? | Femenino · Masculino · No binario/Otro · Prefiero no decir | | +| A7 | single_choice | ¿Cuál es tu modalidad de trabajo actual? | Presencial · Remoto (home office) · Híbrido | | -## Sección 1 — ¿Vivís con discapacidad? *(sensible)* +## Sección 1 — Prevalencia: cuidado y discapacidad *(sensible)* | Code | Tipo | Cond. | Pregunta | Opciones | is_sensitive | |---|---|---|---|---|---| -| B1 | single_choice | trigger | ¿Vos mismo/a tenés alguna discapacidad o condición de salud…? | Sí · No · Prefiero no decir | ✅ | -| B2 | multiple_choice | B1=Sí | ¿Qué tipo de discapacidad tenés? (más de una) | Física/motriz · Visual · Auditiva · Intelectual · TEA · Psicosocial · Condición crónica · Otra | ✅ | -| B3 | single_choice | B1=Sí | ¿Contás con certificado oficial de discapacidad? | Sí · En trámite · No | ✅ | -| B4 | single_choice | B1=Sí | ¿Tu discapacidad afecta tu desempeño o comodidad en el trabajo? | Sí, significativamente · Sí, aspectos puntuales · No, bien gestionada · Prefiero no decir | ✅ | -| B5 | single_choice | B1=Sí | ¿La empresa conoce tu situación? | Sí, con apoyo · Sí, sin apoyo · No, privado | ✅ | +| 1.1 | single_choice | trigger | ¿Vos mismo/a vivís con alguna discapacidad o condición de salud que afecte tu funcionamiento cotidiano?* | Sí · No · Prefiero no decir | ✅ | +| 1.2 | multiple_choice | 1.1=Sí | ¿Qué tipo de discapacidad o condición tenés? | Discapacidad física/motriz · Visual · Auditiva · Intelectual · TEA · Psicosocial/salud mental · Condición crónica que genera limitaciones · Otra | ✅ | +| 1.3 | multiple_choice | 1.1=Sí | ¿Usás algún elemento de apoyo para la movilidad o autonomía? | Silla de ruedas · Bastón · Andador · Muletas · Prótesis · No utilizo | ✅ | +| 1.4 | single_choice | 1.1=Sí | ¿Contás con certificado oficial de discapacidad? | Sí · No, pero estoy en trámite · No | ✅ | +| 1.5 | single_choice | 1.1=Sí | ¿Tu condición afecta tu desempeño o comodidad en el trabajo? | Sí, de forma significativa · Sí, pero en aspectos puntuales · No, está bien gestionada · Prefiero no decir | ✅ | +| 1.6 | single_choice | trigger | ¿Tenés algún familiar cercano (hijo/a, pareja, hermano/a, padre/madre) que viva con discapacidad?* | Sí · No · Prefiero no decir | ✅ | +| 1.7 | multiple_choice | 1.6=Sí | ¿Cuál es tu vínculo con esa persona? | Hijo/a · Cónyuge/pareja · Padre o madre · Hermano/a · Otro familiar | ✅ | +| 1.8 | multiple_choice | 1.6=Sí | ¿Qué tipo de discapacidad tiene? | Física/motriz · Visual · Auditiva · Intelectual · TEA · Psicosocial/salud mental · Condición crónica severa · Otra | ✅ | +| 1.9 | multiple_choice | 1.6=Sí | ¿Qué tipo de apoyo o acompañamiento necesita principalmente? | Movilidad física · Comunicación · Apoyo escolar/educativo · Inclusión laboral · Terapias/rehabilitación · Apoyo emocional/psicosocial | ✅ | +| 1.10 | multiple_choice | 1.6=Sí | ¿Usa algún elemento de apoyo para la movilidad o autonomía? | Silla de ruedas · Bastón · Andador · Muletas · Prótesis · No utiliza | ✅ | +| 1.11 | single_choice | 1.6=Sí | Si es niño/a o adolescente en edad escolar: ¿está escolarizado/a y enfrenta barreras de aprendizaje? | Escolarizado/a, sin barreras importantes · Escolarizado/a, enfrenta barreras o faltan ajustes · No está escolarizado/a · No aplica | ✅ | +| 1.12 | single_choice | 1.6=Sí | ¿La persona con discapacidad se encuentra trabajando actualmente? | Sí, está trabajando · No, y está buscando empleo · No, y no está buscando · No aplica | ✅ | +| 1.13 | single_choice | trigger | ¿Tenés algún adulto mayor (60+ años) a tu cuidado o bajo tu responsabilidad?* | Sí · No · Prefiero no decir | | +| 1.14 | single_choice | 1.13=Sí | ¿Qué nivel de dependencia tiene? (la más representativa) | Independiente, pero necesita supervisión · Dependencia leve · Dependencia moderada · Dependencia severa | ✅ | +| 1.15 | multiple_choice | 1.13=Sí | ¿Tiene una condición de salud que genere mayor necesidad de cuidado? | Demencia/Alzheimer · ACV/Parálisis · Enfermedad crónica grave · Movilidad reducida · Deterioro cognitivo · Sin condición específica | ✅ | +| 1.16 | single_choice | 1.13=Sí | ¿Vive con vos o en otra vivienda? | Vive en mi hogar · Vive en otra vivienda · Está en residencia/institución | | -## Sección 2 — Familiares con Discapacidad *(sensible)* -| Code | Tipo | Cond. | Pregunta | Opciones | is_sensitive | -|---|---|---|---|---|---| -| C1 | single_choice | trigger | ¿Tenés algún familiar cercano que viva con discapacidad? | Sí · No · Prefiero no decir | ✅ | -| C2 | multiple_choice | C1=Sí | ¿Cuál es el vínculo? (más de una) | Hijo/a · Cónyuge/pareja · Padre/madre · Hermano/a · Otro familiar | ✅ | -| C3 | multiple_choice | C1=Sí | ¿Qué tipo de discapacidad tiene? (más de una) | Física/motriz · Visual · Auditiva · Intelectual · TEA · Psicosocial · Condición crónica | ✅ | -| C4 | single_choice | C1=Sí | ¿Esta persona requiere apoyo o cuidado cotidiano? | Alta dependencia · Apoyo parcial · Autónomo/a | ✅ | -| C5 | single_choice | C1=Sí | ¿Quién es el responsable principal del cuidado? | Yo principal · Compartido · Cuidador pagado · Institución | | - -## Sección 3 — Adultos Mayores a Cargo *(sensible)* -| Code | Tipo | Cond. | Pregunta | Opciones | is_sensitive | -|---|---|---|---|---|---| -| D1 | single_choice | trigger | ¿Tenés algún adulto mayor (60+) a tu cuidado? | Sí · No · Prefiero no decir | | -| D2 | single_choice | D1=Sí | ¿Cuántos adultos mayores están bajo tu cuidado? | 1 · 2 · 3+ | | -| D3 | single_choice | D1=Sí | ¿Qué nivel de dependencia tiene/n? | Supervisión · Dependencia leve · Dependencia moderada · Dependencia severa | ✅ | -| D4 | multiple_choice | D1=Sí | ¿Tiene condición diagnosticada? (más de una) | Demencia/Alzheimer · ACV/Parálisis · Enf. crónica · Movilidad reducida · Deterioro cognitivo · Ninguna específica | ✅ | -| D5 | single_choice | D1=Sí | ¿La persona vive con vos o en otra vivienda? | Vive conmigo · Otra vivienda · Institución | | - -## Sección 4 — Tu Rol como Cuidador/a (top-level) +## Sección 2 — Intensidad y rol del cuidado (top-level) | Code | Tipo | Pregunta | Opciones | |---|---|---|---| -| E1 | single_choice | ¿Cuántas horas por día dedicás, en promedio, al cuidado directo? | Menos de 1h · 1-3h · 3-6h · Más de 6h · Variable | -| E2 | multiple_choice | ¿En qué momentos realizás principalmente el cuidado? (más de una) | Antes del trabajo · Durante horario laboral · Al llegar · Durante la noche · Fines de semana · Continuo | -| E3 | single_choice | ¿Contás con apoyo de otras personas para el cuidado? | Apoyo familiar suficiente · Apoyo insuficiente · Único responsable · Apoyo contratado | -| E4 | single_choice | ¿Tuviste que faltar al trabajo por el cuidado en el último año? | Nunca · Pocas veces (1-3) · Varias veces (4-10) · Con frecuencia (10+) | +| 2.1 | single_choice | ¿Quién es el/la responsable principal del cuidado? | Yo soy el/la principal · Comparto con otro familiar · Hay cuidador/a pagado/a · Está en institución/centro de día | +| 2.2 | single_choice | ¿Cuántas horas por día dedicás, en promedio, al cuidado directo? | Menos de 1h · Entre 1 y 3h · Entre 3 y 6h · Más de 6h · Varía mucho | +| 2.3 | multiple_choice | ¿En qué momentos del día cuidás principalmente? | Antes del trabajo · Durante horario laboral (llamadas/emergencias) · Al llegar del trabajo · Durante la noche · Los fines de semana · Es continuo sin horario fijo | +| 2.4 | single_choice | ¿Contás con apoyo de otras personas para el cuidado? | Sí, apoyo familiar suficiente · Algo de apoyo, no suficiente · No, soy el/la único/a responsable · Tengo apoyo contratado | +| 2.5 | single_choice | Como cuidador/a primario, ¿presentás signos de agotamiento o estrés crónico? | Sí, frecuentemente · A veces · No, lo llevo bien · Prefiero no decir | -## Sección 5 — Impacto Económico (top-level) +## Sección 3 — Impacto económico del cuidado (top-level) +| Code | Tipo | Pregunta | Opciones | Notas | +|---|---|---|---|---| +| 3.1 | single_choice | ¿Cuánto estimás que gastás por mes en el cuidado? | Sin gastos significativos · Menos de Gs. 500.000 · Gs. 500.000–1.500.000 · Gs. 1.500.000–3.000.000 · Gs. 3.000.000–6.000.000 · Más de Gs. 6.000.000 · Prefiero no decir | | +| 3.2 | multiple_choice | ¿Qué servicios o apoyos utilizás actualmente? | Terapias especializadas · Cuidador/a particular · Centro de día/institución · Transporte adaptado · Medicación alto costo · Equipamiento médico/tecnología asistiva · No utilizo servicios formales | | +| 3.3 | multiple_choice | ¿Cómo sostenés los gastos y responsabilidades del cuidado? | Con mi empleo de tiempo completo · Con mi empleo de tiempo parcial · Con trabajo independiente/emprendimiento · Me ayudan mis familiares · Es difícil sostenerlo con mis ingresos | | +| 3.4 | single_choice | ¿En qué franja salarial mensual te ubicás? *(CONFIDENCIAL — analyst-only)* | Sueldo mínimo – Gs. 5.000.000 · Gs. 5.000.001–8.000.000 · Gs. 8.000.001–12.000.000 · Gs. 12.000.001–15.000.000 · Gs. 15.000.001–18.000.000 · Gs. 18.000.001–25.000.000 · Gs. 25.000.001–50.000.000 · Gs. 50.000.001 o más · Prefiero no decir | is_sensitive=true; never in org_admin views | +| 3.5 | rating | ¿Los gastos de cuidado impactan en tu situación económica personal? | 1=Sin impacto · 2=Leve · 3=Moderado · 4=Alto · 5=Muy alto | RE-INDEX | + +## Sección 4 — Tiempo y descanso (top-level) | Code | Tipo | Pregunta | Opciones | |---|---|---|---| -| F1 | single_choice | ¿Cuánto estimás que gastás mensualmente en el cuidado? | Sin gastos significativos · Menos de 500k · 500k-1.5M · 1.5M-3M · 3M-6M · Más de 6M · Prefiero no decir | -| F2 | multiple_choice | ¿Qué servicios o apoyos utilizás actualmente? (más de una) | Terapias especializadas · Cuidador particular · Centro de día · Transporte adaptado · Medicación alto costo · Tecnología asistiva · Apoyo ONG · Sin servicios formales | -| F3 | rating | ¿Los gastos de cuidado impactan en tu situación económica personal? | Escala 1 (Sin impacto) → 5 (Muy alto) | +| 4.1 | single_choice | ¿Cómo describirías tu nivel de descanso habitual? | Descanso bien, me siento recuperado/a · Descanso de forma irregular, pero lo manejo · Me cuesta descansar, me siento cansado/a con frecuencia · Descanso muy poco, el agotamiento afecta mi día a día | RE-INDEX | +| 4.2 | multiple_choice | ¿Qué aspectos de tu vida se ven más afectados por tu rol de cuidador/a? | Tiempo libre y ocio · Sueño y descanso · Vida social y amistades · Vida en pareja/familiar · Salud física personal · Salud emocional/mental · Desarrollo profesional · Situación económica | | +| 4.3 | rating | En una escala del 1 al 5, ¿cómo evaluás tu bienestar general en este momento? | 1=Muy mal · 2=Mal · 3=Regular · 4=Bien · 5=Muy bien | RE-INDEX | -## Sección 6 — Bienestar y Descanso (top-level) +## Sección 5 — Impacto en el trabajo (top-level) | Code | Tipo | Pregunta | Opciones | |---|---|---|---| -| G1 | single_choice | ¿Cómo describirías tu nivel de descanso habitual? | Descanso bien · Descanso irregular · Me cuesta descansar · Muy poco descanso | -| G2 | single_choice | En los últimos 3 meses, ¿con qué frecuencia el cuidado afectó tu concentración o rendimiento laboral? | Nunca/casi nunca · Algunas veces al mes · Varias veces por semana · Casi todos los días | -| G3 | multiple_choice | ¿Qué aspectos de tu vida se ven más afectados? (más de una) | Tiempo libre · Sueño y descanso · Vida social · Vida en pareja/familia · Salud física · Salud emocional · Desarrollo profesional · Situación económica | -| G4 | rating | ¿Cómo evaluás tu bienestar general en este momento? | Escala 1 (Muy mal) → 5 (Muy bien) | -| G5 | single_choice | ¿Sentís que tu empresa comprende la realidad de ser cuidador/a? | Sí, acompañado/a · Parcialmente · No, invisible · Nunca lo supo | +| 5.1 | single_choice | En los últimos 3 meses, ¿con qué frecuencia sentiste que el cuidado afectó tu concentración o rendimiento? | Nunca o casi nunca · Algunas veces al mes · Varias veces por semana · Casi todos los días | RE-INDEX | +| 5.2 | single_choice | En el último año, ¿faltaste al trabajo por situaciones relacionadas al cuidado? | Nunca · Pocas veces (1–3 veces al año) · Varias veces (4–10 veces al año) · Con frecuencia (más de 10 veces al año) | | -## Sección 7 — Necesidades (top-level) -| Code | Tipo | Pregunta | Opciones / nota | +## Sección 6 — Conciencia organizacional (top-level) +| Code | Tipo | Pregunta | Opciones | Notas | +|---|---|---|---|---| +| 6.1 | single_choice | ¿Sentís que tu empresa conoce o comprende la realidad del cuidado y la discapacidad de su gente?* | Sí, me siento acompañado/a · Parcialmente, hay cierta comprensión · No, es algo bastante invisible · No, nunca se ha hablado del tema | RE-INDEX | +| 6.2 | multiple_choice (**max_select=3**) | ¿Qué apoyos de la empresa te ayudarían más? Elegí hasta 3 | Flexibilidad horaria o trabajo remoto · Apoyo económico o convenios/descuentos · Acceso a terapias o salud · Contención/apoyo emocional o psicológico · Capacitación y autocuidado · Redes de apoyo/grupos de pares · Información sobre recursos y servicios disponibles | ⚠️ Ranking → multiple_choice para v1. Ranking widget al backlog. | +| 6.3 | single_choice | ¿Estarías dispuesto/a a participar en un grupo de apoyo para cuidadores dentro de la empresa? | Sí, definitivamente · Tal vez, si hay más personas en la misma situación · No por ahora · Prefiero mantenerlo en privado | | +| 6.4 | single_choice | ¿Conocés a algún compañero/a de trabajo que esté al cuidado de una persona con discapacidad o dependiente? | Sí, conozco a varias personas · Sí, conozco a una persona · No conozco a nadie · No estoy seguro/a | Código corregido (era 6.2 duplicado) | +| 6.5 | single_choice | ¿Considerás que la empresa debería ofrecer apoyos a quienes cuidan a una persona dependiente? | Sí, definitivamente · Tal vez, dependería del caso · No lo considero necesario · No lo sé | Código corregido (era 6.3 duplicado) | + +## Sección 7 — Para cerrar (top-level) +| Code | Tipo | Pregunta | Notas | |---|---|---|---| -| H1 | multiple_choice (**max_select=3**) | ¿Qué tipo de apoyo de tu empresa te ayudaría más? (hasta 3) | Flexibilidad horaria/remoto · Info recursos y servicios · Apoyo psicológico · Espacio de escucha · Convenios descuentos · Grupos de pares · Capacitación autocuidado · Nada, estoy bien | -| H2 | single_choice | ¿Estarías dispuesto/a a participar en un grupo de apoyo para cuidadores? | Sí, definitivamente · Tal vez · No por ahora · Prefiero privacidad | -| H3 | text_long | ¿Querés compartir algo más sobre tu experiencia? (opcional) | Texto libre, opcional. **No entra al store analítico crudo** (regla 4 CLAUDE.md). | +| 7.1 | text_long | ¿Te gustaría dejar un comentario o sugerencia especial? (opcional) | No entra al store analítico crudo (regla 4 CLAUDE.md) | --- ## Mapeo a cuasi-identificadores (`responses.qi_*`) -- `qi_age_bucket` ← **A2** (ya viene en bucket — bien). -- `qi_sector` ← **A1** (área). -- `qi_zone` ← **no aplica en este instrumento** (no se pregunta zona geográfica; es intra-empresa). Va NULL. +- `qi_age_bucket` ← A5 (ya en bucket) +- `qi_sector` ← A4 (área) +- `qi_zone` ← NULL (no aplica en este instrumento) +- `qi_city` / `qi_country` ← A2/A1: **Sprint 3** — se agregan como columnas qi en migration futura. + Por ahora A1/A2/A3 se capturan en `answers` como text_short. -## ⚠️ Hallazgo para el director (decisión de modelo de datos, Nivel 3 — NO ejecutar) -El dashboard original quería filtrar por **género (A3)** y **modalidad (A4)**, pero `agg_segment` -solo tiene en su whitelist `qi_age_bucket / qi_sector / qi_zone`. Para segmentar/filtrar por género o -modalidad en el dashboard (Sprint 3), hay que decidir: ¿se agregan columnas `qi_gender` / `qi_modality` -(y a la whitelist de `agg_segment`), o se resuelven por otra vía? Es decisión de esquema → consultar -antes de Sprint 3, no resolver en el seed. \ No newline at end of file +## ⚠️ Decisiones pendientes para el director (NO ejecutar sin aprobación) +- **Ranking widget (6.2):** actual es multiple_choice max_select=3. Cuando se implemente el + widget de ranking (drag o 3 dropdowns), 6.2 pasa a tipo `ranking` con JSONB `{rank1, rank2, rank3}`. +- **qi_city / qi_country:** migration 008 para agregar columnas y extender whitelist de agg_segment. + Se hace antes de Sprint 3 (dashboard). +- **Salary analytics:** metodología para calcular "carga económica del cuidado como % del ingreso" + es trabajo de metodología de investigación (fuera del scope del código). +- **RE-INDEX scoring:** algoritmo de composición de los índices (descanso, bienestar, rendimiento, + conciencia) — decisión antes de construir los reportes del dashboard. +- **Formulario de empresa (Relevamiento Empresa):** instrumento separado con PII de contacto. + Ejecutar offline para las primeras empresas. Diseño del modelo de datos en el sprint del builder. \ No newline at end of file diff --git a/app/globals.css b/app/globals.css index 4f2263c..03945db 100644 --- a/app/globals.css +++ b/app/globals.css @@ -254,6 +254,26 @@ body { .rating-step:hover .rating-dot { border-color: var(--color-accent); background: var(--color-primary-light); } .rating-step:has(input:checked):hover .rating-dot { background: var(--color-primary-hover); border-color: var(--color-primary-hover); color: #fff; } +/* ── Text short (single-line input) ── */ +.text-short-input { + display: block; + width: 100%; + padding: 10px 12px; + border: 1.5px solid var(--color-border); + border-radius: var(--radius); + font-size: 1rem; + font-family: inherit; + line-height: 1.5; + transition: border-color 0.15s; + color: var(--color-text); + background: var(--color-surface); +} +.text-short-input:focus { + outline: none; + border-color: var(--color-border-focus); + box-shadow: 0 0 0 3px rgba(37,99,235,0.15); +} + /* ── Textarea ── */ .text-area { display: block; diff --git a/components/question-renderer.tsx b/components/question-renderer.tsx index 6dba5d5..3c0279b 100644 --- a/components/question-renderer.tsx +++ b/components/question-renderer.tsx @@ -4,6 +4,7 @@ import { RadioGroup } from './widgets/radio-group' import { CheckboxGroup } from './widgets/checkbox-group' import { RatingScale } from './widgets/rating-scale' import { TextAreaField } from './widgets/text-area-field' +import { TextShortField } from './widgets/text-short-field' interface QuestionRendererProps { question: Question @@ -72,7 +73,20 @@ export function QuestionRenderer({ ) } - if (type === 'text_long' || type === 'text_short') { + if (type === 'text_short') { + return ( + onChange(code, v)} + error={error} + /> + ) + } + + if (type === 'text_long') { return ( = { A: 'Datos Generales', - B: '¿Vivís con discapacidad?', - C: 'Familiares con Discapacidad', - D: 'Adultos Mayores a Cargo', - E: 'Tu Rol como Cuidador/a', - F: 'Impacto Económico', - G: 'Bienestar y Descanso', - H: 'Necesidades', + '1': 'Prevalencia: cuidado y discapacidad', + '2': 'Intensidad y rol del cuidado', + '3': 'Impacto económico del cuidado', + '4': 'Tiempo y descanso', + '5': 'Impacto en el trabajo', + '6': 'Conciencia organizacional', + '7': 'Para cerrar', +} + +// 'A1' → 'A', '1.1' → '1', '6.4' → '6', '7.1' → '7' +function getSectionPrefix(code: string): string { + const m = code.match(/^([A-Za-z]+|\d+)/) + return m ? m[1] : code } export function SummaryScreen({ @@ -72,7 +78,7 @@ export function SummaryScreen({
{visibleQuestions.map((q) => { - const section = q.code.replace(/\d+$/, '') + const section = getSectionPrefix(q.code) const showHeader = section !== lastSection lastSection = section diff --git a/components/survey-form.tsx b/components/survey-form.tsx index d35de58..c5e50e8 100644 --- a/components/survey-form.tsx +++ b/components/survey-form.tsx @@ -8,19 +8,23 @@ import { QuestionRenderer } from './question-renderer' import { SummaryScreen } from './summary-screen' // Section metadata (code prefix → display title) +// Prefixes: 'A' for A1-A7, '1' for 1.1-1.16, '2' for 2.1-2.5, etc. const SECTIONS: { prefix: string; title: string; sensitive?: boolean }[] = [ { prefix: 'A', title: 'Datos Generales' }, - { prefix: 'B', title: '¿Vivís con discapacidad?', sensitive: true }, - { prefix: 'C', title: 'Familiares con Discapacidad', sensitive: true }, - { prefix: 'D', title: 'Adultos Mayores a Cargo', sensitive: true }, - { prefix: 'E', title: 'Tu Rol como Cuidador/a' }, - { prefix: 'F', title: 'Impacto Económico' }, - { prefix: 'G', title: 'Bienestar y Descanso' }, - { prefix: 'H', title: 'Necesidades' }, + { prefix: '1', title: 'Prevalencia: cuidado y discapacidad', sensitive: true }, + { prefix: '2', title: 'Intensidad y rol del cuidado' }, + { prefix: '3', title: 'Impacto económico del cuidado' }, + { prefix: '4', title: 'Tiempo y descanso' }, + { prefix: '5', title: 'Impacto en el trabajo' }, + { prefix: '6', title: 'Conciencia organizacional' }, + { prefix: '7', title: 'Para cerrar' }, ] -function getSectionPrefix(code: string) { - return code.replace(/\d+$/, '') +// Extracts the leading alpha or numeric segment from a question code. +// 'A1' → 'A', '1.1' → '1', '1.16' → '1', '6.4' → '6', '7.1' → '7' +function getSectionPrefix(code: string): string { + const m = code.match(/^([A-Za-z]+|\d+)/) + return m ? m[1] : code } interface SurveyFormProps { diff --git a/components/widgets/text-short-field.tsx b/components/widgets/text-short-field.tsx new file mode 100644 index 0000000..9cf5612 --- /dev/null +++ b/components/widgets/text-short-field.tsx @@ -0,0 +1,50 @@ +'use client' + +interface TextShortFieldProps { + name: string + label: string + value: string + required: boolean + placeholder?: string + onChange: (value: string) => void + error?: string +} + +export function TextShortField({ + name, + label, + value, + required, + placeholder = '', + onChange, + error, +}: TextShortFieldProps) { + return ( +
+ + onChange(e.target.value)} + className="text-short-input" + autoComplete="off" + /> + {error && ( + + )} +
+ ) +} diff --git a/docs/adr/ADR-001-privacidad-y-gobierno-de-datos.md b/docs/adr/ADR-001-privacidad-y-gobierno-de-datos.md index 256c0df..eaba395 100644 --- a/docs/adr/ADR-001-privacidad-y-gobierno-de-datos.md +++ b/docs/adr/ADR-001-privacidad-y-gobierno-de-datos.md @@ -84,6 +84,19 @@ compartidos; la inspección fila-por-fila es solo análisis interno (Modo A). Las preguntas abiertas no se exponen crudas a reportes (vector de re-identificación). Se categorizan antes (a futuro, vía LLM — está en BACKLOG). +### 11. Salary range — dato de acceso analyst-only (addendum Jun 2026) +La pregunta `3.4` captura la franja salarial del respondente. Es el dato clave para calcular la +"carga económica del cuidado como % del ingreso" — núcleo del argumento de la economía del cuidado. +Decisión del equipo: +- Se recolecta y almacena en `answers.value` como cualquier respuesta. `is_sensitive=true`. +- Acceso: **exclusivamente rol analyst** (vía `service_role`, que bypassa RLS). Nunca expuesto + a org_admin — ni en vistas crudas ni en funciones de agregación accesibles a ese rol. +- Ninguna llamada a `agg_segment` ni ningún reporte de org_admin incluye salary como dimensión + o como valor. El GRANT existente ya lo bloquea (org_admin tiene 0 filas en `answers`). +- Protección "técnicamente casi imposible": RLS bloquea el path de org_admin + cifrado en reposo + de Supabase + audit logs de accesos. Riesgo de breach externo es categoría separada + (plan de respuesta a incidentes, fuera del scope de este ADR). + ## Alcance de esta etapa (v1) Solo **Modo A**, solo encuestas **anónimas**, **sin Nivel 3 atribuible**. El esquema soporta más (controller_role, respondent_id) pero v1 no lo opera. Principio: el esquema guarda la opción, estos @@ -107,4 +120,4 @@ datos puntuales no la usan. costo correcto de la privacidad. ## Pendiente -Validación del flujo de consentimiento y del lenguaje legal con asesor paraguayo antes de producción. +Validación del flujo de consentimiento y del lenguaje legal con asesor paraguayo antes de producción. \ No newline at end of file diff --git a/sprints/sprint-1/ETAPA_1D_PROMPT.md b/sprints/sprint-1/ETAPA_1D_PROMPT.md new file mode 100644 index 0000000..a20612b --- /dev/null +++ b/sprints/sprint-1/ETAPA_1D_PROMPT.md @@ -0,0 +1,75 @@ +# ETAPA 1D — Actualización del instrumento a v2 (44 preguntas) + +> Implementa la revisión del instrumento hecha por la colega del equipo. +> Leé: `CLAUDE.md`, `DATA_MODEL.md`, `SEED_SPEC.md` (v2) y este prompt. + +## 1. Objetivo +Actualizar el seed y la app para que reflejen el instrumento v2 de 44 preguntas según `SEED_SPEC.md`. +Dos partes: (A) base de datos en Supabase Cloud, (B) widget `text_short` en el formulario Next.js. + +## 2. Contexto previo +La Etapa 1C cerró la fundación de datos con 34 preguntas. Esta etapa la actualiza a 44 por decisión +del equipo. El esquema de tablas NO cambia — solo cambia el contenido del seed. Las columnas `qi_city` +y `qi_country` se agregan en un sprint futuro (no en esta etapa). + +## 3. Decisiones ya tomadas +- 44 preguntas con códigos únicos según `SEED_SPEC.md`. Códigos corregidos: 6.4 y 6.5 (las + que en el HTML original eran 6.2 y 6.3 duplicados). +- A1/A2/A3 son tipo `text_short` (texto libre corto), sin opciones. Se guardan en `answers`. +- Pregunta 6.2 = `multiple_choice max_select=3` (NO ranking todavía). +- Pregunta 3.4 (salary) = `is_sensitive=true`. Ninguna vista de org_admin la expone. +- Condicionales: cond-disc-propia (1.1=Sí → 1.2–1.5), cond-familiar (1.6=Sí → 1.7–1.12), + cond-adulto-mayor (1.13=Sí → 1.14–1.16). Reglas en la pregunta dependiente. +- Secciones A, 2, 3, 4, 5, 6, 7 son top-level (siempre visibles). +- RE-INDEX es solo una nota en los textos de `SEED_SPEC.md`; NO agrega columna al esquema. + +## 4. Tareas + +### 4A — Base de datos +1. Reescribir `supabase/seed.sql` con las 44 preguntas de `SEED_SPEC.md`: tipos, opciones, + `max_select` (6.2=3), `is_sensitive` (marcar las indicadas ✅), `conditional_rules` en + dependientes, `required=false` para todas (el equipo decidió capturar todas las respuestas + para validar el concepto, la obligatoriedad real se define luego). +2. Aplicar a Cloud: `supabase db push --include-seed` o equivalente. +3. Verificar: `SELECT count(*) FROM questions` = **44**; códigos únicos sin duplicados; + pregunta `3.4` con `is_sensitive=true`; los 3 bloques condicionales tienen las reglas correctas. + +### 4B — App (formulario Next.js) +4. En `components/widgets/`, crear `text-short-field.tsx`: un `` accesible + (label asociado, aria-required, aria-invalid) con el mismo estilo visual que los otros widgets. +5. En `components/question-renderer.tsx`: registrar `text_short` y renderizarlo con el nuevo widget. +6. Verificar que A1/A2/A3 se renderizan como campos de texto, y que el formulario sigue + funcionando end-to-end (cargar las 44 preguntas desde Supabase, condicionales B/C/D, envío + al resumen). + +## 5. Definition of Done +- [ ] `SELECT count(*) FROM questions` = 44 contra Cloud. +- [ ] Códigos únicos: `SELECT code, count(*) FROM questions GROUP BY code HAVING count(*) > 1` = vacío. +- [ ] `3.4` tiene `is_sensitive=true`. +- [ ] Pregunta `A1` con `type='text_short'` y `options=null`. +- [ ] `npm run build` limpio. +- [ ] El formulario en `http://localhost:3000` muestra A1/A2/A3 como campos de texto. +- [ ] B1=Sí despliega 1.2–1.5; C1=Sí despliega 1.7–1.12; D1=Sí despliega 1.14–1.16. +- [ ] `git diff --name-only HEAD` solo con `supabase/seed.sql` + archivos de la app. + +## 6. Validaciones automatizadas mandatorias +- Conteo de preguntas: 44 ✓ +- Sin códigos duplicados (query arriba) ✓ +- `is_sensitive` en exactamente las preguntas marcadas en SEED_SPEC.md ✓ +- Al menos una conditional_rule en cada una de las 16 preguntas dependientes ✓ +- `npm run build` sin errores ✓ +- Si CUALQUIERA falla: NO declarar lista. Reportar y esperar. + +## 7. Qué reportar +- Conteo de preguntas y confirmación de código únicos. +- Confirmación de que A1/A2 se renderizan correctamente en el formulario. +- Salida de `git diff --name-only HEAD`. +- Hallazgos, asumidos, decisiones por iniciativa (con nivel). + +## 8. Qué NO hacer +- NO agregar columnas `qi_city`/`qi_country` al esquema (es Sprint 3). +- NO implementar widget de ranking (está en backlog). +- NO tocar migraciones 001–007. +- NO cambiar la lógica de RLS ni los policies. +- NO exponer `3.4` en ninguna vista o función que sea accesible a org_admin. +- Ante conflicto restricción vs build limpio: **detenerse y reportar**. \ No newline at end of file diff --git a/sprints/sprint-2/BRIEF.md b/sprints/sprint-2/BRIEF.md index 7c511c3..76482f1 100644 --- a/sprints/sprint-2/BRIEF.md +++ b/sprints/sprint-2/BRIEF.md @@ -17,8 +17,9 @@ distintos y conviene auditarlos por separado: ## Alcance - **Etapa 2A — Motor del formulario:** lee la encuesta live desde Supabase (anon key), renderiza las - 34 preguntas con el widget correcto por tipo, ejecuta la lógica condicional, valida, mobile-first, - WCAG AA, resiliencia lite. **Al enviar muestra un resumen; NO escribe en la base.** + **44 preguntas** (instrumento v2, Jun 2026) con el widget correcto por tipo (`single_choice`, + `multiple_choice`, `rating`, `text_long`, `text_short`), ejecuta la lógica condicional, valida, + mobile-first, WCAG AA, resiliencia lite. **Al enviar muestra un resumen; NO escribe en la base.** - **Etapa 2B — Consentimiento + persistencia:** pantalla de consentimiento granular versionado (ADR-003) con texto honesto sobre anonimato y no-revocación, que crea el `consent_record` y recién ahí escribe `response` + `answers`, con dedup por `ip_hash`. @@ -34,15 +35,17 @@ distintos y conviene auditarlos por separado: - El formulario corre como **`anon`** (sin login). `service_role` NUNCA en el cliente (regla 9). - El respondente nunca se ata a un IdP (regla 10 / ADR-004). - `options`: array para `single_choice`/`multiple_choice`, objeto `{min,max,min_label,max_label}` para `rating`. -- Condicionales en la pregunta dependiente; disparador value `'Sí'` (B1/C1/D1). +- Condicionales en la pregunta dependiente; disparador value `'Sí'` (triggers: 1.1/1.6/1.13). +- Tipos de widget: `single_choice`→radio, `multiple_choice`→checkbox, `rating`→escala 1-5, + `text_long`→textarea, `text_short`→input de texto de una línea (A1/A2/A3). - WCAG 2.2 AA es pilar (el sujeto es la discapacidad), no checkbox. - El mockup `formulario_mapeo.html` es el **contrato visual** (look y flujo ya aprobados); 2A lo replica pero data-driven desde el esquema, no hardcodeado. ## Criterios de éxito (Etapa 2A) -- [ ] Renderiza las 34 preguntas leídas desde Supabase (no hardcodeadas). -- [ ] Lógica condicional: B1/C1/D1 = "Sí" despliega sus bloques; "No"/"Prefiero no decir" los oculta y limpia. -- [ ] H1 limita a 3 selecciones; `rating` (F3/G4) maneja el formato objeto. +- [ ] Renderiza las **44 preguntas** leídas desde Supabase (no hardcodeadas). +- [ ] Lógica condicional: 1.1/1.6/1.13 = "Sí" despliegan sus bloques; "No"/"Prefiero no decir" ocultan y limpian. +- [ ] 6.2 limita a 3 selecciones; `rating` (3.5/4.3) maneja formato objeto; A1/A2/A3 son `text_short`. - [ ] Mobile-first fluido + navegable solo con teclado + WCAG AA base. - [ ] Refresh no pierde lo cargado (resiliencia lite). - [ ] Enviar muestra resumen; no escribe en la base. diff --git a/sprints/sprint-2/ETAPA_2A_PROMPT.md b/sprints/sprint-2/ETAPA_2A_PROMPT.md index 9973f44..7e08145 100644 --- a/sprints/sprint-2/ETAPA_2A_PROMPT.md +++ b/sprints/sprint-2/ETAPA_2A_PROMPT.md @@ -5,13 +5,13 @@ ## 1. Objetivo Construir el motor del formulario: una app Next.js que **lee** la encuesta live desde Supabase con la -`anon` key, renderiza las 34 preguntas con el widget correcto por tipo, ejecuta la lógica condicional, +`anon` key, renderiza las **44 preguntas** (instrumento v2) con el widget correcto por tipo, ejecuta la lógica condicional, valida, es mobile-first y accesible (WCAG AA), no pierde lo cargado al refrescar, y al enviar muestra un **resumen de respuestas**. **NO escribe nada en la base** (eso es 2B). ## 2. Contexto previo -La fundación de datos (Sprint 1) está cerrada y verificada en Cloud: esquema, RLS, seed real de 34 -preguntas, k-anonimato. El proyecto Supabase está linkeado. Todavía no existe app frontend — esta +La fundación de datos (Sprint 1) está cerrada y verificada en Cloud: esquema, RLS, seed real de **44 +preguntas** (instrumento v2, Jun 2026), k-anonimato. El proyecto Supabase está linkeado. Todavía no existe app frontend — esta etapa la scaffolding. `responses.consent_record_id` es `NOT NULL`, por eso 2A **no** persiste: la escritura requiere el consentimiento, que es 2B. El mockup `formulario_mapeo.html` (en el historial del proyecto) es el contrato visual: replicar su look y flujo, pero leyendo del esquema, no hardcoded. @@ -23,22 +23,25 @@ del proyecto) es el contrato visual: replicar su look y flujo, pero leyendo del `NEXT_PUBLIC_SUPABASE_ANON_KEY` en `.env.local`. **El `service_role` NUNCA va a una variable `NEXT_PUBLIC_` ni al cliente** (regla 9 de CLAUDE.md). - `options`: **array** para `single_choice`/`multiple_choice`; **objeto** `{min,max,min_label,max_label}` - para `rating` (F3, G4). Manejar las dos formas. + para `rating` (3.5, 4.3); **null** para `text_short`/`text_long`. Manejar las tres formas. +- Tipos de widget: `single_choice`→radio, `multiple_choice`→checkbox, `rating`→escala 1-5, + `text_long`→textarea, `text_short`→`` de una línea (A1/A2/A3: País, Ciudad, Sede). - Condicionales: cada pregunta dependiente trae `conditional_rules` con `{if_question, op:'eq', - value:'Sí', action:'show'}`. Mostrar solo si el disparador (B1/C1/D1) = "Sí"; con "No"/"Prefiero no - decir" ocultar **y limpiar** las respuestas de ese bloque. -- H1 = `multiple_choice` con `max_select=3` (impedir marcar más de 3). + value:'Sí', action:'show'}`. Triggers: **1.1** (→1.2–1.5), **1.6** (→1.7–1.12), **1.13** (→1.14–1.16). + Con "No"/"Prefiero no decir" ocultar **y limpiar** las respuestas del bloque. +- 6.2 = `multiple_choice` con `max_select=3` (impedir marcar más de 3). - 2A **no** escribe `responses`/`answers`/`consent_records`. Al enviar → pantalla de resumen. ## 4. Tareas 1. Scaffolding de la app Next.js (App Router) en el repo. Setear el cliente Supabase con la `anon` key desde `.env.local`. Crear `.env.example` (sin valores) documentando las dos variables. -2. Leer desde Supabase (anon) la encuesta `status='live'` + sus 34 `questions` ordenadas por +2. Leer desde Supabase (anon) la encuesta `status='live'` + sus 44 `questions` ordenadas por `position`, con sus `options`, `type`, `max_select`, `is_sensitive`, `conditional_rules`. (Si la encuesta seed no está `live`, dejar documentado que el director debe setearla a `live`, o leer por id — NO cambiar el estado desde el cliente.) 3. Renderizar cada tipo con su widget: `single_choice`→radios, `multiple_choice`→checkboxes (con tope - `max_select`), `rating`→escala 1-5 (usando el objeto options), `text_long`→textarea. + `max_select`), `rating`→escala 1-5 (usando el objeto options), `text_long`→textarea, + `text_short`→input de una línea (A1/A2/A3). 4. Motor de lógica condicional data-driven: evaluar `conditional_rules` para mostrar/ocultar; al ocultar un bloque, limpiar sus valores. 5. Validación con zod (tipos correctos; respetar `max_select`; `required` según el campo `required` @@ -54,17 +57,17 @@ del proyecto) es el contrato visual: replicar su look y flujo, pero leyendo del ## 5. Definition of Done - [ ] `npm run dev` levanta la app y carga la encuesta desde Supabase (anon). -- [ ] Se renderizan las 34 preguntas; los 3 bloques condicionales aparecen/desaparecen con B1/C1/D1. -- [ ] H1 no deja marcar más de 3; rating funciona con el formato objeto. +- [ ] Se renderizan las **44 preguntas**; los 3 bloques condicionales aparecen/desaparecen con 1.1/1.6/1.13. +- [ ] 6.2 no deja marcar más de 3; rating (3.5/4.3) funciona con el formato objeto; A1/A2/A3 son inputs de texto. - [ ] Navegable y operable solo con teclado; pasa una auditoría a11y básica (axe o Lighthouse) sin errores AA. - [ ] Refresh conserva lo cargado; enviar limpia el almacenamiento y muestra el resumen. - [ ] `npm run build` limpio; ninguna variable `NEXT_PUBLIC_` contiene el `service_role`. - [ ] `git diff --name-only HEAD` solo con archivos de la app nueva + `.env.example`. ## 6. Validaciones automatizadas mandatorias (antes de entregar) -- La carga lee **34** preguntas desde la base (logear el conteo), no un número hardcodeado. -- Las 12 condicionales se evalúan desde `conditional_rules` (no con `if` cableados por código). -- `max_select` de H1 se respeta en runtime (test o verificación manual reproducible). +- La carga lee **44** preguntas desde la base (logear el conteo), no un número hardcodeado. +- Las **13 condicionales** se evalúan desde `conditional_rules` (no con `if` cableados por código). +- `max_select` de 6.2 se respeta en runtime (test o verificación manual reproducible). - `npm run build` sin errores. - Auditoría a11y (axe-core o `lighthouse`) sobre la página del formulario: **0 violaciones de nivel AA**. - Grep de seguridad: `service_role` NO aparece en ningún archivo del cliente ni en `NEXT_PUBLIC_*`. diff --git a/supabase/seed.sql b/supabase/seed.sql index 3437f3d..b794887 100644 --- a/supabase/seed.sql +++ b/supabase/seed.sql @@ -1,697 +1,509 @@ -- ============================================================ --- seed.sql — Encuesta "Mapeo de Cuidadores" — 34 preguntas --- Fuente autoritativa: SEED_SPEC.md --- Reemplaza el seed inventado de Etapa 1 (9 preguntas, tipos incorrectos) --- Etapa 1B — 2026-06-02 +-- seed.sql — Instrumento "Mapeo de Cuidadores" v2 — 44 preguntas +-- Fuente autoritativa: SEED_SPEC.md v2 (Jun 2026) +-- Reemplaza v1 (34 preguntas con códigos A-H) -- --- Convenciones (SEED_SPEC.md §Convenciones): --- - conditional_rules en la pregunta DEPENDIENTE (no en el trigger) --- - B1/C1/D1 son single_choice de 3 opciones; solo "Sí" dispara el bloque --- - Valor de opción "Sí" = literal "Sí" (coincide con conditional_rules) --- - is_sensitive=true en las preguntas marcadas en SEED_SPEC.md (11 total) --- - H3 (text_long) NO exponer en agg_segment (regla 4 CLAUDE.md) +-- Estructura condicional: +-- cond-disc-propia: 1.1='Sí' → 1.2–1.5 (4 dependientes) +-- cond-familiar: 1.6='Sí' → 1.7–1.12 (6 dependientes) +-- cond-adulto-mayor: 1.13='Sí' → 1.14–1.16 (3 dependientes) +-- Resto: top-level, siempre visibles +-- +-- is_sensitive=true: 1.1-1.12, 1.14, 1.15, 3.4 (15 preguntas) +-- required=false en todas (equipo decidió captura completa; obligatoriedad se define luego) -- -- UUIDs fijos: -- org: 10000000-0000-0000-0000-000000000001 -- cv-v1: 20000000-0000-0000-0000-000000000001 -- survey: 30000000-0000-0000-0000-000000000001 --- preguntas 40000000-0000-0000-0000-000000000001 .. 000000000034 +-- preguntas 40000000-0000-0000-0000-00000000000{01..44} -- ============================================================ --- ============================================================ --- 1. Organización demo --- ============================================================ +-- ── Organización demo ───────────────────────────────────────── INSERT INTO public.organizations (id, name, sector, size_bucket) -VALUES ( - '10000000-0000-0000-0000-000000000001', - 'Empresa Demo S.A.', - 'Servicios', - '100-500' -) ON CONFLICT (id) DO NOTHING; +VALUES ('10000000-0000-0000-0000-000000000001','Empresa Demo S.A.','Servicios','100-500') +ON CONFLICT (id) DO NOTHING; --- ============================================================ --- 2. Versión de consentimiento v1 --- ============================================================ +-- ── Consent version v1 ──────────────────────────────────────── INSERT INTO public.consent_versions (id, version, body, scopes) VALUES ( - '20000000-0000-0000-0000-000000000001', - 'v1', - 'Esta encuesta es completamente anónima: no registramos tu nombre, número de documento ' - 'ni ningún dato que permita identificarte personalmente. ' - 'Tus respuestas se usarán con dos propósitos: ' - '(1) Ayudar a tu empresa a comprender la situación de cuidado de sus colaboradores y diseñar ' - 'apoyos más adecuados (uso operativo, solo agregados). ' - '(2) Contribuir a un estudio de alcance nacional sobre la economía del cuidado en Paraguay, ' - 'utilizando únicamente datos anonimizados e irreversiblemente desvinculados de cualquier empresa. ' - 'Una vez enviada tu respuesta, al ser anónima, no es posible retirarla ni modificarla. ' - 'Podés elegir qué propósitos autorizás marcando las casillas a continuación.', - '["operativo","macro_n1"]'::jsonb + '20000000-0000-0000-0000-000000000001', 'v1', + 'Esta encuesta es completamente anónima: no registramos tu nombre ni ningún dato que permita ' + 'identificarte. Tus respuestas se usan para (1) ayudar a tu empresa con apoyos sobre cuidado y ' + 'discapacidad, y (2) un estudio nacional anonimizado. Al ser anónima, no es posible retirar ' + 'ni modificar tu respuesta una vez enviada.', + '["operativo","macro_n1"]'::jsonb ) ON CONFLICT (id) DO NOTHING; --- ============================================================ --- 3. Encuesta — anónima / sensible / confidencial / Modo A / k=5 --- ============================================================ +-- ── Survey ──────────────────────────────────────────────────── INSERT INTO public.surveys ( - id, org_id, title, status, is_anonymous, - data_sensitivity, security_class, controller_role, - consent_version_id, k_threshold -) -VALUES ( - '30000000-0000-0000-0000-000000000001', - '10000000-0000-0000-0000-000000000001', - 'Mapeo de Cuidadores — 2026', - 'draft', - true, - 'sensible', - 'confidencial', - 'A', - '20000000-0000-0000-0000-000000000001', - 5 + id, org_id, title, status, is_anonymous, + data_sensitivity, security_class, controller_role, + consent_version_id, k_threshold +) VALUES ( + '30000000-0000-0000-0000-000000000001', + '10000000-0000-0000-0000-000000000001', + 'Mapeo de Cuidadores — 2026', 'draft', true, + 'sensible', 'confidencial', 'A', + '20000000-0000-0000-0000-000000000001', 5 ) ON CONFLICT (id) DO NOTHING; --- ============================================================ --- 4. Preguntas (34) — DELETE+INSERT para idempotencia total --- --- Estructura condicional (SEED_SPEC §Estructura): --- cond-B: B2-B5 visibles si B1 = 'Sí' --- cond-C: C2-C5 visibles si C1 = 'Sí' --- cond-D: D2-D5 visibles si D1 = 'Sí' --- Resto: siempre visible (top-level) --- ============================================================ +-- ── Preguntas: DELETE + INSERT para idempotencia total ──────── DELETE FROM public.questions WHERE survey_id = '30000000-0000-0000-0000-000000000001'; --- ══════════════════════════════════════════════════ --- SECCIÓN A — Datos Generales (cuasi-identificadores) --- qi_sector ← A1 · qi_age_bucket ← A2 · qi_zone = NULL --- ══════════════════════════════════════════════════ +-- ══════════════════════════════════════════════════════════════ +-- SECCIÓN A — Datos Generales (top-level, cuasi-identificadores) +-- A1/A2/A3: text_short (texto libre, sin opciones) +-- qi_sector ← A4 · qi_age_bucket ← A5 +-- qi_city/qi_country ← A2/A1: se agregan como columnas qi en Sprint 3 +-- ══════════════════════════════════════════════════════════════ -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000001', - '30000000-0000-0000-0000-000000000001', - 'A1', 'single_choice', - '¿En qué área o gerencia trabajás?', - 1, false, false, - '[ - {"value":"Operaciones/Producción","label":"Operaciones/Producción"}, - {"value":"Comercial/Ventas","label":"Comercial/Ventas"}, - {"value":"Administración/Finanzas","label":"Administración/Finanzas"}, - {"value":"RRHH/Cultura","label":"RRHH/Cultura"}, - {"value":"Tecnología/Sistemas","label":"Tecnología/Sistemas"}, - {"value":"Logística/Distribución","label":"Logística/Distribución"}, - {"value":"Otra área","label":"Otra área"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required) +VALUES ('40000000-0000-0000-0000-000000000001','30000000-0000-0000-0000-000000000001', + 'A1','text_short','País',1,false,false); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000002', - '30000000-0000-0000-0000-000000000001', - 'A2', 'single_choice', - '¿Cuántos años tenés?', - 2, false, false, - '[ - {"value":"Menos de 25","label":"Menos de 25"}, - {"value":"25-34","label":"25-34"}, - {"value":"35-44","label":"35-44"}, - {"value":"45-54","label":"45-54"}, - {"value":"55+","label":"55+"}, - {"value":"Prefiero no decir","label":"Prefiero no decir"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required) +VALUES ('40000000-0000-0000-0000-000000000002','30000000-0000-0000-0000-000000000001', + 'A2','text_short','Ciudad',2,false,false); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000003', - '30000000-0000-0000-0000-000000000001', - 'A3', 'single_choice', - '¿Con qué género te identificás?', - 3, false, false, - '[ - {"value":"Femenino","label":"Femenino"}, - {"value":"Masculino","label":"Masculino"}, - {"value":"No binario/Otro","label":"No binario/Otro"}, - {"value":"Prefiero no decir","label":"Prefiero no decir"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required) +VALUES ('40000000-0000-0000-0000-000000000003','30000000-0000-0000-0000-000000000001', + 'A3','text_short','Sucursal o sede',3,false,false); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000004', - '30000000-0000-0000-0000-000000000001', - 'A4', 'single_choice', - '¿Cuál es tu modalidad de trabajo actual?', - 4, false, false, - '[ - {"value":"Presencial","label":"Presencial"}, - {"value":"Remoto","label":"Remoto"}, - {"value":"Híbrido","label":"Híbrido"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000004','30000000-0000-0000-0000-000000000001', + 'A4','single_choice','¿En qué área o gerencia trabajás?',4,false,false, + '[{"value":"Operaciones/Producción","label":"Operaciones/Producción"}, + {"value":"Comercial/Ventas","label":"Comercial/Ventas"}, + {"value":"Administración/Finanzas","label":"Administración/Finanzas"}, + {"value":"Recursos Humanos/Cultura","label":"Recursos Humanos/Cultura"}, + {"value":"Tecnología/Sistemas","label":"Tecnología/Sistemas"}, + {"value":"Logística/Distribución","label":"Logística/Distribución"}, + {"value":"Otra área","label":"Otra área"}]'::jsonb); + +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000005','30000000-0000-0000-0000-000000000001', + 'A5','single_choice','¿Cuántos años tenés?',5,false,false, + '[{"value":"Menos de 25 años","label":"Menos de 25 años"}, + {"value":"25 a 34 años","label":"25 a 34 años"}, + {"value":"35 a 44 años","label":"35 a 44 años"}, + {"value":"45 a 54 años","label":"45 a 54 años"}, + {"value":"55 años o más","label":"55 años o más"}, + {"value":"Prefiero no decir","label":"Prefiero no decir"}]'::jsonb); + +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000006','30000000-0000-0000-0000-000000000001', + 'A6','single_choice','¿Con qué género te identificás?',6,false,false, + '[{"value":"Femenino","label":"Femenino"}, + {"value":"Masculino","label":"Masculino"}, + {"value":"No binario/Otro","label":"No binario/Otro"}, + {"value":"Prefiero no decir","label":"Prefiero no decir"}]'::jsonb); + +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000007','30000000-0000-0000-0000-000000000001', + 'A7','single_choice','¿Cuál es tu modalidad de trabajo actual?',7,false,false, + '[{"value":"Presencial","label":"Presencial"}, + {"value":"Remoto (home office)","label":"Remoto (home office)"}, + {"value":"Híbrido","label":"Híbrido"}]'::jsonb); --- ══════════════════════════════════════════════════ --- SECCIÓN B — ¿Vivís con discapacidad? (is_sensitive=true: B1-B5) --- cond-B: B2-B5 se muestran si B1 = 'Sí' --- ══════════════════════════════════════════════════ +-- ══════════════════════════════════════════════════════════════ +-- SECCIÓN 1 — Prevalencia: cuidado y discapacidad (sensible) +-- Triggers: 1.1 (→1.2–1.5), 1.6 (→1.7–1.12), 1.13 (→1.14–1.16) +-- ══════════════════════════════════════════════════════════════ --- B1: trigger — single_choice, is_sensitive=true, sin conditional_rules -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000005', - '30000000-0000-0000-0000-000000000001', - 'B1', 'single_choice', - '¿Vos mismo/a tenés alguna discapacidad o condición de salud permanente o de largo plazo?', - 5, true, false, - '[ - {"value":"Sí","label":"Sí"}, - {"value":"No","label":"No"}, - {"value":"Prefiero no decir","label":"Prefiero no decir"} - ]'::jsonb -); +-- 1.1 trigger — is_sensitive=true, sin conditional_rules +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000008','30000000-0000-0000-0000-000000000001', + '1.1','single_choice', + '¿Vos mismo/a vivís con alguna discapacidad o condición de salud que afecte tu funcionamiento cotidiano?', + 8,true,false, + '[{"value":"Sí","label":"Sí"}, + {"value":"No","label":"No"}, + {"value":"Prefiero no decir","label":"Prefiero no decir"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options, conditional_rules) -VALUES ( - '40000000-0000-0000-0000-000000000006', - '30000000-0000-0000-0000-000000000001', - 'B2', 'multiple_choice', - '¿Qué tipo de discapacidad tenés? (podés marcar más de una)', - 6, true, false, - '[ - {"value":"Física/motriz","label":"Física/motriz"}, - {"value":"Visual","label":"Visual"}, - {"value":"Auditiva","label":"Auditiva"}, - {"value":"Intelectual","label":"Intelectual"}, - {"value":"TEA","label":"TEA"}, - {"value":"Psicosocial","label":"Psicosocial"}, - {"value":"Condición crónica","label":"Condición crónica"}, - {"value":"Otra","label":"Otra"} - ]'::jsonb, - '[{"if_question":"B1","op":"eq","value":"Sí","action":"show"}]'::jsonb -); +-- cond-disc-propia: 1.2–1.5 se muestran si 1.1='Sí' +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000009','30000000-0000-0000-0000-000000000001', + '1.2','multiple_choice','¿Qué tipo de discapacidad o condición tenés?',9,true,false, + '[{"value":"Discapacidad física/motriz","label":"Discapacidad física/motriz"}, + {"value":"Visual","label":"Visual"}, + {"value":"Auditiva","label":"Auditiva"}, + {"value":"Intelectual","label":"Intelectual"}, + {"value":"TEA","label":"TEA"}, + {"value":"Psicosocial/salud mental","label":"Psicosocial/salud mental"}, + {"value":"Condición crónica que genera limitaciones","label":"Condición crónica que genera limitaciones"}, + {"value":"Otra","label":"Otra"}]'::jsonb, + '[{"if_question":"1.1","op":"eq","value":"Sí","action":"show"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options, conditional_rules) -VALUES ( - '40000000-0000-0000-0000-000000000007', - '30000000-0000-0000-0000-000000000001', - 'B3', 'single_choice', - '¿Contás con certificado oficial de discapacidad?', - 7, true, false, - '[ - {"value":"Sí","label":"Sí"}, - {"value":"En trámite","label":"En trámite"}, - {"value":"No","label":"No"} - ]'::jsonb, - '[{"if_question":"B1","op":"eq","value":"Sí","action":"show"}]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000010','30000000-0000-0000-0000-000000000001', + '1.3','multiple_choice','¿Usás algún elemento de apoyo para la movilidad o autonomía?',10,true,false, + '[{"value":"Silla de ruedas","label":"Silla de ruedas"}, + {"value":"Bastón","label":"Bastón"}, + {"value":"Andador","label":"Andador"}, + {"value":"Muletas","label":"Muletas"}, + {"value":"Prótesis","label":"Prótesis"}, + {"value":"No utilizo","label":"No utilizo"}]'::jsonb, + '[{"if_question":"1.1","op":"eq","value":"Sí","action":"show"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options, conditional_rules) -VALUES ( - '40000000-0000-0000-0000-000000000008', - '30000000-0000-0000-0000-000000000001', - 'B4', 'single_choice', - '¿Tu discapacidad afecta tu desempeño o comodidad en el trabajo?', - 8, true, false, - '[ - {"value":"Sí, significativamente","label":"Sí, significativamente"}, - {"value":"Sí, aspectos puntuales","label":"Sí, aspectos puntuales"}, - {"value":"No, bien gestionada","label":"No, bien gestionada"}, - {"value":"Prefiero no decir","label":"Prefiero no decir"} - ]'::jsonb, - '[{"if_question":"B1","op":"eq","value":"Sí","action":"show"}]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000011','30000000-0000-0000-0000-000000000001', + '1.4','single_choice','¿Contás con certificado oficial de discapacidad?',11,true,false, + '[{"value":"Sí","label":"Sí"}, + {"value":"No, pero estoy en trámite","label":"No, pero estoy en trámite"}, + {"value":"No","label":"No"}]'::jsonb, + '[{"if_question":"1.1","op":"eq","value":"Sí","action":"show"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options, conditional_rules) -VALUES ( - '40000000-0000-0000-0000-000000000009', - '30000000-0000-0000-0000-000000000001', - 'B5', 'single_choice', - '¿La empresa conoce tu situación?', - 9, true, false, - '[ - {"value":"Sí, con apoyo","label":"Sí, con apoyo"}, - {"value":"Sí, sin apoyo","label":"Sí, sin apoyo"}, - {"value":"No, privado","label":"No, privado"} - ]'::jsonb, - '[{"if_question":"B1","op":"eq","value":"Sí","action":"show"}]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000012','30000000-0000-0000-0000-000000000001', + '1.5','single_choice','¿Tu condición afecta tu desempeño o comodidad en el trabajo?',12,true,false, + '[{"value":"Sí, de forma significativa","label":"Sí, de forma significativa"}, + {"value":"Sí, pero en aspectos puntuales","label":"Sí, pero en aspectos puntuales"}, + {"value":"No, está bien gestionada","label":"No, está bien gestionada"}, + {"value":"Prefiero no decir","label":"Prefiero no decir"}]'::jsonb, + '[{"if_question":"1.1","op":"eq","value":"Sí","action":"show"}]'::jsonb); + +-- 1.6 trigger — is_sensitive=true +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000013','30000000-0000-0000-0000-000000000001', + '1.6','single_choice', + '¿Tenés algún familiar cercano (hijo/a, pareja, hermano/a, padre/madre) que viva con discapacidad?', + 13,true,false, + '[{"value":"Sí","label":"Sí"}, + {"value":"No","label":"No"}, + {"value":"Prefiero no decir","label":"Prefiero no decir"}]'::jsonb); + +-- cond-familiar: 1.7–1.12 se muestran si 1.6='Sí' +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000014','30000000-0000-0000-0000-000000000001', + '1.7','multiple_choice','¿Cuál es tu vínculo con esa persona?',14,true,false, + '[{"value":"Hijo/a","label":"Hijo/a"}, + {"value":"Cónyuge/pareja","label":"Cónyuge/pareja"}, + {"value":"Padre o madre","label":"Padre o madre"}, + {"value":"Hermano/a","label":"Hermano/a"}, + {"value":"Otro familiar","label":"Otro familiar"}]'::jsonb, + '[{"if_question":"1.6","op":"eq","value":"Sí","action":"show"}]'::jsonb); + +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000015','30000000-0000-0000-0000-000000000001', + '1.8','multiple_choice','¿Qué tipo de discapacidad tiene?',15,true,false, + '[{"value":"Física/motriz","label":"Física/motriz"}, + {"value":"Visual","label":"Visual"}, + {"value":"Auditiva","label":"Auditiva"}, + {"value":"Intelectual","label":"Intelectual"}, + {"value":"TEA","label":"TEA"}, + {"value":"Psicosocial/salud mental","label":"Psicosocial/salud mental"}, + {"value":"Condición crónica severa","label":"Condición crónica severa"}, + {"value":"Otra","label":"Otra"}]'::jsonb, + '[{"if_question":"1.6","op":"eq","value":"Sí","action":"show"}]'::jsonb); + +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000016','30000000-0000-0000-0000-000000000001', + '1.9','multiple_choice','¿Qué tipo de apoyo o acompañamiento necesita principalmente?',16,true,false, + '[{"value":"Movilidad física","label":"Movilidad física"}, + {"value":"Comunicación","label":"Comunicación"}, + {"value":"Apoyo escolar/educativo","label":"Apoyo escolar/educativo"}, + {"value":"Inclusión laboral","label":"Inclusión laboral"}, + {"value":"Terapias/rehabilitación","label":"Terapias/rehabilitación"}, + {"value":"Apoyo emocional/psicosocial","label":"Apoyo emocional/psicosocial"}]'::jsonb, + '[{"if_question":"1.6","op":"eq","value":"Sí","action":"show"}]'::jsonb); + +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000017','30000000-0000-0000-0000-000000000001', + '1.10','multiple_choice','¿Usa algún elemento de apoyo para la movilidad o autonomía?',17,true,false, + '[{"value":"Silla de ruedas","label":"Silla de ruedas"}, + {"value":"Bastón","label":"Bastón"}, + {"value":"Andador","label":"Andador"}, + {"value":"Muletas","label":"Muletas"}, + {"value":"Prótesis","label":"Prótesis"}, + {"value":"No utiliza","label":"No utiliza"}]'::jsonb, + '[{"if_question":"1.6","op":"eq","value":"Sí","action":"show"}]'::jsonb); + +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000018','30000000-0000-0000-0000-000000000001', + '1.11','single_choice', + 'Si es niño/a o adolescente en edad escolar: ¿está escolarizado/a y enfrenta barreras de aprendizaje?', + 18,true,false, + '[{"value":"Escolarizado/a, sin barreras importantes","label":"Escolarizado/a, sin barreras importantes"}, + {"value":"Escolarizado/a, enfrenta barreras o faltan ajustes","label":"Escolarizado/a, enfrenta barreras o faltan ajustes"}, + {"value":"No está escolarizado/a","label":"No está escolarizado/a"}, + {"value":"No aplica","label":"No aplica"}]'::jsonb, + '[{"if_question":"1.6","op":"eq","value":"Sí","action":"show"}]'::jsonb); + +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000019','30000000-0000-0000-0000-000000000001', + '1.12','single_choice','¿La persona con discapacidad se encuentra trabajando actualmente?',19,true,false, + '[{"value":"Sí, está trabajando","label":"Sí, está trabajando"}, + {"value":"No, y está buscando empleo","label":"No, y está buscando empleo"}, + {"value":"No, y no está buscando","label":"No, y no está buscando"}, + {"value":"No aplica","label":"No aplica"}]'::jsonb, + '[{"if_question":"1.6","op":"eq","value":"Sí","action":"show"}]'::jsonb); + +-- 1.13 trigger — NOT sensitive +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000020','30000000-0000-0000-0000-000000000001', + '1.13','single_choice','¿Tenés algún adulto mayor (60+ años) a tu cuidado o bajo tu responsabilidad?', + 20,false,false, + '[{"value":"Sí","label":"Sí"}, + {"value":"No","label":"No"}, + {"value":"Prefiero no decir","label":"Prefiero no decir"}]'::jsonb); + +-- cond-adulto-mayor: 1.14–1.16 se muestran si 1.13='Sí' +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000021','30000000-0000-0000-0000-000000000001', + '1.14','single_choice','¿Qué nivel de dependencia tiene? (la más representativa)',21,true,false, + '[{"value":"Independiente, pero necesita supervisión","label":"Independiente, pero necesita supervisión"}, + {"value":"Dependencia leve","label":"Dependencia leve"}, + {"value":"Dependencia moderada","label":"Dependencia moderada"}, + {"value":"Dependencia severa","label":"Dependencia severa"}]'::jsonb, + '[{"if_question":"1.13","op":"eq","value":"Sí","action":"show"}]'::jsonb); + +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000022','30000000-0000-0000-0000-000000000001', + '1.15','multiple_choice','¿Tiene una condición de salud que genere mayor necesidad de cuidado?',22,true,false, + '[{"value":"Demencia/Alzheimer","label":"Demencia/Alzheimer"}, + {"value":"ACV/Parálisis","label":"ACV/Parálisis"}, + {"value":"Enfermedad crónica grave","label":"Enfermedad crónica grave"}, + {"value":"Movilidad reducida","label":"Movilidad reducida"}, + {"value":"Deterioro cognitivo","label":"Deterioro cognitivo"}, + {"value":"Sin condición específica","label":"Sin condición específica"}]'::jsonb, + '[{"if_question":"1.13","op":"eq","value":"Sí","action":"show"}]'::jsonb); + +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options,conditional_rules) +VALUES ('40000000-0000-0000-0000-000000000023','30000000-0000-0000-0000-000000000001', + '1.16','single_choice','¿Vive con vos o en otra vivienda?',23,false,false, + '[{"value":"Vive en mi hogar","label":"Vive en mi hogar"}, + {"value":"Vive en otra vivienda","label":"Vive en otra vivienda"}, + {"value":"Está en residencia/institución","label":"Está en residencia/institución"}]'::jsonb, + '[{"if_question":"1.13","op":"eq","value":"Sí","action":"show"}]'::jsonb); --- ══════════════════════════════════════════════════ --- SECCIÓN C — Familiares con Discapacidad --- is_sensitive=true: C1-C4 | C5: NOT sensitive --- cond-C: C2-C5 se muestran si C1 = 'Sí' --- ══════════════════════════════════════════════════ +-- ══════════════════════════════════════════════════════════════ +-- SECCIÓN 2 — Intensidad y rol del cuidado (top-level) +-- ══════════════════════════════════════════════════════════════ -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000010', - '30000000-0000-0000-0000-000000000001', - 'C1', 'single_choice', - '¿Tenés algún familiar cercano que viva con discapacidad?', - 10, true, false, - '[ - {"value":"Sí","label":"Sí"}, - {"value":"No","label":"No"}, - {"value":"Prefiero no decir","label":"Prefiero no decir"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000024','30000000-0000-0000-0000-000000000001', + '2.1','single_choice','¿Quién es el/la responsable principal del cuidado?',24,false,false, + '[{"value":"Yo soy el/la principal","label":"Yo soy el/la principal"}, + {"value":"Comparto con otro familiar","label":"Comparto con otro familiar"}, + {"value":"Hay cuidador/a pagado/a","label":"Hay cuidador/a pagado/a"}, + {"value":"Está en institución/centro de día","label":"Está en institución/centro de día"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options, conditional_rules) -VALUES ( - '40000000-0000-0000-0000-000000000011', - '30000000-0000-0000-0000-000000000001', - 'C2', 'multiple_choice', - '¿Cuál es el vínculo? (podés marcar más de una)', - 11, true, false, - '[ - {"value":"Hijo/a","label":"Hijo/a"}, - {"value":"Cónyuge/pareja","label":"Cónyuge/pareja"}, - {"value":"Padre/madre","label":"Padre/madre"}, - {"value":"Hermano/a","label":"Hermano/a"}, - {"value":"Otro familiar","label":"Otro familiar"} - ]'::jsonb, - '[{"if_question":"C1","op":"eq","value":"Sí","action":"show"}]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000025','30000000-0000-0000-0000-000000000001', + '2.2','single_choice','¿Cuántas horas por día dedicás, en promedio, al cuidado directo?',25,false,false, + '[{"value":"Menos de 1h","label":"Menos de 1h"}, + {"value":"Entre 1 y 3h","label":"Entre 1 y 3h"}, + {"value":"Entre 3 y 6h","label":"Entre 3 y 6h"}, + {"value":"Más de 6h","label":"Más de 6h"}, + {"value":"Varía mucho","label":"Varía mucho"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options, conditional_rules) -VALUES ( - '40000000-0000-0000-0000-000000000012', - '30000000-0000-0000-0000-000000000001', - 'C3', 'multiple_choice', - '¿Qué tipo de discapacidad tiene? (podés marcar más de una)', - 12, true, false, - '[ - {"value":"Física/motriz","label":"Física/motriz"}, - {"value":"Visual","label":"Visual"}, - {"value":"Auditiva","label":"Auditiva"}, - {"value":"Intelectual","label":"Intelectual"}, - {"value":"TEA","label":"TEA"}, - {"value":"Psicosocial","label":"Psicosocial"}, - {"value":"Condición crónica","label":"Condición crónica"} - ]'::jsonb, - '[{"if_question":"C1","op":"eq","value":"Sí","action":"show"}]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000026','30000000-0000-0000-0000-000000000001', + '2.3','multiple_choice','¿En qué momentos del día cuidás principalmente?',26,false,false, + '[{"value":"Antes del trabajo","label":"Antes del trabajo"}, + {"value":"Durante horario laboral (llamadas/emergencias)","label":"Durante horario laboral (llamadas/emergencias)"}, + {"value":"Al llegar del trabajo","label":"Al llegar del trabajo"}, + {"value":"Durante la noche","label":"Durante la noche"}, + {"value":"Los fines de semana","label":"Los fines de semana"}, + {"value":"Es continuo sin horario fijo","label":"Es continuo sin horario fijo"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options, conditional_rules) -VALUES ( - '40000000-0000-0000-0000-000000000013', - '30000000-0000-0000-0000-000000000001', - 'C4', 'single_choice', - '¿Esta persona requiere apoyo o cuidado cotidiano?', - 13, true, false, - '[ - {"value":"Alta dependencia","label":"Alta dependencia"}, - {"value":"Apoyo parcial","label":"Apoyo parcial"}, - {"value":"Autónomo/a","label":"Autónomo/a"} - ]'::jsonb, - '[{"if_question":"C1","op":"eq","value":"Sí","action":"show"}]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000027','30000000-0000-0000-0000-000000000001', + '2.4','single_choice','¿Contás con apoyo de otras personas para el cuidado?',27,false,false, + '[{"value":"Sí, apoyo familiar suficiente","label":"Sí, apoyo familiar suficiente"}, + {"value":"Algo de apoyo, no suficiente","label":"Algo de apoyo, no suficiente"}, + {"value":"No, soy el/la único/a responsable","label":"No, soy el/la único/a responsable"}, + {"value":"Tengo apoyo contratado","label":"Tengo apoyo contratado"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options, conditional_rules) -VALUES ( - '40000000-0000-0000-0000-000000000014', - '30000000-0000-0000-0000-000000000001', - 'C5', 'single_choice', - '¿Quién es el responsable principal del cuidado?', - 14, false, false, - '[ - {"value":"Yo principal","label":"Yo principal"}, - {"value":"Compartido","label":"Compartido"}, - {"value":"Cuidador pagado","label":"Cuidador pagado"}, - {"value":"Institución","label":"Institución"} - ]'::jsonb, - '[{"if_question":"C1","op":"eq","value":"Sí","action":"show"}]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000028','30000000-0000-0000-0000-000000000001', + '2.5','single_choice', + 'Como cuidador/a primario, ¿presentás signos de agotamiento o estrés crónico?',28,false,false, + '[{"value":"Sí, frecuentemente","label":"Sí, frecuentemente"}, + {"value":"A veces","label":"A veces"}, + {"value":"No, lo llevo bien","label":"No, lo llevo bien"}, + {"value":"Prefiero no decir","label":"Prefiero no decir"}]'::jsonb); --- ══════════════════════════════════════════════════ --- SECCIÓN D — Adultos Mayores a Cargo --- is_sensitive=true: D3, D4 | D1, D2, D5: NOT sensitive --- cond-D: D2-D5 se muestran si D1 = 'Sí' --- ══════════════════════════════════════════════════ +-- ══════════════════════════════════════════════════════════════ +-- SECCIÓN 3 — Impacto económico del cuidado (top-level) +-- 3.4: is_sensitive=true + analyst-only (no exponer a org_admin) +-- ══════════════════════════════════════════════════════════════ -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000015', - '30000000-0000-0000-0000-000000000001', - 'D1', 'single_choice', - '¿Tenés algún adulto mayor (60+) a tu cuidado?', - 15, false, false, - '[ - {"value":"Sí","label":"Sí"}, - {"value":"No","label":"No"}, - {"value":"Prefiero no decir","label":"Prefiero no decir"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000029','30000000-0000-0000-0000-000000000001', + '3.1','single_choice','¿Cuánto estimás que gastás por mes en el cuidado?',29,false,false, + '[{"value":"Sin gastos significativos","label":"Sin gastos significativos"}, + {"value":"Menos de Gs. 500.000","label":"Menos de Gs. 500.000"}, + {"value":"Gs. 500.000–1.500.000","label":"Gs. 500.000–1.500.000"}, + {"value":"Gs. 1.500.000–3.000.000","label":"Gs. 1.500.000–3.000.000"}, + {"value":"Gs. 3.000.000–6.000.000","label":"Gs. 3.000.000–6.000.000"}, + {"value":"Más de Gs. 6.000.000","label":"Más de Gs. 6.000.000"}, + {"value":"Prefiero no decir","label":"Prefiero no decir"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options, conditional_rules) -VALUES ( - '40000000-0000-0000-0000-000000000016', - '30000000-0000-0000-0000-000000000001', - 'D2', 'single_choice', - '¿Cuántos adultos mayores están bajo tu cuidado?', - 16, false, false, - '[ - {"value":"1","label":"1"}, - {"value":"2","label":"2"}, - {"value":"3+","label":"3+"} - ]'::jsonb, - '[{"if_question":"D1","op":"eq","value":"Sí","action":"show"}]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000030','30000000-0000-0000-0000-000000000001', + '3.2','multiple_choice','¿Qué servicios o apoyos utilizás actualmente?',30,false,false, + '[{"value":"Terapias especializadas","label":"Terapias especializadas"}, + {"value":"Cuidador/a particular","label":"Cuidador/a particular"}, + {"value":"Centro de día/institución","label":"Centro de día/institución"}, + {"value":"Transporte adaptado","label":"Transporte adaptado"}, + {"value":"Medicación alto costo","label":"Medicación alto costo"}, + {"value":"Equipamiento médico/tecnología asistiva","label":"Equipamiento médico/tecnología asistiva"}, + {"value":"No utilizo servicios formales","label":"No utilizo servicios formales"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options, conditional_rules) -VALUES ( - '40000000-0000-0000-0000-000000000017', - '30000000-0000-0000-0000-000000000001', - 'D3', 'single_choice', - '¿Qué nivel de dependencia tiene/n?', - 17, true, false, - '[ - {"value":"Supervisión","label":"Supervisión"}, - {"value":"Dependencia leve","label":"Dependencia leve"}, - {"value":"Dependencia moderada","label":"Dependencia moderada"}, - {"value":"Dependencia severa","label":"Dependencia severa"} - ]'::jsonb, - '[{"if_question":"D1","op":"eq","value":"Sí","action":"show"}]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000031','30000000-0000-0000-0000-000000000001', + '3.3','multiple_choice','¿Cómo sostenés los gastos y responsabilidades del cuidado?',31,false,false, + '[{"value":"Con mi empleo de tiempo completo","label":"Con mi empleo de tiempo completo"}, + {"value":"Con mi empleo de tiempo parcial","label":"Con mi empleo de tiempo parcial"}, + {"value":"Con trabajo independiente/emprendimiento","label":"Con trabajo independiente/emprendimiento"}, + {"value":"Me ayudan mis familiares","label":"Me ayudan mis familiares"}, + {"value":"Es difícil sostenerlo con mis ingresos","label":"Es difícil sostenerlo con mis ingresos"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options, conditional_rules) -VALUES ( - '40000000-0000-0000-0000-000000000018', - '30000000-0000-0000-0000-000000000001', - 'D4', 'multiple_choice', - '¿Tiene condición diagnosticada? (podés marcar más de una)', - 18, true, false, - '[ - {"value":"Demencia/Alzheimer","label":"Demencia/Alzheimer"}, - {"value":"ACV/Parálisis","label":"ACV/Parálisis"}, - {"value":"Enf. crónica","label":"Enf. crónica"}, - {"value":"Movilidad reducida","label":"Movilidad reducida"}, - {"value":"Deterioro cognitivo","label":"Deterioro cognitivo"}, - {"value":"Ninguna específica","label":"Ninguna específica"} - ]'::jsonb, - '[{"if_question":"D1","op":"eq","value":"Sí","action":"show"}]'::jsonb -); +-- 3.4: CONFIDENCIAL — is_sensitive=true, analyst-only +-- No exponer en ninguna vista accesible a org_admin (ADR-001 addendum) +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000032','30000000-0000-0000-0000-000000000001', + '3.4','single_choice','¿En qué franja salarial mensual te ubicás?',32,true,false, + '[{"value":"Sueldo mínimo – Gs. 5.000.000","label":"Sueldo mínimo – Gs. 5.000.000"}, + {"value":"Gs. 5.000.001–8.000.000","label":"Gs. 5.000.001–8.000.000"}, + {"value":"Gs. 8.000.001–12.000.000","label":"Gs. 8.000.001–12.000.000"}, + {"value":"Gs. 12.000.001–15.000.000","label":"Gs. 12.000.001–15.000.000"}, + {"value":"Gs. 15.000.001–18.000.000","label":"Gs. 15.000.001–18.000.000"}, + {"value":"Gs. 18.000.001–25.000.000","label":"Gs. 18.000.001–25.000.000"}, + {"value":"Gs. 25.000.001–50.000.000","label":"Gs. 25.000.001–50.000.000"}, + {"value":"Gs. 50.000.001 o más","label":"Gs. 50.000.001 o más"}, + {"value":"Prefiero no decir","label":"Prefiero no decir"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options, conditional_rules) -VALUES ( - '40000000-0000-0000-0000-000000000019', - '30000000-0000-0000-0000-000000000001', - 'D5', 'single_choice', - '¿La persona vive con vos o en otra vivienda?', - 19, false, false, - '[ - {"value":"Vive conmigo","label":"Vive conmigo"}, - {"value":"Otra vivienda","label":"Otra vivienda"}, - {"value":"Institución","label":"Institución"} - ]'::jsonb, - '[{"if_question":"D1","op":"eq","value":"Sí","action":"show"}]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000033','30000000-0000-0000-0000-000000000001', + '3.5','rating','¿Los gastos de cuidado impactan en tu situación económica personal?',33,false,false, + '{"min":1,"max":5,"min_label":"Sin impacto","max_label":"Muy alto impacto"}'::jsonb); --- ══════════════════════════════════════════════════ --- SECCIÓN E — Tu Rol como Cuidador/a (top-level) --- ══════════════════════════════════════════════════ +-- ══════════════════════════════════════════════════════════════ +-- SECCIÓN 4 — Tiempo y descanso (top-level) +-- ══════════════════════════════════════════════════════════════ -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000020', - '30000000-0000-0000-0000-000000000001', - 'E1', 'single_choice', - '¿Cuántas horas por día dedicás, en promedio, al cuidado directo?', - 20, false, false, - '[ - {"value":"Menos de 1h","label":"Menos de 1h"}, - {"value":"1-3h","label":"1-3h"}, - {"value":"3-6h","label":"3-6h"}, - {"value":"Más de 6h","label":"Más de 6h"}, - {"value":"Variable","label":"Variable"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000034','30000000-0000-0000-0000-000000000001', + '4.1','single_choice','¿Cómo describirías tu nivel de descanso habitual?',34,false,false, + '[{"value":"Descanso bien, me siento recuperado/a","label":"Descanso bien, me siento recuperado/a"}, + {"value":"Descanso de forma irregular, pero lo manejo","label":"Descanso de forma irregular, pero lo manejo"}, + {"value":"Me cuesta descansar, me siento cansado/a con frecuencia","label":"Me cuesta descansar, me siento cansado/a con frecuencia"}, + {"value":"Descanso muy poco, el agotamiento afecta mi día a día","label":"Descanso muy poco, el agotamiento afecta mi día a día"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000021', - '30000000-0000-0000-0000-000000000001', - 'E2', 'multiple_choice', - '¿En qué momentos realizás principalmente el cuidado? (podés marcar más de una)', - 21, false, false, - '[ - {"value":"Antes del trabajo","label":"Antes del trabajo"}, - {"value":"Durante horario laboral","label":"Durante horario laboral"}, - {"value":"Al llegar","label":"Al llegar"}, - {"value":"Durante la noche","label":"Durante la noche"}, - {"value":"Fines de semana","label":"Fines de semana"}, - {"value":"Continuo","label":"Continuo"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000035','30000000-0000-0000-0000-000000000001', + '4.2','multiple_choice','¿Qué aspectos de tu vida se ven más afectados por tu rol de cuidador/a?',35,false,false, + '[{"value":"Tiempo libre y ocio","label":"Tiempo libre y ocio"}, + {"value":"Sueño y descanso","label":"Sueño y descanso"}, + {"value":"Vida social y amistades","label":"Vida social y amistades"}, + {"value":"Vida en pareja/familiar","label":"Vida en pareja/familiar"}, + {"value":"Salud física personal","label":"Salud física personal"}, + {"value":"Salud emocional/mental","label":"Salud emocional/mental"}, + {"value":"Desarrollo profesional","label":"Desarrollo profesional"}, + {"value":"Situación económica","label":"Situación económica"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000022', - '30000000-0000-0000-0000-000000000001', - 'E3', 'single_choice', - '¿Contás con apoyo de otras personas para el cuidado?', - 22, false, false, - '[ - {"value":"Apoyo familiar suficiente","label":"Apoyo familiar suficiente"}, - {"value":"Apoyo insuficiente","label":"Apoyo insuficiente"}, - {"value":"Único responsable","label":"Único responsable"}, - {"value":"Apoyo contratado","label":"Apoyo contratado"} - ]'::jsonb -); - -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000023', - '30000000-0000-0000-0000-000000000001', - 'E4', 'single_choice', - '¿Tuviste que faltar al trabajo por el cuidado en el último año?', - 23, false, false, - '[ - {"value":"Nunca","label":"Nunca"}, - {"value":"Pocas veces (1-3)","label":"Pocas veces (1-3)"}, - {"value":"Varias veces (4-10)","label":"Varias veces (4-10)"}, - {"value":"Con frecuencia (10+)","label":"Con frecuencia (10+)"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000036','30000000-0000-0000-0000-000000000001', + '4.3','rating','En una escala del 1 al 5, ¿cómo evaluás tu bienestar general en este momento?',36,false,false, + '{"min":1,"max":5,"min_label":"Muy mal","max_label":"Muy bien"}'::jsonb); --- ══════════════════════════════════════════════════ --- SECCIÓN F — Impacto Económico (top-level) --- ══════════════════════════════════════════════════ +-- ══════════════════════════════════════════════════════════════ +-- SECCIÓN 5 — Impacto en el trabajo (top-level) +-- ══════════════════════════════════════════════════════════════ -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000024', - '30000000-0000-0000-0000-000000000001', - 'F1', 'single_choice', - '¿Cuánto estimás que gastás mensualmente en el cuidado?', - 24, false, false, - '[ - {"value":"Sin gastos significativos","label":"Sin gastos significativos"}, - {"value":"Menos de 500k","label":"Menos de 500k"}, - {"value":"500k-1.5M","label":"500k-1.5M"}, - {"value":"1.5M-3M","label":"1.5M-3M"}, - {"value":"3M-6M","label":"3M-6M"}, - {"value":"Más de 6M","label":"Más de 6M"}, - {"value":"Prefiero no decir","label":"Prefiero no decir"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000037','30000000-0000-0000-0000-000000000001', + '5.1','single_choice', + 'En los últimos 3 meses, ¿con qué frecuencia sentiste que el cuidado afectó tu concentración o rendimiento?', + 37,false,false, + '[{"value":"Nunca o casi nunca","label":"Nunca o casi nunca"}, + {"value":"Algunas veces al mes","label":"Algunas veces al mes"}, + {"value":"Varias veces por semana","label":"Varias veces por semana"}, + {"value":"Casi todos los días","label":"Casi todos los días"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000025', - '30000000-0000-0000-0000-000000000001', - 'F2', 'multiple_choice', - '¿Qué servicios o apoyos utilizás actualmente? (podés marcar más de una)', - 25, false, false, - '[ - {"value":"Terapias especializadas","label":"Terapias especializadas"}, - {"value":"Cuidador particular","label":"Cuidador particular"}, - {"value":"Centro de día","label":"Centro de día"}, - {"value":"Transporte adaptado","label":"Transporte adaptado"}, - {"value":"Medicación alto costo","label":"Medicación alto costo"}, - {"value":"Tecnología asistiva","label":"Tecnología asistiva"}, - {"value":"Apoyo ONG","label":"Apoyo ONG"}, - {"value":"Sin servicios formales","label":"Sin servicios formales"} - ]'::jsonb -); - --- F3: rating — escala 1-5 (Sin impacto → Muy alto impacto) -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000026', - '30000000-0000-0000-0000-000000000001', - 'F3', 'rating', - '¿Los gastos de cuidado impactan en tu situación económica personal?', - 26, false, false, - '{"min":1,"max":5,"min_label":"Sin impacto","max_label":"Muy alto impacto"}'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000038','30000000-0000-0000-0000-000000000001', + '5.2','single_choice', + 'En el último año, ¿faltaste al trabajo por situaciones relacionadas al cuidado?',38,false,false, + '[{"value":"Nunca","label":"Nunca"}, + {"value":"Pocas veces (1–3 veces al año)","label":"Pocas veces (1–3 veces al año)"}, + {"value":"Varias veces (4–10 veces al año)","label":"Varias veces (4–10 veces al año)"}, + {"value":"Con frecuencia (más de 10 veces al año)","label":"Con frecuencia (más de 10 veces al año)"}]'::jsonb); --- ══════════════════════════════════════════════════ --- SECCIÓN G — Bienestar y Descanso (top-level) --- ══════════════════════════════════════════════════ +-- ══════════════════════════════════════════════════════════════ +-- SECCIÓN 6 — Conciencia organizacional (top-level) +-- 6.2: multiple_choice max_select=3 (ranking en backlog) +-- 6.4/6.5: códigos corregidos (eran 6.2/6.3 duplicados en el HTML original) +-- ══════════════════════════════════════════════════════════════ -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000027', - '30000000-0000-0000-0000-000000000001', - 'G1', 'single_choice', - '¿Cómo describirías tu nivel de descanso habitual?', - 27, false, false, - '[ - {"value":"Descanso bien","label":"Descanso bien"}, - {"value":"Descanso irregular","label":"Descanso irregular"}, - {"value":"Me cuesta descansar","label":"Me cuesta descansar"}, - {"value":"Muy poco descanso","label":"Muy poco descanso"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000039','30000000-0000-0000-0000-000000000001', + '6.1','single_choice', + '¿Sentís que tu empresa conoce o comprende la realidad del cuidado y la discapacidad de su gente?', + 39,false,false, + '[{"value":"Sí, me siento acompañado/a","label":"Sí, me siento acompañado/a"}, + {"value":"Parcialmente, hay cierta comprensión","label":"Parcialmente, hay cierta comprensión"}, + {"value":"No, es algo bastante invisible","label":"No, es algo bastante invisible"}, + {"value":"No, nunca se ha hablado del tema","label":"No, nunca se ha hablado del tema"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000028', - '30000000-0000-0000-0000-000000000001', - 'G2', 'single_choice', - 'En los últimos 3 meses, ¿con qué frecuencia el cuidado afectó tu concentración o rendimiento laboral?', - 28, false, false, - '[ - {"value":"Nunca/casi nunca","label":"Nunca/casi nunca"}, - {"value":"Algunas veces al mes","label":"Algunas veces al mes"}, - {"value":"Varias veces por semana","label":"Varias veces por semana"}, - {"value":"Casi todos los días","label":"Casi todos los días"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,max_select,options) +VALUES ('40000000-0000-0000-0000-000000000040','30000000-0000-0000-0000-000000000001', + '6.2','multiple_choice','¿Qué apoyos de la empresa te ayudarían más? Elegí hasta 3',40,false,false,3, + '[{"value":"Flexibilidad horaria o trabajo remoto","label":"Flexibilidad horaria o trabajo remoto"}, + {"value":"Apoyo económico o convenios/descuentos","label":"Apoyo económico o convenios/descuentos"}, + {"value":"Acceso a terapias o salud","label":"Acceso a terapias o salud"}, + {"value":"Contención/apoyo emocional o psicológico","label":"Contención/apoyo emocional o psicológico"}, + {"value":"Capacitación y autocuidado","label":"Capacitación y autocuidado"}, + {"value":"Redes de apoyo/grupos de pares","label":"Redes de apoyo/grupos de pares"}, + {"value":"Información sobre recursos y servicios disponibles","label":"Información sobre recursos y servicios disponibles"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000029', - '30000000-0000-0000-0000-000000000001', - 'G3', 'multiple_choice', - '¿Qué aspectos de tu vida se ven más afectados? (podés marcar más de una)', - 29, false, false, - '[ - {"value":"Tiempo libre","label":"Tiempo libre"}, - {"value":"Sueño y descanso","label":"Sueño y descanso"}, - {"value":"Vida social","label":"Vida social"}, - {"value":"Vida en pareja/familia","label":"Vida en pareja/familia"}, - {"value":"Salud física","label":"Salud física"}, - {"value":"Salud emocional","label":"Salud emocional"}, - {"value":"Desarrollo profesional","label":"Desarrollo profesional"}, - {"value":"Situación económica","label":"Situación económica"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000041','30000000-0000-0000-0000-000000000001', + '6.3','single_choice', + '¿Estarías dispuesto/a a participar en un grupo de apoyo para cuidadores dentro de la empresa?', + 41,false,false, + '[{"value":"Sí, definitivamente","label":"Sí, definitivamente"}, + {"value":"Tal vez, si hay más personas en la misma situación","label":"Tal vez, si hay más personas en la misma situación"}, + {"value":"No por ahora","label":"No por ahora"}, + {"value":"Prefiero mantenerlo en privado","label":"Prefiero mantenerlo en privado"}]'::jsonb); --- G4: rating — escala 1-5 (Muy mal → Muy bien) -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000030', - '30000000-0000-0000-0000-000000000001', - 'G4', 'rating', - '¿Cómo evaluás tu bienestar general en este momento?', - 30, false, false, - '{"min":1,"max":5,"min_label":"Muy mal","max_label":"Muy bien"}'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000042','30000000-0000-0000-0000-000000000001', + '6.4','single_choice', + '¿Conocés a algún compañero/a de trabajo que esté al cuidado de una persona con discapacidad o dependiente?', + 42,false,false, + '[{"value":"Sí, conozco a varias personas","label":"Sí, conozco a varias personas"}, + {"value":"Sí, conozco a una persona","label":"Sí, conozco a una persona"}, + {"value":"No conozco a nadie","label":"No conozco a nadie"}, + {"value":"No estoy seguro/a","label":"No estoy seguro/a"}]'::jsonb); -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000031', - '30000000-0000-0000-0000-000000000001', - 'G5', 'single_choice', - '¿Sentís que tu empresa comprende la realidad de ser cuidador/a?', - 31, false, false, - '[ - {"value":"Sí, acompañado/a","label":"Sí, acompañado/a"}, - {"value":"Parcialmente","label":"Parcialmente"}, - {"value":"No, invisible","label":"No, invisible"}, - {"value":"Nunca lo supo","label":"Nunca lo supo"} - ]'::jsonb -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required,options) +VALUES ('40000000-0000-0000-0000-000000000043','30000000-0000-0000-0000-000000000001', + '6.5','single_choice', + '¿Considerás que la empresa debería ofrecer apoyos a quienes cuidan a una persona dependiente?', + 43,false,false, + '[{"value":"Sí, definitivamente","label":"Sí, definitivamente"}, + {"value":"Tal vez, dependería del caso","label":"Tal vez, dependería del caso"}, + {"value":"No lo considero necesario","label":"No lo considero necesario"}, + {"value":"No lo sé","label":"No lo sé"}]'::jsonb); --- ══════════════════════════════════════════════════ --- SECCIÓN H — Necesidades (top-level) --- ══════════════════════════════════════════════════ +-- ══════════════════════════════════════════════════════════════ +-- SECCIÓN 7 — Para cerrar (top-level) +-- 7.1: text_long — NO exponer en agg_segment ni store analítico (regla 4 CLAUDE.md) +-- ══════════════════════════════════════════════════════════════ --- H1: multiple_choice con max_select = 3 -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, max_select, options) -VALUES ( - '40000000-0000-0000-0000-000000000032', - '30000000-0000-0000-0000-000000000001', - 'H1', 'multiple_choice', - '¿Qué tipo de apoyo de tu empresa te ayudaría más? (hasta 3 opciones)', - 32, false, false, 3, - '[ - {"value":"Flexibilidad horaria/remoto","label":"Flexibilidad horaria/remoto"}, - {"value":"Info recursos y servicios","label":"Info recursos y servicios"}, - {"value":"Apoyo psicológico","label":"Apoyo psicológico"}, - {"value":"Espacio de escucha","label":"Espacio de escucha"}, - {"value":"Convenios descuentos","label":"Convenios descuentos"}, - {"value":"Grupos de pares","label":"Grupos de pares"}, - {"value":"Capacitación autocuidado","label":"Capacitación autocuidado"}, - {"value":"Nada, estoy bien","label":"Nada, estoy bien"} - ]'::jsonb -); - -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required, options) -VALUES ( - '40000000-0000-0000-0000-000000000033', - '30000000-0000-0000-0000-000000000001', - 'H2', 'single_choice', - '¿Estarías dispuesto/a a participar en un grupo de apoyo para cuidadores?', - 33, false, false, - '[ - {"value":"Sí, definitivamente","label":"Sí, definitivamente"}, - {"value":"Tal vez","label":"Tal vez"}, - {"value":"No por ahora","label":"No por ahora"}, - {"value":"Prefiero privacidad","label":"Prefiero privacidad"} - ]'::jsonb -); - --- H3: text_long — opcional, NO exponer en store analítico crudo (regla 4 CLAUDE.md) -INSERT INTO public.questions - (id, survey_id, code, type, prompt, position, is_sensitive, required) -VALUES ( - '40000000-0000-0000-0000-000000000034', - '30000000-0000-0000-0000-000000000001', - 'H3', 'text_long', - '¿Querés compartir algo más sobre tu experiencia como cuidador/a? (opcional)', - 34, false, false -); +INSERT INTO public.questions (id,survey_id,code,type,prompt,position,is_sensitive,required) +VALUES ('40000000-0000-0000-0000-000000000044','30000000-0000-0000-0000-000000000001', + '7.1','text_long','¿Te gustaría dejar un comentario o sugerencia especial? (opcional)',44,false,false);