This commit is contained in:
2026-03-26 19:02:01 +01:00
parent 91acaba3dc
commit 841f7a1c20
2 changed files with 92 additions and 46 deletions

View File

@@ -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):