Codificación de productos

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

Out of the box Odoo provee un campo para la codificación de productos llamado Referencia Interna (campo default_code). 


Este campo es un buen arranque pero puede llegar a no ser suficiente. El campo de referencia interna debe ser el SKU interno de la empresa, el código mediante el cual se identifica el producto.

Si lo que se necesita es almacenar el código del proveedor del producto, para ello tenemos el código del proveedor en la pestaña de compras (es el modelo product.supplierinfo)


Código del fabricante

Ahora muchas veces en un entorno de manufactura (sobre todo de electrónica) necesitamos poder identificar a los productos por medio del código del fabricante. Esto se debe a que muchas veces los componentes son fabricados por una empresa pero distribuidos por otra. 

Para esta situación OCA provee el módulo product_manufacturer. Este módulo agrega unos campos muy útiles para el producto. Estos campos son: fabricante, nombre del producto fabricado, código del producto fabricado y (atentos a esto) URL del producto.


Generando un nuevo código en forma automática

Muchas veces cuando trabajamos con productos necesitamos generar en forma automática el código de producto, no queremos dejar esa posibilidad abierta a la creatividad del usuario (la historia demuestra que los usuarios fueron una gran fuente de calamidades gracias a su inagotable imaginación).

Para ello desarrollamos un módulo que ilustra este concepto. La idea es la siguiente: cada vez que se crea un producto que es un componente de una lista de materiales (o sea que el producto se compra) en forma automática se crea su referencia interna (que es asignada mediante una secuencia, un feature de Odoo del que hablaremos en otro lugar)

Si instalamos el módulo notaremos que la categoría del producto tiene dos campos nuevos: Product Ref Sequence y Computed Product Ref Sequence


El campo Product Ref Sequence le permite ingresar al usuario la secuencia con la que quiere codificar la categoría del producto. El campo Computed Product Ref Sequence tiene la secuencia con la que se codificará realmente el producto (en caso que el usuario no seleccione ninguna secuencia para dicha categoría). En este caso, tomará la secuencia de su categoría padre.

Si creamos un nuevo producto, apenas salvemos al mismo veremos como se actualizó en forma automática el campo Referencia Interna con el valor asignado por la secuencia


Notas técnicas

El módulo que acabamos de exponer tiene sus límites, pero demuestra como funciona el principio de codificación de productos. Le faltan muchas cosas; empezando por hacer readonly el campo default_code y aplicar el mismo principio de codificación para los productos para la venta. Ni que hablar de codificar los productos creados previamente a la instalación del módulo (se deben actualizar mediante una acción de servidor o un script de xmlrpc)

Ahora es interesante la definición de la categoría. Ahi tenemos dos campos del tipo many2one que referencian las secuencias. Una para la secuencia elegida por el usuario, y otra con la secuencia que finalmente se aplicará al producto. Esta última secuencia puede ser la secuencia de la categoría (si esta definida) o la secuencia definida para la categoría padre (una empresa puede tener centenares de categorías de productos y codificar en base a diez, por ejemplo).


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)

Y por otra parte es interesante como extendemos el método create del product.template para generar el nuevo código:

    @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('Por favor configure la secuencia en la categoria')
default_code = seq._next()
vals['default_code'] = default_code
return super(ProductTemplate, self).create(vals)
Gustavo Orrillo 26 de julio de 2023
Compartir
Categorías
Archivar
Identificarse dejar un comentario