diff --git a/modules/purchase_trade/stock.py b/modules/purchase_trade/stock.py
index f4714fc..dc9ac55 100755
--- a/modules/purchase_trade/stock.py
+++ b/modules/purchase_trade/stock.py
@@ -1836,6 +1836,19 @@ class ShipmentIn(metaclass=PoolMeta):
values.append(str(value or ''))
return '\n'.join(values)
+ @classmethod
+ def _report_table_rows(cls, rows, names, amount_names=()):
+ result = []
+ for row in rows:
+ values = {}
+ for index, name in enumerate(names):
+ value = row[index]
+ if name in amount_names:
+ value = cls._report_amount(value)
+ values[name] = str(value or '')
+ result.append(values)
+ return result
+
@property
def report_linkage_title(self):
purchase = self._get_report_linkage_purchase()
@@ -1911,6 +1924,13 @@ class ShipmentIn(metaclass=PoolMeta):
return self._report_column(
self._get_report_linkage_summary_rows(), 3, amount=True)
+ @property
+ def report_linkage_summary_rows(self):
+ return self._report_table_rows(
+ self._get_report_linkage_summary_rows(),
+ ('group', 'cost_type', 'estimated', 'validated'),
+ {'estimated', 'validated'})
+
@property
def report_linkage_movement_types(self):
return self._report_column(self._get_report_linkage_movement_rows(), 0)
@@ -1951,6 +1971,13 @@ class ShipmentIn(metaclass=PoolMeta):
def report_linkage_movement_to_dates(self):
return self._report_column(self._get_report_linkage_movement_rows(), 9)
+ @property
+ def report_linkage_movement_rows(self):
+ return self._report_table_rows(
+ self._get_report_linkage_movement_rows(),
+ ('type', 'reference', 'counterpart', 'commodity', 'quantity',
+ 'delivery', 'basis', 'period', 'from_date', 'to_date'))
+
@property
def report_linkage_bank_deal(self):
purchase = self._get_report_linkage_purchase()
@@ -2009,6 +2036,12 @@ class ShipmentIn(metaclass=PoolMeta):
def report_linkage_pricing_input_prices(self):
return self._report_column(self._get_report_linkage_pricing_rows(), 5)
+ @property
+ def report_linkage_pricing_rows(self):
+ return self._report_table_rows(
+ self._get_report_linkage_pricing_rows(),
+ ('deal', 'side', 'type', 'symbol', 'period', 'input_price'))
+
@property
def report_linkage_detail_groups(self):
return self._report_column(self._get_report_linkage_detail_rows(), 0)
@@ -2042,6 +2075,14 @@ class ShipmentIn(metaclass=PoolMeta):
def report_linkage_detail_validated(self):
return self._report_column(
self._get_report_linkage_detail_rows(), 7, amount=True)
+
+ @property
+ def report_linkage_detail_rows(self):
+ return self._report_table_rows(
+ self._get_report_linkage_detail_rows(),
+ ('group', 'cost_type', 'counterpart', 'source', 'unit_price',
+ 'quantity', 'estimated', 'validated'),
+ {'estimated', 'validated'})
def get_rec_name(self, name=None):
if self.number:
diff --git a/modules/stock/linkage.fodt b/modules/stock/linkage.fodt
index 72da5ea..1edbe23 100644
--- a/modules/stock/linkage.fodt
+++ b/modules/stock/linkage.fodt
@@ -1141,22 +1141,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-<records[0].report_linkage_title or ''>
- /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoM
+ <for each="shipment in records">
+
+
+ <shipment.report_linkage_title or ''>
+ /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoM
DAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsN
FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAAR
CAAyAqADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
@@ -1349,10 +1413,58 @@
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//9k=
-
-
- Desk<records[0].report_linkage_desk or ''>B/L Date<records[0].report_linkage_bl_date or ''>Book<records[0].report_linkage_book or ''>Trading Unit<records[0].report_linkage_trading_unit or ''>Strategy<records[0].report_linkage_strategy or ''>Finance user<records[0].report_linkage_finance_user or ''>1- Financial summary ( USD )2- InformationGroupCost TypeEstimatedValidated<records[0].report_linkage_summary_groups or ''><records[0].report_linkage_summary_cost_types or ''><records[0].report_linkage_summary_estimated or ''><records[0].report_linkage_summary_validated or ''>3- Loading and Discharge movementsTypeReferenceCounterpartCommodityQuantityDeliveryBasisPeriod atFromTo<records[0].report_linkage_movement_types or ''><records[0].report_linkage_movement_references or ''><records[0].report_linkage_movement_counterparts or ''><records[0].report_linkage_movement_commodities or ''><records[0].report_linkage_movement_quantities or ''><records[0].report_linkage_movement_deliveries or ''><records[0].report_linkage_movement_basis or ''><records[0].report_linkage_movement_periods or ''><records[0].report_linkage_movement_from_dates or ''><records[0].report_linkage_movement_to_dates or ''>4- Bank InformationDeal<records[0].report_linkage_bank_deal or ''>Type<records[0].report_linkage_bank_type or ''>Financing Bank<records[0].report_linkage_bank_name or ''>LC Type<records[0].report_linkage_lc_type or ''>LC Number<records[0].report_linkage_lc_number or ''>LC Amount<records[0].report_linkage_lc_amount or ''>LC Expiry Date<records[0].report_linkage_lc_expiry_date or ''>5- PricingDealTypeTypeSymbolPeriodInput Price<records[0].report_linkage_pricing_deals or ''><records[0].report_linkage_pricing_sides or ''><records[0].report_linkage_pricing_types or ''><records[0].report_linkage_pricing_symbols or ''><records[0].report_linkage_pricing_periods or ''><records[0].report_linkage_pricing_input_prices or ''><records[0].report_linkage_title or ''>
- /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoM
+ Desk<shipment.report_linkage_desk or ''>B/L Date<shipment.report_linkage_bl_date or ''>
+ Book<shipment.report_linkage_book or ''>Trading Unit<shipment.report_linkage_trading_unit or ''>
+ Strategy<shipment.report_linkage_strategy or ''>Finance user<shipment.report_linkage_finance_user or ''>
+
+
+
+
+
+1- Financial summary ( USD )2- Information
+
+
+
+ GroupCost TypeEstimatedValidated
+ <for each="row in shipment.report_linkage_summary_rows"><row['group']><row['cost_type']><row['estimated']><row['validated']></for>
+
+
+
+
+
+3- Loading and Discharge movements
+
+
+
+ TypeReferenceCounterpartCommodityQuantityDeliveryBasisPeriod atFromTo
+ <for each="row in shipment.report_linkage_movement_rows"><row['type']><row['reference']><row['counterpart']><row['commodity']><row['quantity']><row['delivery']><row['basis']><row['period']><row['from_date']><row['to_date']></for>
+
+
+
+
+
+4- Bank Information
+
+
+
+ Deal<shipment.report_linkage_bank_deal or ''>Type<shipment.report_linkage_bank_type or ''>Financing Bank<shipment.report_linkage_bank_name or ''>LC Type<shipment.report_linkage_lc_type or ''>LC Number<shipment.report_linkage_lc_number or ''>LC Amount<shipment.report_linkage_lc_amount or ''>LC Expiry Date<shipment.report_linkage_lc_expiry_date or ''>
+
+
+
+
+
+5- Pricing
+
+
+
+ DealTypeTypeSymbolPeriodInput Price
+ <for each="row in shipment.report_linkage_pricing_rows"><row['deal']><row['side']><row['type']><row['symbol']><row['period']><row['input_price']></for>
+
+
+
+
+ <shipment.report_linkage_title or ''>
+ /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoM
DAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsN
FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAAR
CAAyAqADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
@@ -1545,9 +1657,28 @@
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//9k=
-
-
- Desk<records[0].report_linkage_desk or ''>B/L Date<records[0].report_linkage_bl_date or ''>Book<records[0].report_linkage_book or ''>Trading Unit<records[0].report_linkage_trading_unit or ''>Strategy<records[0].report_linkage_strategy or ''>Finance user<records[0].report_linkage_finance_user or ''>6- Financial details ( USD )GroupCost TypeCounterpartSourceUnit PriceQuantityEstimatedValidated<records[0].report_linkage_detail_groups or ''><records[0].report_linkage_detail_cost_types or ''><records[0].report_linkage_detail_counterparts or ''><records[0].report_linkage_detail_sources or ''><records[0].report_linkage_detail_unit_prices or ''><records[0].report_linkage_detail_quantities or ''><records[0].report_linkage_detail_estimated or ''><records[0].report_linkage_detail_validated or ''>OliverGyslerDigitally signed by Oliver GyslerDate: 2026.03.27 10:02:25 +01'00'J?r?mieCOLLOTDigitally signed by J?r?mie COLLOTDate: 2026.03.27 10:05:10 +01'00'Stephane MonnardDigitally signed by Stephane MonnardDate: 2026.03.27 10:54:44 +01'00'SteveZaccariniDigitally signed by Steve ZaccariniDate: 2026.03.30 15:49:42 +02'00'
-
+ Desk<shipment.report_linkage_desk or ''>B/L Date<shipment.report_linkage_bl_date or ''>
+ Book<shipment.report_linkage_book or ''>Trading Unit<shipment.report_linkage_trading_unit or ''>
+ Strategy<shipment.report_linkage_strategy or ''>Finance user<shipment.report_linkage_finance_user or ''>
+
+
+
+
+
+6- Financial details ( USD )
+
+
+
+ GroupCost TypeCounterpartSourceUnit PriceQuantityEstimatedValidated
+ <for each="row in shipment.report_linkage_detail_rows"><row['group']><row['cost_type']><row['counterpart']><row['source']><row['unit_price']><row['quantity']><row['estimated']><row['validated']></for>
+
+
+
+
+ OliverGyslerDigitally signed by Oliver GyslerDate: 2026.03.27 10:02:25 +01'00'JeremieCOLLOTDigitally signed by Jeremie COLLOTDate: 2026.03.27 10:05:10 +01'00'Stephane MonnardDigitally signed by Stephane MonnardDate: 2026.03.27 10:54:44 +01'00'
+ SteveZaccariniDigitally signed by Steve ZaccariniDate: 2026.03.30 15:49:42 +02'00'
+
+ </for>
+
\ No newline at end of file