# US-MGN-008-001-001: CRUD Planes Analíticos **RF Asociado:** [RF-MGN-008-001](../../02-modelado/requerimientos-funcionales/mgn-008/RF-MGN-008-001-gestión-de-cuentas-analíticas.md) **Módulo:** MGN-008 - Contabilidad Analítica **Epic:** Cuentas Analíticas **Prioridad:** P0 **Story Points:** 3 **Sprint:** Sprint 18 **Estado:** Ready for Development **Fecha:** 2025-11-24 --- ## User Story **Como** contador, **Quiero** crear y gestionar planes analíticos (analytical plans), **Para** organizar diferentes dimensiones de análisis contable (proyectos, departamentos, categorías). --- ## Descripción Detallada Un Plan Analítico es un eje de análisis contable que permite segmentar transacciones. Ejemplos: - Plan "Proyectos": Para trackear costos/ingresos por proyecto - Plan "Departamentos": Para análisis por área organizacional - Plan "Categorías": Para clasificaciones personalizadas Cada plan tiene: - Nombre y código único - Descripción - Estado activo/inactivo - Múltiples cuentas analíticas (hierarchía) --- ## Criterios de Aceptación ### Escenario 1: Crear plan analítico (Camino Feliz) **Dado que** soy contador con permiso accounting_manager, **Cuando** creo plan con code="PROJ", name="Proyectos", description="Análisis por proyecto", **Entonces** sistema crea plan con id único, active=true. ### Escenario 2: Código único por empresa **Dado que** ya existe plan con code="PROJ", **Cuando** intento crear otro plan con code="PROJ", **Entonces** sistema retorna error 400 "El código PROJ ya existe". ### Escenario 3: Actualizar plan analítico **Dado que** plan id=1 existe, **Cuando** actualizo name="Proyectos Estratégicos", **Entonces** sistema actualiza el plan y registra en audit_log. ### Escenario 4: Eliminar plan sin cuentas asociadas **Dado que** plan id=1 no tiene cuentas analíticas, **Cuando** lo elimino, **Entonces** sistema lo elimina exitosamente. ### Escenario 5: No eliminar plan con cuentas activas **Dado que** plan tiene 5 cuentas analíticas activas, **Cuando** intento eliminar, **Entonces** sistema retorna error 400 "No se puede eliminar plan con cuentas activas. Desactívelo en su lugar". ### Escenario 6: Desactivar plan **Dado que** plan está active=true, **Cuando** lo desactivo, **Entonces** active=false y no aparece en selectores (pero mantiene histórico). --- ## Reglas de Negocio - **RN-1:** Código (code) único por empresa. - **RN-2:** Plan no se puede eliminar si tiene cuentas asociadas. - **RN-3:** Desactivar plan no elimina datos históricos. - **RN-4:** RLS filtra por empresa. - **RN-5:** Permisos: accounting_user (lectura), accounting_manager (escritura). --- ## Tareas Técnicas ### Backend - [ ] Endpoint: `POST /api/v1/analytics/plans` - [ ] Endpoint: `GET /api/v1/analytics/plans` - [ ] Endpoint: `GET /api/v1/analytics/plans/:id` - [ ] Endpoint: `PUT /api/v1/analytics/plans/:id` - [ ] Endpoint: `DELETE /api/v1/analytics/plans/:id` - [ ] Service: `AnalyticalPlanService` (CRUD methods) - [ ] DTO: `CreateAnalyticalPlanDto`, `UpdateAnalyticalPlanDto` - [ ] Validar code único por empresa - [ ] Validar plan no tiene cuentas antes de eliminar - [ ] Unit tests (>80%) - [ ] Integration tests - [ ] Swagger docs ### Frontend - [ ] Página: `AnalyticalPlansPage.tsx` (/analytics/plans) - [ ] Componente: `AnalyticalPlanForm.tsx` - [ ] Componente: `AnalyticalPlanList.tsx` - [ ] CRUD completo con modales - [ ] Validación de código único - [ ] Toggle activo/inactivo - [ ] API client: `analyticalPlanApi` - [ ] Component tests - [ ] E2E test ### Database - [ ] Tabla: `analytics.plans` (id, company_id, code, name, description, active) - [ ] Constraint: unique(company_id, code) - [ ] Índices: idx_plans_company_id, idx_plans_code - [ ] RLS policy: company_isolation --- ## Estimación Detallada | Tarea | Horas | |-------|-------| | Backend | 1.5 | | Frontend | 1.5 | | Testing | 1 | | Code Review | 0.5 | | **TOTAL** | **4.5 horas = 3 SP** | --- ## Definition of Done - [ ] CRUD completo funcional - [ ] Tests pasando (>80%) - [ ] Code review aprobado - [ ] Validaciones aplicadas - [ ] RLS aplicado - [ ] Swagger docs actualizado - [ ] QA validado - [ ] PO aprobado --- ## Referencias - [RF-MGN-008-001](../../02-modelado/requerimientos-funcionales/mgn-008/RF-MGN-008-001-gestión-de-cuentas-analíticas.md) - [Traceability](../../02-modelado/trazabilidad/TRACEABILITY-MGN-008.yaml) - [Schema](../../02-modelado/database-design/schemas/analytics-schema-ddl.sql)