From 20fec19fd0afc47bc8449e4ac70220aacb8ad03f Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Tue, 25 Feb 2020 12:15:48 +0000 Subject: [PATCH] [FIX] sale_stock: batch quantities computation correctly. Available quantities computation is grouped by warehouse,date but using datetime.now as fallback during the for loop ensures no batch computation is done at all if order is not confirmed and has no commitment_date. X-original-commit: 563d0f73a8cea1933e57ae2b914f161ffeb5b7e4 --- addons/sale_stock/models/sale_order.py | 3 ++- addons/sale_stock/tests/test_sale_stock.py | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/sale_stock/models/sale_order.py b/addons/sale_stock/models/sale_order.py index 9045f6f8db4..12f2d445689 100644 --- a/addons/sale_stock/models/sale_order.py +++ b/addons/sale_stock/models/sale_order.py @@ -262,6 +262,7 @@ class SaleOrderLine(models.Model): grouped_lines = defaultdict(lambda: self.env['sale.order.line']) # We first loop over the SO lines to group them by warehouse and schedule # date in order to batch the read of the quantities computed field. + now = fields.Datetime.now() for line in self: if not line.display_qty_widget: continue @@ -269,7 +270,7 @@ class SaleOrderLine(models.Model): if line.order_id.commitment_date: date = line.order_id.commitment_date else: - confirm_date = line.order_id.date_order if line.order_id.state in ['sale', 'done'] else datetime.now() + confirm_date = line.order_id.date_order if line.order_id.state in ['sale', 'done'] else now date = confirm_date + timedelta(days=line.customer_lead or 0.0) grouped_lines[(line.warehouse_id.id, date)] |= line diff --git a/addons/sale_stock/tests/test_sale_stock.py b/addons/sale_stock/tests/test_sale_stock.py index fbc3dd74df2..f2f4331033f 100644 --- a/addons/sale_stock/tests/test_sale_stock.py +++ b/addons/sale_stock/tests/test_sale_stock.py @@ -653,6 +653,9 @@ class TestSaleStock(TestSaleCommon): self.assertEqual(line.warehouse_id, warehouse1) self.assertEqual(line.qty_to_deliver, 1) so.warehouse_id = warehouse2 + # invalidate product cache to ensure qty_available is recomputed + # bc warehouse isn't in the depends_context of qty_available + line.product_id.invalidate_cache() self.assertEqual(line.virtual_available_at_date, 5) self.assertEqual(line.free_qty_today, 5) self.assertEqual(line.qty_available_today, 5)