# Indice de Especificaciones Tecnicas - MGN-010 Financial

## Identificacion

| Campo | Valor |
|-------|-------|
| **Modulo** | MGN-010 |
| **Epic** | Base Financiera |
| **Total ET** | 3 |
| **Story Points** | 46 |
| **Fecha** | 2025-12-05 |

---

## Especificaciones Tecnicas

| ID | Titulo | RF Cubiertos | Estado |
|----|--------|--------------|--------|
| [ET-FIN-database](./ET-FIN-database.md) | Schema core_financial | RF-001 a RF-004 | Documentado |
| [ET-FIN-backend](./ET-FIN-backend.md) | Servicios y API REST | RF-001 a RF-004 | Documentado |
| [ET-FIN-frontend](./ET-FIN-frontend.md) | Componentes React + Decimal.js | RF-001 a RF-004 | Documentado |

---

## Resumen de Componentes

### Database (ET-FIN-database)

| Tabla | RF | Descripcion |
|-------|-----|-------------|
| account_types | RF-001 | Tipos de cuenta (global) |
| charts_of_accounts | RF-001 | Planes de cuentas por tenant |
| accounts | RF-001 | Cuentas contables jerarquicas |
| tenant_currencies | RF-002 | Monedas habilitadas por tenant |
| exchange_rates | RF-002 | Tipos de cambio historicos |
| fiscal_years | RF-003 | Anos fiscales |
| fiscal_periods | RF-003 | Periodos contables |
| cost_centers | RF-004 | Centros de costo |
| journal_entries | RF-004 | Asientos contables (cabecera) |
| journal_lines | RF-004 | Lineas de asiento (partida doble) |

**Total:** 10 tablas

**Funciones:**
- `get_exchange_rate()` - Obtener tipo de cambio para fecha
- `get_period_for_date()` - Obtener periodo abierto
- `post_journal_entry()` - Contabilizar asiento atomicamente
- `get_account_balance()` - Saldo de cuenta
- `create_default_chart()` - Crear plan de cuentas base

### Backend (ET-FIN-backend)

| Servicio | Responsabilidad | RF |
|----------|-----------------|-----|
| ChartsService | CRUD planes de cuentas | RF-001 |
| AccountsService | CRUD cuentas, balances | RF-001 |
| CurrenciesService | Monedas, conversiones | RF-002 |
| ExchangeRatesService | Tipos de cambio | RF-002 |
| FiscalYearsService | CRUD anos fiscales | RF-003 |
| FiscalPeriodsService | CRUD periodos, cierre | RF-003 |
| JournalService | Asientos, contabilizacion | RF-004 |
| CostCentersService | CRUD centros de costo | RF-004 |

**Total:** 23 endpoints

---

## Matriz de Trazabilidad RF -> ET

| RF | Database | Backend |
|----|----------|---------|
| RF-FIN-001 | account_types, charts_of_accounts, accounts | ChartsService, AccountsService |
| RF-FIN-002 | tenant_currencies, exchange_rates | CurrenciesService, ExchangeRatesService |
| RF-FIN-003 | fiscal_years, fiscal_periods | FiscalYearsService, FiscalPeriodsService |
| RF-FIN-004 | journal_entries, journal_lines, cost_centers | JournalService, CostCentersService |

---

## Arquitectura Contable

```
+------------------+
| Chart of Accounts|
+--------+---------+
         |
         v
+--------+---------+
|     Accounts     |<--- Jerarquia (LTREE)
|   (Detail/Group) |
+--------+---------+
         |
         v
+--------+---------+     +------------------+
|  Journal Entry   |---->|  Fiscal Period   |
+--------+---------+     +------------------+
         |                        |
         v                        v
+--------+---------+     +------------------+
|  Journal Lines   |     |   Fiscal Year    |
| (Debit/Credit)   |     +------------------+
+------------------+
```

### Flujo de Contabilizacion

1. **Crear asiento** (draft)
   - Validar periodo abierto
   - Obtener tipo de cambio
   - Generar numero secuencial
   - Crear lineas con montos base

2. **Contabilizar** (post)
   - Verificar balance (debito = credito)
   - Actualizar saldos de cuentas
   - Marcar como posted

3. **Reversar** (si necesario)
   - Crear asiento inverso
   - Contabilizar reverso
   - Marcar original como reversed

---

## Precisiones Numericas

| Campo | Tipo | Precision | Uso |
|-------|------|-----------|-----|
| Montos | DECIMAL | 18,4 | Valores monetarios |
| Tipos de cambio | DECIMAL | 18,8 | Tasas de conversion |
| Saldos | DECIMAL | 18,4 | Acumulados de cuenta |

---

## Dependencias Tecnicas

### Externas
- PostgreSQL 15+ (LTREE, DECIMAL, transactions)
- TypeORM 0.3+
- NestJS 10+
- date-fns (manejo de fechas)

### Internas
- core_tenants.tenants (RLS)
- core_catalogs.currencies (catalogo global)
- MGN-001 Auth (Autenticacion)
- MGN-003 RBAC (Permisos)

---

## Permisos Requeridos

| Permiso | Descripcion |
|---------|-------------|
| financial.accounts.read | Ver cuentas y balances |
| financial.accounts.manage | Crear/editar cuentas |
| financial.currencies.read | Ver monedas y tasas |
| financial.currencies.manage | Configurar monedas |
| financial.periods.read | Ver anos y periodos |
| financial.periods.manage | Crear/cerrar periodos |
| financial.journal.read | Ver asientos |
| financial.journal.create | Crear asientos |
| financial.journal.post | Contabilizar asientos |
| financial.journal.reverse | Reversar asientos |
| financial.costcenters.read | Ver centros de costo |
| financial.costcenters.manage | Crear/editar CC |
| financial.reports.read | Ver reportes financieros |

---

## Reportes Derivados

| Reporte | Descripcion | Query Base |
|---------|-------------|------------|
| Balance General | Activo, Pasivo, Capital | Saldos por clasificacion |
| Estado de Resultados | Ingresos vs Gastos | Movimientos del periodo |
| Balanza de Comprobacion | Saldos por cuenta | get_account_balance() |
| Libro Mayor | Movimientos por cuenta | getLedger() |
| Libro Diario | Asientos cronologicos | findAll() |

---

## Integracion con Verticales

```
MGN-010 Financial (Base)
    │
    ├── Facturacion
    │   └── JournalService.create(sourceModule: 'invoicing')
    │
    ├── Cuentas por Cobrar
    │   └── JournalService.create(sourceModule: 'receivables')
    │
    ├── Cuentas por Pagar
    │   └── JournalService.create(sourceModule: 'payables')
    │
    └── Tesoreria
        └── JournalService.create(sourceModule: 'treasury')
```

Cada modulo vertical:
1. Define sus cuentas contables en el plan
2. Genera asientos automaticamente
3. Referencia documentos via `sourceDocumentId`

---

## Historial

| Version | Fecha | Autor | Cambios |
|---------|-------|-------|---------|
| 1.0 | 2025-12-05 | Requirements-Analyst | Creacion inicial con 2 ET |
| 1.1 | 2025-12-05 | Requirements-Analyst | Agregado ET Frontend |
