From 531c24144615a521fce9e749ca67a52db363285e Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 4 Sep 2020 11:34:27 +0200 Subject: [PATCH] [IMP] purchase_order_uninvoiced_amount: Be compatible with purchase_discount If we use such module, the final price is not the PO line price unit, so we need to extract the unit price from the subtotal divided by the quantity instead for getting a proper result on both cases. TT25368 --- .../models/purchase_order.py | 13 +++++++++---- .../tests/test_purchase_order_uninvoiced_amount.py | 5 +++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/purchase_order_uninvoiced_amount/models/purchase_order.py b/purchase_order_uninvoiced_amount/models/purchase_order.py index ec50615431b..e3b347bc823 100644 --- a/purchase_order_uninvoiced_amount/models/purchase_order.py +++ b/purchase_order_uninvoiced_amount/models/purchase_order.py @@ -1,4 +1,5 @@ # Copyright 2020 Tecnativa - Manuel Calero +# Copyright 2020 Tecnativa - Pedro M. Baeza # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from odoo import api, fields, models @@ -11,10 +12,14 @@ class PurchaseOrder(models.Model): def _compute_amount_uninvoiced(self): for order in self: amount_uninvoiced = order.amount_untaxed - - for line in order.order_line.filtered(lambda x: (x.qty_invoiced != 0)): - amount_uninvoiced -= line.qty_invoiced * line.price_unit - + for line in order.order_line.filtered("qty_invoiced"): + # we use this way for being compatible with purchase_discount + price_unit = ( + line.product_qty and + line.price_subtotal / line.product_qty or + line.price_unit + ) + amount_uninvoiced -= line.qty_invoiced * price_unit order.update({ 'amount_uninvoiced': order.currency_id.round(amount_uninvoiced), }) diff --git a/purchase_order_uninvoiced_amount/tests/test_purchase_order_uninvoiced_amount.py b/purchase_order_uninvoiced_amount/tests/test_purchase_order_uninvoiced_amount.py index 35b06e4b443..7ec59941475 100644 --- a/purchase_order_uninvoiced_amount/tests/test_purchase_order_uninvoiced_amount.py +++ b/purchase_order_uninvoiced_amount/tests/test_purchase_order_uninvoiced_amount.py @@ -1,4 +1,5 @@ # Copyright 2020 Tecnativa - Manuel Calero +# Copyright 2020 Tecnativa - Pedro M. Baeza # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from odoo.tests.common import SavepointCase @@ -105,3 +106,7 @@ def test_create_purchase_create_and_invoiced_with_all_units(self): self._create_invoice_from_purchase(purchase) self.assertEquals(purchase.amount_uninvoiced, 0, "The purchase amount uninvoiced must be 0") + + def test_create_purchase_qty_0(self): + purchase = self._create_purchase(0, 0) + self.assertEquals(purchase.amount_uninvoiced, 0)