Como se administra el stock en Odoo? El modelo stock.quant

Gustavo Orrillo
- 07/08/2022 - 2 min. de lectura


Años atrás Odoo (cuando se llamaba OpenERP tenía la genial idea de no necesitarse una tabla (o modelo) para almacenar el stock. Para que tomarse la molestia de mantener un modelo con los stocks cuando los mismos podían ser computados en base a los movimientos de stock ya presentes en el sistema? Sin pensar no solo en la complejidad de las consultas sino también en los problemas de performance que eso podría llegar a ocasionar?

Por oscuros motivos que nunca fueron aclarados, años atrás de forma silenciosa introdujo el modelo stock.quant el cual mantiene el stock. Este modelo es mantenido automáticamente cuando se validan los movimientos de stock (stock.move) (con sus correspondientes movimientos de producto, modelo stock.move.line). En otros términos, debemos despreocuparnos de actualizar el stock manualmente debido a que Odoo lo hace en forma automática (y no es recomendable hacerlo). Este modelo mantiene el stock físico (o las cantidades en mano), no mantiene el stock virtual.

Cual es la estructura del modelo stock.quant? Por lo pronto tenemos los siguientes campos que nos van a resultar útiles:

  • location_id: tenemos la ubicación donde se encuentra el inventario. Puede ser una ubicación interna de stock, como puede ser un depósito. O puede ser la ubicación de un partner, por ejemplo puede ser la ubicación de un cliente que recibió la mercadería (no se cuenta con el partner_id, el mismo podría obtenerse de los movimientos de producto que actualizaron el quant).

  • quantity: cantidad física en stock

  • product_id: producto de stock

  • lot_id: identificador de lote/número de serie de stock.

El quant podemos listarlo como lo hace la vista de "Informe de inventario" (la cual lista los quants agrupados por ubicación y producto). También podemos consultarla desde nuestro código. Supongamos que necesitamos conocer el stock de un producto y número de serie determinado, tenemos que hacer lo siguiente:

product_id = self.env['product.product'].search([('default_code','=','producto a consultar')])
lot_id = self.env['stock.production.lot'].search([('name','=','nro de serie a consultar'),('product_id','=',product_id.id)]
quants = self.env['stock.quant'].search([('location_id.usage','=','internal'),('lot_id','=',lot_id.id)])
for quant in quants:
    print('Stock in location %s para producto %s nro de serie %s es %s'\         %(quant.location_id.name,quant.product_id.name,quant.lot_id.name,quant.quantity))

Otro ejemplo de como se puede consultar el stock se encuentra en el post Generando un XLSX con el inventario en Odoo (usando la librería xlsxwriter)

Para facilitar el mantenimiento del stock, recomendamos impedir los stocks negativos en el mismo (algún cráneo en Bélgica pensó que una empresa puede funcionar normalmente con stock negativos). Revisen el módulo stock_no_negative ya que brida ideas muy buenas sobre como 

Por último, no vamos a entrar en la valuación de stock debido a que nadie en su sano juicio utiliza dicha funcionalidad en Argentina.

Acerca de:

Gustavo Orrillo

Apasionado de la programación, implementa Odoo para distintos tipos de negocios desde el año 2010. En Moldeo Interactive es Socio fundador y Programador; además de escribir en el Blog sobre distintos temas relacionados a los desarrollos que realiza.