Calculando el costo unitario en las órdenes de compra

Gustavo Orrillo
- 13/08/2022 - 2 min. de lectura

Muchas veces necesitamos actualizar los costos de los productos que se importan de proveedores en el exterior. No nos confundamos, no el costo directo que es el costo que se paga por unidad al comprarse al proveedor. Sino necesitamos actualizar el costo directo del producto con todos los costos indirectos asociados a el (por ejemplo, tasas aduaneras o gastos de entrega). Como lo hacemos? Desarrollamos el módulo purchase_indirect_costs, el cual calcula por cada uno de los productos en la orden de compra, su costo total considerando costos indirectos. 

Como funciona? Primero se instala el módulo, no tiene grandes requerimientos de instalación. Paso siguiente, pasamos a ingresar las facturas de los proveedores para los gastos asociados. Verán que debajo del campo "Referencia Factura" hay un nuevo campo llamado "Orden de compra" que permite seleccionar la orden de compra a asociar.


Como pueden ver, gracias a la magia de los campos one2many podemos ver en la orden de compra la lista de las facturas relacionadas:


Y también se agregó un campo computado, "Costo total unitario" en el cual se computa para cada producto de la orden de compra el nuevo costo unitario teniendo en cuenta las facturas de compra relacionadas.


Es un módulo para empezar, le faltan más funcionalidades. Pero por lo pronto sirve para resolver un escenario sencillo que es: calcular los costos unitarios de los productos de las ordenes de compra en USD que tienen gastos relacionados en USD para su proceso de nacionalización (o importación). Le falta brindar soporte de multimoneda así se le asignan gastos en ARS a la orden de compra en USD, soporte a notas de crédito, y poder actualizar el campo "Coste de producto" en el producto con los nuevos costos (también mantener un histórico de los costos de producto). Por último sería interesante brindar soporte para prorratear los costos por medio de la cantidad de unidades, volumen, etc.

Notas técnicas

Agregamos un campo computado (sin necesidad de almacenarlo ya que no imaginamos que por ahora nadie necesite buscarlo) que se muestra en la línea de la orden de compra. El campo se muestra como opcional, ya que no necesariamente se necesita ver dicho dato en todas las órdenes de compra (el real-estate en las órdenes de compra o de venta es muy valioso).

<xpath expr="//field[@name='order_line']/tree/field[@name='price_subtotal']" position="after">
    <field name="total_unit_cost" optional="hide" />
</xpath>

Por último el cálculo del campo computado primero calcula la tasa de impuestos que hay en la factura del proveedor (ya que el monto en la moneda de la factura se expresa incluyendo impuestos). Y se suman los montos netos en la moneda de la factura. Paso siguiente se calcula el porcentual de la línea con respecto a la factura (para prorratear el costo) y se multiplica dicho porcentual por el total de los montos netos de la factura. Para por último sumarlo al costo total unitario.

for invoice in rec.order_id.account_move_ids:
    tax_percent = invoice.amount_total / invoice.amount_untaxed
    amount_invoices = amount_invoices + (abs(invoice.amount_total_in_currency_signed) / tax_percent)
percent = rec.price_subtotal / rec.order_id.amount_untaxed
res = (rec.price_subtotal + amount_invoices * percent) / rec.product_qty
Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.