# Módulo de Contabilidad - Fase 2

Compras, proveedores, bancos, tesorería, stock valorizado y reportes avanzados.

## Resumen

La Fase 2 completa el circuito administrativo-contable, permitiendo:

- Registrar compras a proveedores con discriminación de IVA, percepciones y retenciones.
- Llevar cuenta corriente de proveedores con saldos pendientes.
- Generar órdenes de pago con múltiples medios (efectivo, transferencia, cheques, retenciones).
- Administrar bancos, cuentas bancarias, movimientos, conciliación e importación de extractos.
- Gestionar cheques recibidos y emitidos con sus estados.
- Mover fondos entre cajas y bancos (tesorería avanzada).
- Valuar stock por costo promedio con asiento de CMV automático en ventas.
- Calcular Posición IVA mensual, Estado de Resultados, Balance General y Flujo de Fondos.
- Cerrar períodos contables con asiento de cierre y bloqueo de movimientos.

## Tablas creadas

| Tabla | Propósito |
|-------|-----------|
| `suppliers` | Proveedores con datos fiscales y saldo en cuenta corriente |
| `purchase_invoices` | Comprobantes de compra (FA, FB, FC, NC, ND, etc.) |
| `purchase_invoice_items` | Ítems de cada compra |
| `supplier_account_movements` | Movimientos de cuenta corriente de proveedores |
| `payments` | Órdenes de pago (cabecera) |
| `payment_items` | Medios de pago de cada orden |
| `payment_invoice_applications` | Aplicación de pagos a facturas |
| `banks` | Catálogo de bancos |
| `bank_accounts` | Cuentas bancarias propias |
| `bank_movements` | Movimientos bancarios (depósitos, extracciones, transferencias, etc.) |
| `bank_reconciliations` | Conciliaciones bancarias mensuales |
| `checks` | Cheques recibidos y emitidos con sus estados |
| `treasury_movements` | Transferencias entre cajas y bancos |
| `stock_valuation_movements` | Movimientos de stock valorizado (compras, ventas, ajustes) |
| `cost_centers` | Centros de costo |
| `fiscal_authorizations` | Autorizaciones fiscales (CAE) - placeholder ARCA |
| `arca_logs` | Bitácora de interacción con AFIP/ARCA - placeholder |

Adicionalmente se extendieron:

- `company_settings`: cuentas por defecto para proveedores, IVA crédito, percepciones y retenciones, además de método de valuación de stock (`stock_valuation_method`).
- `articles`: campos `current_stock_qty`, `current_avg_cost`, `current_stock_value`, `cogs_account_id`.

## Modelos principales

| Modelo | Namespace |
|--------|-----------|
| `Supplier`, `PurchaseInvoice`, `PurchaseInvoiceItem`, `SupplierAccountMovement` | `App\Models\Purchasing` |
| `Payment`, `PaymentItem`, `PaymentInvoiceApplication` | `App\Models\Purchasing` |
| `Bank`, `BankAccount`, `BankMovement`, `BankReconciliation`, `Check`, `CostCenter` | `App\Models\Banking` |
| `TreasuryMovement`, `StockValuationMovement`, `FiscalAuthorization`, `ArcaLog` | `App\Models\Treasury` |

## Servicios

| Servicio | Responsabilidad |
|----------|-----------------|
| `PurchaseAccountingService` | Confirmar/anular facturas de compra, generar asiento, mover stock y cuenta corriente |
| `PaymentAccountingService` | Confirmar/anular órdenes de pago, registrar movimientos en caja/banco, aplicar a facturas |
| `BankAccountingService` | Movimientos bancarios manuales, gastos/impuestos/intereses |
| `BankReconciliationService` | Inicio y cierre de conciliación, importación CSV de extractos |
| `TreasuryService` | Transferencias entre cajas y bancos con asiento contable |
| `StockAccountingService` | Costo promedio ponderado, ingresos por compra, salidas por venta y ajustes |
| `SupplierAccountService` | Movimientos en cuenta corriente del proveedor |
| `FiscalExportService` | Exportación a CSV de IVA Ventas e IVA Compras |
| `PeriodService` | Cierre de período contable, generación de asiento de cierre y bloqueo |

