4.4 KiB
US-MGN-008-001-001: CRUD Planes Analíticos
RF Asociado: RF-MGN-008-001 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