From b935db1e70bf86036af448396bd9fa0a3e623ccf Mon Sep 17 00:00:00 2001 From: "Tiffany Chang (tic)" Date: Wed, 10 Nov 2021 15:13:50 +0000 Subject: [PATCH] [IMP] mrp: improve UX Several UX improvements: 1 - Add "Unbuild" filter to MOs (1 or more 'Done' unbuilds) + added Unbuilds smart button to MO form view 2 - When copying an operation across BoMs, it is annoying that it adds "Copy" to the end of the name, so we remove that. 3 - Display a warning when using an expired Lot/SN in detailed operations view (burger window + tab). 4 - Allow adding/removing WO Real Duration + add/remove/edit specific time time tracking (time_ids) for Done, Unlocked MOs. 5 - Allow search WOs by product to manufacture 7 - Fix validation error message typo Parts 1-5 and 7 of Task: 2667151 Part-of: odoo/odoo#80319 --- addons/mrp/models/mrp_production.py | 18 ++++++++++++++++++ addons/mrp/models/mrp_routing.py | 2 +- addons/mrp/views/mrp_production_views.xml | 9 ++++++++- addons/mrp/views/mrp_workorder_views.xml | 2 ++ .../product_expiry/models/stock_move_line.py | 1 + .../product_expiry/views/stock_move_views.xml | 14 ++++++++++++++ .../wizard/stock_assign_serial_numbers.py | 2 +- 7 files changed, 45 insertions(+), 3 deletions(-) diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py index 2f3f86dc6d2..2973dc353ee 100644 --- a/addons/mrp/models/mrp_production.py +++ b/addons/mrp/models/mrp_production.py @@ -6,6 +6,7 @@ import datetime import math import re +from ast import literal_eval from collections import defaultdict from dateutil.relativedelta import relativedelta @@ -235,6 +236,8 @@ class MrpProduction(models.Model): json_popover = fields.Char('JSON data for the popover widget', compute='_compute_json_popover') scrap_ids = fields.One2many('stock.scrap', 'production_id', 'Scraps') scrap_count = fields.Integer(compute='_compute_scrap_move_count', string='Scrap Move') + unbuild_ids = fields.One2many('mrp.unbuild', 'mo_id', 'Unbuilds') + unbuild_count = fields.Integer(compute='_compute_unbuild_count', string='Number of Unbuilds') is_locked = fields.Boolean('Is Locked', default=_get_default_is_locked, copy=False) is_planned = fields.Boolean('Its Operations are Planned', compute="_compute_is_planned", store=True) @@ -513,6 +516,11 @@ class MrpProduction(models.Model): for production in self: production.scrap_count = count_data.get(production.id, 0) + @api.depends('unbuild_ids') + def _compute_unbuild_count(self): + for production in self: + production.unbuild_count = len(production.unbuild_ids) + @api.depends('move_finished_ids') def _compute_move_byproduct_ids(self): for order in self: @@ -1818,6 +1826,16 @@ class MrpProduction(models.Model): def action_view_reception_report(self): return self.env["ir.actions.actions"]._for_xml_id("mrp.mrp_reception_action") + def action_view_mrp_production_unbuilds(self): + self.ensure_one() + action = self.env["ir.actions.actions"]._for_xml_id("mrp.mrp_unbuild") + action['domain'] = [('mo_id', '=', self.id)] + context = literal_eval(action['context']) + context.update(self.env.context) + context['default_mo_id'] = self.id + action['context'] = context + return action + @api.model def get_empty_list_help(self, help): self = self.with_context( diff --git a/addons/mrp/models/mrp_routing.py b/addons/mrp/models/mrp_routing.py index 1d8a0700219..c105ff91a66 100644 --- a/addons/mrp/models/mrp_routing.py +++ b/addons/mrp/models/mrp_routing.py @@ -93,7 +93,7 @@ class MrpRoutingWorkcenter(models.Model): if 'bom_id' in self.env.context: bom_id = self.env.context.get('bom_id') for operation in self: - operation.copy({'name': _("%s (copy)", operation.name), 'bom_id': bom_id}) + operation.copy({'bom_id': bom_id}) return { 'view_mode': 'form', 'res_model': 'mrp.bom', diff --git a/addons/mrp/views/mrp_production_views.xml b/addons/mrp/views/mrp_production_views.xml index fb508d73f64..0592513303d 100644 --- a/addons/mrp/views/mrp_production_views.xml +++ b/addons/mrp/views/mrp_production_views.xml @@ -150,6 +150,12 @@ Backorders +