diff --git a/modules/account_invoice/invoice_ict.fodt b/modules/account_invoice/invoice_ict.fodt
index 96a70e7..00ad8e9 100644
--- a/modules/account_invoice/invoice_ict.fodt
+++ b/modules/account_invoice/invoice_ict.fodt
@@ -1,762 +1,773 @@
-
-
+
- Invoice nowillen2018-12-09T16:20:002026-03-23T20:46:35.3000000002007-08-28T18:19:00LibreOffice/7.6.0.3$Windows_X86_64 LibreOffice_project/69edd8b8ebc41d00b4de3915dc82f8f0fc3b6265PT22M49S1
-
-
- 9172
- 0
- 43623
- 21098
- true
- false
-
-
- view2
- 19516
- 16919
- 0
- 9172
- 43621
- 30268
- 0
- 0
- false
- 100
- false
- false
- true
- true
- false
- false
-
-
-
-
- true
-
- true
- false
- false
- false
- true
- 1
- true
- false
- false
- true
-
- false
-
- false
- false
- false
-
- 0
- false
- true
- true
- false
- false
- false
-
- 0
-
- true
- high-resolution
- false
- false
- true
- false
- true
- false
- false
- true
- true
- false
- true
- false
- false
- true
- false
- true
- false
- false
- false
- false
- false
- false
- false
- true
- false
- false
- false
- 84841
- 84510
- false
- false
- false
- true
- true
- false
- true
- true
- false
- true
- true
- false
- false
- false
- false
- false
- false
- true
- false
- false
- false
- false
- false
- false
- false
- 0
- false
- true
- false
- false
- 0
- true
- false
- true
- true
- true
- true
- false
- false
- false
- false
- false
- true
-
- false
- true
- false
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAABZ4AAAC9CAIAAAC8iP/2AAAAAXNSR0IArs4c6QAAAAlwSFlz
+
+ Invoice no
+ willen
+ 2018-12-09T16:20:00
+ 2026-03-23T20:46:35.300000000
+ 2007-08-28T18:19:00
+ LibreOffice/7.6.0.3$Windows_X86_64 LibreOffice_project/69edd8b8ebc41d00b4de3915dc82f8f0fc3b6265
+ PT22M49S
+ 1
+
+
+
+
+ 9172
+ 0
+ 43623
+ 21098
+ true
+ false
+
+
+ view2
+ 19516
+ 16919
+ 0
+ 9172
+ 43621
+ 30268
+ 0
+ 0
+ false
+ 100
+ false
+ false
+ true
+ true
+ false
+ false
+
+
+
+
+ true
+
+ true
+ false
+ false
+ false
+ true
+ 1
+ true
+ false
+ false
+ true
+
+ false
+
+ false
+ false
+ false
+
+ 0
+ false
+ true
+ true
+ false
+ false
+ false
+
+ 0
+
+ true
+ high-resolution
+ false
+ false
+ true
+ false
+ true
+ false
+ false
+ true
+ true
+ false
+ true
+ false
+ false
+ true
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ 84841
+ 84510
+ false
+ false
+ false
+ true
+ true
+ false
+ true
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ 0
+ false
+ true
+ false
+ false
+ 0
+ true
+ false
+ true
+ true
+ true
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAABZ4AAAC9CAIAAAC8iP/2AAAAAXNSR0IArs4c6QAAAAlwSFlz
AAAOxAAADsMB2mqY3AAA/7VJREFUeF7svQeAHMd1Jlyduydu3kUmQRLMIimJVBaVbStYWc6y
JdvncLZOtuxzOMmSreAsZ9/9tmVZsiVZWbKtnLMVSDGDAAkSGZsndw7/96p6ZmcXu8AsuAAW
ZDWbg5nZnu6qr6q663313veULMtY/yY+9b5T0qU/9r9f9ht12adTf8hwwqWz82Pxc5Up+be9
@@ -3137,16 +3148,19 @@
R57yT152pXiKBRQLKBZQLKBYQLGAYgHFAooFFAsoFlAsoFhAscB/vQX+D/7u9z9ziytTAAAA
AElFTkSuQmCC
-
-
-
-
-
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAAAqoAAAAnCAIAAABIVv0SAAAAAXNSR0IArs4c6QAAAAlwSFlz
+
+
+
+
+
+
+
+
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAqoAAAAnCAIAAABIVv0SAAAAAXNSR0IArs4c6QAAAAlwSFlz
AAAOwwAADsMBx2+oZAAAge9JREFUeF7tvQeYHNW1LXwqdHXO05NHM8oSkkgOGDDGGGxMMjnn
nCyCAZFBRuScETlnEMlgMjbYmCwQymly7Byrq7q66l/7VM9o4OL3vff+j3e5WO320Jqprjpx
h7XX3kewLIv94F9oojmukeLoZ8H+MNaDsQ8Cqwr0a/sCadx37VuN/azyz7jA8c3L/puHBG2y
@@ -3765,288 +3779,355 @@
bhQRP/q1tVH9/1immJB/G+gbLak7vmf/xQLYuLd/LBO/sR//0SPw3Wb9f1Xz9oYf//uxb45a
EGPhwg2Iwn/00P74O///ATDZnzJDhxbZAAAAAElFTkSuQmCC
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <replace text:p=\'set_lang(invoice.party.lang)\'>
- <replace text:p=\'invoice.set_lang(invoice.party.lang)\'>
-
-
-
-
- <for each='line in invoice.invoice_address.full_address.split('\n')">
- <line>
- </for>
-
-
-
-
-
-
-
-
-
- <format_date(invoice.invoice_date or today, invoice.party.lang)>
-
-
-
-
-
-
-
-
-
- Invoice N°
-
-
-
- <invoice.number>
-
-
-
-
- Contract N°
-
-
- <invoice.origins or ''>
-
-
-
-
-
-
-
-
-
- Name of the vessel
-
-
- <invoice.description or ''>
-
-
-
-
- N° of Bill of Lading
-
-
- <invoice.reference or ''>
-
-
-
-
- Shipped on board date
- Port of loading
-
-
- 14.06.2025
- SANTOS, BRAZIL
-
-
-
-
- Port of discharge
-
-
- PORT QASIM, PAKISTAN
-
-
-
-
-
-
-
-
-
- Goods description
-
-
- QUANTITY: 2,253,035 LBS (1,021.970 MTS)
- OF BRAZILIAN GINNED COTTON BCI CROP 2024
- AT THE RATE OF USC 74.15 PER LB
- H.S CODE 5201.0090
- CFR PORT QASIM, PAKISTAN
- ALL DETAILS AND SPECIFICATIONS AS PER BENEFICIARY’S
- PROFORMA INVOICE NO. 1411-1 DATED 20-05-2025.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- BALES
-
-
- Gross KGS
-
-
- NET KGS
-
-
-
-
-
-
-
-
-
-
- <format_number(invoice.lines[0].quantity, invoice.party.lang) if invoice.lines else ''>
-
-
- <invoice.lines[0].gross_weight if (invoice.lines and hasattr(invoice.lines[0], \'gross_weight\')) else ''>
-
-
- <format_number_symbol(invoice.lines[0].quantity, invoice.party.lang, invoice.lines[0].unit) if (invoice.lines and invoice.lines[0].unit) else (format_number(invoice.lines[0].quantity, invoice.party.lang) if invoice.lines else '')>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Equivalent to LBS
-
-
- <format_number(invoice.lines[0].quantity * 2.20462, invoice.party.lang) if invoice.lines else ''>
-
-
-
-
-
-
-
-
-
-
-
-
- At <format_currency(invoice.lines[0].unit_price, invoice.party.lang, invoice.currency, digits=invoice.lines[0].__class__.unit_price.digits[1]) if invoice.lines else \'\'>PER LB
-
- FREIGHT VALUE: <invoice.currency.symbol if invoice.currency else 'USD'><format_number(invoice.freight_amount, invoice.party.lang) if hasattr(invoice, \'freight_amount\') else \'\'>
-
- WE CERTIFY THAT THE MERCHANDISE IS OF BRAZIL ORIGIN
- L/C NUMBER <invoice.reference or ''>
- IMPORTER H.S. CODE NOS. <invoice.party_tax_identifier.type_string if invoice.party_tax_identifier else \'5201.0090\'>
- IMPORTER’S NTN <invoice.party_tax_identifier.code if invoice.party_tax_identifier else \'\'>
-
-
-
- <invoice.currency.symbol if invoice.currency else 'USD'><format_currency(invoice.total_amount, invoice.party.lang, invoice.currency)>
-
-
-
-
-
-
-
-
-
-
- NET LANDED WEIGHTS, ACTUAL TARE, NO FRANCHISE
-
-
-
-
-
- <for each='tax in invoice.taxes'>
- V.A.T. <tax.description or \'\'>RATE
- </for>
-
-
-
-
-
-
-
-
-
- S/I
-
- Controller Name
-
-
- S/BR/55
-
- INTERTEK
-
-
-
-
-
-
-
-
-
-
-
-
- Payment
-
-
- <if test=\'invoice.payment_term and invoice.payment_term.description\'>
- <for each=\'description in (invoice.payment_term.description or \'\').split(chr(10))\'>
- <description>
- </for>
- </if>
-
-
- ICT TRADING S.A.
-
-
-
-
- SB/DR
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <replace text:p=\'set_lang(invoice.party.lang)\'>
+
+
+ <replace text:p=\'invoice.set_lang(invoice.party.lang)\'>
+
+
+
+
+
+
+ <for each="line in invoice.report_address.splitlines()">
+
+
+ <line>
+
+
+ </for>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <format_date(invoice.invoice_date or today, invoice.party.lang)>
+
+
+
+
+
+
+
+
+
+
+ Invoice N°
+
+
+
+
+ <invoice.number>
+
+
+
+
+
+ Contract N°
+
+
+
+ <invoice.report_contract_number>
+
+
+
+
+
+
+
+
+
+
+ Name of the vessel
+
+
+
+ <invoice.report_shipment or ''>
+
+
+
+
+
+ N° of Bill of Lading
+
+
+
+ <invoice.reference or ''>
+
+
+
+
+
+ Shipped on board date
+ Port of loading
+
+
+ 14.06.2025
+ SANTOS, BRAZIL
+
+
+
+
+ Port of discharge
+
+
+ PORT QASIM, PAKISTAN
+
+
+
+
+
+
+
+
+
+ Goods description
+
+
+ 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 ''> MTS)
+ <invoice.report_product_description> CROP <invoice.report_crop_name>
+ <invoice.report_attributes_name>
+ H.S CODE 5201.0090
+ CFR PORT QASIM, PAKISTAN
+
+ ALL DETAILS AND SPECIFICATIONS AS PER
+ BENEFICIARY’S
+
+ PROFORMA INVOICE NO. 1411-1 DATED 20-05-2025.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ BALES
+
+
+
+ Gross KGS
+
+
+
+ NET KGS
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <invoice.report_nb_bale>
+
+
+
+
+ <format_number(invoice.report_gross, invoice.party.lang) if invoice.report_gross != '' else ''>
+
+
+
+
+ <format_number(invoice.report_net, invoice.party.lang) if invoice.report_net != '' else ''>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Equivalent to LBS
+
+
+
+ <format_number(invoice.report_lbs, invoice.party.lang) if invoice.report_lbs != '' else ''>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ At <format_currency(invoice.lines[0].unit_price, invoice.party.lang, invoice.currency, digits=invoice.lines[0].__class__.unit_price.digits[1]) if invoice.lines else \'\'>PER LB
+
+ FREIGHT VALUE: <invoice.currency.symbol if invoice.currency else 'USD'><format_number(invoice.freight_amount, invoice.party.lang) if hasattr(invoice, \'freight_amount\') else \'\'>
+
+
+ WE CERTIFY THAT THE MERCHANDISE IS OF BRAZIL ORIGIN
+ L/C NUMBER <invoice.reference or ''>
+ IMPORTER H.S. CODE NOS. <invoice.party_tax_identifier.type_string if invoice.party_tax_identifier else \'5201.0090\'>
+ IMPORTER’S NTN <invoice.party_tax_identifier.code if invoice.party_tax_identifier else \'\'>
+
+
+
+
+ <invoice.currency.symbol if invoice.currency else 'USD'>
+
+ <format_currency(invoice.total_amount, invoice.party.lang, invoice.currency)>
+
+
+
+
+
+
+
+
+
+
+
+ NET LANDED WEIGHTS, ACTUAL TARE, NO FRANCHISE
+
+
+
+
+
+
+ <for each="tax in invoice.taxes">
+
+ V.A.T. <tax.description or \'\'>RATE
+
+ </for>
+
+
+
+
+
+
+
+
+
+
+ S/I
+
+ Controller Name
+
+
+ S/BR/55
+
+ INTERTEK
+
+
+
+
+
+
+
+
+
+
+
+
+ Payment
+
+
+
+ <if test="invoice.report_payment_description">
+
+
+ <for each="description in invoice.report_payment_description.splitlines()">
+
+
+ <description>
+
+
+ </for>
+
+
+ </if>
+
+
+
+
+
+
+
+
+
+
+
+
+ ICT TRADING S.A.
+
+
+
+
+ SB/DR
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/purchase_trade/__init__.py b/modules/purchase_trade/__init__.py
index 20ad0af..b3f3591 100755
--- a/modules/purchase_trade/__init__.py
+++ b/modules/purchase_trade/__init__.py
@@ -30,9 +30,10 @@ from . import (
valuation,
dimension,
weight_report,
- backtoback,
- service,
-)
+ backtoback,
+ service,
+ invoice,
+)
def register():
Pool.register(
@@ -74,8 +75,8 @@ def register():
dashboard.Incoming,
dashboard.BotAction,
dashboard.News,
- dashboard.Demos,
- party.Party,
+ dashboard.Demos,
+ party.Party,
party.PartyExecution,
party.PartyExecutionSla,
party.PartyExecutionPlace,
@@ -177,12 +178,15 @@ def register():
purchase.PenaltyRule,
purchase.PenaltyRuleTier,
purchase.ConcentrateTerm,
- backtoback.Backtoback,
- dimension.AnalyticDimension,
- dimension.AnalyticDimensionValue,
- dimension.AnalyticDimensionAssignment,
- weight_report.WeightReport,
- module='purchase', type_='model')
+ backtoback.Backtoback,
+ dimension.AnalyticDimension,
+ dimension.AnalyticDimensionValue,
+ dimension.AnalyticDimensionAssignment,
+ weight_report.WeightReport,
+ module='purchase', type_='model')
+ Pool.register(
+ invoice.Invoice,
+ module='account_invoice', type_='model')
Pool.register(
forex.Forex,
forex.ForexCoverFees,
diff --git a/modules/purchase_trade/invoice.py b/modules/purchase_trade/invoice.py
new file mode 100644
index 0000000..bf4b5ff
--- /dev/null
+++ b/modules/purchase_trade/invoice.py
@@ -0,0 +1,113 @@
+from decimal import Decimal
+
+from trytond.pool import PoolMeta
+
+
+class Invoice(metaclass=PoolMeta):
+ __name__ = 'account.invoice'
+
+ def _get_report_sale(self):
+ sales = list(self.sales or [])
+ return sales[0] if sales else None
+
+ def _get_report_sale_line(self):
+ sale = self._get_report_sale()
+ if sale and sale.lines:
+ return sale.lines[0]
+
+ @property
+ def report_address(self):
+ sale = self._get_report_sale()
+ if sale and sale.report_address:
+ return sale.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
+ return self.origins or ''
+
+ @property
+ def report_shipment(self):
+ sale = self._get_report_sale()
+ if sale and sale.report_shipment:
+ return sale.report_shipment
+ return self.description or ''
+
+ @property
+ def report_product_description(self):
+ line = self._get_report_sale_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 ''
+ return ''
+
+ @property
+ def report_attributes_name(self):
+ line = self._get_report_sale_line()
+ if line:
+ return 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
+ return ''
+
+ @property
+ def report_payment_date(self):
+ sale = self._get_report_sale()
+ if sale and sale.report_payment_date:
+ return sale.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 ''
+ 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
+ return ''
+
+ @property
+ def report_gross(self):
+ sale = self._get_report_sale()
+ if sale and sale.report_gross != '':
+ return sale.report_gross
+ return ''
+
+ @property
+ def report_net(self):
+ sale = self._get_report_sale()
+ if sale and sale.report_net != '':
+ return sale.report_net
+ 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')
diff --git a/modules/purchase_trade/tryton.cfg b/modules/purchase_trade/tryton.cfg
index 6a141bf..8a488e2 100755
--- a/modules/purchase_trade/tryton.cfg
+++ b/modules/purchase_trade/tryton.cfg
@@ -1,11 +1,12 @@
[tryton]
version=7.2.7
-depends:
- ir
- purchase
- sale
- stock
- res
+depends:
+ ir
+ purchase
+ sale
+ account_invoice
+ stock
+ res
lot
document_incoming
incoterm
@@ -32,4 +33,4 @@ xml:
valuation.xml
weight_report.xml
dimension.xml
- backtoback.xml
\ No newline at end of file
+ backtoback.xml
diff --git a/modules/sale/sale_ict.fodt b/modules/sale/sale_ict.fodt
index 01bd958..d944063 100644
--- a/modules/sale/sale_ict.fodt
+++ b/modules/sale/sale_ict.fodt
@@ -1,912 +1,928 @@
-
-
+
- LibreOffice/7.6.0.3$Windows_X86_64 LibreOffice_project/69edd8b8ebc41d00b4de3915dc82f8f0fc3b6265Invoice nowillen2026-02-26T13:52:00Z2026-03-09T20:26:38.5930000002025-12-17T14:25:00Z39PT5H4M10S
-
-
- 36941
- 0
- 24236
- 11721
- true
- false
-
-
- view2
- 14600
- 46249
- 0
- 36941
- 24234
- 48660
- 0
- 0
- false
- 180
- false
- false
- false
- false
- false
- false
-
-
-
-
- true
-
- true
- false
- false
- false
- true
- 1
- true
- false
- false
- true
-
- false
-
- false
- false
- false
-
- 0
- false
- true
- true
- false
- false
- false
-
- 0
-
- true
- high-resolution
- false
- false
- false
- false
- true
- false
- false
- true
- false
- false
- true
- true
- false
- true
- false
- false
- true
- true
- false
- false
- false
- false
- false
- false
- false
- false
- false
- 3002665
- 1846560
- false
- false
- false
- false
- false
- false
- true
- true
- false
- true
- true
- false
- false
- false
- false
- false
- true
- false
- true
- false
- false
- false
- false
- false
- false
- 0
- true
- false
- false
- true
- 0
- true
- false
- true
- true
- true
- true
- false
- false
- false
- false
- false
- true
-
- false
- true
- false
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAABZ4AAAC9CAIAAAC8iP/2AAAAAXNSR0IArs4c6QAAAAlwSFlz
+
+ LibreOffice/7.6.0.3$Windows_X86_64 LibreOffice_project/69edd8b8ebc41d00b4de3915dc82f8f0fc3b6265
+ Invoice no
+
+
+ willen
+ 2026-02-26T13:52:00Z
+ 2026-03-09T20:26:38.593000000
+ 2025-12-17T14:25:00Z
+ 39
+ PT5H4M10S
+
+
+
+
+
+ 36941
+ 0
+ 24236
+ 11721
+ true
+ false
+
+
+ view2
+ 14600
+ 46249
+ 0
+ 36941
+ 24234
+ 48660
+ 0
+ 0
+ false
+ 180
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+
+ true
+
+ true
+ false
+ false
+ false
+ true
+ 1
+ true
+ false
+ false
+ true
+
+ false
+
+ false
+ false
+ false
+
+ 0
+ false
+ true
+ true
+ false
+ false
+ false
+
+ 0
+
+ true
+ high-resolution
+ false
+ false
+ false
+ false
+ true
+ false
+ false
+ true
+ false
+ false
+ true
+ true
+ false
+ true
+ false
+ false
+ true
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ 3002665
+ 1846560
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ 0
+ true
+ false
+ false
+ true
+ 0
+ true
+ false
+ true
+ true
+ true
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAABZ4AAAC9CAIAAAC8iP/2AAAAAXNSR0IArs4c6QAAAAlwSFlz
AAAOxAAADsMB2mqY3AAA/7VJREFUeF7svQeAHMd1Jlyduydu3kUmQRLMIimJVBaVbStYWc6y
JdvncLZOtuxzOMmSreAsZ9/9tmVZsiVZWbKtnLMVSDGDAAkSGZsndw7/96p6ZmcXu8AsuAAW
ZDWbg5nZnu6qr6q663313veULMtY/yY+9b5T0qU/9r9f9ht12adTf8hwwqWz82Pxc5Up+be9
@@ -3287,13 +3303,20 @@
R57yT152pXiKBRQLKBZQLKBYQLGAYgHFAooFFAsoFlAsoFhAscB/vQX+D/7u9z9ziytTAAAA
AElFTkSuQmCC
-
-
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAAAqoAAAAnCAIAAABIVv0SAAAAAXNSR0IArs4c6QAAAAlwSFlz
+
+
+
+
+
+
+
+
+
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAqoAAAAnCAIAAABIVv0SAAAAAXNSR0IArs4c6QAAAAlwSFlz
AAAOwwAADsMBx2+oZAAAge9JREFUeF7tvQeYHNW1LXwqdHXO05NHM8oSkkgOGDDGGGxMMjnn
nCyCAZFBRuScETlnEMlgMjbYmCwQymly7Byrq7q66l/7VM9o4OL3vff+j3e5WO320Jqprjpx
h7XX3kewLIv94F9oojmukeLoZ8H+MNaDsQ8Cqwr0a/sCadx37VuN/azyz7jA8c3L/puHBG2y
@@ -3912,242 +3935,458 @@
bhQRP/q1tVH9/1immJB/G+gbLak7vmf/xQLYuLd/LBO/sR//0SPw3Wb9f1Xz9oYf//uxb45a
EGPhwg2Iwn/00P74O///ATDZnzJDhxbZAAAAAElFTkSuQmCC
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <for each="sale in records">
-
-
-
-
-
- <for each="line in sale.report_address.splitlines()">
- <line>
- </for>
-
-
-
-
-
-
-
-
-
- Sale Contract : <sale.full_number>DATE: <format_date(sale.sale_date, sale.party.lang)>
-
-
-
-
-
-
-
-
-
-
- Buyers
-
-
- <sale.party.rec_name>
- ADDRESS:<sale.report_address>
-
-
-
-
-
- Sellers
-
-
- ICT TRADING S.A.
- VIA MAGAZZINI GENERALI, 3
- 6828 BALERNA, SWITZERLAND
-
-
-
-
-
- Agents
-
-
- <for each="line in sale.report_agent.splitlines()">
- <line>
- </for>
-
-
-
-
-
-
-
-
-
-
-
-
- Growth
-
-
-
-
- <sale.lines[0].product.description if sale.lines and sale.lines[0].product else ''>CROP <sale.crop.name>
-
-
-
-
- Quality
-
-
-
- <sale.lines[0].attributes_name>
-
-
-
-
- Quantity
-
-
-
- ABOUT <sum(line.quantity for line in sale.lines)><sale.lines[0].unit.rec_name.upper() if sale.lines and sale.lines[0].unit else ''>(<sale.report_qt>)
- <sale.report_nb_bale>
-
-
-
-
-
-
-
-
-
-
-
- Price
-
-
- <sale.lines[0].linked_currency.rec_name.upper() if sale.lines[0].linked_currency else sale.currency.rec_name.upper()><sale.lines[0].linked_price if sale.lines[0].linked_price else sale.lines[0].unit_price>PER <sale.lines[0].linked_unit.rec_name.upper() if sale.lines[0].linked_unit else sale.lines[0].unit.rec_name.upper()>(<sale.report_price>) <sale.lines[0].get_pricing_text>
-
-
-
-
-
-
-
-
-
-
-
- <if test="sale.lines[0].pricing_rule">
-
-
-
-
-
-
-
- Fixation
-
-
- <for each="line in sale.lines[0].pricing_rule.splitlines()">
- <line>
- </for>
-
-
-
-
-
- </if>
-
-
-
-
-
-
-
- Shipment
-
-
- <sale.lines[0].del_period.description if sale.lines[0].del_period else ''>
-
-
-
-
-
-
-
-
-
-
-
-
- Terms
-
-
- <sale.incoterm.code if sale.incoterm else ''><sale.incoterm_location.party_name if sale.incoterm_location else ''>, <sale.wb.description if sale.wb else ''>
-
-
-
-
- Payment
-
-
- <sale.payment_term.rec_name if sale.payment_term else '100% CASH AGAINST DOCUMENTS'>
- BEFORE <sale.report_payment_date><sale.payment_term.description if sale.payment_term else ''>
-
-
-
-
- Arbitration & Rules
-
-
- <if test="sale.association">
- <for each="line in sale.association.rule.splitlines()">
- <line>
- </for>
- </if>
-
-
-
-
-
-
-
-
-
-
-
- THE SELLERS
-
-
-
- THE BUYERS
-
-
-
-
- ICT TRADING SA
-
-
-
-
-
-
-
- <sale.party.rec_name>
-
-
-
- <sale.trader.initial if sale.trader else ''>/<sale.operator.initial if sale.operator else ''>
-
- </for>
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <for each="sale in records">
+
+
+
+
+
+
+
+ <for each="line in sale.report_address.splitlines()">
+
+
+ <line>
+
+
+ </for>
+
+
+
+
+
+
+
+
+
+
+
+
+ Sale Contract :
+
+
+
+ <sale.full_number>
+
+
+
+
+
+ DATE:
+
+
+
+ <format_date(sale.sale_date, sale.party.lang)>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Buyers
+
+
+
+
+
+ <sale.party.rec_name>
+
+ ADDRESS:<sale.report_address>
+
+
+
+
+
+ Sellers
+
+
+ ICT TRADING S.A.
+ VIA MAGAZZINI GENERALI, 3
+ 6828 BALERNA, SWITZERLAND
+
+
+
+
+
+ Agents
+
+
+
+ <for each="line in sale.report_agent.splitlines()">
+
+
+ <line>
+
+
+ </for>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Growth
+
+
+
+
+
+ <sale.lines[0].product.description if sale.lines and sale.lines[0].product else ''>
+
+ CROP
+
+ <sale.crop.name>
+
+
+
+
+
+
+ Quality
+
+
+
+
+ <sale.lines[0].attributes_name>
+
+
+
+
+
+ Quantity
+
+
+
+ ABOUT <sum(line.quantity for line in sale.lines)><sale.lines[0].unit.rec_name.upper() if sale.lines and sale.lines[0].unit else ''>(<sale.report_qt>)
+
+ <sale.report_nb_bale>
+
+
+
+
+
+
+
+
+
+
+
+
+ Price
+
+
+
+ <sale.lines[0].linked_currency.rec_name.upper() if sale.lines[0].linked_currency else sale.currency.rec_name.upper()>
+
+ <sale.lines[0].linked_price if sale.lines[0].linked_price else sale.lines[0].unit_price>
+
+
+
+ PER
+
+ <sale.lines[0].linked_unit.rec_name.upper() if sale.lines[0].linked_unit else sale.lines[0].unit.rec_name.upper()>
+
+
+
+
+ (
+
+ <sale.report_price>
+
+ )
+
+ <sale.lines[0].get_pricing_text>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <if test="sale.lines[0].pricing_rule">
+
+
+
+
+
+
+
+
+
+
+
+
+ Fixation
+
+
+
+
+
+ <for each="line in sale.lines[0].pricing_rule.splitlines()">
+
+
+ <line>
+
+
+ </for>
+
+
+
+
+
+
+
+
+
+ </if>
+
+
+
+
+
+
+
+
+
+
+
+
+ Shipment
+
+
+
+
+
+
+
+ <sale.lines[0].del_period.description if sale.lines[0].del_period else ''>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Terms
+
+
+
+ <sale.incoterm.code if sale.incoterm else ''>
+
+ <sale.incoterm_location.party_name if sale.incoterm_location else ''>, <sale.wb.description if sale.wb else ''>
+
+
+
+
+ Payment
+
+
+
+
+ <sale.payment_term.rec_name if sale.payment_term else '100% CASH AGAINST DOCUMENTS'>
+
+
+
+
+
+
+ BEFORE
+
+ <sale.report_payment_date>
+
+
+
+
+
+ <sale.payment_term.description if sale.payment_term else ''>
+
+
+
+
+
+
+ Arbitration & Rules
+
+
+
+
+
+ <if test="sale.association">
+
+
+
+
+
+
+ <for each="line in sale.association.rule.splitlines()">
+
+
+
+
+
+
+ <line>
+
+
+
+
+
+
+ </for>
+
+
+
+
+
+
+ </if>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ THE SELLERS
+
+
+
+
+
+
+
+ THE BUYERS
+
+
+
+
+
+
+ ICT TRADING SA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <sale.party.rec_name>
+
+
+
+
+
+
+
+
+
+ <sale.trader.initial if sale.trader else ''>
+
+
+
+ /
+
+
+
+ <sale.operator.initial if sale.operator else ''>
+
+
+
+
+
+
+
+
+
+ </for>
+
+
+
\ No newline at end of file