From 108ee65af2a88d61526dc047043138bddc3f9b63 Mon Sep 17 00:00:00 2001 From: William Henrotin Date: Wed, 20 Feb 2019 10:14:37 +0000 Subject: [PATCH] [IMP] mrp: block creating lot from workorder/produce wizard When registering lot or serial number for a component in a workorder, the manufacturer can create it on on the fly. We would like to give this ability a restriction depending on the picking type. This commit blocks the creating by default but leave the possibility to tick a new checkbox on the manufacturing picking type to allow the creation of lot and serial number for components inside the production process. Task : 1891864 --- addons/mrp/models/mrp_abstract_workorder.py | 1 + addons/mrp/models/stock_picking.py | 5 +++++ addons/mrp/models/stock_production_lot.py | 11 ++++++++++- addons/mrp/views/mrp_workorder_views.xml | 2 +- addons/mrp/views/stock_picking_views.xml | 5 +++++ addons/mrp/wizard/mrp_product_produce_views.xml | 2 +- addons/stock/models/stock_production_lot.py | 7 +++++-- addons/stock/views/stock_picking_views.xml | 2 +- 8 files changed, 29 insertions(+), 6 deletions(-) diff --git a/addons/mrp/models/mrp_abstract_workorder.py b/addons/mrp/models/mrp_abstract_workorder.py index 1a34ac13c68..a54691c6436 100644 --- a/addons/mrp/models/mrp_abstract_workorder.py +++ b/addons/mrp/models/mrp_abstract_workorder.py @@ -24,6 +24,7 @@ class MrpAbstractWorkorder(models.AbstractModel): ('flexible', 'Flexible')], required=True, ) + use_create_components_lots = fields.Boolean(related="production_id.picking_type_id.use_create_components_lots") @api.onchange('qty_producing') def _onchange_qty_producing(self): diff --git a/addons/mrp/models/stock_picking.py b/addons/mrp/models/stock_picking.py index bac9093f454..ce4cf49449b 100644 --- a/addons/mrp/models/stock_picking.py +++ b/addons/mrp/models/stock_picking.py @@ -14,6 +14,11 @@ class StockPickingType(models.Model): compute='_get_mo_count') count_mo_late = fields.Integer(string="Number of Manufacturing Orders Late", compute='_get_mo_count') + use_create_components_lots = fields.Boolean( + string="Create New Lots/Serial Numbers for Components", + help="Allow to create new lot/serial numbers for the components", + default=False, + ) def _get_mo_count(self): mrp_picking_types = self.filtered(lambda picking: picking.code == 'mrp_operation') diff --git a/addons/mrp/models/stock_production_lot.py b/addons/mrp/models/stock_production_lot.py index a8ca9f12e16..7a04e34f272 100644 --- a/addons/mrp/models/stock_production_lot.py +++ b/addons/mrp/models/stock_production_lot.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import api, exceptions, fields, models, _ +from odoo import fields, models, _ +from odoo.exceptions import UserError class StockProductionLot(models.Model): @@ -10,3 +11,11 @@ class StockProductionLot(models.Model): use_next_on_work_order_id = fields.Many2one('mrp.workorder', string="Next Work Order to Use", help='Technical: used to figure out default serial number on work orders') + + def _check_create(self): + active_mo_id = self.env.context.get('active_mo_id') + if active_mo_id: + active_mo = self.env['mrp.production'].browse(active_mo_id) + if not active_mo.picking_type_id.use_create_components_lots: + raise UserError(_('You are not allowed to create or edit a lot or serial number for the components with the operation type "Manufacturing". To change this, go on the operation type and tick the box "Create New Lots/Serial Numbers for Components".')) + return super(StockProductionLot, self)._check_create() diff --git a/addons/mrp/views/mrp_workorder_views.xml b/addons/mrp/views/mrp_workorder_views.xml index 0888cb670f7..f451bfd13bd 100644 --- a/addons/mrp/views/mrp_workorder_views.xml +++ b/addons/mrp/views/mrp_workorder_views.xml @@ -158,7 +158,7 @@ - + diff --git a/addons/mrp/views/stock_picking_views.xml b/addons/mrp/views/stock_picking_views.xml index bf64a2579f6..fb34f770058 100644 --- a/addons/mrp/views/stock_picking_views.xml +++ b/addons/mrp/views/stock_picking_views.xml @@ -106,6 +106,11 @@ {"invisible": [("code", "=", "mrp_operation")]} + + + + + diff --git a/addons/mrp/wizard/mrp_product_produce_views.xml b/addons/mrp/wizard/mrp_product_produce_views.xml index 2c7954e1a6e..3864c6384a4 100644 --- a/addons/mrp/wizard/mrp_product_produce_views.xml +++ b/addons/mrp/wizard/mrp_product_produce_views.xml @@ -30,7 +30,7 @@ - + diff --git a/addons/stock/models/stock_production_lot.py b/addons/stock/models/stock_production_lot.py index b5636776ae3..43cbf15996c 100644 --- a/addons/stock/models/stock_production_lot.py +++ b/addons/stock/models/stock_production_lot.py @@ -28,13 +28,16 @@ class ProductionLot(models.Model): ('name_ref_uniq', 'unique (name, product_id)', 'The combination of serial number and product must be unique !'), ] - @api.model_create_multi - def create(self, vals_list): + def _check_create(self): active_picking_id = self.env.context.get('active_picking_id', False) if active_picking_id: picking_id = self.env['stock.picking'].browse(active_picking_id) if picking_id and not picking_id.picking_type_id.use_create_lots: raise UserError(_('You are not allowed to create a lot or serial number with this operation type. To change this, go on the operation type and tick the box "Create New Lots/Serial Numbers".')) + + @api.model_create_multi + def create(self, vals_list): + self._check_create() return super(ProductionLot, self).create(vals_list) @api.multi diff --git a/addons/stock/views/stock_picking_views.xml b/addons/stock/views/stock_picking_views.xml index 5b36be67aff..7c617e27dc7 100644 --- a/addons/stock/views/stock_picking_views.xml +++ b/addons/stock/views/stock_picking_views.xml @@ -55,7 +55,7 @@ - +