From 9b53ab050d021c87fd216593c983df960a3b97f7 Mon Sep 17 00:00:00 2001 From: JF Aubert Date: Mon, 17 Aug 2020 11:22:02 +0000 Subject: [PATCH] [IMP] mrp,stock: allow to encode lots in a m2m on the move Allow to add serial numbers as tags on the move in production order and stock picking. The purpose is to earn time for database with only tracking installed. Also when only create_lots is checked on picking type. New lots could select existing lot and an onchange trigger a warning if it's used. closes odoo/odoo#55883 Task: 2280985 Signed-off-by: Arnold Moyaux --- addons/mrp/models/mrp_production.py | 17 +++++ addons/mrp/tests/test_order.py | 3 +- addons/mrp/views/mrp_production_views.xml | 15 +++++ addons/stock/models/stock_move.py | 62 +++++++++++++++++++ addons/stock/models/stock_move_line.py | 21 ++++++- addons/stock/tests/test_move2.py | 43 +++++++++++++ addons/stock/views/stock_picking_views.xml | 9 +++ .../tests/test_lifo_price.py | 1 + 8 files changed, 167 insertions(+), 4 deletions(-) diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py index 7f84efbf104..068e1d23a33 100644 --- a/addons/mrp/models/mrp_production.py +++ b/addons/mrp/models/mrp_production.py @@ -109,6 +109,7 @@ class MrpProduction(models.Model): 'stock.picking.type', 'Operation Type', domain="[('code', '=', 'mrp_operation'), ('company_id', '=', company_id)]", default=_get_default_picking_type, required=True, check_company=True) + use_create_components_lots = fields.Boolean(related='picking_type_id.use_create_components_lots') location_src_id = fields.Many2one( 'stock.location', 'Components Location', default=_get_default_location_src_id, @@ -668,6 +669,22 @@ class MrpProduction(models.Model): def _onchange_producing(self): self._set_qty_producing() + @api.onchange('lot_producing_id') + def _onchange_lot_producing(self): + if self.product_id.tracking == 'serial': + if self.env['stock.move.line'].search_count([ + ('company_id', '=', self.company_id.id), + ('product_id', '=', self.product_id.id), + ('lot_id', '=', self.lot_producing_id.id), + ('state', '!=', 'cancel') + ]): + return { + 'warning': { + 'title': _('Warning'), + 'message': _('Existing Serial number (%s). Please correct the serial numbers encoded.') % self.lot_producing_id.name + } + } + @api.onchange('bom_id') def _onchange_workorder_ids(self): if self.bom_id: diff --git a/addons/mrp/tests/test_order.py b/addons/mrp/tests/test_order.py index 3dfa1500625..a7e024f146e 100644 --- a/addons/mrp/tests/test_order.py +++ b/addons/mrp/tests/test_order.py @@ -976,7 +976,8 @@ class TestMrpOrder(TestMrpCommon): mo2.action_confirm() mo_form = Form(mo2) - mo_form.lot_producing_id = sn + with self.assertLogs(level="WARNING"): + mo_form.lot_producing_id = sn mo2 = mo_form.save() with self.assertRaises(UserError): mo2.button_mark_done() diff --git a/addons/mrp/views/mrp_production_views.xml b/addons/mrp/views/mrp_production_views.xml index c0a86603c16..400dafccf5d 100644 --- a/addons/mrp/views/mrp_production_views.xml +++ b/addons/mrp/views/mrp_production_views.xml @@ -143,6 +143,7 @@ + @@ -270,6 +271,13 @@ attrs="{'column_invisible': [('parent.state', '=', 'draft')], 'readonly': [('show_details_visible', '=', True)]}"/> +