## Plan de cuentas (incorporaciones de Fase 2)

Cuentas agregadas con `system_role`:

- `1.1.4.04` Percepciones Sufridas IVA → `percepcion_iva_sufrida`
- `1.1.4.05` Percepciones Sufridas IIBB → `percepcion_iibb_sufrida`
- `1.1.5.01` Cheques de Terceros → `cheques_terceros`
- `2.1.2.04` Percepciones IIBB a depositar → `percepcion_iibb_depositar`
- `2.1.2.05` Retenciones a depositar → `retenciones_practicadas`
- `2.1.4.01` Cheques Propios Emitidos → `cheques_propios`
- `5.3.03` Gastos Bancarios → `gastos_bancarios`
- `5.3.04` Impuestos Bancarios → `impuestos_bancarios`

Cuentas existentes con rol `proveedores`, `iva_credito`, `retenciones_sufridas`, `anticipos_proveedores`, `cmv` y `stock_mercaderias` se utilizan automáticamente.

## Flujo automático de asientos

### Compra confirmada

```
Mercaderías / Cuenta del ítem  D     Neto gravado
IVA Crédito Fiscal             D     IVA total
Percepciones IVA / IIBB        D     Percepciones (si las hay)
Retenciones a depositar             H   Retenciones (si las hay)
Proveedores                          H   Total - retenciones
```

Adicionalmente:

- Movimiento de cuenta corriente del proveedor (haber).
- Movimiento de stock valorizado por cada ítem con `updates_stock=true`, recalculando costo promedio ponderado.

### Pago confirmado

```
Proveedores                    D     Total
Caja / Banco / Cheques propios       H   Importe por medio
Retenciones a depositar              H   Retenciones practicadas (si aplican)
```

- Aplicación a una o varias facturas con su pivote `payment_invoice_applications`.
- Movimientos en caja o banco según el medio elegido.
- Cheques propios pasan a `issued_status = emitido`; cheques de terceros endosados pasan a `endosado`.

### Venta confirmada (mejora de Fase 1)

Adicional al asiento de venta ya generado en Fase 1, ahora si los artículos vendidos
tienen stock valorizado, se genera un segundo asiento por el CMV:

```
Costo de Mercaderías Vendidas  D     Costo promedio * cantidad
Mercaderías                          H   Costo promedio * cantidad
```

### Transferencia caja↔banco (TreasuryService)

```
Cuenta destino (caja/banco)    D     Importe
Cuenta origen (caja/banco)           H   Importe
Gastos bancarios               D     Comisión (si aplica)
```

## Filament — Resources e UI

### Compras

- **Proveedores** (`/admin/purchasing/suppliers`): alta/baja/modificación con cuenta contable y datos fiscales.
- **Comprobantes de compra** (`/admin/purchasing/purchase-invoices`): carga con repeater de ítems, percepciones, retenciones, archivo adjunto, acciones de **Confirmar** y **Anular**.
- **Órdenes de pago** (`/admin/purchasing/payments`): repeater de medios de pago (efectivo, transferencia, cheque propio o de terceros, tarjeta, retenciones), aplicación a facturas pendientes y acciones de **Confirmar** y **Anular**.

### Bancos

- **Bancos** (`/admin/banking/banks`).
- **Cuentas bancarias** (`/admin/banking/bank-accounts`): vinculación con cuenta contable y caja, acción rápida para registrar **gasto/impuesto/interés** bancario.
- **Cheques** (`/admin/banking/checks`): único formulario que cambia campos según sea recibido o emitido, con todos los estados.
- **Centros de costo** (`/admin/banking/cost-centers`).

### Reportes (Fase 2)

