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...