Este es un escenario que ocurre a menudo con MercadoLibre. Tenemos una empresa distribuidora que ya tiene sus canales de venta establecidos y ademas vende por MercadoLibre. Pero este marketplace lo maneja con otra empresa (factura con otro CUIT y busca evitar conflicto de canales). Ahora, en el fondo son la misma empresa. Comparten el maestro de productos y por sobre todo, comparten el inventario.
En ese caso usamos el entorno multi-compañía y solo contamos con un almacen. 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 mediante rutas pero tengo mis serias dudas con respecto a este punto. Ya que necesitamos que la operación sea simple de configurar y además sea automática.
Hacer esto con un módulo no es complejo, 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. Cuando hay problemas con las rutas para un usuario final es complejo encontrar la causa del error). Pero hice este mmódulo porque queria aprender como resolver este problema (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 (todos los módulos de MercadoLibre por cada orden crean un pedido de venta) 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).
También con algunos ajustes resuelve un problema frecuente en las implementaciones de MercadoLibre.