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
| 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