Introducción
En Odoo, los modelos son la plantilla que organiza la información en la base de datos. Todo dato de la empresa —pedidos, movimientos de stock, operaciones logísticas— tiene una tabla y una lógica asociada en forma de modelo.
Para desarrolladores y consultores funcionales, dominar los modelos es imprescindible. Son la columna vertebral de la arquitectura: definen los campos, las relaciones entre registros y la lógica de negocio que aplica a los datos.
Aquí nos centraremos en uno de los modelos más relevantes del módulo de Inventario: stock.picking. Si diseñas módulos de almacén, integraciones con terceros o estructuras de flujo, acabarás interactuando con este modelo.
¿Qué representa el modelo stock.picking?
El stock.picking representa los traslados de mercancía. Es la ficha que refleja una operación logística concreta: cada registro corresponde a un movimiento de productos de una ubicación origen a una ubicación destino.
En el módulo de Inventario se utiliza para múltiples tipos de operaciones. Entradas, salidas e intercambios internos se registran como pickings. Confirmar una entrega, recepcionar compras o mover stock entre ubicaciones crea o actualiza estos registros.
El modelo se define en el módulo stock y luego es extendido por otros módulos mediante herencia. Ventas añade campos y enlaces para entregas; Compras incorpora flujos de recepción; Fabricación integra consumos y devoluciones, todo sin duplicar la estructura base.
stock.picking hereda funcionalidades de comunicación y tareas (mail.thread y mail.activity.mixin). Eso permite registrar el histórico, usar el chatter y programar actividades directamente sobre la transferencia.
Campos clave del modelo
A continuación verás los campos más relevantes de stock.picking. Conocerlos facilita la configuración, la integración y la resolución de incidencias en operaciones de almacén.
1. name
Tipo: Char. Referencia de la transferencia, normalmente generada por una secuencia (por ejemplo, WH/OUT/00001). Se muestra en el encabezado del pedido y actúa como identificador humano de la operación.
2. origin
Tipo: Char. Referencia del documento origen (por ejemplo, el pedido de venta o la orden de compra). Sirve para trazar qué originó la transferencia y facilita auditorías y consultas rápidas.
3. state
Tipo: Selection. Estado de la transferencia (Borrador, En espera de otra operación, En espera, Listo, Hecho, Cancelado). El estado condiciona las acciones disponibles y se calcula en función de los movimientos asociados.
4. picking_type_id
Tipo: Many2one (stock.picking.type). Tipo de operación: entrada, salida o interna. Es obligatorio y determina las ubicaciones por defecto y el comportamiento del proceso.
5. move_ids
Tipo: One2many (stock.move). Líneas de movimiento: cada una indica producto y cantidad a mover. Constituyen el núcleo del picking; sobre ellas se realizan reservas y comprobaciones de disponibilidad.
6. move_line_ids
Tipo: One2many (stock.move.line). Operaciones detalladas: aquí van los lotes/series y las ubicaciones exactas cuando se trabaja con trazabilidad. Son fundamentales para picking, empaquetado y validación fina.
7. location_id
Tipo: Many2one (stock.location). Ubicación origen de los productos. Obligatorio: para salidas suele ser la ubicación de stock; para entradas, la ubicación del proveedor o entrada entrante.
8. location_dest_id
Tipo: Many2one (stock.location). Ubicación destino. Obligatorio: por ejemplo, la ubicación del cliente en las entregas o la ubicación de stock en las recepciones.
9. partner_id
Tipo: Many2one (res.partner). Contacto asociado: cliente en salidas o proveedor en entradas. Se utiliza para imprimir direcciones, calcular tarifas de transporte y comunicación con carriers.
10. scheduled_date
Tipo: Datetime. Fecha prevista para procesar la transferencia. Se usa en la planificación y priorización: fijarla afecta a las reservas y al orden de ejecución de pickings.
11. date_deadline
Tipo: Datetime. Fecha límite, normalmente tomada del pedido de venta o compra. Útil para detectar retrasos y cumplir compromisos con clientes.
12. date_done
Tipo: Datetime. Fecha en la que la transferencia se validó o canceló. Campo de solo lectura, gestionado automáticamente al completar el picking.
13. priority
Tipo: Selection. Nivel de prioridad. Las reservas y asignaciones prefieren pickings con prioridad alta; utilizable para gestionar pedidos urgentes.
14. move_type
Tipo: Selection. Política de entrega: En cuanto esté disponible (permitir entregas parciales) o Cuando todos los productos estén listos (todo o nada). Influye en cuándo puede procesarse el picking.
15. user_id
Tipo: Many2one (res.users). Usuario responsable de la operación. Sirve para asignación, control de carga de trabajo y seguimiento. Por defecto suele ser el usuario que crea el picking.
16. company_id
Tipo: Many2one (res.company). Empresa propietaria del picking, normalmente heredada del picking_type. Importante en entornos multicompany para separar operaciones.
17. group_id
Tipo: Many2one (procurement.group). Agrupa movimientos relacionados procedentes del mismo pedido u operación. Facilita la trazabilidad cuando varios pickings nacen de una misma venta.
18. backorder_id
Tipo: Many2one (stock.picking). En validaciones parciales se crea un backorder con lo pendiente; este campo enlaza al picking original para mantener la relación.
19. backorder_ids
Tipo: One2many (stock.picking). Backorders generados a partir de este picking: útil cuando se procesa parcialmente y queda trabajo pendiente para otra operación.
20. return_id
Tipo: Many2one (stock.picking). Si el picking es una devolución, aquí se referencia el picking original; permite gestionar devoluciones y su trazabilidad.
21. note
Tipo: Html. Notas internas visibles para el personal de almacén: instrucciones, requisitos de manipulación o información adicional relevante para la operación.
22. signature
Tipo: Image. Firma capturada al validar la entrega. Se guarda como adjunto y sirve como prueba de entrega para clientes y auditorías.
23. is_signed
Tipo: Boolean. Calculado a partir de signature; indica si la entrega fue firmada o no.
24. owner_id
Tipo: Many2one (res.partner). Propietario asignable al validar: usado en consignaciones o cuando la mercancía pertenece a un tercero y no a la empresa almacenista.
25. package_level_ids
Tipo: One2many (stock.package_level). Niveles de paquete para “put in pack”: agrupan move lines en paquetes para su envío y control de embalaje.
26. create_date
Tipo: Datetime. Fecha de creación del registro. Gestado automáticamente por Odoo y heredado del modelo base.
27. write_date
Tipo: Datetime. Fecha de la última modificación del registro. También gestionada automáticamente.
28. active
Tipo: Boolean. Flag de borrado lógico: cuando es False el registro queda archivado y no aparece en búsquedas normales.
Cómo se usa este modelo en los procesos de negocio
1. Ventas y entregas
Al confirmar un pedido de venta Odoo genera un delivery (stock.picking). El picking guarda el enlace con la venta en el campo origin; el equipo de almacén prepara, empaqueta y valida, y el flujo de estados avanza desde borrador hasta listo y luego hecho.
2. Compras y recepciones
Al confirmarse una orden de compra se crea un albarán de entrada. El picking recibe mercancía desde la ubicación del proveedor hacia la ubicación de stock; partner_id apunta al proveedor y la validación actualiza las cantidades en inventario.
3. Traslados internos
Los movimientos entre almacenes o ubicaciones internas generan pickings con picking_type_id de tipo 'internal'. Tanto origen como destino son ubicaciones internas del almacén.
4. Devoluciones y backorders
Las devoluciones generan pickings vinculados al original mediante return_id. Si una validación queda parcial, se crea un backorder y la relación queda registrada en backorder_ids para gestionar lo pendiente.
5. Fabricación y producción
Las órdenes de fabricación generan pickings para consumo de materias primas y para la salida de productos terminados. El módulo de mrp extiende stock.picking para integrar estos flujos en la producción.
Cómo lo amplían los desarrolladores
Los desarrolladores amplían stock.picking con diferentes patrones de herencia y personalización. La herencia de modelos de Odoo es la técnica central.
Herencia del modelo
Usa _inherit = 'stock.picking' para añadir campos, sobrescribir métodos o incluir restricciones. Mantener las extensiones en módulos separados facilita actualizaciones y evita tocar el núcleo directamente.
Añadir campos
Declara nuevos campos en el modelo heredado usando los tipos adecuados: Char, Many2one, Boolean, Integer, Text, Selection. Ten en cuenta campos dependientes de compañía en entornos multicompany.
Extensiones en Python
Sobrescribe métodos como button_validate, action_assign o _create_backorder para insertar lógica propia; utiliza super() para preservar la funcionalidad base. Atiende con cuidado las transiciones de estado y la creación de movimientos.
Odoo Studio
Studio permite añadir campos y modificar vistas sin escribir código, ideal para ajustes rápidos como etiquetas o notas. Para integraciones complejas o lógica avanzada conviene crear un módulo personalizado para mantenerlo mantenible.
Buenas prácticas
- Siempre fija picking_type_id al crear pickings manualmente: define las ubicaciones por defecto y el comportamiento esperado del proceso.
- Usa origin para conservar la referencia al documento que originó la operación; ayuda en informes, seguimientos y resolución de incidencias.
- En integraciones por API, stock.picking está totalmente expuesto. Crea las líneas de movimiento a través de move_ids en vez de crear pickings vacíos: un picking sin moves no representa una operación válida.
- Aprovecha scheduled_date en la planificación: influye en la priorización y en cómo el sistema reserva stock para los pickings.
- Para campos propios, emplea prefijos x_ o un prefijo de módulo (por ejemplo, x_mimodulo_) para evitar colisiones con futuros campos estándar de Odoo.
Errores frecuentes
- Crear pickings sin indicar picking_type_id. Riesgo: ubicaciones por defecto incorrectas y comportamiento indeseado.
- Modificar move_ids tras la confirmación sin comprender la máquina de estados. Las transiciones pueden ser complejas y generar inconsistencias si no se controla bien.
- No asignar partner_id en entregas. Las etiquetas, transportistas y documentos pueden necesitar el contacto para tarifas y direcciones.
- Sobrescribir button_validate sin llamar a super(). Esto puede impedir la creación de backorders y romper integraciones de otros módulos.
- Creer que move_ids y move_line_ids siempre están sincronizados. Las move_lines aparecen en reservas detalladas o al usar operaciones por lotes y pueden no coincidir automáticamente.
Conclusión
El modelo stock.picking es el núcleo del inventario en Odoo: centraliza traslados, entregas y recepciones. Conocer sus campos y cómo se extiende te ayudará a configurar, personalizar e integrar Odoo con menos errores.
Tanto si eres consultor funcional definiendo procesos de almacén como si eres desarrollador, entender stock.picking te ahorrará tiempo y evitará problemas operativos.
¿Listo para optimizar tu almacén en Odoo?
Dasolo acompaña a empresas en implantaciones y personalizaciones de Odoo, con especial foco en integraciones API y desarrollo a medida. Nuestro equipo conoce en profundidad la arquitectura de datos y modelos clave como stock.picking.
Si necesitas apoyo con tu implementación de Odoo, módulos de almacén personalizados o integraciones, podemos ayudarte a diseñar la mejor solución. Solicita una demo para hablar de tu proyecto.