Cambiando la precisión de los montos o cantidades en Odoo

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

Es algo que sucede. No a menudo pero pasa. Llama un usuario de compras y te dice "necesitamos aumentar la cantidad de decimales en los costos de los productos ya que los tenemos en USD y necesitamos mayor precisión."

Odoo para administrar la precisión de las columnas, lo administra por medio de la interface de usuarios. Si uno (en modo desarrollador) clickea en Ajustes > Técnico > Estructura de la base de datos > Precisión decimal, veremos la siguiente lista 


Donde podemos ver la definición de una unidad de precisión (por ejemplo Product Price) con su correspondiente cantidad de dígitos. Si vemos el código del modelo purchase.order.line para el campo price_unit, podemos observar como esta definido esto

    price_unit = fields.Float(
string='Unit Price', required=True, digits='Product Price',
compute="_compute_price_unit_and_date_planned_and_name", readonly=False, store=True)

Lo interesante en la definición del campo es, la cantidad de dígitos es dinámica debido a que en lugar de indicar de forma fija "2 dígitos" Odoo permite indicar la precisión decimal por medio de un keyword (Product Price) y que el usuario decida cuantos decimales quiere. No hay necesidad de pedirselo al programador.

Ahora, esto tiene un pequeño problema. Muchas veces estas precisiones son compartidas por muchos objetos (por ejemplo Product Price esta compartida al menos por sale.order.line, account.move.line y purchase.order.line) o sea que modificando la precisión de una columna de un modelo afectamos la precisión de una columna de otro modelo. Como hacemos para evitar esto?

Primero debemos definir una nueva medida de precisión. Por medio de un módulo (no vamos a entrar en el detalle de como desarrollar un módulo de Odoo precisamente en este post, hay miles de posts que lo hacen mejor) agregamos un archivo de datos con la nueva precisión

        <record forcecreate="True" id="decimal_price" model="decimal.precision">
<field name="name">Product Purchase Price</field>
<field name="digits">4</field>
</record>

Donde definimos una nueva unidad de precisión decimal. Luego tenemos que modificar la definición del campo price_unit del modelo purchase.order.line para indicarle que use la nueva unidad de precisión

class PurchaseOrderLine(models.Model):
​_inherit = 'purchase.order.line'
		​price_unit = fields.Float(
string='Unit Price', required=True, digits='Product Purchase Price',
compute="_compute_price_unit_and_date_planned_and_name", readonly=False, store=True)

Y nada más, bastante sencillo todo

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