305 lines
9.0 KiB
Python
305 lines
9.0 KiB
Python
from decimal import Decimal
|
|
|
|
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_trade_line()
|
|
if line and line.lots:
|
|
for lot in line.lots:
|
|
if lot.lot_type == 'physic':
|
|
return lot
|
|
return line.lots[0]
|
|
|
|
def _get_report_shipment(self):
|
|
lot = self._get_report_lot()
|
|
if not lot:
|
|
return None
|
|
return (
|
|
getattr(lot, 'lot_shipment_in', None)
|
|
or getattr(lot, 'lot_shipment_out', None)
|
|
or getattr(lot, 'lot_shipment_internal', None)
|
|
)
|
|
|
|
@property
|
|
def report_address(self):
|
|
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):
|
|
trade = self._get_report_trade()
|
|
if trade and trade.full_number:
|
|
return trade.full_number
|
|
return self.origins or ''
|
|
|
|
@property
|
|
def report_shipment(self):
|
|
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):
|
|
trade = self._get_report_trade()
|
|
if trade and getattr(trade, 'trader', None):
|
|
return trade.trader.initial or ''
|
|
return ''
|
|
|
|
@property
|
|
def report_origin(self):
|
|
trade = self._get_report_trade()
|
|
if trade and getattr(trade, 'product_origin', None):
|
|
return trade.product_origin or ''
|
|
return ''
|
|
|
|
@property
|
|
def report_operator_initial(self):
|
|
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_trade_line()
|
|
if line and line.product:
|
|
return line.product.description or ''
|
|
return ''
|
|
|
|
@property
|
|
def report_crop_name(self):
|
|
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_trade_line()
|
|
if line:
|
|
return getattr(line, 'attributes_name', '') or ''
|
|
return ''
|
|
|
|
@property
|
|
def report_price(self):
|
|
trade = self._get_report_trade()
|
|
if trade and trade.report_price:
|
|
return trade.report_price
|
|
return ''
|
|
|
|
@property
|
|
def report_payment_date(self):
|
|
trade = self._get_report_trade()
|
|
if trade and trade.report_payment_date:
|
|
return trade.report_payment_date
|
|
return ''
|
|
|
|
@property
|
|
def report_payment_description(self):
|
|
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 ''
|
|
|
|
@property
|
|
def report_nb_bale(self):
|
|
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
|
|
def report_gross(self):
|
|
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):
|
|
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 ''
|
|
|
|
@property
|
|
def report_lbs(self):
|
|
net = self.report_net
|
|
if net == '':
|
|
return ''
|
|
return Decimal(net) * Decimal('2.20462')
|
|
|
|
@property
|
|
def report_bl_date(self):
|
|
shipment = self._get_report_shipment()
|
|
if shipment:
|
|
return shipment.bl_date
|
|
|
|
@property
|
|
def report_loading_port(self):
|
|
shipment = self._get_report_shipment()
|
|
if shipment and shipment.from_location:
|
|
return shipment.from_location.rec_name
|
|
return ''
|
|
|
|
@property
|
|
def report_discharge_port(self):
|
|
shipment = self._get_report_shipment()
|
|
if shipment and shipment.to_location:
|
|
return shipment.to_location.rec_name
|
|
return ''
|
|
|
|
@property
|
|
def report_incoterm(self):
|
|
trade = self._get_report_trade()
|
|
if not trade:
|
|
return ''
|
|
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
|
|
|
|
@property
|
|
def report_proforma_invoice_number(self):
|
|
lot = self._get_report_lot()
|
|
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:
|
|
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):
|
|
shipment = self._get_report_shipment()
|
|
if shipment and shipment.controller:
|
|
return shipment.controller.rec_name
|
|
return ''
|
|
|
|
@property
|
|
def report_si_number(self):
|
|
shipment = self._get_report_shipment()
|
|
if shipment:
|
|
return shipment.number or ''
|
|
return ''
|
|
|
|
|
|
class InvoiceLine(metaclass=PoolMeta):
|
|
__name__ = 'account.invoice.line'
|
|
|
|
def _get_report_trade(self):
|
|
origin = getattr(self, 'origin', None)
|
|
if not origin:
|
|
return None
|
|
return getattr(origin, 'sale', None) or getattr(origin, 'purchase', None)
|
|
|
|
@property
|
|
def report_product_description(self):
|
|
if self.product:
|
|
return self.product.description or ''
|
|
origin = getattr(self, 'origin', None)
|
|
if origin and getattr(origin, 'product', None):
|
|
return origin.product.description or ''
|
|
return ''
|
|
|
|
@property
|
|
def report_crop_name(self):
|
|
trade = self._get_report_trade()
|
|
if trade and getattr(trade, 'crop', None):
|
|
return trade.crop.name or ''
|
|
return ''
|
|
|
|
@property
|
|
def report_attributes_name(self):
|
|
origin = getattr(self, 'origin', None)
|
|
if origin:
|
|
return getattr(origin, 'attributes_name', '') or ''
|
|
return ''
|
|
|
|
@property
|
|
def report_net(self):
|
|
if self.type == 'line':
|
|
return self.quantity
|
|
return ''
|
|
|
|
@property
|
|
def report_lbs(self):
|
|
net = self.report_net
|
|
if net == '':
|
|
return ''
|
|
return Decimal(net) * Decimal('2.20462')
|