# Ampliación contable

Alcance autorizado: configuración por empresa; centros de costo; cierre anual y apertura; inventario y costo de ventas; reportes y presupuestos; aprobación, adjuntos y auditoría; saldos iniciales; anticipos, cheques y sesiones de caja.

La configuración de cada empresa debe elegirse antes de activar automatizaciones. No se deducen cuentas contables, saldos iniciales ni políticas de valoración a partir de datos incompletos.

## Entregables y comprobación

- Configuración, centros y presupuestos: formularios, aislamiento por empresa, validación de cuentas.
- Cierre y apertura: vista previa, transacción, idempotencia y conciliación de saldos.
- Operación: aprobación configurable, adjuntos privados, trazabilidad y saldos CSV.
- Reportes: situación financiera, resultados, patrimonio, comparativos, centros, presupuestos y exportaciones.
- Inventario: método seleccionado, entradas/salidas, costo de ventas, devolución y kardex.
- Tesorería: anticipos aplicables a cartera, cheques, sesiones de caja y arqueo.
- Puesta en marcha: pruebas automáticas y guía de validación con el contador. La carga de datos reales y validación profesional requieren datos de la empresa.

## Funcionalidad implementada

**Gestión y cierre anual** (`/admin/contabilidad/gestion`):

- Configuración por empresa: moneda funcional USD, redondeo de líneas a cuatro decimales (mitad hacia arriba o mitad al par), marco contable declarado, cuentas de resultado, inventario, costo de ventas y anticipos; nombres del contador y representante para reportes.
- Aprobación manual configurable. Otro contador o administrador debe aprobar cuando se activa esta política. Cambiar un borrador aprobado invalida su aprobación. Los documentos generados por servicios contables conservan su automatización.
- Centros de costo con código, nombre, sucursal y activación. Los centros existentes en asientos anteriores se incorporan al catálogo durante la migración.
- Presupuesto mensual por cuenta de ingreso/costo/gasto y centro opcional. Guardar la misma combinación actualiza su monto.
- Carga CSV de saldos iniciales, como borrador, únicamente cuando la empresa no tiene asientos. Cabecera exacta: `codigo,debe,haber`, importes con punto decimal, cuentas de balance, máximo 10000 filas. No crea auxiliares de cartera a partir del saldo global.
- Vista previa de resultado y borradores, cierre anual transaccional, traslado a patrimonio y apertura del siguiente ejercicio. Conserva los centros históricos, incluso inactivos. Genera los períodos del siguiente año cuando no existen. Repetir el cierre devuelve el mismo registro, sin duplicar asientos.
- Se exige cobertura completa del año, último período abierto, ausencia de borradores anteriores al cierre, resultados anteriores cerrados y ausencia de movimientos contabilizados posteriores al ejercicio.
- Auditoría reciente: últimos 100 eventos de la empresa.

**Asientos**:

- Aprobación con usuario y fecha, respaldos privados de hasta 10 MB con huella SHA-256 y descarga desde el asiento.
- Bloqueo de modificación y eliminación de asientos contabilizados y de sus líneas mediante los modelos. La aplicación debe seguir utilizando los servicios; estos controles no sustituyen permisos de acceso directo a la base de datos.
- Los asientos de apertura y cierre se generan desde sus procesos específicos. Los reversos de documentos de origen se operan desde el módulo correspondiente.
- Numeración con el año de la fecha contable.

**Inventario y tesorería** (`/admin/contabilidad/operaciones`):

- Inicialización por producto, entradas, salidas/bajas, kardex y comparación de existencia física con existencia valorada. Los movimientos manuales actualizan también la existencia física; la inicialización no la incrementa.
- Promedio ponderado y FIFO. Inventario desactivado por defecto y método sin preselección, conforme a la decisión del usuario. Una vez que existe kardex, no se permite cambiar método ni cuentas mediante la configuración.
- Costo de ventas vinculado a movimientos físicos de facturas, costo original de devoluciones parciales y anulaciones compensatorias. Los errores quedan en la integración electrónica para revisión y reintento. Una anulación con movimientos posteriores efectivos del mismo producto exige conciliación previa; no recalcula silenciosamente todo el kardex.
- Las compras recibidas por XML conservan su integración existente. La entrada física/valorada se registra con una contrapartida definida por el contador para evitar contabilizar dos veces la compra.
- Anticipos de clientes/proveedores, aplicación parcial a documentos del mismo tercero y tipo, control estricto de saldo, reversos de aplicaciones y de anticipos sin aplicaciones vigentes.
- Cheques emitidos contra cuentas por pagar. La emisión registra el pago; marcar cobrado no genera un segundo pago. Anular un cheque emitido revierte el pago. El número es único por cuenta bancaria.
- Sesiones diarias de caja, usuario de apertura/cierre, saldo en libros, efectivo contado y diferencia con explicación. El arqueo no genera ajustes automáticos; después del cierre se bloquea contabilizar o reversar movimientos con fechas que alteren ese arqueo.
- Las tablas de operaciones muestran hasta 200 registros recientes (existencias: todos los productos). La exportación de esta pantalla corresponde a ese mismo conjunto.

