Introducción
En Odoo, los modelos definen cómo se estructura y almacena la información en la base de datos. Cada pieza de datos empresariales con la que trabajas, desde pedidos de venta hasta transferencias de inventario y operaciones de almacén, reside en un modelo.
Entender los modelos de Odoo es esencial tanto para desarrolladores como para consultores funcionales. Los modelos son la base de la arquitectura de datos de Odoo. Definen campos, relaciones y lógica empresarial.
Este artículo se centra en uno de los modelos más importantes de la aplicación de Inventario: stock.picking. Ya sea que estés construyendo módulos personalizados para almacenes, integrando sistemas externos o configurando flujos de trabajo, trabajarás con este modelo.
¿Qué es el modelo stock.picking?
El modelo stock.picking representa transferencias en Odoo. Es el lugar central donde se rastrean las operaciones del almacén. Cada registro de picking representa una única transferencia de bienes de una ubicación a otra.
Este modelo en Odoo se utiliza en todo el módulo de Inventario. Recepciones, entregas y transferencias internas crean registros de stock.picking. Cuando confirmas un pedido de entrega de una venta, recibes bienes de una compra o mueves stock entre almacenes, estás creando o actualizando un registro de stock.picking.
El modelo está definido en el módulo de stock. Otros módulos lo extienden a través de la herencia de modelos de Odoo. Venta añade campos relacionados con la entrega. Compra añade flujos de trabajo de recepción. Fabricación añade movimientos de producción. Cada módulo añade lo que necesita sin duplicar la estructura central.
El modelo stock.picking hereda de mail.thread y mail.activity.mixin. Esto significa que puedes rastrear cambios, añadir mensajes de chatter y programar actividades en las transferencias directamente.
Campos clave en el modelo
Aquí están los campos más importantes de Odoo en el modelo stock.picking. Entender estos te ayudará a trabajar de manera efectiva con transferencias y operaciones de almacén.
1. nombre
Tipo: Char. Este campo almacena la referencia de la transferencia. Normalmente se genera automáticamente a partir de una secuencia (por ejemplo, WH/OUT/00001). Se muestra en el encabezado de los formularios de transferencia y es el identificador principal para el picking.
2. origen
Tipo: Char. La referencia del documento fuente. Para una entrega, esto podría ser el nombre del pedido de venta. Para una recepción, el pedido de compra. Ayuda a rastrear de dónde se originó la transferencia.
3. estado
Tipo: Selección. El estado de la transferencia. Valores: Borrador, Esperando Otra Operación, Esperando, Listo, Hecho, Cancelado. Cada estado determina qué acciones están disponibles. Odoo calcula esto a partir de los movimientos de stock relacionados.
4. picking_type_id
Tipo: Many2one (stock.picking.type). El tipo de operación. Define si se trata de un recibo, entrega o transferencia interna. Requerido. Cada tipo de picking tiene ubicaciones de origen y destino predeterminadas.
5. move_ids
Tipo: One2many (stock.move). Los movimientos de stock. Cada línea representa un producto y cantidad a mover. Este es el núcleo de la transferencia. Toda la lógica de reserva y disponibilidad funciona sobre estos movimientos.
6. move_line_ids
Tipo: One2many (stock.move.line). Las operaciones detalladas. Cuando tienes seguimiento de lotes o series, estas líneas almacenan los lotes y ubicaciones específicos. Se utilizan para picking, embalaje y validación.
7. location_id
Tipo: Many2one (stock.location). La ubicación de origen. De donde se toman los productos. Requerido. Para entregas, esta suele ser la ubicación de stock. Para recibos, la ubicación del proveedor.
8. location_dest_id
Tipo: Many2one (stock.location). La ubicación de destino. A donde se mueven los productos. Requerido. Para entregas, esta suele ser la ubicación del cliente. Para recibos, la ubicación de stock.
9. partner_id
Tipo: Many2one (res.partner). El contacto. Para entregas, el cliente. Para recibos, el proveedor. Se utiliza para la dirección en documentos y para la integración con transportistas.
10. scheduled_date
Tipo: Fecha y hora. Cuando se programó que se procesara la transferencia. Se utiliza para la planificación y priorización. Configurarlo manualmente establece la fecha esperada para todos los movimientos de stock.
11. fecha_límite
Tipo: Fecha y hora. La fecha límite. A menudo proviene del pedido de venta o del pedido de compra. Se utiliza para marcar transferencias tardías y para fechas de promesa al cliente.
12. fecha_hecha
Tipo: Fecha y hora. Cuando la transferencia fue validada o cancelada. Solo lectura. Se establece automáticamente cuando se completa la recogida.
13. prioridad
Tipo: Selección. El nivel de prioridad. Los productos se reservan primero para transferencias con mayor prioridad. Se utiliza para pedidos urgentes.
14. tipo_movimiento
Tipo: Selección. La política de envío. Valores: Tan pronto como sea posible (se permite entrega parcial) o Cuando todos los productos estén listos (todo o nada). Afecta cuándo se puede procesar la recogida.
15. id_usuario
Tipo: Muchos a uno (res.users). El usuario responsable. Se utiliza para la asignación y el seguimiento de la carga de trabajo. Por defecto, se establece en el usuario actual al crear.
16. id_empresa
Tipo: Many2one (res.company). La empresa. Relacionado con el tipo de recogida. En configuraciones de múltiples empresas, esto determina qué empresa posee la transferencia.
17. group_id
Tipo: Many2one (procurement.group). El grupo de aprovisionamiento. Vincula movimientos relacionados entre sí. Se utiliza cuando múltiples recogidas provienen del mismo pedido.
18. backorder_id
Tipo: Many2one (stock.picking). Cuando una transferencia está parcialmente validada, se crea un pedido pendiente para lo restante. Este campo se vincula a la recogida original.
19. backorder_ids
Tipo: One2many (stock.picking). Los pedidos pendientes creados a partir de esta recogida. Se utiliza cuando validas parcialmente y necesitas procesar el resto más tarde.
20. return_id
Tipo: Many2one (stock.picking). Si esta recogida fue creada como un retorno, esto se vincula a la recogida original. Se utiliza para flujos de trabajo de devoluciones.
21. note
Tipo: Html. Notas internas. Visibles para los usuarios del almacén. Pueden incluir instrucciones especiales o requisitos de manejo.
22. signature
Tipo: Imagen. La firma capturada cuando se valida la entrega. Usada como prueba de entrega. Almacenada como un archivo adjunto.
23. está_firmado
Tipo: Booleano. Calculado a partir de la firma. Indica si la entrega ha sido firmada.
24. id_propietario
Tipo: Many2one (res.partner). El propietario a asignar al validar. Usado para el envío o cuando los productos pertenecen a un tercero.
25. ids_niveles_paquete
Tipo: One2many (stock.package_level). Niveles de paquete al usar poner en paquete. Agrupa líneas de movimiento en paquetes para el envío.
26. fecha_creación
Tipo: Datetime. Cuándo se creó el registro. Gestionado automáticamente por Odoo. Heredado del modelo base.
27. fecha_modificación
Tipo: Datetime. Cuándo se modificó por última vez el registro. Gestionado automáticamente. Heredado del modelo base.
28. activo
Tipo: Booleano. Bandera de eliminación suave. Cuando es Falso, el registro se archiva. Heredado del modelo base.
Cómo se utiliza este modelo en los flujos de trabajo empresariales
1. Ventas y Entrega
Cuando se confirma un pedido de venta, Odoo crea un pedido de entrega (stock.picking). La entrega se vincula al pedido de venta a través del origen. El personal del almacén recoge y empaqueta, luego valida. El estado pasa de borrador a listo a hecho.
2. Compra y Recepción
Cuando se confirma un pedido de compra, Odoo crea una recepción entrante. La entrega recibe productos de la ubicación del proveedor al stock. El partner_id es el proveedor. La validación actualiza las cantidades de inventario.
3. Transferencias Internas
Mover stock entre almacenes o ubicaciones crea entregas internas. El picking_type_id tiene el código 'internal'. La ubicación y el destino son ambas ubicaciones de stock internas.
4. Devoluciones y Pedidos Pendientes
Cuando se devuelve una venta, se crea un picking de devolución. El return_id se vincula a la entrega original. Cuando una entrega está parcialmente validada, backorder_ids contiene el trabajo restante.
5. Fabricación y Producción
Los pedidos de fabricación crean pickings para materias primas (consumo) y productos terminados (producción). El modelo stock.picking se extiende mediante el módulo mrp para estos flujos.
Cómo los desarrolladores extienden este modelo
Los desarrolladores extienden stock.picking utilizando varios patrones. La herencia de modelos de Odoo es el principal mecanismo.
Herencia de Modelos
Utiliza _inherit = 'stock.picking' para extender el modelo. Agrega nuevos campos, sobrescribe métodos o añade restricciones. El modelo heredado en Odoo mantiene tus cambios en un módulo separado para facilitar las actualizaciones.
Añadiendo Campos
Define nuevos campos de Odoo en tu modelo heredado. Usa el tipo de campo correcto: Char, Many2one, Boolean, Integer, Text, Selection. Considera campos dependientes de la empresa para multiempresa.
Extensiones de Python
Sobrescribe button_validate, action_assign o _create_backorder para añadir lógica. Usa super() para llamar al original. Ten cuidado con las transiciones de estado y la creación de movimientos.
Odoo Studio
Odoo Studio te permite añadir campos sin código. Es bueno para personalizaciones rápidas como etiquetas personalizadas o notas adicionales. Para lógica compleja o integración de transportistas, los módulos personalizados son más mantenibles.
Mejores prácticas
- Siempre establece el picking_type_id al crear picking manualmente. Esto determina las ubicaciones y el comportamiento por defecto.
- Utiliza el campo origin para rastrear el documento fuente. Ayuda con la generación de informes y la depuración.
- Al construir integraciones API, el modelo stock.picking está completamente expuesto a través de la API de Odoo. Crea movimientos a través de la relación move_ids. No crees pickings sin movimientos.
- Utiliza scheduled_date para la planificación. Afecta la reserva y la priorización.
- Para campos personalizados, utiliza el prefijo
x_o un prefijo de módulo para evitar conflictos con futuras versiones de Odoo.
Errores comunes
- Creando albaranes sin establecer picking_type_id. Esto puede llevar a ubicaciones predeterminadas incorrectas.
- Modificando move_ids después de la confirmación sin entender la máquina de estados. Las transiciones de estado pueden ser complejas.
- Olvidando establecer partner_id para las entregas. Los transportistas y documentos necesitan el contacto.
- Sobrescribiendo button_validate sin llamar a super(). Esto puede romper la creación de pedidos pendientes y otros módulos.
- Asumiendo que move_ids y move_line_ids siempre están sincronizados. Las líneas de movimiento se crean cuando reservas o cuando utilizas operaciones detalladas.
Conclusión
El modelo stock.picking es central para el inventario de Odoo. Almacena transferencias, entregas y recibos. Entender sus campos y cómo los módulos lo extienden te ayudará a configurar, personalizar e integrar Odoo de manera efectiva.
Ya seas un consultor funcional mapeando procesos de almacén o un desarrollador construyendo módulos personalizados, un sólido entendimiento de stock.picking te ahorrará tiempo y evitará errores.
¿Listo para optimizar tu almacén Odoo?
Dasolo ayuda a las empresas a implementar, personalizar y optimizar Odoo. Nos especializamos en integraciones API y desarrollo de Odoo. Nuestro equipo tiene una profunda experiencia con la arquitectura de datos de Odoo y modelos como stock.picking.
Si necesitas ayuda con tu implementación de Odoo, módulos personalizados de almacén o integraciones, estamos aquí para ayudar. Reserva una demostración para discutir tu proyecto.