Codificando de forma automática los productos

14 de marzo de 2026 por
Gustavo Orrillo
| Sin comentarios aún
 

Codificar cada uno de los productos que se mantienen  en inventario es crítico (no vamos a explicar porque en este post, lo dejamos para otro post). Muchas veces no podemos hacerlo de forma manual, necesitamos que cada vez que un usuario da de alta un producto, se asigne en forma automática un SKU al producto. Como podríamos hacerlo?

Años atrás para un cliente desarrollé un módulo llamado product_automatic_ref que hace esto, y la idea de este post es explicar como funciona.

Lo primero que hace el módulo es definir por categoría que secuencia se utilizará para definir el SKU de forma automática. Debido a que las categorías son jerárquicas, definimos dos campos. Uno donde el usuario ingresa la secuencia a utilizarse. Y el segundo es el que computa que secuencia se usará (en caso que la categoría no tenga secuencia, busca la secuencia de la categoría padre)

class ProductCategory(models.Model):
_inherit = 'product.category'

def _compute_product_sequence_id(self):
for rec in self:
res = None
categ = rec
while categ:
if categ.sequence_id:
res = categ.sequence_id.id
break
else:
categ = categ.parent_id
rec.product_sequence_id = res

sequence_id = fields.Many2one('ir.sequence','Product Ref Sequence')
product_sequence_id = fields.Many2one('ir.sequence','Computed Product Ref Sequence',compute=_compute_product_sequence_id)

Despues, cuando se crea el producto y el mismo tiene categoría, se procede a obtener el nuevo SKU y se lo asigna al campo default_code. Para ello se utiliza el método _next de la secuencia

class ProductTemplate(models.Model):
​_inherit = 'product.template'

​@api.model
​def create(self, vals):
​if vals.get('purchase_ok') and vals.get('categ_id'):
​categ_id = vals.get('categ_id')
​categ = self.env['product.category'].browse(categ_id)
​seq = categ.product_sequence_id
​if not seq:
​raise ValidationError('Please configure sequence in category')
​default_code = seq._next()
​vals['default_code'] = default_code
​return super(ProductTemplate, self).create(vals)

Bueno, espero que les sea de utilidad...
Gustavo Orrillo 14 de marzo de 2026
Compartir
Categorías
Archivar
Identificarse dejar un comentario