| Página | Ruta |
|--------|------|
| Libro IVA Compras | `/admin/iva-purchases-book` |
| Cuenta corriente proveedores | `/admin/supplier-statement` |
| Posición IVA mensual | `/admin/iva-position` |
| Estado de Resultados | `/admin/income-statement` |
| Balance General | `/admin/balance-sheet` |
| Flujo de Fondos | `/admin/cash-flow` |
| Stock Valorizado | `/admin/valued-stock` |
| Deuda a Proveedores | `/admin/supplier-debt` |
| Cobranzas Pendientes | `/admin/pending-collections` |
| Bancos (movimientos y conciliación) | `/admin/bank-report` |
| Exportaciones para Contador | `/admin/accountant-exports` |

## Flujos clave

1. **Crear compra**: Compras → Comprobantes → Nuevo → completar cabecera, ítems, percepciones → guardar → "Confirmar".
2. **Pagar a proveedor**: Compras → Órdenes de pago → Nueva → seleccionar proveedor → cargar medios y aplicaciones → "Confirmar".
3. **Importar extracto bancario**: Crear conciliación con `BankReconciliationService::start()` y luego `importStatementCsv($account, $path)`.
4. **Conciliar movimientos**: `BankReconciliationService::markReconciled($rec, [$movId, ...])` y `close($rec)`.
5. **Cierre mensual**: `app(PeriodService::class)->close($period)` → genera asiento de cierre por cuentas de resultado y bloquea el período.

## Importación de extractos CSV

`BankReconciliationService::importStatementCsv($account, $path, $delimiter = ',')` acepta archivos con columnas:

- `fecha` (formatos `Y-m-d`, `d/m/Y`, `d-m-Y`)
- `concepto` (también `description`, `detalle`)
- `importe` con signo (positivo = crédito en banco, negativo = débito)
- `referencia` (opcional)

Devuelve `['count' => N, 'errors' => [...]]`.

## Stock valorizado

- Método: **costo promedio ponderado** (configurable a "último costo" en `company_settings.stock_valuation_method`).
- Cada `purchase_invoice_item` con `updates_stock=true` recalcula `current_avg_cost` y `current_stock_value` del artículo.
- Cada venta confirmada egresa stock al costo promedio actual y genera asiento de CMV.
- Ajustes manuales con `StockAccountingService::adjust($article, $deltaQty, $unitCost)`.

## Cierres contables

`PeriodService::close($period, $generateClosingEntries = true)`:

1. Verifica que no existan asientos en borrador.
2. Genera asiento de cierre cancelando saldos de Ingresos y Egresos contra "Resultado del Ejercicio" (cuenta con `system_role = resultado_ejercicio`).
3. Marca el período como `cerrado`.
4. Bloquea futuros asientos en ese rango (`PeriodService::isLockedAt($date)`).

`reopen($period)` permite revertir.

## Verificación post-instalación

```bash
php artisan migrate
php artisan db:seed --class=AccountingSeeder
php artisan optimize:clear
php artisan route:list --path=admin | grep -i 'purchasing\|banking\|reports'
```

## Test integral validado

Se ejecutó un test que cubrió:

1. Alta de proveedor con condición fiscal RI.
2. Alta de banco con cuenta corriente vinculada.
3. Creación de factura de compra con ítem (10 unidades a $150 c/u).
4. Confirmación: asiento balanceado por $1815, stock actualizado a 10u con costo promedio $150 y valor $1500, saldo proveedor $1815.
5. Pago parcial por transferencia bancaria de $1000 aplicado a la factura: asiento generado, banco descontado, factura en estado `parcial`, saldo proveedor $815.
6. Transferencia caja → banco por $5000 con asiento contable automático.
7. Cálculo de posición IVA mensual: saldo a favor por $315 (IVA crédito de la compra).

## Próximos pasos sugeridos (Fase 3)

- Integración real con AFIP/ARCA para CAE y consulta padrón.
- Liquidación de sueldos.
- Multi-moneda con cotizaciones automáticas.
- Activos fijos y depreciaciones.
- Presupuestos y control de ejecución.
- Auditoría avanzada con cambios línea por línea.
