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 @@
+