From dbfd6a0d89d64c5df5c506c997f59665417d5e2c Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Fri, 12 Jun 2026 19:09:08 +0200 Subject: [PATCH] Valuation --- modules/purchase_trade/tests/test_module.py | 5 +++++ modules/purchase_trade/valuation.py | 8 ++++++++ modules/purchase_trade/view/valuation_list.xml | 1 + modules/purchase_trade/view/valuation_tree_sequence3.xml | 1 + modules/purchase_trade/view/valuation_tree_sequence4.xml | 1 + 5 files changed, 16 insertions(+) diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py index 6c8f777..612008a 100644 --- a/modules/purchase_trade/tests/test_module.py +++ b/modules/purchase_trade/tests/test_module.py @@ -1208,6 +1208,7 @@ class PurchaseTradeTestCase(ModuleTestCase): lot = Mock(id=5, sale_line=None, lot_type='virtual') lot.get_current_quantity_converted.return_value = Decimal('10') fee = Mock( + id=11, product=product, supplier=supplier, type='budgeted', @@ -1241,6 +1242,7 @@ class PurchaseTradeTestCase(ModuleTestCase): values = Valuation.create_pnl_fee_from_line(line) self.assertEqual(values[0]['amount'], Decimal('0')) + self.assertEqual(values[0]['fee'], fee.id) def test_fee_quantity_sync_uses_physical_lots_when_present(self): 'fee quantity sync ignores virtual lot once physical lots exist' @@ -1762,6 +1764,7 @@ class PurchaseTradeTestCase(ModuleTestCase): sale_lot.get_current_quantity_converted.return_value = Decimal('220') sale_line.lots = [sale_lot] fee = Mock( + id=12, product=Mock(id=6, name='Broker commission'), supplier=Mock(id=7), type='budgeted', @@ -1802,6 +1805,8 @@ class PurchaseTradeTestCase(ModuleTestCase): values = Valuation.create_pnl_fee_from_sale_line(sale_line) self.assertEqual(len(values), 2) + self.assertEqual(values[0]['fee'], fee.id) + self.assertEqual(values[1]['fee'], fee.id) self.assertEqual(values[0]['shipment_in'], shipment.id) self.assertEqual(values[0]['quantity'], Decimal('88.00000')) self.assertEqual(values[0]['amount'], Decimal('-880.00')) diff --git a/modules/purchase_trade/valuation.py b/modules/purchase_trade/valuation.py index cee059a..e6e91b8 100644 --- a/modules/purchase_trade/valuation.py +++ b/modules/purchase_trade/valuation.py @@ -64,6 +64,7 @@ class ValuationBase(ModelSQL): strategy = fields.Many2One('mtm.strategy',"Strategy") lot = fields.Many2One('lot.lot',"Lot") shipment_in = fields.Many2One('stock.shipment.in', "Shipment In") + fee = fields.Many2One('fee.fee', "Fee") base_amount = fields.Numeric("Base Amount",digits=(16,2)) rate = fields.Numeric("Rate", digits=(16,6)) @@ -337,6 +338,7 @@ class ValuationBase(ModelSQL): value.get('state'), value.get('strategy'), value.get('shipment_in'), + value.get('fee'), value.get('mtm_curve'), ) @@ -363,6 +365,7 @@ class ValuationBase(ModelSQL): ('state', '=', value.get('state')), ('strategy', '=', value.get('strategy')), ('shipment_in', '=', value.get('shipment_in')), + ('fee', '=', value.get('fee')), ('mtm_curve', '=', value.get('mtm_curve')), ] if value.get('sale_line'): @@ -1230,6 +1233,7 @@ class ValuationBase(ModelSQL): 'purchase': line.purchase.id, 'line': line.id, 'shipment_in': segment.get('shipment_in'), + 'fee': sf.id, 'type': ( 'shipment fee' if sf.shipment_in else 'sale fee' if sf.sale_line @@ -1291,6 +1295,7 @@ class ValuationBase(ModelSQL): 'sale': sale_line.sale.id, 'sale_line': sale_line.id, 'shipment_in': segment.get('shipment_in'), + 'fee': sf.id, 'type': ( 'shipment fee' if sf.shipment_in else 'sale fee' @@ -1520,6 +1525,7 @@ class ValuationDyn(ModelSQL,ModelView): r_strategy = fields.Many2One('mtm.strategy',"Strategy") r_lot = fields.Many2One('lot.lot',"Lot") r_shipment_in = fields.Many2One('stock.shipment.in', "Shipment In") + r_fee = fields.Many2One('fee.fee', "Fee") @classmethod def table_query(cls): @@ -1558,6 +1564,7 @@ class ValuationDyn(ModelSQL,ModelView): Max(val.strategy).as_('r_strategy'), Max(val.lot).as_('r_lot'), Max(val.shipment_in).as_('r_shipment_in'), + Max(val.fee).as_('r_fee'), where=wh, group_by=[val.type, val.counterparty, val.state, val.mtm_curve]) @@ -1615,6 +1622,7 @@ class ValuationReport(ValuationBase, ModelView): val.strategy.as_('strategy'), val.lot.as_('lot'), val.shipment_in.as_('shipment_in'), + val.fee.as_('fee'), where=wh) return query diff --git a/modules/purchase_trade/view/valuation_list.xml b/modules/purchase_trade/view/valuation_list.xml index 5a05b4d..d3baf8f 100644 --- a/modules/purchase_trade/view/valuation_list.xml +++ b/modules/purchase_trade/view/valuation_list.xml @@ -3,6 +3,7 @@ + diff --git a/modules/purchase_trade/view/valuation_tree_sequence3.xml b/modules/purchase_trade/view/valuation_tree_sequence3.xml index 65aaf95..3d6c496 100755 --- a/modules/purchase_trade/view/valuation_tree_sequence3.xml +++ b/modules/purchase_trade/view/valuation_tree_sequence3.xml @@ -4,6 +4,7 @@ this repository contains the full copyright notices and license terms. --> + diff --git a/modules/purchase_trade/view/valuation_tree_sequence4.xml b/modules/purchase_trade/view/valuation_tree_sequence4.xml index 0070c03..6febbdb 100755 --- a/modules/purchase_trade/view/valuation_tree_sequence4.xml +++ b/modules/purchase_trade/view/valuation_tree_sequence4.xml @@ -4,6 +4,7 @@ this repository contains the full copyright notices and license terms. --> +