filoquin.github.io

Calcular los impuestos de manera reversa

Imaginemos un escenario donde nos piden que mediante un wizard o desde otro modelo. Agreguemos un producto con un valor exacto en una orden de venta o presupuesto.

Cuando configuramos los impuestos en odoo como “incluidos en el precio”, lo podemos hacer de manera sencilla.

                    rec.sale_order_id.order_line = [(0, 0, {
                        'order_id': rec.sale_order_id.id,
                        'product_id': rec.product_id.id,
                        'product_uom_qty': 1,
                        'price_unit': rec.amount,
                        'tax_id': [(6, 0, rec.product_id.taxes_id.ids)]
                    })]

Y listo

Pero…

Si en nuestra configuración los impuestos no estan incluidos en el precio. Al agregar un producto de $100 tendria un total $120

Por eso antes de agregar el producto tenemos que descontarle los impuestos. Si el valor es $100 el costo sin impuestos es aproximadamente $82,65.

Por suerte algun programador penso en nosotros y dejo un flag en la función compute_all de account.tax para que resolvamos este problema. Si en el contexto agregamos force_price_include=True computa el precio con los impuestos incluidos. y asi obtendremos el valor sin impuestos de nuestro monto.

                    tax_amount = rec.product_id.taxes_id.with_context(force_price_include=True).compute_all(rec.amount)
                    rec.sale_order_id.order_line = [(0, 0, {
                        'order_id': rec.sale_order_id.id,
                        'product_id': rec.product_id.id,
                        'product_uom_qty': 1,
                        'price_unit': tax_amount['total_excluded'],
                        'tax_id': [(6, 0, rec.product_id.taxes_id.ids)]
                    })]

Todavía podemos tener problemas de redondeo, pero ya estamos cerca de la solución.