diff --git a/modules/account_invoice/invoice_melya.fodt b/modules/account_invoice/invoice_melya.fodt
index c702ccd..4874d7b 100644
--- a/modules/account_invoice/invoice_melya.fodt
+++ b/modules/account_invoice/invoice_melya.fodt
@@ -1646,7 +1646,7 @@
- <if test="invoice.report_rate_lines">
+ <if test="invoice.report_rate_rows">
@@ -1654,7 +1654,7 @@
- <for each="pc in invoice.report_rate_lines.splitlines()">
+ <for each="pc in invoice.report_rate_rows">
@@ -1662,10 +1662,10 @@
- <pc>Value in <invoice.currency.name>
+ <pc['label']>
- <''>
+ <format_currency(pc['amount'], invoice.party.lang, invoice.currency) if pc['amount'] is not None else ''>
@@ -1710,4 +1710,4 @@
</for>
-
\ No newline at end of file
+
diff --git a/modules/purchase_trade/invoice.py b/modules/purchase_trade/invoice.py
index 3f59d4b..c1e4fa3 100644
--- a/modules/purchase_trade/invoice.py
+++ b/modules/purchase_trade/invoice.py
@@ -916,9 +916,22 @@ class Invoice(metaclass=PoolMeta):
@property
def report_rate_lines(self):
- price_composition_lines = self._get_report_price_composition_lines()
- if price_composition_lines:
- return price_composition_lines
+ rows = self.report_rate_rows
+ if rows:
+ return '\n'.join(row['label'] for row in rows)
+ return ''
+
+ @property
+ def report_rate_rows(self):
+ price_composition_rows = self._get_report_price_composition_rows()
+ if price_composition_rows:
+ return price_composition_rows
+ return [{
+ 'label': line,
+ 'amount': None,
+ } for line in self._get_report_rate_line_details()]
+
+ def _get_report_rate_line_details(self):
details = []
for line in self._get_report_invoice_lines():
currency = getattr(line, 'report_rate_currency_upper', '') or ''
@@ -941,19 +954,18 @@ class Invoice(metaclass=PoolMeta):
] if part)
if detail:
details.append(detail)
- return '\n'.join(details)
+ return details
- def _get_report_price_composition_lines(self):
+ def _get_report_price_composition_rows(self):
sale = self._get_report_sale()
- if sale and getattr(sale, 'report_price_composition_lines', None):
- return sale.report_price_composition_lines
- details = []
+ if sale and getattr(sale, 'report_price_composition_rows', None):
+ return sale.report_price_composition_rows
for line in self._get_report_invoice_lines():
origin = getattr(line, 'origin', None)
sale = getattr(origin, 'sale', None)
- if sale and getattr(sale, 'report_price_composition_lines', None):
- return sale.report_price_composition_lines
- return '\n'.join(details)
+ if sale and getattr(sale, 'report_price_composition_rows', None):
+ return sale.report_price_composition_rows
+ return []
@property
def report_positive_rate_lines(self):
diff --git a/modules/purchase_trade/sale.py b/modules/purchase_trade/sale.py
index 96fc817..3bf21e9 100755
--- a/modules/purchase_trade/sale.py
+++ b/modules/purchase_trade/sale.py
@@ -848,34 +848,34 @@ class Sale(metaclass=PoolMeta):
@property
def report_price_composition_lines(self):
+ return '\n'.join(
+ row['label'] for row in self.report_price_composition_rows)
+
+ @property
+ def report_price_composition_rows(self):
lines = []
for line in self._get_report_lines():
currency = self._get_report_display_currency(line)
- unit = self._get_report_display_unit(line)
currency_name = (
currency.rec_name.upper()
if currency and currency.rec_name else '')
- unit_name = (
- unit.rec_name.upper()
- if unit and unit.rec_name else '')
for composition in getattr(line, 'price_composition', []) or []:
component = getattr(composition, 'component', '') or ''
price = getattr(composition, 'price', None)
if price in (None, ''):
continue
- price_text = self._format_report_number(
- price, strip_trailing_zeros=False)
- detail = ' '.join(
+ label = ' '.join(
part for part in [
component,
+ 'value in',
currency_name,
- price_text,
- 'PER' if unit_name else '',
- unit_name,
] if part)
- if detail:
- lines.append(detail)
- return '\n'.join(lines)
+ if label:
+ lines.append({
+ 'label': label,
+ 'amount': Decimal(str(price or 0)),
+ })
+ return lines
@property
def report_trade_blocks(self):
diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py
index 98dc60c..2b4f649 100644
--- a/modules/purchase_trade/tests/test_module.py
+++ b/modules/purchase_trade/tests/test_module.py
@@ -2612,25 +2612,38 @@ class PurchaseTradeTestCase(ModuleTestCase):
self.assertEqual(
sale.report_price_composition_lines.splitlines(),
[
- 'FOB EUR 2500.0000 PER MT',
- 'FREIGHT EUR 25.0000 PER MT',
+ 'FOB value in EUR',
+ 'FREIGHT value in EUR',
+ ])
+ self.assertEqual(
+ sale.report_price_composition_rows,
+ [
+ {'label': 'FOB value in EUR', 'amount': Decimal('2500')},
+ {'label': 'FREIGHT value in EUR', 'amount': Decimal('25')},
])
def test_invoice_report_rate_lines_prefers_sale_price_composition(self):
'invoice_melya rate block uses sale price composition when available'
Invoice = Pool().get('account.invoice')
sale = Mock(
- report_price_composition_lines=(
- 'FOB EUR 2500.0000 PER MT\n'
- 'FREIGHT EUR 25.0000 PER MT'))
+ report_price_composition_rows=[
+ {'label': 'FOB value in EUR', 'amount': Decimal('2500')},
+ {'label': 'FREIGHT value in EUR', 'amount': Decimal('25')},
+ ])
invoice = Invoice()
invoice.sales = [sale]
self.assertEqual(
invoice.report_rate_lines.splitlines(),
[
- 'FOB EUR 2500.0000 PER MT',
- 'FREIGHT EUR 25.0000 PER MT',
+ 'FOB value in EUR',
+ 'FREIGHT value in EUR',
+ ])
+ self.assertEqual(
+ invoice.report_rate_rows,
+ [
+ {'label': 'FOB value in EUR', 'amount': Decimal('2500')},
+ {'label': 'FREIGHT value in EUR', 'amount': Decimal('25')},
])
def test_sale_report_converts_mixed_units_for_total_and_words(self):