erp-core/docs/05-user-stories/mgn-008/US-MGN-008-001-001-crud-planes-analiticos.md

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

Referencias