Márgenes en Odoo, pero para empresas del mundo real

¿Por qué el módulo de márgenes no es funcional?

Ignacio Buioli
- 20/04/2020 - 2 min. de lectura

Cualquier implementación de Odoo de un negocio medianamente normal necesitará un reporte de utilidades en algun momento de su escala. Es algo natural y Odoo lo sabe, por eso existe el módulo sale_margin que calcula de manera automática el "margen de utilidades" de una orden de ventas. Al crear una nueva orden el módulo busca el precio de costo del producto y se lo resta al precio de lista, dando por resultado el margen de ganancia. Entiendo que no hace falta explicarlo, pero por si acaso: si vendemos un producto a 10 y ese producto nos costó 5 entonces la ganacia será 5. Lo interesante es que este módulo lo aplica a cada producto de una sale.order.line, lo suma como un valor a parte y recién hace la resta del total margen al total precio. Esto es útil porque trabajará con los descuentos aplicados y servirá como dato para que el negocio decida subir o bajar el precio. Pero el mundo de Odoo no es tan luminoso, y este módulo (como tantos otros) solo funciona en empresas Belgas, o la de paises cuya organización estructural a nivel monedas es ordenada y sencilla. Cuando utilizamos el módulo de márgenes en una empresa un poco más real (que tiene costos en dólares pero vende en moneda local) el cálculo falla, hace cálculos muy extraños, se vuelve poco funcional.

Utilidades marginales

Algo con lo que he estado trabajando para contrarrestar este problema es con un campo de utilidades marginales, un cliente me lo sugirió y realmente es una solución simple pero mucho más funcional. Consiste en agregar dos campos al producto, uno será la moneda del costo y otro la utilidad marginal. Con la moneda del costo el usuario elige en que moneda está el costo del producto, y la utilidad marginal simplemente será la división entre el precio de lista y el precio de costo. Si el precio de costo tiene una moneda distinta al de lista, se lo convierte primero usando la tasa de cambio de la moneda y listo. Esto es especialmente útil si se tiene cuasimonedas, algo que forma parte de nuestra realidad. Luego podremos utilizar ese dato en los presupuestos si es lo deseado.

Modificando el módulo de márgenes

Aunque claro, el módulo de márgenes de Odoo está muy bueno, por lo tanto muchos quieren usarlo, y lo entiendo. ¿Qué solución hay? Modificarlo. Lo ideal es copiarlo y hacer algo así como sale_margin_custom, ya que heredarlo es ridículo. Pero modificarlo directamente no es tan riesgoso porque el módulo no es dependencia, así que lo dejo al criterio del desarrollador. Lo importante son las dos funciones de computación y cálculo del precio de costo, porque ahi está el error, el resto funciona bien. Este es el campo en cuestión:

frm_cur = self.env.user.company_id.currency_id

Figura de la misma forma en las dos computaciones y es un problema, ya que considera que la moneda del producto es la de la compañía, y por lo tanto obliga a tener dos compañías. Una solución puede ser tomando la moneda del precio de lista:

frm_cur = order_id.pricelist_id.currency_id

Es un poco absurdo ya que el frm_cur y el to_cur van a ser el mismo dato, pero al menos la conversión va a ser más clara. Del mismo modo, podemos diferenciar la moneda y multiplicar por la tasa de cambio el siguiente valor:

purchase_price = product_id.standard_price
Acerca de:

Ignacio Buioli

Licenciado en Artes Multimediales. Ha desarrollado numerosos proyectos de Multimedia así como también escrito artículos y traducido textos del mencionado tema. En Moldeo Interactive es Socio y Programador; encargándose, además, de gran parte de las redes y los cursos online.