Reabasteciendo un pedido de ventas desde otra compañía

18 de diciembre de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

Muchas veces usamos el entorno multi-compañía y nos encontramos con la situación que en la realidad solo contamos con un almacen, y tenemos dos empresas para facturar (o tenemos una empresa para publicar en Mercadolibre). Entonces necesitamos que, cada vez que se confirme un pedido de ventas de una compañía, si esta no tiene stock transfiera en forma automática de la otra empresa.

En este post vamos a analizar como reabastecer en forma automática con un módulo. Se podría configurar; pero no es complejo hacerlo con un módulo, se puede mantener en forma sencilla y además tenemos control sobre el proceso y transparencia (algo que no siempre se da con los reabastecimientos en Odoo). Y tambien queria aprender como hacerlo (aprender a mover stock de una ubicación a otra es uno de los conocimientos básicos que debe tener un desarrollador de Odoo).

Supongamos tenemos un pedido con productos almacenables del que no tenemos stock, al momento de confirmar se crean los movimientos de stock para poder abastecer los pedidos de entrega a los clientes. Los movimientos creados se pueden ver en el tab Reabastecimientos del pedido de ventas



Lo único que necesita configurarse es la ubicación de reabastecimiento en el almacen que abastecerá los pedidos de venta


El módulo lo pueden descargar de nuestro repositorio, y se instala como cualquier módulo. No tiene requerimientos.

Notas técnicas

El primer punto a notar es que se invoca el reabastecimiento al confirmar el pedido de ventas, eso lo hacemos extendiendo la confirmación del modelo sale.order

    def action_confirm(self):
for rec in self:
rec.resupply_order()
res = super(SaleOrder, self).action_confirm()
return res

Luego necesitamos conocer el stock, tanto en el almacén origen como en el almacen destino. Eso lo hacemos sumarizando la columna quantity del modelo stock.quant para el producto y ubicación que queremos consultar

remote_stock_quants = self.env['stock.quant'].search([('location_id','=',self.warehouse_id.resupply_location_id.id),('product_id','=',order_line.product_id.id)])
remote_stock = sum(remote_stock_quants.mapped('quantity'))

Y por último, si es necesario movemos el stock. Para eso debemos crear por cada producto a mover un registro en el modelo stock.move, y por cada lote o número de serie otro registro en el modelo stock.move.line

vals_move = {
'resupply_order_id': self.id,
'product_uom': prod_id.uom_id.id,
'product_id': prod_id.id,
'name': 'Reabastecimiento inventario %s %s'%(self.name,prod_id.display_name),
'company_id': self.warehouse_id.resupply_location_id.company_id.id,
'state': 'draft',
'is_inventory': True,
'location_id': self.warehouse_id.resupply_location_id.id,
'location_dest_id': location_adj.id,
'product_uom_qty': qty
}
src_move_id = self.env['stock.move'].create(vals_move)
vals_move_line = {
'resupply_order_id': self.id,
'move_id': src_move_id.id,
'product_uom_id': prod_id.uom_id.id,
'product_id': prod_id.id,
'state': 'draft',
'company_id': self.warehouse_id.resupply_location_id.company_id.id,
'location_id': self.warehouse_id.resupply_location_id.id,
'location_dest_id': location_adj.id,
'qty_done': qty
}
move_line_id = self.env['stock.move.line'].create(vals_move_line)

Tengamos en cuenta que debemos hacer por cada producto dos movimientos: uno de la ubicacion de la empresa que abastece a ajustes, y luego otro de ajustes a la ubicacion de la empresa donde tenemos el pedido de ventas. Sino obtenemos un mensaje de error indicando que no se pueden hacer movimientos entre ubicaciones de diferentes empresas.

Por último, confirmamos el movimiento de stock

src_move_id._action_done()

El módulo hace el trabajo, si bien le falta más ajustes (por ejemplo no tener en cuenta el stock reservado ni las sub-ubicaciones de stock). Pero para empezar a estar bien, y es un buen punto para ilustrar como a nivel código se puede mover stock en Odoo (algo no del todo documentado).

Gustavo Orrillo 18 de diciembre de 2023
Compartir
Archivar
Identificarse dejar un comentario