**Libros y balance**:

- Diario y mayor detallado, balance de comprobación, situación financiera con comprobación de la ecuación, resultados, cambios en cuentas de patrimonio incluyendo resultado pendiente, comparativo anual y mensual, presupuesto frente a ejecución y filtro por centro.
- Flujo de efectivo ejecutado integrado con el reporte existente y proyección a 90 días desde la fecha actual. La proyección usa saldos vigentes de cartera y movimientos contabilizados del horizonte; los vencidos se estiman al día inicial. No incluye operaciones todavía no registradas.
- Exportación XLSX real y PDF con identificación de la empresa, período y espacios/nombres para firmas. Se reutiliza el generador PDF local; no se añadió una dependencia externa.
- Las aperturas anuales no duplican saldos acumulados de caja/bancos ni aparecen como ingresos de efectivo.
- Son reportes operativos del libro contable, sin presentación automática ante organismos ni certificación del marco NIIF seleccionado.

## Puesta en marcha por empresa

1. Revisar plan de cuentas y definir el marco contable, cuentas de integración y política de aprobación en Gestión.
2. Crear períodos y registrar centros de costo. Cargar el balance inicial CSV antes de cualquier otro asiento; revisar y contabilizar el borrador. Conciliar aparte los auxiliares por cliente/proveedor.
3. Elegir el método de inventario con el contador. Activarlo solo después de definir las cuentas y conciliar existencias. Inicializar cada producto, incluidos los de cantidad cero. Si el inventario ya está incluido en el balance inicial, utilizar una contrapartida de conciliación adecuada para evitar duplicación.
4. Probar una compra, una venta, devolución parcial, cobro/pago, anticipo, aplicación y reverso. Comparar documento, cartera, existencias y mayor contable.
5. Probar arqueo de caja y conciliación bancaria, y revisar diferencias antes de cerrar períodos.
6. Revisar los estados, los saldos de control y los pendientes de integración. Ejecutar el cierre anual con el último período abierto y verificar su apertura antes de contabilizar el siguiente año.

Las pruebas automáticas usan datos ficticios y SQLite en memoria. La selección del método de inventario sigue pendiente; la carga de saldos y aceptación contable reales requieren los datos y revisión de cada empresa. La operación monetaria sigue siendo USD; no se implementó conversión multimoneda. No se ejecutan cierres, cargas reales ni se activa inventario al instalar estas migraciones.

## Instalación y verificación

Migraciones aditivas de esta ampliación:

```powershell
php artisan migrate --path=database/migrations/2026_09_07_000001_extend_accounting_management.php --path=database/migrations/2026_09_07_000002_create_accounting_inventory_and_treasury.php
php -d extension=pdo_sqlite vendor/phpunit/phpunit/phpunit
```

Las pruebas nuevas cubren cierre/apertura sin duplicación, reversión transaccional ante error, centros históricos, aprobación independiente, inmutabilidad, presupuestos, carga inicial, promedio/FIFO, inventario vacío, venta/devolución/anulación, anticipos y reversos, cheques, arqueo, adjuntos privados, formatos de exportación y pantallas Livewire. SQLite no valida concurrencia real entre conexiones MySQL.

Durante la verificación global se restauró `HasFactory` en `User`, necesario para las pruebas preexistentes de eliminación de usuarios.

## Resultado de la entrega — 7 de septiembre de 2026

- Suite completa del ERP: 152 pruebas y 554 aserciones aprobadas.
- Verificación posterior de la nueva proyección y pantalla: 2 pruebas, 15 aserciones aprobadas (incluye una prueba adicional de proyección).
- Formato de los archivos PHP modificados: Pint aprobado.
- Ambas migraciones aplicadas correctamente en el entorno local MySQL (`127.0.0.1`).
- Consultas de estados, saldos por centro y proyección ejecutadas sin errores sobre tres empresas existentes, solo en lectura.
- Rutas de Gestión e Inventario/tesorería registradas. Cero empresas con inventario contable activado al terminar la instalación.
- [Plantilla vacía de saldos iniciales](plantilla_saldos_iniciales.csv).
