# Flujo de Negocio: Stock (Inventario) **Modulo:** stock **Modelo Principal:** stock.picking, stock.move **Aplica Workflow:** Si --- ## 1. Estados del Movimiento (stock.move.state) | Estado | Nombre UI | Descripcion | Siguiente | |--------|-----------|-------------|-----------| | draft | Nuevo | Estado inicial, no confirmado | confirmed | | waiting | Esperando | Esperando otro movimiento (cadena) | confirmed | | confirmed | En espera | Confirmado, sin disponibilidad | assigned | | partially_available | Parcial | Parcialmente reservado | assigned | | assigned | Disponible | Stock reservado | done | | done | Completado | Movimiento ejecutado | - | | cancel | Cancelado | Movimiento cancelado | - | --- ## 2. Estados del Albaran (stock.picking.state) | Estado | Nombre UI | Descripcion | Siguiente | |--------|-----------|-------------|-----------| | draft | Borrador | Estado inicial | confirmed | | waiting | En espera | Esperando otra operacion | confirmed/assigned | | confirmed | En espera | Esperando disponibilidad | assigned | | assigned | Listo | Stock reservado, listo para procesar | done | | done | Completado | Albaran validado | - | | cancel | Cancelado | Albaran cancelado | - | --- ## 3. Diagrama de Transiciones - stock.picking ``` ┌──────────────────┐ │ DRAFT │ │ (Borrador) │ └────────┬─────────┘ │ action_confirm() │ ┌──────────────┴──────────────┐ │ │ ▼ ▼ ┌──────────────────┐ ┌──────────────────┐ │ CONFIRMED │ │ WAITING │ │ (En espera) │ │ (Otra operacion) │ └────────┬─────────┘ └────────┬─────────┘ │ │ │ action_assign() │ (dependencia resuelta) │ │ └──────────────┬────────────┘ │ ▼ ┌──────────────────┐ │ ASSIGNED │ │ (Listo) │ └────────┬─────────┘ │ button_validate() _action_done() │ ▼ ┌──────────────────┐ │ DONE │ │ (Completado) │ └──────────────────┘ Estado paralelo (desde cualquier estado excepto done): ┌──────────────────┐ │ CANCEL │ │ (Cancelado) │ └──────────────────┘ ``` --- ## 4. Diagrama de Transiciones - stock.move ``` ┌──────────────────┐ │ DRAFT │ │ (Nuevo) │ └────────┬─────────┘ │ _action_confirm() │ ┌──────────────┴──────────────┐ │ │ ▼ ▼ ┌──────────────────┐ ┌──────────────────┐ │ CONFIRMED │ │ WAITING │ │ (En espera) │ │ (Otro movimiento)│ └────────┬─────────┘ └────────┬─────────┘ │ │ │ _action_assign() │ │ │ └──────────────┬────────────┘ │ ┌──────────────┼──────────────┐ │ │ │ ▼ ▼ ▼ (sin stock) (stock parcial) (stock completo) │ │ │ │ ▼ │ │ ┌─────────────────┐ │ │ │ PARTIALLY_AVAIL │ │ │ │ (Parcial) │ │ │ └────────┬────────┘ │ │ │ │ └─────────────┼───────────────┘ │ ▼ ┌──────────────────┐ │ ASSIGNED │ │ (Disponible) │ └────────┬─────────┘ │ _action_done() │ ▼ ┌──────────────────┐ │ DONE │ │ (Completado) │ └──────────────────┘ ``` --- ## 5. Flujo de Recepcion (Entrada de Proveedor) ``` 1. CREACION └─ stock.picking creado con picking_type_code='incoming' └─ move_ids con state = 'draft' 2. CONFIRMACION (action_confirm) └─ Confirma todos los movimientos └─ picking.state = 'confirmed' o 'assigned' └─ move.state = 'confirmed' 3. ASIGNACION (action_assign) └─ Para recepciones: generalmente pasa directo a assigned └─ No requiere reserva de stock (entra nuevo) └─ picking.state = 'assigned' └─ move.state = 'assigned' 4. OPERACION └─ Operario registra en move_line_ids └─ Asigna quantity_done └─ Opcionalmente asigna lot_id 5. VALIDACION (button_validate) └─ _action_done() ejecutado └─ stock.quant creado/actualizado └─ quantity incrementada en ubicacion destino └─ picking.state = 'done' └─ move.state = 'done' ``` --- ## 6. Flujo de Envio (Salida a Cliente) ``` 1. CREACION └─ stock.picking creado con picking_type_code='outgoing' └─ move_ids con state = 'draft' 2. CONFIRMACION (action_confirm) └─ Confirma movimientos └─ picking.state = 'confirmed' └─ Inicia proceso de reserva segun picking_type.reservation_method 3. VERIFICACION DISPONIBILIDAD (action_assign) └─ Busca stock en ubicacion origen └─ Crea reservas en stock.quant (reserved_quantity) Si stock completo: └─ move.state = 'assigned' └─ picking.state = 'assigned' Si stock parcial: └─ move.state = 'partially_available' └─ picking.state = 'confirmed' (esperando) Si sin stock: └─ move.state = 'confirmed' └─ picking.state = 'waiting' o 'confirmed' 4. OPERACION (Picking) └─ Operario escanea/selecciona productos └─ Registra quantity_done en move_line_ids └─ Puede crear paquetes (action_put_in_pack) 5. VALIDACION (button_validate) └─ Si quantity_done < product_uom_qty: └─ Opcion de crear backorder └─ _action_done() ejecutado └─ stock.quant.quantity reducida en origen └─ Reservas liberadas └─ picking.state = 'done' ``` --- ## 7. Flujo de Transferencia Interna ``` 1. CREACION └─ stock.picking con picking_type_code='internal' └─ location_id = origen interno └─ location_dest_id = destino interno 2. CONFIRMACION └─ Similar a envio 3. ASIGNACION └─ Reserva stock en ubicacion origen 4. OPERACION └─ Mueve fisicamente productos 5. VALIDACION └─ Reduce quant en origen └─ Incrementa quant en destino └─ Sin cambio en stock total del almacen ``` --- ## 8. Metodos de Transicion ### stock.picking | Metodo | De Estado | A Estado | Descripcion | |--------|-----------|----------|-------------| | action_confirm() | draft | confirmed/waiting | Confirma albaran | | action_assign() | confirmed | assigned | Reserva stock | | action_cancel() | * | cancel | Cancela | | button_validate() | assigned | done | Valida/completa | | _action_done() | * | done | Marca completado | ### stock.move | Metodo | De Estado | A Estado | Descripcion | |--------|-----------|----------|-------------| | _action_confirm() | draft | confirmed | Confirma movimiento | | _action_assign() | confirmed | assigned | Reserva | | _action_cancel() | * | cancel | Cancela | | _action_done() | assigned | done | Ejecuta | --- ## 9. Reglas de Negocio | ID | Regla | Validacion | Mensaje | |----|-------|------------|---------| | R1 | Producto requerido | product_id presente | Producto requerido | | R2 | Cantidad positiva | product_uom_qty > 0 | Cantidad debe ser positiva | | R3 | Ubicaciones validas | location_id y location_dest_id | Ubicaciones requeridas | | R4 | Stock disponible | quant.available_quantity >= qty | Sin stock disponible | | R5 | Lote requerido | Si tracking='lot'/'serial' | Lote/SN requerido | | R6 | SN unico | Si tracking='serial', qty=1 | SN no acepta qty > 1 | --- ## 10. Acciones Automaticas | Trigger | Accion | Condicion | |---------|--------|-----------| | action_confirm | Generar nombre secuencial | Si name = '/' | | action_confirm | Reservar automatico | Si reservation_method = 'at_confirm' | | button_validate | Crear backorder | Si create_backorder = 'always' | | button_validate | Actualizar quants | Siempre | | _action_done | Propagar a cadena | Si move_dest_ids | | Scheduler | action_assign | Periodico | --- ## 11. Permisos por Estado | Estado | Editable | Grupos | |--------|----------|--------| | draft | Si | stock.group_stock_user | | confirmed | Parcial | stock.group_stock_user | | waiting | No | - | | assigned | Operacion | stock.group_stock_user | | done | No | stock.group_stock_manager (forzar) | | cancel | No | - | --- ## 12. Flujo de Backorder ``` ALBARAN ORIGINAL (picking_1) │ │ button_validate() con cantidad parcial │ create_backorder='always' o 'ask' │ ├─► ALBARAN COMPLETADO (picking_1) │ state = 'done' │ Cantidades procesadas │ └─► BACKORDER (picking_2) state = 'confirmed' o 'assigned' backorder_id = picking_1 Cantidades pendientes ``` --- ## 13. Flujo de Cadena de Movimientos ``` REGLA MTO (Make-to-Order) │ │ Crea movimiento con procure_method='make_to_order' │ ▼ MOVIMIENTO 1 (move_orig) state = 'waiting' (espera movimiento origen) │ │ move_orig_ids completado │ ▼ MOVIMIENTO 2 (move_dest) state = 'confirmed' → 'assigned' ``` --- ## 14. Sistema de Reservas (Quants) ``` RESERVA DE STOCK │ ▼ stock.quant ├─ quantity = 100 (total) ├─ reserved_quantity = 30 (reservado) └─ available_quantity = 70 (computed) PROCESO: 1. action_assign() busca quants disponibles 2. Incrementa reserved_quantity 3. Crea stock.move.line vinculado 4. Al validar: reduce quantity, libera reserved_quantity ``` --- ## 15. Estrategias de Extraccion | Estrategia | Descripcion | Uso | |------------|-------------|-----| | fifo | First In First Out | Productos perecederos | | lifo | Last In First Out | Apilamiento | | closest | Mas cercano | Optimizacion ruta | | fefo | First Expiry First Out | Con fechas expiracion | --- **Referencias:** - stock_picking.py: action_confirm, action_assign, button_validate - stock_move.py: _action_confirm, _action_assign, _action_done - stock_quant.py: _update_available_quantity