From c2d4e34516ee712a61aeb3fd048bcf21b372bb3e Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Wed, 27 May 2026 10:54:30 +0200 Subject: [PATCH] Mtm bug --- modules/purchase_trade/tests/test_module.py | 35 +++++++++++++++++++-- modules/purchase_trade/valuation.py | 3 ++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py index 17a0a83..715bd76 100644 --- a/modules/purchase_trade/tests/test_module.py +++ b/modules/purchase_trade/tests/test_module.py @@ -80,8 +80,8 @@ class PurchaseTradeTestCase(ModuleTestCase): strategy.get_mtm(line, Decimal('10')), Decimal('250.00')) - def test_get_strategy_mtm_price_returns_unit_price(self): - 'strategy mtm price exposes the raw unit valuation price' + def test_get_strategy_mtm_price_applies_component_ratio(self): + 'strategy mtm price applies component ratios' strategy = Mock( scenario=Mock( valuation_date='2026-03-29', @@ -99,7 +99,36 @@ class PurchaseTradeTestCase(ModuleTestCase): self.assertEqual( valuation_module.Valuation._get_strategy_mtm_price(strategy, line), - Decimal('100.0000')) + Decimal('25.0000')) + + def test_get_strategy_mtm_price_keeps_signed_component_spread(self): + 'strategy mtm price keeps signed spread between different components' + strategy = Mock( + scenario=Mock( + valuation_date='2026-03-29', + use_last_price=True, + ), + currency=Mock(), + ) + strategy.components = [ + Mock( + price_source_type='curve', + price_index=Mock(get_price=Mock(return_value=Decimal('120'))), + price_matrix=None, + ratio=Decimal('100'), + ), + Mock( + price_source_type='curve', + price_index=Mock(get_price=Mock(return_value=Decimal('80'))), + price_matrix=None, + ratio=Decimal('-100'), + ), + ] + line = Mock(unit=Mock()) + + self.assertEqual( + valuation_module.Valuation._get_strategy_mtm_price(strategy, line), + Decimal('40.0000')) def test_sale_line_is_unmatched_checks_lot_links(self): 'sale line unmatched helper ignores empty matches and detects linked purchases' diff --git a/modules/purchase_trade/valuation.py b/modules/purchase_trade/valuation.py index 2e4be3c..a038637 100644 --- a/modules/purchase_trade/valuation.py +++ b/modules/purchase_trade/valuation.py @@ -356,6 +356,9 @@ class ValuationBase(ModelSQL): value = Decimal(strategy._get_matrix_price( comp, line, scenario.valuation_date)) + if comp.ratio: + value *= Decimal(comp.ratio) / Decimal(100) + total += value return round(total, 4)