# Migración: Stock Dinámico por Sucursal

## Resumen

Se desacopló el sistema de stock de los campos hardcodeados `stock_1_producto`, `stock_2_producto`, `stock_3_producto` hacia una tabla intermedia `producto_sucursal` que relaciona producto + sucursal + cantidad de forma dinámica.

## Cambios Realizados

### Base de Datos

1. **Nueva tabla `producto_sucursal`**
   - `id_producto` (FK productos)
   - `id_sucursal` (FK sucursales)
   - `cantidad` (decimal)
   - Unique (id_producto, id_sucursal)

2. **Nueva tabla `ingreso_detalle_sucursal`** (para historial de ingresos)
   - Reemplaza stock_1_ingDetalle, stock_2_ingDetalle, stock_3_ingDetalle

3. **Migraciones de datos**
   - Migración de stock existente desde productos hacia producto_sucursal
   - Migración de ingresoDetalle hacia ingreso_detalle_sucursal

### Backend

- **StockService**: Servicio centralizado para getStock, setStock, descontar, sumar
- **VentaController**: Usa StockService para descuento; buscarProductos devuelve `stock_sucursal_actual` y `stock_por_sucursal`
- **DevolucionController**: Usa StockService para sumar stock
- **PedidoMercaderiaController**: Usa StockService para movimientos origen/destino
- **ComprobanteController**: Usa StockService para ingreso de mercadería
- **ProductoController**: store, update, sumarUnidades, alertas usan StockService
- **VarianteController**: crearVariante y actualizarVariante sincronizan con producto_sucursal
- **Tienda/VentaTiendaController**: Usa StockService con TiendaHelper.getIdSucursalTienda()
- **TiendaHelper**: Nuevo método `getIdSucursalTienda()` que mapea campo_stock_tienda → id_sucursal

### Configuración

En `config/app.php`:
- `id_sucursal_tienda`: ID de sucursal para la tienda online (default: 5)
- Variable de entorno: `ID_SUCURSAL_TIENDA`

### Frontend

- **FacturadorA / FacturadorB**: Usan `stock_sucursal_actual` para validar stock; modal muestra columna "Otras sucursales" con stock por sucursal

## Pasos para Aplicar

1. **Ejecutar migraciones**
   ```bash
   cd backend && php artisan migrate
   ```

2. **Opcional: agregar a .env**
   ```
   ID_SUCURSAL_TIENDA=5
   ```

## Flujos Actualizados

| Flujo | Antes | Ahora |
|-------|-------|-------|
| Punto de venta | stock_X según id sucursal hardcodeado | stock_sucursal_actual del backend |
| Modal productos | Solo stock sucursal actual | + Columna "Otras sucursales" |
| Nuevo/Editar producto | stock_1,2,3 en productos | Sincroniza a producto_sucursal |
| Ingreso mercadería | deposito/bbps/centro → stock_1,2,3 | Suma a producto_sucursal (1,2,3) |
| Movimiento stock | obtenerCampoStock(id) | StockService.descontar/sumar |
| Alertas | stock_X < umbral | producto_sucursal por sucursal usuario |
| Tienda online | campo_stock_tienda | StockService + id_sucursal_tienda |

## Notas

- Las columnas `stock_1_producto`, `stock_2_producto`, `stock_3_producto` en la tabla `productos` se mantienen por compatibilidad (Producto::create, Variante, etc.) pero el sistema lee y escribe principalmente en `producto_sucursal`.
- Ingreso de mercadería sigue usando deposito/bbps/centro en el frontend (mapeo a sucursales 1, 2, 3). Para hacerlo completamente dinámico con N sucursales, el frontend de IngresoMercaderia debería cargar sucursales y mostrar una columna por sucursal.
- ListadoProductos: las columnas stock siguen siendo stock_1, 2, 3 hasta que se adapte el listado para consumir stock_por_sucursal dinámicamente.
