From 08febb904f8ac261898790feab43bc27f2257eca Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Sun, 29 Mar 2026 17:34:42 +0200 Subject: [PATCH 1/6] 29.03.26 --- modules/purchase_trade/tests/__init__.py | 2 + modules/purchase_trade/tests/test_module.py | 52 +++++++++++++++++++++ modules/purchase_trade/valuation.py | 8 +++- 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 modules/purchase_trade/tests/__init__.py create mode 100644 modules/purchase_trade/tests/test_module.py diff --git a/modules/purchase_trade/tests/__init__.py b/modules/purchase_trade/tests/__init__.py new file mode 100644 index 0000000..4effdfa --- /dev/null +++ b/modules/purchase_trade/tests/__init__.py @@ -0,0 +1,2 @@ +# This file is part of Tryton. The COPYRIGHT file at the top level of +# this repository contains the full copyright notices and license terms. diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py new file mode 100644 index 0000000..2f49993 --- /dev/null +++ b/modules/purchase_trade/tests/test_module.py @@ -0,0 +1,52 @@ +# This file is part of Tryton. The COPYRIGHT file at the top level of +# this repository contains the full copyright notices and license terms. + +from decimal import Decimal +from unittest.mock import Mock, patch + +from trytond.pool import Pool +from trytond.tests.test_tryton import ModuleTestCase, with_transaction + + +class PurchaseTradeTestCase(ModuleTestCase): + 'Test purchase_trade module' + module = 'purchase_trade' + + @with_transaction() + def test_get_totals_without_rows(self): + 'get_totals returns zeros when the query has no row' + Valuation = Pool().get('valuation.valuation') + cursor = Mock() + cursor.fetchone.return_value = None + connection = Mock() + connection.cursor.return_value = cursor + + with patch( + 'trytond.modules.purchase_trade.valuation.Transaction' + ) as Transaction, patch.object( + Valuation, '__table__', return_value='valuation_valuation'): + Transaction.return_value.connection = connection + + self.assertEqual( + Valuation.get_totals(), (Decimal(0), Decimal(0))) + + @with_transaction() + def test_get_totals_without_previous_total(self): + 'get_totals converts null variation to zero' + Valuation = Pool().get('valuation.valuation') + cursor = Mock() + cursor.fetchone.return_value = (Decimal('42.50'), None) + connection = Mock() + connection.cursor.return_value = cursor + + with patch( + 'trytond.modules.purchase_trade.valuation.Transaction' + ) as Transaction, patch.object( + Valuation, '__table__', return_value='valuation_valuation'): + Transaction.return_value.connection = connection + + self.assertEqual( + Valuation.get_totals(), (Decimal('42.50'), Decimal(0))) + + +del ModuleTestCase diff --git a/modules/purchase_trade/valuation.py b/modules/purchase_trade/valuation.py index 3142d05..3dc7cf3 100644 --- a/modules/purchase_trade/valuation.py +++ b/modules/purchase_trade/valuation.py @@ -459,9 +459,13 @@ class Valuation(ValuationBase, ModelView): """ cursor.execute(sql) - last_total, last_variation = cursor.fetchone() + row = cursor.fetchone() + if not row: + return Decimal(0), Decimal(0) - return last_total, last_variation + last_total, last_variation = row + + return last_total or Decimal(0), last_variation or Decimal(0) class ValuationLine(ValuationBase, ModelView): "Last Valuation" -- 2.49.1 From d6382f624b2ec426b05db347875b42194cb4be23 Mon Sep 17 00:00:00 2001 From: "AzureAD\\SylvainDUVERNAY" Date: Sun, 29 Mar 2026 18:02:31 +0200 Subject: [PATCH 2/6] Commit 2 --- test2.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 test2.py diff --git a/test2.py b/test2.py new file mode 100644 index 0000000..6460ce7 --- /dev/null +++ b/test2.py @@ -0,0 +1 @@ +#Comment from Sylvain \ No newline at end of file -- 2.49.1 From 5cff728d79b164c5b9c35757ff56d78cc20fb172 Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Sun, 29 Mar 2026 18:05:00 +0200 Subject: [PATCH 3/6] 29.03.26 --- test2.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test2.py b/test2.py index 6460ce7..4c9901b 100644 --- a/test2.py +++ b/test2.py @@ -1 +1,2 @@ -#Comment from Sylvain \ No newline at end of file +#Comment from Sylvain +#comment from lolo \ No newline at end of file -- 2.49.1 From 43c62607a8a969b9eb81c6781a388d2fa11bfd32 Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Sun, 29 Mar 2026 18:13:56 +0200 Subject: [PATCH 4/6] 29.03.26 --- modules/purchase_trade/pricing.py | 10 +++++----- modules/purchase_trade/tests/test_module.py | 22 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/modules/purchase_trade/pricing.py b/modules/purchase_trade/pricing.py index b4031ea..6191627 100755 --- a/modules/purchase_trade/pricing.py +++ b/modules/purchase_trade/pricing.py @@ -113,11 +113,11 @@ class MtmStrategy(ModelSQL, ModelView): ) ) - elif comp.price_source_type == 'matrix' and comp.price_matrix: - value = self._get_matrix_price(comp, line, dt) - - if comp.ratio: - value *= Decimal(comp.ratio) + elif comp.price_source_type == 'matrix' and comp.price_matrix: + value = self._get_matrix_price(comp, line, dt) + + if comp.ratio: + value *= Decimal(comp.ratio) / Decimal(100) total += value * qty diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py index 2f49993..7d2b4c5 100644 --- a/modules/purchase_trade/tests/test_module.py +++ b/modules/purchase_trade/tests/test_module.py @@ -48,5 +48,27 @@ class PurchaseTradeTestCase(ModuleTestCase): self.assertEqual( Valuation.get_totals(), (Decimal('42.50'), Decimal(0))) + @with_transaction() + def test_get_mtm_applies_component_ratio_as_percentage(self): + 'get_mtm treats component ratio as a percentage' + Strategy = Pool().get('mtm.strategy') + strategy = Strategy() + strategy.scenario = Mock( + valuation_date='2026-03-29', + use_last_price=True, + ) + strategy.currency = Mock() + strategy.components = [Mock( + price_source_type='curve', + price_index=Mock(get_price=Mock(return_value=Decimal('100'))), + price_matrix=None, + ratio=Decimal('25'), + )] + line = Mock(unit=Mock()) + + self.assertEqual( + strategy.get_mtm(line, Decimal('10')), + Decimal('250.00')) + del ModuleTestCase -- 2.49.1 From ad2f7e6f786dc7e5bf791e6e2d6b90a0e494c211 Mon Sep 17 00:00:00 2001 From: "AzureAD\\SylvainDUVERNAY" Date: Sun, 29 Mar 2026 18:34:54 +0200 Subject: [PATCH 5/6] Commit IFRS adjustments --- modules/purchase_trade/__init__.py | 36 +++++----- modules/purchase_trade/account.py | 30 ++++++++ modules/purchase_trade/account.xml | 70 +++++++++++++++++++ modules/purchase_trade/tryton.cfg | 25 +++---- .../view/physical_trade_IFRS_form.xml | 11 +++ .../view/physical_trade_IFRS_tree.xml | 6 ++ 6 files changed, 150 insertions(+), 28 deletions(-) create mode 100644 modules/purchase_trade/account.py create mode 100644 modules/purchase_trade/account.xml create mode 100644 modules/purchase_trade/view/physical_trade_IFRS_form.xml create mode 100644 modules/purchase_trade/view/physical_trade_IFRS_tree.xml diff --git a/modules/purchase_trade/__init__.py b/modules/purchase_trade/__init__.py index 0919bda..d3bae59 100755 --- a/modules/purchase_trade/__init__.py +++ b/modules/purchase_trade/__init__.py @@ -4,6 +4,7 @@ from trytond.pool import Pool from . import ( + account, purchase, sale, global_reporting, @@ -30,10 +31,10 @@ from . import ( valuation, dimension, weight_report, - backtoback, - service, - invoice, -) + backtoback, + service, + invoice, +) def register(): Pool.register( @@ -75,8 +76,8 @@ def register(): dashboard.Incoming, dashboard.BotAction, dashboard.News, - dashboard.Demos, - party.Party, + dashboard.Demos, + party.Party, party.PartyExecution, party.PartyExecutionSla, party.PartyExecutionPlace, @@ -178,16 +179,19 @@ def register(): purchase.PenaltyRule, purchase.PenaltyRuleTier, purchase.ConcentrateTerm, - backtoback.Backtoback, - dimension.AnalyticDimension, - dimension.AnalyticDimensionValue, - dimension.AnalyticDimensionAssignment, - weight_report.WeightReport, - module='purchase', type_='model') - Pool.register( - invoice.Invoice, - invoice.InvoiceLine, - module='account_invoice', type_='model') + backtoback.Backtoback, + dimension.AnalyticDimension, + dimension.AnalyticDimensionValue, + dimension.AnalyticDimensionAssignment, + weight_report.WeightReport, + module='purchase', type_='model') + Pool.register( + account.PhysicalTradeIFRS, + module='purchase_trade', type_='model') + Pool.register( + invoice.Invoice, + invoice.InvoiceLine, + module='account_invoice', type_='model') Pool.register( forex.Forex, forex.ForexCoverFees, diff --git a/modules/purchase_trade/account.py b/modules/purchase_trade/account.py new file mode 100644 index 0000000..b686fa6 --- /dev/null +++ b/modules/purchase_trade/account.py @@ -0,0 +1,30 @@ +# account.py +from trytond.model import ModelSQL, ModelView, fields +from trytond.pool import PoolMeta +from trytond.pyson import Eval + +__all__ = ['PhysicalTradeIFRS'] +__metaclass__ = PoolMeta + + +class PhysicalTradeIFRS(ModelSQL, ModelView): + 'Physical Trade - IFRS Adjustment' + __name__ = 'account.physical_trade_ifrs' + + date = fields.Date('Date', required=True) + comment = fields.Text('Comment', required=True) + currency = fields.Many2One('currency.currency', 'Currency', required=True) + currency_digits = fields.Function( + fields.Integer('Currency Digits'), + 'on_change_with_currency_digits') + amount = fields.Numeric( + 'Amount', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits'], + required=True) + + @fields.depends('currency') + def on_change_with_currency_digits(self, name=None): + if self.currency: + return self.currency.digits + return 2 diff --git a/modules/purchase_trade/account.xml b/modules/purchase_trade/account.xml new file mode 100644 index 0000000..bbd3a23 --- /dev/null +++ b/modules/purchase_trade/account.xml @@ -0,0 +1,70 @@ + + + + + Physical Trade IFRS + + + Physical Trade IFRS Administration + + + + + + + + + + + + + account.physical_trade_ifrs + form + physical_trade_IFRS_form + + + account.physical_trade_ifrs + tree + physical_trade_IFRS_tree + + + + Physical Trade - IFRS Adjustment + account.physical_trade_ifrs + + + + + + + + + + + + + + + + account.physical_trade_ifrs + + + + + + + account.physical_trade_ifrs + + + + + + + + diff --git a/modules/purchase_trade/tryton.cfg b/modules/purchase_trade/tryton.cfg index e125de5..8f43cba 100755 --- a/modules/purchase_trade/tryton.cfg +++ b/modules/purchase_trade/tryton.cfg @@ -1,12 +1,12 @@ [tryton] version=7.2.7 -depends: - ir - purchase - sale - account_invoice - stock - res +depends: + ir + purchase + sale + account_invoice + stock + res lot document_incoming incoterm @@ -29,8 +29,9 @@ xml: party.xml forex.xml global_reporting.xml - derivative.xml - valuation.xml - weight_report.xml - dimension.xml - backtoback.xml + derivative.xml + valuation.xml + weight_report.xml + dimension.xml + backtoback.xml + account.xml diff --git a/modules/purchase_trade/view/physical_trade_IFRS_form.xml b/modules/purchase_trade/view/physical_trade_IFRS_form.xml new file mode 100644 index 0000000..19ca656 --- /dev/null +++ b/modules/purchase_trade/view/physical_trade_IFRS_form.xml @@ -0,0 +1,11 @@ +
+