# US-MGN-008-005-001: CRUD Presupuestos 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:** Presupuestos Analíticos
**Prioridad:** P1
**Story Points:** 3
**Sprint:** Sprint 19
**Estado:** Ready for Development
**Fecha:** 2025-11-24

---

## User Story
**Como** gerente, **Quiero** crear presupuestos para cuentas analíticas, **Para** controlar gastos/ingresos proyectados vs reales.

## Descripción Detallada
Presupuesto analítico define montos proyectados por:
- Cuenta analítica (ej: Proyecto A)
- Período (mensual, trimestral, anual)
- Tipo (ingresos, gastos)

Ejemplo:
- Proyecto A, Q1-2024: Presupuesto Ingresos $100K, Gastos $60K

## Criterios de Aceptación

### Escenario 1: Crear presupuesto
**Dado que** Proyecto A existe,
**Cuando** creo presupuesto: account_id=Proyecto-A, period=Q1-2024, budget_revenue=100K, budget_expense=60K,
**Entonces** sistema crea presupuesto exitosamente.

### Escenario 2: Presupuesto único por cuenta/período
**Dado que** ya existe presupuesto para Proyecto-A Q1-2024,
**Cuando** intento crear otro,
**Entonces** error 400 "Ya existe presupuesto para esta cuenta y período".

### Escenario 3: Actualizar presupuesto
**Dado que** presupuesto existe,
**Cuando** actualizo budget_expense=70K,
**Entonces** sistema actualiza y registra en audit_log.

## Reglas de Negocio
- **RN-1:** Presupuesto único por cuenta + período.
- **RN-2:** Puede ser por mes, trimestre o año.
- **RN-3:** budget_revenue y budget_expense son opcionales (pueden ser 0).

## Tareas Técnicas

### Backend
- [ ] Endpoint: POST/GET/PUT/DELETE `/api/v1/analytics/budgets`
- [ ] Service: `AnalyticalBudgetService` (CRUD)
- [ ] Validar unicidad cuenta+período
- [ ] Unit tests

### Frontend
- [ ] Página: `AnalyticalBudgetsPage.tsx`
- [ ] Formulario CRUD
- [ ] Selector de período
- [ ] Component tests

### Database
- [ ] Tabla: `analytics.budgets` (account_id, period_start, period_end, budget_revenue, budget_expense)
- [ ] Constraint: unique(account_id, period_start, period_end)

## Estimación Detallada
| Tarea | Horas |
|-------|-------|
| Backend | 1.5 |
| Frontend | 1.5 |
| Testing | 1 |
| **TOTAL** | **4 horas = 3 SP** |

## Definition of Done
- [ ] CRUD completo
- [ ] Validaciones aplicadas
- [ ] Tests >80%
- [ ] QA/PO aprobado

## Referencias
- [RF-MGN-008-001](../../02-modelado/requerimientos-funcionales/mgn-008/RF-MGN-008-001-gestión-de-cuentas-analíticas.md)
