From dd228ff39f3da91a373b392697ae2dc3e7e7e2b3 Mon Sep 17 00:00:00 2001 From: JF Aubert Date: Mon, 28 Nov 2022 08:22:16 +0000 Subject: [PATCH] [FIX] mrp(workorder_hr): fix workorder duration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, _intervals_duration (called by _compute_duration) sometimes loose the last mrp.workcenter.productivity. A fix has been made. First, mrp.workcenter.productivity.loss _convert_to_duration calculates according to the loss type, we have to take that in account. Second, mrp.workcenter.productivity _close badly generates performance timers. For example, test_mrp_employee_analytic_account generated - productive for 1st employee from 10:00 to 11:00 - performance for 2nd employee from 10:00 to 11:00 - performance for 2nd employee from 11:00 to 11:00 (! duration = 0) Now, the timers are - productive for 1st employee from 10:00 to 11:00 - productive for 2nd employee from 10:00 to 11:00 which is correct. closes odoo/odoo#106908 Task: 2985735 X-original-commit: 8638ec145ab83e4afafa39a5c9e987e8d772bfd1 Related: odoo/enterprise#34533 Signed-off-by: William Henrotin (whe) Signed-off-by: Jean-François Aubert --- addons/mrp/models/mrp_workcenter.py | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/addons/mrp/models/mrp_workcenter.py b/addons/mrp/models/mrp_workcenter.py index b5bea7bdcf6..e2e6f6b21ad 100644 --- a/addons/mrp/models/mrp_workcenter.py +++ b/addons/mrp/models/mrp_workcenter.py @@ -434,20 +434,14 @@ class MrpWorkcenterProductivity(models.Model): underperformance_timers = self.env['mrp.workcenter.productivity'] for timer in self: wo = timer.workorder_id - if wo.duration_expected <= wo.duration: - if timer.loss_type == 'productive': + timer.write({'date_end': datetime.now()}) + if wo.duration > wo.duration_expected: + productive_date_end = timer.date_end - relativedelta.relativedelta(minutes=wo.duration - wo.duration_expected) + if productive_date_end <= timer.date_start: underperformance_timers |= timer - timer.write({'date_end': fields.Datetime.now()}) - continue - - maxdate = timer.date_start + relativedelta.relativedelta(minutes=wo.duration_expected - wo.duration) - enddate = fields.datetime.now() - if maxdate > enddate: - timer.write({'date_end': enddate}) - else: - timer.write({'date_end': maxdate}) - underperformance_timers |= timer.copy({'date_start': maxdate, 'date_end': enddate}) - + else: + underperformance_timers |= timer.copy({'date_start': productive_date_end}) + timer.write({'date_end': productive_date_end}) if underperformance_timers: underperformance_type = self.env['mrp.workcenter.productivity.loss'].search([('loss_type', '=', 'performance')], limit=1) if not underperformance_type: