From 0d5cf7dffc81838ca73d096d7920c5a77b41fadc Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Thu, 2 Apr 2026 12:46:42 +0200 Subject: [PATCH] 02.04.26 --- modules/account_invoice/invoice_ict.fodt | 8 ++--- .../account_invoice/invoice_ict_final.fodt | 30 ++++++++----------- modules/purchase_trade/invoice.py | 25 +++++----------- modules/purchase_trade/tests/test_module.py | 23 ++++++++++++++ 4 files changed, 47 insertions(+), 39 deletions(-) diff --git a/modules/account_invoice/invoice_ict.fodt b/modules/account_invoice/invoice_ict.fodt index d94583a..c65e8fa 100644 --- a/modules/account_invoice/invoice_ict.fodt +++ b/modules/account_invoice/invoice_ict.fodt @@ -2,7 +2,7 @@ - Provisional Invoice + Invoice willen @@ -3866,7 +3866,7 @@ - Provisional Invoice + Invoice @@ -3932,7 +3932,7 @@ QUANTITY: <format_number(invoice.report_lbs, invoice.party.lang) if invoice.report_lbs != '' else ''>LBS (<format_number(invoice.report_net, invoice.party.lang) if invoice.report_net != '' else ''> <invoice.report_weight_unit_upper>) - <invoice.report_description_upper or invoice.report_product_description>CROP <invoice.report_crop_name> + <invoice.report_description_upper or invoice.report_product_description><' CROP ' + invoice.report_crop_name if invoice.report_crop_name else ''> <invoice.report_attributes_name> <for each="block in invoice.report_trade_blocks"> <block[0]> @@ -3943,7 +3943,7 @@ <invoice.report_incoterm> ALL DETAILS AND SPECIFICATIONS AS PER BENEFICIARY - PROFORMA INVOICE NO. <invoice.report_proforma_invoice_number>DATED <format_date(invoice.report_proforma_invoice_date, invoice.party.lang) if invoice.report_proforma_invoice_date else ''>. + diff --git a/modules/account_invoice/invoice_ict_final.fodt b/modules/account_invoice/invoice_ict_final.fodt index 9e0c79d..3ed36be 100644 --- a/modules/account_invoice/invoice_ict_final.fodt +++ b/modules/account_invoice/invoice_ict_final.fodt @@ -2,7 +2,7 @@ - Final Invoice + Credit / Debit Note willen 2018-12-09T16:20:00 2026-03-27T08:01:16.333000000 @@ -3852,7 +3852,7 @@ - Final Invoice + <invoice.report_note_title> @@ -3916,23 +3916,19 @@ Goods description - <for each="line in invoice.lines"> - <if test="line.type == 'line'"> - <if test="line.report_description_upper"> - <line.report_description_upper> - </if> - QUANTITY <format_number(line.report_lbs, invoice.party.lang) if line.report_lbs != '' else ''>LBS (<format_number(line.report_net, invoice.party.lang) if line.report_net != '' else ''> MTS) - <line.report_product_description or line.product_name or ''>CROP <line.report_crop_name> - <line.report_attributes_name> - At <line.report_rate_currency_upper><line.report_rate_value>PER <line.report_rate_unit_upper>(<line.report_rate_price_words>) <line.report_rate_pricing_text> + QUANTITY: <format_number(invoice.report_lbs, invoice.party.lang) if invoice.report_lbs != '' else ''>LBS (<format_number(invoice.report_net, invoice.party.lang) if invoice.report_net != '' else ''> <invoice.report_weight_unit_upper>) + + <invoice.report_description_upper or invoice.report_product_description><' CROP ' + invoice.report_crop_name if invoice.report_crop_name else ''> + <invoice.report_attributes_name> + <for each="block in invoice.report_trade_blocks"> + <block[0]> + At <block[1]> - </if> - - </for> + </for> <invoice.report_incoterm> ALL DETAILS AND SPECIFICATIONS AS PER BENEFICIARY - PROFORMA INVOICE NO. <invoice.report_proforma_invoice_number>DATED <format_date(invoice.report_proforma_invoice_date, invoice.party.lang) if invoice.report_proforma_invoice_date else ''>. + @@ -3946,10 +3942,10 @@ BALES - Gross KGS + Gross <invoice.report_weight_unit_upper> - NET KGS + NET <invoice.report_weight_unit_upper> diff --git a/modules/purchase_trade/invoice.py b/modules/purchase_trade/invoice.py index 9087841..7195db4 100644 --- a/modules/purchase_trade/invoice.py +++ b/modules/purchase_trade/invoice.py @@ -167,9 +167,6 @@ class Invoice(metaclass=PoolMeta): @property def report_quantity_lines(self): - sale = self._get_report_sale() - if sale and getattr(sale, 'report_quantity_lines', None): - return sale.report_quantity_lines details = [] for line in self._get_report_invoice_lines(): quantity = getattr(line, 'report_net', '') @@ -193,9 +190,6 @@ class Invoice(metaclass=PoolMeta): @property def report_trade_blocks(self): - sale = self._get_report_sale() - if sale and getattr(sale, 'report_trade_blocks', None): - return sale.report_trade_blocks blocks = [] quantity_lines = self.report_quantity_lines.splitlines() rate_lines = self.report_rate_lines.splitlines() @@ -241,9 +235,6 @@ class Invoice(metaclass=PoolMeta): @property def report_rate_lines(self): - sale = self._get_report_sale() - if sale and getattr(sale, 'report_price_lines', None): - return sale.report_price_lines details = [] for line in self._get_report_invoice_lines(): currency = getattr(line, 'report_rate_currency_upper', '') or '' @@ -309,9 +300,6 @@ class Invoice(metaclass=PoolMeta): @property def report_gross(self): - sale = self._get_report_sale() - if sale and sale.report_gross != '': - return sale.report_gross if self.lines: return sum( Decimal(str(getattr(line, 'quantity', 0) or 0)) @@ -326,9 +314,6 @@ class Invoice(metaclass=PoolMeta): @property def report_net(self): - trade = self._get_report_trade() - if trade and getattr(trade, 'report_net', '') != '': - return trade.report_net if self.lines: return sum( Decimal(str(getattr(line, 'quantity', 0) or 0)) @@ -352,15 +337,19 @@ class Invoice(metaclass=PoolMeta): @property def report_weight_unit_upper(self): - sale = self._get_report_sale() - if sale and getattr(sale, 'report_quantity_unit_upper', None): - return sale.report_quantity_unit_upper line = self._get_report_trade_line() or self._get_report_invoice_line() unit = getattr(line, 'unit', None) if line else None if unit and unit.rec_name: return unit.rec_name.upper() return 'KGS' + @property + def report_note_title(self): + total = Decimal(str(self.total_amount or 0)) + if total < 0: + return 'Debit Note' + return 'Credit Note' + @property def report_bl_date(self): shipment = self._get_report_shipment() diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py index 2b0b42a..b2b293a 100644 --- a/modules/purchase_trade/tests/test_module.py +++ b/modules/purchase_trade/tests/test_module.py @@ -310,5 +310,28 @@ class PurchaseTradeTestCase(ModuleTestCase): 'USC 8.3000 PER POUND (EIGHT USC AND THIRTY CENTS) ON ICE Cotton #2 MARCH 2026', )]) + def test_invoice_report_note_title_uses_total_amount_sign(self): + 'final invoice title switches between credit and debit note' + Invoice = Pool().get('account.invoice') + + credit = Invoice() + credit.total_amount = Decimal('10') + self.assertEqual(credit.report_note_title, 'Credit Note') + + debit = Invoice() + debit.total_amount = Decimal('-10') + self.assertEqual(debit.report_note_title, 'Debit Note') + + def test_invoice_report_net_sums_signed_invoice_lines(self): + 'invoice report net uses the signed differential from invoice lines' + Invoice = Pool().get('account.invoice') + + line_a = Mock(type='line', quantity=Decimal('1000')) + line_b = Mock(type='line', quantity=Decimal('-200')) + invoice = Invoice() + invoice.lines = [line_a, line_b] + + self.assertEqual(invoice.report_net, Decimal('800')) + del ModuleTestCase