# Parche de retiros internos — 2026-08-01

## Qué corrige

Una unidad destinada a consumo personal estaba registrada como venta confirmada a `$ 0`. Eso bajaba correctamente el stock, pero generaba una pérdida comercial ficticia de `$ 19.800`.

El parche incorpora el movimiento **Retiro de stock** para:

- consumo personal;
- muestra o promoción;
- merma o rotura;
- otra salida interna.

Un retiro baja stock y conserva el costo adeudado al proveedor, pero no suma facturación ni altera la ganancia comercial.

## Respaldo previo

Desde la raíz de la aplicación:

```bash
./scripts/backup.sh
```

Además se recomienda una copia rápida del código:

```bash
sudo tar -czf /tmp/microerp-codigo-$(date +%Y%m%d-%H%M%S).tar.gz \
  --exclude='./database/*.sqlite*' \
  --exclude='./storage/sessions/*' \
  --exclude='./storage/logs/*' \
  .
```

## Aplicar el parche

El archivo del parche contiene rutas relativas a la raíz de Micro ERP:

```bash
cd /var/www/html/microerp
sudo tar -xzf /tmp/microerp-patch-retiros-20260801.tar.gz -C .
sudo chown -R www-data:www-data database storage uploads
```

Abrir una página del sistema o ejecutar el comando siguiente aplica automáticamente la migración SQLite.

## Corregir la venta histórica

En la base revisada, la operación incorrecta es la venta `V-20260730-000001`, id `1`:

```bash
cd /var/www/html/microerp
sudo -u www-data php scripts/convert-sale-to-withdrawal.php 1 consumo_personal
```

También puede usarse el número:

```bash
sudo -u www-data php scripts/convert-sale-to-withdrawal.php V-20260730-000001 consumo_personal
```

El comando es idempotente: si ya se convirtió, no crea otro retiro. También recalcula las liquidaciones abiertas que incluyen la fecha del movimiento.

## Resultado esperado con los datos revisados

- stock vendible: `1` unidad;
- ventas confirmadas: `$ 69.000`;
- ganancia comercial: `$ 9.600`;
- retiro personal al costo: `$ 19.800`;
- costo total comprometido con proveedor: `$ 79.200`;
- pagos registrados: `$ 59.400`;
- saldo pendiente: `$ 19.800`.

## Seguridad después del despliegue

El paquete de revisión original contenía sesiones PHP activas. No forman parte de los archivos de entrega. En el servidor conviene invalidar las sesiones existentes una vez aplicado el parche:

```bash
sudo find storage/sessions -maxdepth 1 -type f -name 'sess_*' -delete
```

Eso cerrará las sesiones abiertas y obligará a iniciar sesión nuevamente.
