# 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)
