From eee5c6443bc99b293cbb80b2966e59d8dbd39c20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Voet=20=28ryv=29?= Date: Thu, 9 Jan 2020 09:36:12 +0000 Subject: [PATCH] [FIX] mrp: truncate millisecond to check overlaps In some flows, a planned_datetime_start/finished will contains milliseconds. In these cases, we can detect overlaps/conflicts between workorders but these conflicts can't be see in the web interface (because datetime is truncate when it is display). Then, change the conflicts computation to remove milliseconds in search of conflicts. task-2169447 closes odoo/odoo#43013 Signed-off-by: Simon Lejeune (sle) --- addons/mrp/models/mrp_workorder.py | 3 ++- addons/mrp/tests/test_workorder_operation.py | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/addons/mrp/models/mrp_workorder.py b/addons/mrp/models/mrp_workorder.py index b6b27047a6e..6bf6319d8d4 100644 --- a/addons/mrp/models/mrp_workorder.py +++ b/addons/mrp/models/mrp_workorder.py @@ -767,7 +767,8 @@ class MrpWorkorder(models.Model): AND wo2.state IN ('pending','ready') AND wo1.id != wo2.id AND wo1.workcenter_id = wo2.workcenter_id - AND (wo2.date_planned_start, wo2.date_planned_finished) OVERLAPS (wo1.date_planned_start, wo1.date_planned_finished) + AND (DATE_TRUNC('second', wo2.date_planned_start), DATE_TRUNC('second', wo2.date_planned_finished)) + OVERLAPS (DATE_TRUNC('second', wo1.date_planned_start), DATE_TRUNC('second', wo1.date_planned_finished)) """ self.env.cr.execute(sql, [tuple(self.ids)]) res = defaultdict(list) diff --git a/addons/mrp/tests/test_workorder_operation.py b/addons/mrp/tests/test_workorder_operation.py index 1d0dd9ca0cf..3f4359e2f0b 100644 --- a/addons/mrp/tests/test_workorder_operation.py +++ b/addons/mrp/tests/test_workorder_operation.py @@ -1447,13 +1447,17 @@ class TestWorkOrderProcess(TestWorkOrderProcessCommon): self.assertEqual(wo2.state, 'pending') self.assertEqual(wo3.state, 'pending') + self.assertFalse(wo1.id in wo1._get_conflicted_workorder_ids(), "Shouldn't conflict") + self.assertFalse(wo2.id in wo2._get_conflicted_workorder_ids(), "Shouldn't conflict") + self.assertFalse(wo3.id in wo3._get_conflicted_workorder_ids(), "Shouldn't conflict") + # Conflicted with wo1 wo2.write({'date_planned_start': wo1.date_planned_start, 'date_planned_finished': wo1.date_planned_finished}) # Bad order of workorders (wo3-wo1-wo2) + Late wo3.write({'date_planned_start': wo1.date_planned_start - timedelta(weeks=1), 'date_planned_finished': wo1.date_planned_finished - timedelta(weeks=1)}) - self.assertEqual(wo2.id in wo2._get_conflicted_workorder_ids(), True, "Should conflict with wo1") - self.assertEqual(wo1.id in wo1._get_conflicted_workorder_ids(), True, "Should conflict with wo2") + self.assertTrue(wo2.id in wo2._get_conflicted_workorder_ids(), "Should conflict with wo1") + self.assertTrue(wo1.id in wo1._get_conflicted_workorder_ids(), "Should conflict with wo2") self.assertTrue('text-danger' in wo2.json_popover, "Popover should in be in red (due to conflict)") self.assertTrue('text-danger' in wo3.json_popover, "Popover should in be in red (due to bad order of wo)")