From 7a39754a63590c4ee6881b481f9c242ebaedf547 Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Mon, 25 May 2026 11:15:50 +0200 Subject: [PATCH] Matching --- modules/purchase_trade/lot.py | 5 +++++ modules/purchase_trade/purchase.py | 4 ++-- modules/purchase_trade/sale.py | 4 ++-- modules/purchase_trade/tests/test_module.py | 16 ++++++++++------ .../view/lot_matching_lot_tree.xml | 1 + .../view/lot_matching_lot_tree2.xml | 1 + 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/modules/purchase_trade/lot.py b/modules/purchase_trade/lot.py index 66bb4d6..ea4052a 100755 --- a/modules/purchase_trade/lot.py +++ b/modules/purchase_trade/lot.py @@ -1247,10 +1247,14 @@ class LotQt( getattr(line, 'quantity_theorical', None) or getattr(line, 'quantity', None) or 0)) + targeted = getattr(line, 'targeted_qt', None) + if targeted in (None, ''): + targeted = theoretical tol_min = cls._matching_line_tolerance_percent(line, 'tol_min') tol_max = cls._matching_line_tolerance_percent(line, 'tol_max') return { 'lot_theoretical_qt': theoretical, + 'lot_targeted_qt': Decimal(str(targeted or 0)), 'lot_tol_min': tol_min, 'lot_tol_max': tol_max, 'lot_tolerance_min': -tol_min, @@ -3157,6 +3161,7 @@ class LotMatchingLot(ModelView): lot_product = fields.Many2One('product.product',"Product",readonly=True) lot_quantity = fields.Numeric("Qt",readonly=True) lot_theoretical_qt = fields.Numeric("Theoretical Qt", readonly=True) + lot_targeted_qt = fields.Numeric("Targeted Qt", readonly=True) lot_already_matched_qt = fields.Numeric("Already matched", readonly=True) lot_qt_min = fields.Numeric("Qt min", readonly=True) lot_qt_max = fields.Numeric("Qt max", readonly=True) diff --git a/modules/purchase_trade/purchase.py b/modules/purchase_trade/purchase.py index 052225a..734b86d 100755 --- a/modules/purchase_trade/purchase.py +++ b/modules/purchase_trade/purchase.py @@ -280,7 +280,7 @@ class Purchase(metaclass=PoolMeta): tolerance_used = fields.Function( fields.Numeric("Tolerance used"), 'get_tolerance_used') tolerance_option = fields.Selection([ - ('no_option', "No option"), + ('', ''), ('buyer_option', "Buyer's option"), ('seller_option', "Seller's option"), ], "Tolerance option") @@ -408,7 +408,7 @@ class Purchase(metaclass=PoolMeta): @classmethod def default_tolerance_option(cls): - return 'no_option' + return '' def _line_quantity_in_unit(self, quantity, from_unit, to_unit): if not from_unit or not to_unit or from_unit == to_unit: diff --git a/modules/purchase_trade/sale.py b/modules/purchase_trade/sale.py index 24fd836..ae7aac1 100755 --- a/modules/purchase_trade/sale.py +++ b/modules/purchase_trade/sale.py @@ -252,7 +252,7 @@ class Sale(metaclass=PoolMeta): tolerance_used = fields.Function( fields.Numeric("Tolerance used"), 'get_tolerance_used') tolerance_option = fields.Selection([ - ('no_option', "No option"), + ('', ''), ('buyer_option', "Buyer's option"), ('seller_option', "Seller's option"), ], "Tolerance option") @@ -372,7 +372,7 @@ class Sale(metaclass=PoolMeta): @classmethod def default_tolerance_option(cls): - return 'no_option' + return '' def _line_quantity_in_unit(self, quantity, from_unit, to_unit): if not from_unit or not to_unit or from_unit == to_unit: diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py index 38ad64a..127b347 100644 --- a/modules/purchase_trade/tests/test_module.py +++ b/modules/purchase_trade/tests/test_module.py @@ -1776,13 +1776,13 @@ class PurchaseTradeTestCase(ModuleTestCase): self.assertEqual( Purchase.operator.domain, [('categories.name', '=', 'OPERATOR')]) - def test_sale_and_purchase_tolerance_option_defaults_to_no_option(self): - 'sale and purchase tolerance option defaults to no option' + def test_sale_and_purchase_tolerance_option_defaults_to_empty(self): + 'sale and purchase tolerance option defaults to empty' Sale = Pool().get('sale.sale') Purchase = Pool().get('purchase.purchase') - self.assertEqual(Sale.default_tolerance_option(), 'no_option') - self.assertEqual(Purchase.default_tolerance_option(), 'no_option') + self.assertEqual(Sale.default_tolerance_option(), '') + self.assertEqual(Purchase.default_tolerance_option(), '') def test_sale_line_basis_price_and_progress_use_manual_summary_without_component(self): 'sale line basis values use manual summary rows even without a component' @@ -3219,14 +3219,16 @@ class PurchaseTradeTestCase(ModuleTestCase): id=101, line=Mock( purchase=purchase, inherit_tol=False, - quantity_theorical=Decimal('100'), tol_min=0, tol_max=0), + quantity_theorical=Decimal('100'), + targeted_qt=Decimal('96'), tol_min=0, tol_max=0), sale_line=None, lot_type='virtual', lot_product=product) sale_lot = Mock( id=102, line=None, sale_line=Mock( sale=sale, inherit_tol=False, - quantity_theorical=Decimal('80'), tol_min=0, tol_max=0), + quantity_theorical=Decimal('80'), + targeted_qt=Decimal('84'), tol_min=0, tol_max=0), lot_type='virtual', lot_product=product) matched_sale_lot = Mock( id=103, line=None, @@ -3274,11 +3276,13 @@ class PurchaseTradeTestCase(ModuleTestCase): self.assertEqual(len(result['lot_s']), 1) self.assertEqual(result['lot_p'][0]['lot_r_id'], 1) self.assertEqual(result['lot_p'][0]['lot_quantity'], Decimal('100')) + self.assertEqual(result['lot_p'][0]['lot_targeted_qt'], Decimal('96')) self.assertEqual(result['lot_p'][0]['lot_qt_min'], Decimal('100.00000')) self.assertEqual(result['lot_p'][0]['lot_qt_max'], Decimal('100.00000')) self.assertEqual(result['lot_p'][0]['lot_cp'], 20) self.assertEqual(result['lot_s'][0]['lot_r_id'], 2) self.assertEqual(result['lot_s'][0]['lot_quantity'], Decimal('80')) + self.assertEqual(result['lot_s'][0]['lot_targeted_qt'], Decimal('84')) self.assertEqual(result['lot_s'][0]['lot_qt_min'], Decimal('80.00000')) self.assertEqual(result['lot_s'][0]['lot_qt_max'], Decimal('80.00000')) self.assertEqual(result['lot_s'][0]['lot_cp'], 40) diff --git a/modules/purchase_trade/view/lot_matching_lot_tree.xml b/modules/purchase_trade/view/lot_matching_lot_tree.xml index d40f1b9..f96102e 100755 --- a/modules/purchase_trade/view/lot_matching_lot_tree.xml +++ b/modules/purchase_trade/view/lot_matching_lot_tree.xml @@ -5,6 +5,7 @@ + diff --git a/modules/purchase_trade/view/lot_matching_lot_tree2.xml b/modules/purchase_trade/view/lot_matching_lot_tree2.xml index 165cdca..bf5a017 100755 --- a/modules/purchase_trade/view/lot_matching_lot_tree2.xml +++ b/modules/purchase_trade/view/lot_matching_lot_tree2.xml @@ -5,6 +5,7 @@ +