From 841f7a1c2051957514c01c6d7a0f39d8f5eff65b Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Thu, 26 Mar 2026 19:02:01 +0100 Subject: [PATCH] 26.03.26 --- modules/account_invoice/invoice_ict.fodt | 6 +- modules/purchase_trade/invoice.py | 132 +++++++++++++++-------- 2 files changed, 92 insertions(+), 46 deletions(-) diff --git a/modules/account_invoice/invoice_ict.fodt b/modules/account_invoice/invoice_ict.fodt index 71c60fe..43b1f70 100644 --- a/modules/account_invoice/invoice_ict.fodt +++ b/modules/account_invoice/invoice_ict.fodt @@ -2,7 +2,7 @@ - Provisional Sale + Provisional Invoice willen 2018-12-09T16:20:00 2026-03-26T18:22:40.515000000 @@ -3833,7 +3833,7 @@ - Provisional Sale + Provisional Invoice @@ -4072,4 +4072,4 @@ - \ No newline at end of file + diff --git a/modules/purchase_trade/invoice.py b/modules/purchase_trade/invoice.py index e629b2e..864c2fb 100644 --- a/modules/purchase_trade/invoice.py +++ b/modules/purchase_trade/invoice.py @@ -6,19 +6,34 @@ from trytond.pool import PoolMeta class Invoice(metaclass=PoolMeta): __name__ = 'account.invoice' + def _get_report_purchase(self): + purchases = list(self.purchases or []) + return purchases[0] if purchases else None + def _get_report_sale(self): # Bridge invoice templates to the originating sale so FODT files can # reuse stable sale.report_* properties instead of complex expressions. sales = list(self.sales or []) return sales[0] if sales else None + def _get_report_trade(self): + return self._get_report_sale() or self._get_report_purchase() + + def _get_report_purchase_line(self): + purchase = self._get_report_purchase() + if purchase and purchase.lines: + return purchase.lines[0] + def _get_report_sale_line(self): sale = self._get_report_sale() if sale and sale.lines: return sale.lines[0] + def _get_report_trade_line(self): + return self._get_report_sale_line() or self._get_report_purchase_line() + def _get_report_lot(self): - line = self._get_report_sale_line() + line = self._get_report_trade_line() if line and line.lots: for lot in line.lots: if lot.lot_type == 'physic': @@ -37,81 +52,81 @@ class Invoice(metaclass=PoolMeta): @property def report_address(self): - sale = self._get_report_sale() - if sale and sale.report_address: - return sale.report_address + trade = self._get_report_trade() + if trade and trade.report_address: + return trade.report_address if self.invoice_address and self.invoice_address.full_address: return self.invoice_address.full_address return '' @property def report_contract_number(self): - sale = self._get_report_sale() - if sale and sale.full_number: - return sale.full_number + trade = self._get_report_trade() + if trade and trade.full_number: + return trade.full_number return self.origins or '' @property def report_shipment(self): - sale = self._get_report_sale() - if sale and sale.report_shipment: - return sale.report_shipment + trade = self._get_report_trade() + if trade and trade.report_shipment: + return trade.report_shipment return self.description or '' @property def report_trader_initial(self): - sale = self._get_report_sale() - if sale and sale.trader: - return self.trader.initial + trade = self._get_report_trade() + if trade and getattr(trade, 'trader', None): + return trade.trader.initial or '' return '' - + @property def report_operator_initial(self): - sale = self._get_report_sale() - if sale and sale.operator: - return self.operator.initial + trade = self._get_report_trade() + if trade and getattr(trade, 'operator', None): + return trade.operator.initial or '' return '' @property def report_product_description(self): - line = self._get_report_sale_line() + line = self._get_report_trade_line() if line and line.product: return line.product.description or '' return '' @property def report_crop_name(self): - sale = self._get_report_sale() - if sale and sale.crop: - return sale.crop.name or '' + trade = self._get_report_trade() + if trade and getattr(trade, 'crop', None): + return trade.crop.name or '' return '' @property def report_attributes_name(self): - line = self._get_report_sale_line() + line = self._get_report_trade_line() if line: - return line.attributes_name or '' + return getattr(line, 'attributes_name', '') or '' return '' @property def report_price(self): - sale = self._get_report_sale() - if sale and sale.report_price: - return sale.report_price + trade = self._get_report_trade() + if trade and trade.report_price: + return trade.report_price return '' @property def report_payment_date(self): - sale = self._get_report_sale() - if sale and sale.report_payment_date: - return sale.report_payment_date + trade = self._get_report_trade() + if trade and trade.report_payment_date: + return trade.report_payment_date return '' @property def report_payment_description(self): - sale = self._get_report_sale() - if sale and sale.payment_term: - return sale.payment_term.description or '' + trade = self._get_report_trade() + if trade and trade.payment_term: + return trade.payment_term.description or '' if self.payment_term: return self.payment_term.description or '' return '' @@ -121,6 +136,12 @@ class Invoice(metaclass=PoolMeta): sale = self._get_report_sale() if sale and sale.report_nb_bale: return sale.report_nb_bale + line = self._get_report_trade_line() + if line and line.lots: + nb_bale = sum( + lot.lot_qt for lot in line.lots if lot.lot_type == 'physic' + ) + return 'NB BALES: ' + str(int(nb_bale)) return '' @property @@ -128,13 +149,25 @@ class Invoice(metaclass=PoolMeta): sale = self._get_report_sale() if sale and sale.report_gross != '': return sale.report_gross + line = self._get_report_trade_line() + if line and line.lots: + return sum( + lot.get_current_gross_quantity_converted() + for lot in line.lots if lot.lot_type == 'physic' + ) return '' @property def report_net(self): - sale = self._get_report_sale() - if sale and sale.report_net != '': - return sale.report_net + trade = self._get_report_trade() + if trade and getattr(trade, 'report_net', '') != '': + return trade.report_net + line = self._get_report_trade_line() + if line and line.lots: + return sum( + lot.get_current_quantity_converted() + for lot in line.lots if lot.lot_type == 'physic' + ) if self.lines: return self.lines[0].quantity return '' @@ -168,11 +201,14 @@ class Invoice(metaclass=PoolMeta): @property def report_incoterm(self): - sale = self._get_report_sale() - if not sale: + trade = self._get_report_trade() + if not trade: return '' - incoterm = sale.incoterm.code if sale.incoterm else '' - location = sale.incoterm_location.party_name if sale.incoterm_location else '' + incoterm = trade.incoterm.code if getattr(trade, 'incoterm', None) else '' + location = ( + trade.incoterm_location.party_name + if getattr(trade, 'incoterm_location', None) else '' + ) if incoterm and location: return f"{incoterm} {location}" return incoterm or location @@ -180,15 +216,25 @@ class Invoice(metaclass=PoolMeta): @property def report_proforma_invoice_number(self): lot = self._get_report_lot() - if lot and lot.sale_invoice_line_prov and lot.sale_invoice_line_prov.invoice: - return lot.sale_invoice_line_prov.invoice.number or '' + if lot: + line = ( + getattr(lot, 'sale_invoice_line_prov', None) + or getattr(lot, 'invoice_line_prov', None) + ) + if line and line.invoice: + return line.invoice.number or '' return '' @property def report_proforma_invoice_date(self): lot = self._get_report_lot() - if lot and lot.sale_invoice_line_prov and lot.sale_invoice_line_prov.invoice: - return lot.sale_invoice_line_prov.invoice.invoice_date + if lot: + line = ( + getattr(lot, 'sale_invoice_line_prov', None) + or getattr(lot, 'invoice_line_prov', None) + ) + if line and line.invoice: + return line.invoice.invoice_date @property def report_controller_name(self):