# Micro ERP Consignación

Aplicación interna para controlar mercadería consignada, clientes, ventas, stock por lote, deuda y pagos a proveedores, devoluciones, liquidaciones, reportes y auditoría.

## Requisitos

- Ubuntu 22.04 o posterior.
- PHP 8.3 con `pdo_sqlite`, `sqlite3`, `mbstring` y `fileinfo`.
- Apache 2.4 o Nginx con PHP-FPM.
- `sqlite3` para los scripts de backup y restauración.

No requiere Node.js, Composer, procesos de compilación ni servicios externos.

## Instalación rápida en Ubuntu

1. Instalar paquetes:

   ```bash
   sudo apt update
   sudo apt install php8.3-fpm php8.3-sqlite3 php8.3-mbstring sqlite3
   ```

2. Copiar la carpeta completa:

   ```bash
   sudo mkdir -p /var/www/html/microerp
   sudo cp -a . /var/www/html/microerp/
   ```

3. Ajustar propietario y permisos. La base, las fotos, los logs y los backups deben ser escribibles por el usuario del servidor web:

   ```bash
   sudo chown -R www-data:www-data /var/www/html/microerp
   sudo find /var/www/html/microerp -type d -exec chmod 750 {} \;
   sudo find /var/www/html/microerp -type f -exec chmod 640 {} \;
   sudo chmod 770 /var/www/html/microerp/database
   sudo chmod 770 /var/www/html/microerp/uploads/productos
   sudo chmod 770 /var/www/html/microerp/storage/logs
   sudo chmod 770 /var/www/html/microerp/storage/sessions
   sudo chmod 770 /var/www/html/microerp/storage/backups
   sudo chmod 750 /var/www/html/microerp/scripts/*.sh
   ```

4. Configurar el servidor:

   - Apache: usar `deploy/apache-microerp.conf`, habilitar `proxy_fcgi`, `setenvif`, `rewrite` y `headers`, y permitir `.htaccess`.
   - Nginx: incluir el contenido de `deploy/nginx-microerp.conf` en el bloque `server` HTTPS existente.

5. Abrir `https://DOMINIO/microerp/install.php`, crear el administrador y completar los datos del negocio. Después del alta, el acceso habitual es `https://DOMINIO/microerp/`.

## Configuración

`config/app.php` contiene rutas técnicas. `config/app.example.php` sirve como referencia. Si la aplicación se publica con una ruta distinta, se puede fijar `base_path`; normalmente la detección automática funciona.

Desde Configuración se ajustan negocio, moneda, zona horaria, máximo de foto y el control de pagos superiores al saldo. El límite inicial de fotos es 5 MB. Se aceptan JPG, JPEG, PNG y WEBP; las imágenes se guardan en `uploads/productos/`, nunca en SQLite.

## Seguridad

- Contraseñas con `password_hash`.
- Sesiones con cookies `HttpOnly`, `SameSite=Lax` y `Secure` automático bajo HTTPS.
- Formularios protegidos con token CSRF.
- SQL mediante PDO y consultas preparadas.
- Escape de HTML en todas las vistas.
- Validación por MIME y contenido real de las fotos.
- Transacciones para ingresos, ventas, devoluciones, pagos y liquidaciones.
- Ventas y movimientos financieros no se borran físicamente.
- Errores internos en `storage/logs/app.log`, sin detalles sensibles en pantalla.
- `.htaccess` y los ejemplos de servidor bloquean acceso web a base, configuración, scripts y logs.

## Backup y restauración

Crear un backup consistente de SQLite, fotos y configuración:

```bash
cd /var/www/html/microerp
sudo -u www-data ./scripts/backup.sh
```

Restaurar un archivo. El script valida la integridad y crea antes un backup de seguridad:

```bash
sudo -u www-data ./scripts/restore.sh storage/backups/microerp-AAAAMMDD-HHMMSS.tar.gz
```

Conviene programar `backup.sh` con cron y copiar los archivos resultantes a un almacenamiento externo.

## Prueba integral

En una instalación con PHP CLI:

```bash
php tests/integration.php
```

La prueba usa una base temporal y verifica clientes, proveedor, producto, dos lotes con costos distintos, venta FIFO, devolución de cliente, pago parcial, saldo, liquidación, devolución al proveedor y auditoría. No modifica la base real.

La prueba `tests/migration.php` simula una instalación anterior, ejecuta dos veces la migración de clientes y comprueba que las ventas existentes se conservan con `cliente_id` nulo.

## Estructura

- `app/`: conexión, seguridad, utilidades y reglas del negocio.
- `modules/`: pantallas funcionales.
- `partials/`: encabezado y pie compartidos.
- `assets/`: CSS y JavaScript vanilla.
- `database/schema.sql`: esquema SQLite completo.
- `uploads/productos/`: fotografías.
- `deploy/`: ejemplos Apache y Nginx.
- `scripts/`: backup y restauración.
- `tests/`: prueba integral.
- `docs/ARQUITECTURA.md`: arquitectura, relaciones y reglas de cálculo.

## Criterios contables internos

Todos los importes se guardan como centavos enteros. Cada ingreso crea un lote con costo histórico. Las ventas consumen lotes por FIFO; el importe correspondiente al proveedor surge de ese costo real. La ganancia es el total efectivamente cobrado menos el costo del proveedor. Devoluciones y pagos se registran como movimientos compensatorios auditables.

## Clientes y migración

El módulo Clientes permite altas, edición, búsqueda, activación/desactivación e historial de compras. Asociar un cliente a una venta es opcional, por lo que los registros anteriores y las ventas rápidas pueden seguir sin identificación.

Al iniciar una instalación existente, `app/migrations.php` crea de forma idempotente la tabla `clientes`, agrega `ventas.cliente_id` nullable y sus índices. No borra ni reescribe ventas. Los nombres internos heredados `entregas_hermana` y `entregado_hermana_centavos` se conservan exclusivamente por compatibilidad; toda la interfaz utiliza la terminología general de pagos a proveedores.

El selector visual alterna tema oscuro y claro. La preferencia queda guardada solamente en el navegador como ajuste de interfaz; los datos operativos continúan en SQLite.

Esta herramienta no implementa facturación fiscal, impuestos ni integraciones contables externas.
