diff --git a/modules/purchase_trade/sale.py b/modules/purchase_trade/sale.py index fd82737..fda5ff7 100755 --- a/modules/purchase_trade/sale.py +++ b/modules/purchase_trade/sale.py @@ -509,7 +509,10 @@ class Sale(metaclass=PoolMeta): def _get_report_display_price_value(self, line): if getattr(line, 'price_type', None) == 'basis': if getattr(line, 'enable_linked_currency', False) and getattr(line, 'linked_currency', None): - return Decimal(str(line.premium or 0)) + premium = getattr(line, 'premium', None) + if premium is None and hasattr(line, '_get_premium_price'): + premium = line._get_premium_price() + return Decimal(str(premium or 0)) return Decimal(str(line._get_premium_price() or 0)) if getattr(line, 'linked_price', None): return Decimal(str(line.linked_price or 0)) @@ -1854,7 +1857,10 @@ class SaleLine(metaclass=PoolMeta): }]) def _get_premium_price(self): - return Decimal(self.premium or 0) + premium = getattr(self, 'premium', None) + if premium is None: + premium = self.get_premium('premium') + return Decimal(str(premium or 0)) def _get_amount_quantity(self): if getattr(self, 'finished', False): diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py index 3568175..06bf9c5 100644 --- a/modules/purchase_trade/tests/test_module.py +++ b/modules/purchase_trade/tests/test_module.py @@ -2164,6 +2164,22 @@ class PurchaseTradeTestCase(ModuleTestCase): self.assertEqual(line.get_premium('premium'), Decimal('10.2500')) + def test_sale_line_premium_price_falls_back_to_decomposition(self): + 'sale line premium price works when the function field is not loaded' + class LineWithoutPremium: + premium_decomposition = [ + Mock(base_amount=Decimal('7.25')), + Mock(base_amount=Decimal('-1.00')), + ] + + get_premium = sale_module.SaleLine.get_premium + + line = LineWithoutPremium() + + self.assertEqual( + sale_module.SaleLine._get_premium_price(line), + Decimal('6.2500')) + def test_purchase_and_sale_line_premium_fields_are_readonly_totals(self): 'line premium fields are readonly totals from premium decomposition' PurchaseLine = Pool().get('purchase.line')