diff --git a/BACKLOG.md b/BACKLOG.md index b12c3f9..550c41e 100644 --- a/BACKLOG.md +++ b/BACKLOG.md @@ -130,6 +130,25 @@ Los assets SÍ existen en `assets/` (4 PNGs documentados en `simulador-web/CLAUD **Estimación:** Sprint 6 o posterior. Baja prioridad — los PDFs ya tienen "Powered by InQuality" en footer. +### [SPRINT-8] Consolidación modelo de cliente: organizations → areas → procesos + +Refactorización de modelo de datos para unificar los tres conceptos paralelos de "cliente" (process_groups, clientName, org_id) en una jerarquía de dos niveles. + +**Scope:** +- Nueva tabla `areas (id, org_id, name)` — reemplaza `process_groups` +- `area_id` en `processes` — reemplaza `group_id` +- Eliminar campo `clientName` (texto libre) del dominio y la UI +- `LibraryPage`: agrupa por org → área (en lugar de por clientName) +- Workspace sidebar: org como contexto (read-only), área como selector normalizado +- Admin UI: CRUD de áreas por org +- RLS para `areas` +- Migración: bulk-assign 154 procesos de prueba a InQuality, eliminar process_groups de prueba +- Tests E2E del flujo completo + +**Referencia:** `STRATEGIC_DIRECTION.md` → "Consolidación del modelo de cliente" (2026-07-07). + +--- + ### [BACKLOG] Ocultar Settings y ruta /settings para roles de cliente El ícono de tuerca (⚙) en LibraryPage es visible y navegable para `client_editor` y `client_viewer`. La página de configuración ("Etiqueta de grupos") es una feature interna de InQuality — un cliente no debería ver ni editar esta preferencia. diff --git a/STRATEGIC_DIRECTION.md b/STRATEGIC_DIRECTION.md index 74d137e..4848cf3 100644 --- a/STRATEGIC_DIRECTION.md +++ b/STRATEGIC_DIRECTION.md @@ -449,7 +449,55 @@ En tres etapas (AdminLayout, WorkspacePage, ImportPage), Claude Code implementó **Decisión del director:** implementado en Sprint 7 como Etapa 7B. Brief en `sprints/sprint-7/ETAPA_7B_PROMPT.md`. -Comportamiento: -- Admin en proceso de cliente → "← [nombre del cliente]" → `/library?org=` con scroll al cliente +Comportamiento **post-hotfix (2026-07-07):** +- Admin en proceso de cliente → "← [nombre del cliente]" → `/library` (sin `?org=`) - Admin en proceso sin org → "← Biblioteca" → `/library` - client_editor/viewer → "← Procesos" → `/library` + +**Nota:** La navegación con `?org=` + scroll fue descartada porque `LibraryPage` agrupa por `clientName` (texto libre), no por `org_id`. No existe una vista filtrada por org. El label contextual se mantiene ("← Solar Banco") porque aporta información al usuario; la navegación destino simplifica a `/library` hasta que exista la vista filtrada. + +--- + +### Consolidación del modelo de cliente: `organizations` → `areas` → procesos + +**Decisión del director (2026-07-07):** reemplazar los tres conceptos paralelos de "cliente" por una jerarquía unificada en dos niveles. + +**Estado actual — tres conceptos no reconciliados:** + +| Campo | Uso actual | Problema | +|---|---|---| +| `process_groups` (tabla) | Agrupador "Clientes" en LibraryPage | Nombre confuso, duplica el rol de organizations | +| `clientName` (texto libre) | Editable en workspace sidebar | Sin normalización, sin FK, sin validación | +| `org_id` (FK a organizations) | Multi-tenant Sprint 7 | Correcto pero desconectado de lo que muestra la UI | + +**Modelo objetivo:** + +``` +organizations (org_id) ← el cliente → entidad registrada por admin + └─ areas (area_id) ← área / equipo / unidad → normalizado por org, creado por admin + └─ processes ← tiene org_id + area_id (ambos nullables con lógica clara) +``` + +**Implicancias técnicas:** +- Nueva tabla `areas (id, org_id, name, description?, created_at)` — reemplaza `process_groups` +- Campo `area_id uuid REFERENCES areas(id)` reemplaza `group_id` en `processes` +- Campo `clientName` (texto libre) se elimina del dominio — el display viene de `org.name` + `area.name` +- `LibraryPage` agrupa por `org_id` (organización) y sub-agrupa por `area_id` (área) +- Workspace sidebar: el campo "cliente" pasa a ser un selector de área (dropdown de áreas de la org del proceso) +- Admin UI: CRUD de áreas por org (similar a CRUD de resources, scoped por org) +- RLS: `areas_select` — acceso transitivo por org (si ves la org, ves sus áreas) + +**Datos actuales:** los 154 procesos "sin cliente asignado" son datos de prueba. El plan de migración es: +1. Bulk-assign a InQuality org (`UPDATE processes SET org_id = '' WHERE org_id IS NULL`) o eliminarlos +2. Los `process_groups` existentes ("david-dev", "InQuality") se eliminan — eran grupos de prueba +3. Sin datos reales en riesgo — el producto no tiene clientes externos activos al momento de la migración + +**Sprint objetivo:** Sprint 8. Es refactorización de modelo de datos con impacto en DB + repositorios + UI. No entra en Sprint 5 (UX polish en curso). El brief de Sprint 8 incluye esta consolidación como prioridad 1 antes de features nuevas. + +**Criterio de done:** +- `process_groups` eliminada (con migración que dropea la tabla y transfiere datos si aplica) +- `clientName` eliminado del tipo `Process` y de la UI +- `areas` table con RLS + CRUD en Admin +- `LibraryPage` agrupa por org → área +- Workspace sidebar muestra org asignada (read-only para client_editor) + selector de área +- Tests E2E: flujo admin crea org → crea área → asigna proceso → client_editor ve sus procesos agrupados