From cfd2eb062425a6eacab9a3e4ea24c33cf7de1758 Mon Sep 17 00:00:00 2001 From: markosbenitez Date: Thu, 11 Jun 2026 16:56:17 -0300 Subject: [PATCH] docs: estado del proyecto 11 junio 2026 --- PROJECT_STATUS.md | 114 ------------- docs/estado/ESTADO_PROYECTO_JUNIO_2026.md | 155 ++++++++++++++++++ .../sprint-3-instrumento/ETAPA_3ALL_PROMPT.md | 124 ++++++++++++++ 3 files changed, 279 insertions(+), 114 deletions(-) delete mode 100644 PROJECT_STATUS.md create mode 100644 docs/estado/ESTADO_PROYECTO_JUNIO_2026.md create mode 100644 sprints/sprint-3-instrumento/ETAPA_3ALL_PROMPT.md diff --git a/PROJECT_STATUS.md b/PROJECT_STATUS.md deleted file mode 100644 index 96a2266..0000000 --- a/PROJECT_STATUS.md +++ /dev/null @@ -1,114 +0,0 @@ -# ESTADO DEL PROYECTO — Datos País sobre el Cuidado -## Documento de continuidad — junio 2026 (actualización) - -> Director: Marcos · Metodología: Maria Mersan · Contacto Fundación: Valeria Arce -> Última actualización: 10 junio 2026 - ---- - -## 1. URLs operativas - -| Encuesta | URL | -|---|---| -| Demo (Empresa Demo) | https://economia-cuidado.inqualityhq.com/?s=30000000-0000-0000-0000-000000000001 | -| InQuality | https://economia-cuidado.inqualityhq.com/?s=30000000-0000-0000-0000-000000000002 | -| Fundación Solidaridad | https://economia-cuidado.inqualityhq.com/?s=30000000-0000-0000-0000-000000000003 | -| Control de respuestas | https://economia-cuidado.inqualityhq.com/admin/responses | -| Dashboard | https://economia-cuidado.inqualityhq.com/dashboard | - ---- - -## 2. Infraestructura — OPERATIVA ✅ - -- **App:** Next.js 15.3.3 + TypeScript + Tailwind CSS (⚠️ CVE-2025-66478 pendiente) -- **DB:** Supabase self-hosted en Dokploy v0.29.4 -- **VPS:** inq-mart-2, IP VPN: 172.20.5.11 -- **Repos:** - - App: `git.inquality.com.py/marcos/motor-de-encuestas` (rama main) - - Supabase stack: `git.inquality.com.py/marcos/supabase-motor-fomularios` (rama master) -- **API Supabase:** https://db.inqualityhq.com (Kong + SSL) -- **Backups:** `/var/backups/supabase-prod/`, cron 3AM, retención GFS (3 días diarios + domingos 14 días) - ---- - -## 3. Instrumento — v2.1 ACTIVO - -- **44 preguntas**, 8 secciones -- **Salto triple:** 1.1=No AND 1.6=No AND 1.13=No → salta a 6.4 -- **Nueva pregunta 6.6:** "¿Estarías dispuesto/a a ser voluntario/a en iniciativas y/o redes de apoyo?" -- **2.4 eliminada** (similar a 2.1) -- **2.1 → multiple_choice** (TECH-DEBT: falta ranking de prioridad) -- "Prefiero no decir" eliminado de todas las preguntas -- Hint "Podés marcar más de una opción" en todas las multiple_choice -- "Tecnología asistiva" agregada en 1.3 y 1.10 (penúltima posición) - ---- - -## 4. DB — estado actual - -| Tabla | Filas | -|---|---| -| organizations | 3 (Empresa Demo, InQuality, Fundación Solidaridad) | -| surveys | 3 (una por organización) | -| questions | 132 (44 × 3 surveys) | -| responses | 3 (todas de prueba) | -| answers | 97 (de prueba) | - ---- - -## 5. Vista de control /admin/responses - -- Tabla plana: una fila por answer, agrupada por submission -- Excluye: `text_long`, `is_sensitive=true`, `3.4` (salary) -- Sin auth — URL no publicada (TECH-DEBT-008) -- **Pendiente:** contraer/expandir por submission + eliminar columna Tipo - ---- - -## 6. Deuda técnica abierta - -| ID | Descripción | Bloqueante | -|---|---|---| -| TECH-DEBT-006 | Backup remoto S3 | **SÍ — antes del primer dato real** | -| TECH-DEBT-007 | auth.jwt() deprecado en GoTrue v2.189+ | No (piloto) | -| TECH-DEBT-008 | /admin/responses sin auth | No (URL no publicada) | -| CVE-2025-66478 | Next.js 15.3.3 con vulnerabilidad crítica | **SÍ — antes del primer dato real** | - ---- - -## 7. Pendientes inmediatos (en orden) - -1. **CVE-2025-66478** — actualizar Next.js (bloqueante antes del primer dato real) -2. **TECH-DEBT-006** — backup remoto S3 (bloqueante antes del primer dato real) -3. **Etapa 2G** — cierre Sprint 2: C.8, AP.10, AP.11 en el método -4. **Admin/responses** — contraer/expandir + eliminar columna Tipo -5. **RE Index** — confirmar mapeo G1/G2/G4/G5 → códigos seed antes de implementar -6. **Informe descargable** — prometido en deck comercial - ---- - -## 8. Decisiones tomadas — no reabrir - -1. Supabase en Dokploy siempre via modo Git (no docker raw) -2. POSTGRES_PASSWORD siempre con `openssl rand -hex` -3. kong.yml: una sola entrada por bloque keyauth_credentials -4. SMTP_PORT=587 siempre explícito aunque SMTP esté desactivado -5. GOTRUE_EXTERNAL_ANONYMOUS_USERS_ENABLED=false siempre explícito -6. LUA_AUTH_EXPR con prefijo "Bearer " en kong-entrypoint.sh rama legacy -7. NEXT_PUBLIC_SUPABASE_URL via Build Argument en Dokploy -8. App Next.js conecta a https://db.inqualityhq.com (URL pública) -9. /admin/responses no muestra is_sensitive=true hasta tener auth (TECH-DEBT-008) -10. brand_config.org_name es el campo que alimenta el nombre de empresa en el formulario -11. Organizaciones separadas para cada encuesta (InQuality y Fundación Solidaridad) -12. conditional_rules referencian códigos de pregunta, no UUIDs - ---- - -## 9. Contexto comercial - -- 2 empresas comprometidas para piloto -- Cronograma: JUN inicio · JUL-AGO relevamiento · SEP análisis · OCT informe + evento -- Meta: 20 empresas pioneras -- Precios: Gs. 4.5M (≤50) · 7.5M (≤200) · 12M (≤400) -- GAPs deck vs producto: RE Index no implementado, informe descargable no existe -- Contacto Fundación: Valeria Arce — ddff@fundacionsolidaridad.org.py · +595 991 854333 diff --git a/docs/estado/ESTADO_PROYECTO_JUNIO_2026.md b/docs/estado/ESTADO_PROYECTO_JUNIO_2026.md new file mode 100644 index 0000000..d7289b8 --- /dev/null +++ b/docs/estado/ESTADO_PROYECTO_JUNIO_2026.md @@ -0,0 +1,155 @@ +# ESTADO DEL PROYECTO — Datos País sobre el Cuidado +## Documento de continuidad — 11 junio 2026 + +> Director: Marcos · Metodología: Maria Mersan · Contacto Fundación: Valeria Arce + +--- + +## 1. URLs operativas + +| Recurso | URL | +|---|---| +| Formulario Demo | https://economia-cuidado.inqualityhq.com/?s=30000000-0000-0000-0000-000000000001 | +| Formulario InQuality | https://economia-cuidado.inqualityhq.com/?s=30000000-0000-0000-0000-000000000002 | +| Formulario Fundación Solidaridad | https://economia-cuidado.inqualityhq.com/?s=30000000-0000-0000-0000-000000000003 | +| Dashboard — Todos | https://economia-cuidado.inqualityhq.com/dashboard?survey_id=00000000-0000-0000-0000-000000000000 | +| Dashboard — InQuality | https://economia-cuidado.inqualityhq.com/dashboard?survey_id=30000000-0000-0000-0000-000000000002 | +| Dashboard — Fundación Solidaridad | https://economia-cuidado.inqualityhq.com/dashboard?survey_id=30000000-0000-0000-0000-000000000003 | +| Dashboard — Demo | https://economia-cuidado.inqualityhq.com/dashboard?survey_id=30000000-0000-0000-0000-000000000001 | +| Control de respuestas | https://economia-cuidado.inqualityhq.com/admin/responses | + +--- + +## 2. Infraestructura — OPERATIVA ✅ + +- **App:** Next.js 15.3.8 (CVE-2025-66478 resuelto ✅) +- **DB:** Supabase self-hosted en Dokploy v0.29.4 +- **VPS:** inq-mart-2, IP VPN: 172.20.5.11 +- **Repos:** + - App: `git.inquality.com.py/marcos/motor-de-encuestas` (rama main) + - Supabase stack: `git.inquality.com.py/marcos/supabase-motor-fomularios` (rama master) +- **API Supabase:** https://db.inqualityhq.com (Kong + SSL) +- **Backups:** `/var/backups/supabase-prod/`, cron 3AM, GFS (3 días diarios + domingos 14 días) +- **Studio:** solo vía SSH tunnel → `ssh -L 3001:localhost:3001 administrator@172.20.5.11` + +--- + +## 3. Instrumento — v2.1 ACTIVO + +- **44 preguntas**, 8 secciones +- **Salto triple:** 1.1=No AND 1.6=No AND 1.13=No → salta a 6.4 (validado con datos reales ✅) +- **Nueva pregunta 6.6:** voluntariado en redes de apoyo (Sí/No/Tal vez) +- **2.4 eliminada**, **2.1 → multiple_choice** +- "Prefiero no decir" eliminado de todas las preguntas +- Hint "Podés marcar más de una opción" en todas las multiple_choice +- "Tecnología asistiva" en 1.3 y 1.10 + +--- + +## 4. DB — estado actual + +| Tabla | Filas | +|---|---| +| organizations | 3 (Empresa Demo, InQuality, Fundación Solidaridad) | +| surveys | 3 (una por organización) | +| questions | 132 (44 × 3 surveys) | +| responses | 15 (8 InQuality + 7 Demo — todas de prueba) | +| answers | ~500 (estimado) | + +--- + +## 5. Dashboard — multitenante operativo ✅ + +- Selector de empresa en el header: Todos / InQuality / Fundación Solidaridad / Demo +- "Todos" usa UUID especial `00000000-0000-0000-0000-000000000000` → pool agregado +- Implementado via flag en `_dash_responses` (migración `20260611000001`) +- Validado visualmente con n=15: KPIs, heatmap departamental, perfil población ✅ + +--- + +## 6. Vista de control /admin/responses + +- Tabla plana: una fila por answer, agrupada por submission +- Colapsar/expandir por submission (Client Component island) +- Excluye: `text_long`, `is_sensitive=true` (TECH-DEBT-008 — sin auth) +- Sin columna "Tipo" + +--- + +## 7. Método — Sprint 2 cerrado ✅ + +- `method/PATTERNS.md` y `method/ANTI_PATTERNS.md` creados en el repo +- C.8 promovido a estable con casos reales del proyecto +- AP.10 y AP.11 documentados con casos reales + +--- + +## 8. Deuda técnica abierta + +| ID | Descripción | Bloqueante | +|---|---|---| +| TECH-DEBT-006 | Backup remoto S3 | SÍ — antes del primer dato real | +| TECH-DEBT-007 | auth.jwt() deprecado en GoTrue v2.189+ | No (piloto) | +| TECH-DEBT-008 | /admin/responses sin auth | No (URL no publicada) | +| TECH-DEBT-009 | Rotar secrets Supabase post-CVE-2025-66478 | SÍ — antes del primer dato real | + +--- + +## 9. Pendientes próxima sesión + +1. TECH-DEBT-006 — backup remoto S3 +2. TECH-DEBT-009 — rotar secrets Supabase +3. RE Index — confirmar mapeo G1/G2/G4/G5 → códigos seed con Marcos +4. Informe descargable — prometido en deck comercial +5. Onboarding empresas reales — cuando validación esté lista + +--- + +## 10. Decisiones tomadas — no reabrir + +1. Supabase en Dokploy siempre via modo Git +2. POSTGRES_PASSWORD siempre con `openssl rand -hex` +3. kong.yml: una sola entrada por bloque keyauth_credentials +4. SMTP_PORT=587 siempre explícito aunque SMTP esté desactivado +5. GOTRUE_EXTERNAL_ANONYMOUS_USERS_ENABLED=false siempre explícito +6. LUA_AUTH_EXPR con prefijo "Bearer " en kong-entrypoint.sh +7. NEXT_PUBLIC_SUPABASE_URL via Build Argument en Dokploy +8. App conecta a https://db.inqualityhq.com +9. /admin/responses no muestra is_sensitive=true sin auth (TECH-DEBT-008) +10. brand_config.org_name alimenta el nombre de empresa en el formulario +11. Organizaciones separadas para cada encuesta +12. conditional_rules referencian códigos de pregunta, no UUIDs +13. UUID cero `00000000-...` es el flag p_all del dashboard +14. Next.js pinneado a versión exacta `15.3.8` (sin caret) + +--- + +## 11. Contexto comercial + +- 2 empresas comprometidas para piloto (InQuality y Fundación Solidaridad en espacio de pruebas) +- Cronograma: JUN inicio · JUL-AGO relevamiento · SEP análisis · OCT informe + evento +- Meta: 20 empresas pioneras +- Precios: Gs. 4.5M (≤50) · 7.5M (≤200) · 12M (≤400) +- GAPs deck vs producto: RE Index no implementado, informe descargable no existe +- Contacto Fundación: Valeria Arce — ddff@fundacionsolidaridad.org.py · +595 991 854333 + +--- + +## 12. Prompt para nueva sesión + +Pegá al inicio de la nueva conversación: + +--- + +Sos el copiloto técnico del proyecto "Datos País sobre el Cuidado" — plataforma soberana +de encuestas sobre economía del cuidado en Paraguay. Tenemos múltiples sesiones de trabajo. + +Stack: Next.js 15.3.8 + Supabase self-hosted + Dokploy v0.29.4. +URL: https://economia-cuidado.inqualityhq.com +Repos en Gitea: git.inquality.com.py/marcos/ + +El estado completo está en `docs/estado/ESTADO_PROYECTO_JUNIO_2026.md` en el repo. +Los prompts de etapas pasadas están en `sprints/`. +Las reglas no negociables están en `CLAUDE.md`. + +Próximos pasos: [COMPLETAR CON LO QUE VAS A HACER] \ No newline at end of file diff --git a/sprints/sprint-3-instrumento/ETAPA_3ALL_PROMPT.md b/sprints/sprint-3-instrumento/ETAPA_3ALL_PROMPT.md new file mode 100644 index 0000000..7366927 --- /dev/null +++ b/sprints/sprint-3-instrumento/ETAPA_3ALL_PROMPT.md @@ -0,0 +1,124 @@ +# ETAPA 3ALL — Flag p_all en el dashboard (vista agregada de todos los surveys) + +## 1. Objetivo +Permitir que el dashboard muestre datos de TODOS los surveys mezclados, usando un +UUID especial como flag. Cambio mínimo — solo toca `_dash_responses` y el frontend. +Las 11 RPCs no se modifican. + +--- + +## 2. Contexto previo +- `_dash_responses(p_survey_id uuid, ...)` es la función base que usan las 11 RPCs. +- Todas las RPCs pasan `p_survey_id` a `_dash_responses`. +- El dashboard lee `?survey_id=UUID` de la URL y lo pasa a `/api/dashboard/[widget]`. +- `route.ts` requiere `survey_id` en la query string (400 si falta). + +## 3. DECISIONES YA TOMADAS — no consultar de nuevo +- UUID especial para "todos": `00000000-0000-0000-0000-000000000000` (UUID cero). + No puede existir como survey real. Es el flag `p_all`. +- Implementación en `_dash_responses`: una sola línea cambia. +- Las 11 RPCs NO se tocan — el cambio es transparente para ellas. +- El cambio va en una NUEVA migración, no modifica las existentes. +- El k-anonimato sigue aplicando — el pool más grande solo beneficia la protección. + +--- + +## 4. Cambios requeridos + +### 4.1 Nueva migración SQL +Crear `supabase/migrations/20260611000001_dash_responses_all.sql`: + +```sql +-- Migración: agregar flag p_all a _dash_responses +-- UUID especial '00000000-0000-0000-0000-000000000000' = todos los surveys +CREATE OR REPLACE FUNCTION public._dash_responses( + p_survey_id uuid, + p_depto text DEFAULT NULL, + p_genero text[] DEFAULT NULL, + p_etario text[] DEFAULT NULL, + p_modalidad text[] DEFAULT NULL +) +RETURNS TABLE(response_id uuid) +LANGUAGE sql STABLE SECURITY DEFINER +SET search_path = public +AS $$ + SELECT r.id + FROM public.responses r + WHERE (p_survey_id = '00000000-0000-0000-0000-000000000000' + OR r.survey_id = p_survey_id) + AND (p_depto IS NULL OR r.qi_zone = p_depto) + AND (p_genero IS NULL OR cardinality(p_genero) = 0 OR EXISTS ( + SELECT 1 FROM public.answers a + JOIN public.questions q ON q.id = a.question_id + WHERE a.response_id = r.id AND q.code = 'A6' + AND a.value #>> '{}' = ANY(p_genero) + )) + AND (p_etario IS NULL OR cardinality(p_etario) = 0 + OR r.qi_age_bucket = ANY(p_etario)) + AND (p_modalidad IS NULL OR cardinality(p_modalidad) = 0 OR EXISTS ( + SELECT 1 FROM public.answers a + JOIN public.questions q ON q.id = a.question_id + WHERE a.response_id = r.id AND q.code = 'A7' + AND a.value #>> '{}' = ANY(p_modalidad) + )); +$$; +``` + +### 4.2 route.ts — permitir el UUID especial +En `app/api/dashboard/[widget]/route.ts`, donde se valida `survey_id`: +El UUID cero debe pasar la validación existente — verificar si hay algún check +adicional que lo rechazaría (ej. validación de formato UUID o lookup en DB). +Si `route.ts` solo verifica presencia del parámetro (400 si falta), no hay +nada que cambiar. Reportar cuál es el caso. + +### 4.3 dashboard/page.tsx — agregar link/selector "Todos" +Agregar en el header del dashboard un selector o links de navegación mínimo: + +``` +[ Todos ] [ InQuality ] [ Fundación Solidaridad ] [ Demo ] +``` + +Implementación sugerida: links `` simples que navegan a: +- Todos: `/dashboard?survey_id=00000000-0000-0000-0000-000000000000` +- InQuality: `/dashboard?survey_id=30000000-0000-0000-0000-000000000002` +- Fundación Solidaridad: `/dashboard?survey_id=30000000-0000-0000-0000-000000000003` +- Demo: `/dashboard?survey_id=30000000-0000-0000-0000-000000000001` + +El survey activo se destaca visualmente (comparar `surveyId` del searchParam +con el UUID de cada link). Estilo `.admin-*` no aplica acá — usar clases +`.db-*` o tokens CSS existentes del dashboard. + +El label de cada opción puede ser hardcodeado por ahora — no hacer fetch +a `surveys` para obtener los nombres (Nivel 3, fuera de scope). + +--- + +## 5. Entregables (DoD) + +- [ ] Nueva migración `20260611000001_dash_responses_all.sql` creada. +- [ ] `_dash_responses` actualizada con el flag de UUID cero. +- [ ] `route.ts` permite el UUID especial (verificar y reportar). +- [ ] Dashboard muestra selector de empresa con "Todos" + las 3 empresas. +- [ ] Build exitoso. +- [ ] `git diff --name-only HEAD` en scope. + +## 6. Qué reportar +``` +Verificado: +- Migración creada ✓ +- route.ts: [necesitó cambio / no necesitó cambio — explicar] +- Selector visible en dashboard ✓ +- Build exitoso ✓ +- Diff en scope ✓ + +URL de validación: +- Todos: /dashboard?survey_id=00000000-0000-0000-0000-000000000000 +- InQuality: /dashboard?survey_id=30000000-0000-0000-0000-000000000002 +``` + +## 7. Qué NO hacer +- ❌ No modificar las migraciones existentes — solo agregar una nueva. +- ❌ No tocar las 11 RPCs directamente. +- ❌ No hacer fetch a `surveys` para obtener nombres de empresa. +- ❌ No agregar dependencias npm. +- ❌ No tocar el formulario ni `/admin/responses`. \ No newline at end of file