Inventario de Odoo - Que sucede al clickear "Actualizar cantidad" en un producto?

7 de julio de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

Si observamos un formulario de producto almacenable, podemos ver el botón "Actualizar Cantidad".


Si investigamos lo que hace el botón vemos que muestra  es una vista tree del model stock.quant (el objeto con el cual se gestiona el inventario en Odoo).


Para sorpresa de quien les escribe, esta vista permite crear un stock.quant. Un stock.quant es ub objeto que permite conocer por ubicación, producto, nro. de serie, paquete la cantidad de unidades reservadas y en stock que se administran en el sistema. Por ejemplo, si nos fijamos en la base de datos PostgreSQL el registro de la base de datos del quant que mostramos en la imagen anterior:



Que sucede al clickear el botón aplicar? No se crea un stock.quant (eso lo hace automáticamente el sistema). Se crea un movimiento de stock (stock.move) y un movimiento de producto (stock.move.line). Si ejecutamos Odoo con el debugger y vemos el diccionario de valores que se usa para crear estos movimientos podemos apreciar:

[{
'name': 'Cantidad de producto actualizada', 
'product_id': 60, 
'product_uom': 1, 
'product_uom_qty': 40.0, 
'company_id': 1, 
'state': 'confirmed', 
'location_id': 30, 
'location_dest_id': 8, 
'is_inventory': True, 
'move_line_ids': [
(0, 0, 
{'product_id': 60, 
'product_uom_id': 1, 
'qty_done': 40.0, 
'location_id': 30, 
'location_dest_id': 8, 
'company_id': 1, 
'lot_id': False, 
'package_id': False, 
'result_package_id': False, 
'owner_id': False})]
}]

Esto crea el movimiento de stock (modelo stock.move) con su correspondiente movimiento de producto (stock.move.line). Estos son confirmados cuando se invoca el método _action_done del modelo stock.move

moves._action_done()

Aca tenemos el movimiento de stock creado


Y el movimiento de producto creado,






Un par puntos a tener en cuenta: la ubicación origen de los movimientos es "Inventory adjustment" y la ubicación destino debe ser siempre una ubicación física (entiendan que uno trabaja siempre con ubicaciones físicas, otros tipos de ubicaciones sirven para descartar o consumir material). Y el valor del campo is_inventory debe ser True en el movimiento de stock. 

Veamos ahora la lista de valores cuando damos de alta stock con números de serie.

[{
'name': 'Cantidad de producto actualizada', 
'product_id': 62, 
'product_uom': 1, 
'product_uom_qty': 1.0, 
'company_id': 1, 
'state': 'confirmed', 
'location_id': 30, 
'location_dest_id': 8, 
'is_inventory': True, 
'move_line_ids': 
[(0, 0, 
{'product_id': 62, 
'product_uom_id': 1, 
'qty_done': 1.0, 
'location_id': 30, 
'location_dest_id': 8, 
'company_id': 1, 
'lot_id': 21, 
'package_id': False, 
'result_package_id': False, 
'owner_id': False})]
}]

Lo único que cambia es el ID del número de serie en el movimiento del producto, que es especificado en este ejemplo. Y si vemos el movimiento de producto creado


Y si clickeamos en el botón de trazabilidad


Por que es importante entender estos conceptos? Porque si necesitamos desarrollar desde cero un sistema de manufactura (por ejemplo si trabajamos con una empresa siderúrgica), la salida del proceso de producción son movimientos de stock y productos como los anteriormente descriptos. Y los consumos de materia prima tambien son movimientos de stock. Y si necesitamos hacer ingresos de mercadería a la empresa en forma automática, los podemos replicar con estos movimientos tambien (solo necesitamos modificar la ubicación origen).

Ahora, si hacemos una orden de compra y recibimos la mercadería, veremos un movimiento de stock de la siguiente manera:




El movimiento de stock es el mismo. Lo único que cambia es la ubicación de origen. El destino es Stock y el origen es una ubicación de proveedor (es una ubicación del tipo Partner, no una ubicación física). Lo que sería bueno es agregar a este movimiento de stock el partner de origen. Lo mismo sucede con el movimiento de producto. Pero eso con fines de reporting

Si analizamos al módulo de fabricación llegamos a la conclusión que este solo le poner infraestructura a un conjunto de movimientos de stock y de producto. Primero por una lista de materiales tenemos los movimientos de stock/productos desde la ubicación en Stock a la ubicación de producción. Después tenemos que el producto elaborado es un movimiento de stock/producto de una ubicación de producción a una ubicación interna, como vemos a continuación


Por que hablamos de esto? Primero quería explicar como se originan los movimientos de stock y productos. Como se estructuran. Que es un stock.move y un stock.move.line. Pero hacerlo fuera de la infraestructura que provee el modelo stock.picking (este mismo no es aconsejable usar en escenarios de automatización). En posts posteriores vamos a hablar sobre los quants (para entender como se maneja el inventario) y la administración de los números de serie.


Gustavo Orrillo 7 de julio de 2023
Compartir
Categorías
Archivar
Identificarse dejar un comentario