# Arquitectura de Micro ERP Consignación

La aplicación usa PHP 8.3, PDO y SQLite. No requiere Node.js, un framework ni servicios residentes adicionales.

## Capas

- `index.php`: enrutador de páginas autenticadas.
- `install.php`, `login.php`, `logout.php`: instalación y acceso.
- `app/bootstrap.php`: sesión, conexión, configuración y manejo seguro de errores.
- `app/functions.php`: utilidades, formato, seguridad, archivos y auditoría.
- `app/services.php`: transacciones del negocio y consultas de métricas.
- `modules/`: pantallas y controladores por módulo.
- `partials/`: estructura visual compartida.
- `database/schema.sql`: esquema versionable.
- `database/microerp.sqlite`: datos locales; se crea desde el instalador.
- `uploads/productos/`: fotografías; SQLite conserva solamente la ruta.
- `storage/logs/`: errores internos, fuera de la interfaz.

## Reglas de cálculo

Los importes se guardan como centavos enteros. Cada ingreso crea un lote inmutable con costo histórico. Una venta consume stock por FIFO y registra qué cantidad salió de cada lote. El costo del proveedor es la suma de esas asignaciones; la ganancia es el importe cobrado menos ese costo.

Las devoluciones de clientes revierten el importe, el costo y la ganancia proporcional del detalle original. Cuando corresponde, reponen las unidades en los lotes originales. Las devoluciones al proveedor reducen solamente stock consignado disponible.

La deuda y el saldo pendiente con proveedores se calculan como:

`costo de ventas confirmadas - costo revertido por devoluciones - pagos confirmados`

Las liquidaciones guardan un resumen y un detalle por producto. Al cerrarse no se editan; una reapertura es una operación explícita y auditada.

## Esquema resumido

```text
proveedores ─┬─ productos ─┬─ ingreso_detalles ─ lotes
             │             └─ venta_detalles ─ venta_asignaciones_lote
             ├─ ingresos
             ├─ entregas_hermana
             └─ liquidaciones ─ liquidacion_detalles

clientes ─ ventas ─┬─ venta_detalles
        └─ devoluciones_clientes ─ devolucion_cliente_detalles

lotes ─ devoluciones_proveedor
usuarios ─ auditoria
```

Todos los movimientos sensibles usan transacciones, claves foráneas, consultas preparadas y auditoría.

`clientes` se vincula opcionalmente con `ventas` mediante `cliente_id`; una venta histórica o anónima conserva ese valor nulo. `app/migrations.php` aplica esta ampliación de forma idempotente en instalaciones existentes. Los identificadores internos `entregas_hermana` y `entregado_hermana_centavos` permanecen sin renombrar para evitar una migración destructiva, aunque la interfaz los presenta como pagos a proveedores.
