Flujo de Stock en Bakerfy
Ciclo de vida del inventario vendible: desde la producción en cocina hasta la venta en POS, con lógica de la aplicación.
Resumen
Bakerfy maneja stock de productos terminados y, aparte, lotes de insumos/subproductos:
- Producto no expirable: stock del mismo día (
recibido − ventas − cortesía − merma). - Producto expirable: lotes por día de producción, acumulados hasta vencer; el POS suma lotes vigentes.
- Insumo / subproducto con vida útil: lotes desde la recepción o elaboración; vencen a los N días. Vacío = no vence.
- Insumo en vitrina: se vende en POS/web como ítem (no descuenta receta del día).
El inventario vive en ubicaciones dentro de cada sucursal (Principal, Refrigerador, Freezer). El POS de una tienda suma todas las ubicaciones de esa sucursal. En Producción Diario se elige la ubicación de inventario al registrar Terminado (cocinado) (Freezer 1, Refrigerador Z, etc.) y luego se despacha a tiendas u otras ubicaciones desde Cocina Resultado Día. Si no se elige ubicación y ninguna tiene “Recibe producción”, el flujo sigue siendo cocina → camión → tienda.
Ver también Flujo de Operación (7 pasos).
Ubicaciones (seco / refrigerador / freezer)
No son sucursales extra: son bins dentro de una sucursal. Se editan en la ficha de la sucursal (Sucursales).
- Tipos: Seco, Refrigerador, Freezer. La sucursal sigue teniendo el flag grueso de refrigeración; las advertencias de cadena de frío usan el tipo de la ubicación cuando se conoce.
- Hay exactamente una ubicación Principal por sucursal (se crea sola). No se elimina si es la última o si tiene stock.
- Insumos, productos terminados y subproductos se guardan en una ubicación. Si la pantalla no elige una, se usa Principal.
- Recepción OC: selector de ubicación (de la sucursal de la OC, o de la cocina si la línea no es vitrina).
- Consumo de receta: FIFO en todas las ubicaciones de esa cocina (la mantequilla del freezer se usa si es más antigua).
- POS: stock disponible = suma de las ubicaciones de la tienda. Una cámara de cocina no se vende ahí.
- Conteo de ubicaciones: conteo por pestaña y traslado intra-sucursal (misma sucursal, otra ubicación).
Cámara y despacho a tiendas
Al registrar Terminado (cocinado) en Producción Diario, el operador elige la ubicación de inventario (Principal, Freezer 1, Refrigerador Z). El lote (o el recibido de no expirables) queda en ese bin de la cocina, no en las tiendas. “Recibe producción” sigue siendo el valor por defecto del selector, no un requisito.
- Terminado (cocinado) — se setea la cantidad y la ubicación; el inventario entra a ese bin.
- Por entregar — se sigue calculando como sugerencia de despacho según el plan semanal.
- Despacho desde cámara — Producción → Cocina Resultado Día: pestañas por ubicación de cocina. Cantidad por tienda (precargada desde por entregar) u otra ubicación. Mueve de ese bin a la Principal de la tienda (anota entregado) o a otra cámara.
- Recibido — la tienda confirma en Control de Stock para activar venta (igual que hoy).
El plan semanal y el camión siguen siendo por sucursal de venta. El despacho entre sucursales y el traslado freezer ↔ vitrina usan el mismo servicio de traslado.
Producto no expirable
- Planificación —
RecipeDay.planned_amountpor sucursal y fecha. - Producción — cocina registra
salida_cocina(kitchen,branch_idnil). - Sin cámara: se calcula
por_entregarpor sucursal. Con cámara: elrecibidoqueda en la sucursal cocina (bodega) hasta el despacho;por_entregares solo sugerencia. - Logística / despacho — camión registra
entregado, o Cocina Resultado Día copia cantidad apor_entregar/entregadode la tienda. - Recepción — sucursal registra
recibidoen Control de Stock. - POS —
Product#stock_available= recibido − ventas_tienda − cortesía − merma (mismo día), en la sucursal de venta. - Venta —
Sale#deduct_stock_from_branchincrementaventas_tienda.
Producto expirable
En ficha de producto: expirable + expirable_days (días de vigencia desde la producción).
- Terminado (cocinado) — al guardar
salida_cocina, se recalculapor_entregar(sugerencia de despacho). - Lote asignado — sin cámara: un lote por tienda con
quantity_initial= por_entregar. Con cámara: un lote en esa ubicación,quantity_initial= salida ajustada; las tiendas aún no tienen lote. - Despacho (solo con cámara) — mueve cantidad a la Principal de la tienda. El lote en tienda nace sin stock vendible hasta el recibido.
- Recibido activa venta — al confirmar
recibido, se seteaquantity_sellableyquantity_remaining. - POS — stock = suma de
quantity_remainingvendible en lotes no vencidos de todas las ubicaciones de esa tienda. - Ventas / merma / cortesía — descuentan lotes FIFO (
expires_on, luegoproduction_date). - Vencimiento — tarea
product_stock_lots:expire_dueda de baja lotes vencidos y registra movimientoexpiry.
Insumos y subproductos
En la ficha: Vida útil (días). Vacío = el lote no vence.
- Insumo: al recibir una OC eliges la ubicación; se crea un lote ahí. Vence = fecha de recepción + vida útil. La cocina consume FIFO en todas sus ubicaciones al registrar hitos / Terminado (cocinado).
- Traslado interno: al marcar entregado en una solicitud, los gramos se mueven de la Principal (o ubicación elegida) del emisor a la ubicación de destino (si el insumo pide frío, prefiere refrigerador / freezer).
- Subproducto: vence desde la elaboración; el conteo y el ajuste son por ubicación de la cocina.
- Los vencidos dejan de estar disponibles; la tarea diaria puede darlos de baja.
No confundir con el flag expirable del producto terminado (lotes de venta en sucursal).
Tabla de campos
| RecipeDay (sucursal) | ProductStockLot / Location |
|---|---|
planned_amount — plan semanal | location_id — bin dentro de la sucursal |
por_entregar — asignado o sugerido de despacho | quantity_initial — por_entregar (sin cámara) o salida (con cámara) |
entregado — camión o despacho desde bodega | — (informativo; recibido activa lote) |
recibido — inventario inicial día (o hold de no expirable en cocina) | quantity_sellable — activado al recibir |
ventas_tienda — ventas POS | quantity_remaining — disponible en lote |
merma / cortesia | movimientos merma / cortesia / transfer |
| — | expires_on — fecha límite de venta |
Pantallas del sistema
| Producción diaria | Producción Diario |
| Panel cocina | Panel hoy |
| Stock entre hitos | Stock hitos |
| Insumos del día | Insumos día |
| Insumos del mes | Insumos mes |
| Asignación y despacho (cámara → tiendas / ubicaciones) | Cocina Resultado Día |
| Ubicaciones de la sucursal | Sucursales → ficha → Ubicaciones |
| Control de stock | Control de Stock |
| Conteo y traslado intra-sucursal | Conteo de ubicaciones |
| Cierre sucursal | Cierre Sucursal |
| POS | Punto de Venta |
| Análisis | Análisis Stock |
Integraciones
- WooCommerce push: envía stock disponible (lotes vigentes si el producto es expirable).
- WooCommerce inbound: expirables ajustan lotes; no expirables ajustan
recibido. - Shopify: el pedido pagado descuenta stock en la sucursal de la tienda; no hay sync de inventario con Shopify.
- Portal B2B: el stock se descuenta al confirmar el pedido, no al crearlo.
- Lioren: emite DTE; no mueve stock.
Preguntas frecuentes
¿Por qué el POS muestra 0 si ya hubo Terminado (cocinado)?
En expirables falta confirmar recibido en Control de Stock. Si la cocina usa cámara, además hay que despachar a la tienda: el stock de la cámara no se vende en el POS.
¿Qué pasa al vencimiento?
El lote deja de contar en POS; la tarea diaria registra baja por vencimiento y puede incrementar merma del día.
¿Puedo vender más de lo recibido hoy?
Sí, en expirables el stock acumula lotes de varios días de producción mientras no hayan vencido (todas las ubicaciones de esa tienda).
¿El Panel hoy o Stock hitos cambian el inventario de sucursal?
No. Solo muestran avance de cocina. El stock vendible aparece después de salida → (cámara + despacho, si aplica) → entrega → recibido.
¿Cómo entra stock a un freezer si no es Principal?
En la recepción de la OC elige esa ubicación, o usa un traslado intra-sucursal en Conteo de ubicaciones.
¿El traslado interno de insumos mueve lotes?
Sí, al aumentar lo entregado de la solicitud. Si no marcas entregado, los gramos no se mueven. El aviso de refrigeración mira el tipo de la ubicación de destino.