diff --git a/addons/mrp/__manifest__.py b/addons/mrp/__manifest__.py
index 8291233478565..731e6ccf8aaf1 100644
--- a/addons/mrp/__manifest__.py
+++ b/addons/mrp/__manifest__.py
@@ -24,6 +24,7 @@
'wizard/mrp_consumption_warning_views.xml',
'wizard/mrp_batch_produce.xml',
'wizard/mrp_production_split.xml',
+ 'wizard/mrp_generate_serials_views.xml',
'views/mrp_views_menus.xml',
'views/stock_move_views.xml',
'views/mrp_workorder_views.xml',
diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py
index d49f6de62e9b0..43b9b921865c9 100644
--- a/addons/mrp/models/mrp_production.py
+++ b/addons/mrp/models/mrp_production.py
@@ -272,6 +272,20 @@ def _get_default_is_locked(self):
string='Date Category', store=False,
search='_search_date_category', readonly=True
)
+ lot_ids = fields.Many2many(
+ 'stock.lot',
+ 'mrp_production_lot_rel',
+ 'production_id',
+ 'lot_id',
+ string='Pre-generated Serials',
+ copy=False,
+ help="Serial/Lot numbers pre-generated for this MO. Used to prefill the Batch Produce wizard.",
+ )
+
+ lot_serial_count = fields.Integer(
+ string="Generated Serials",
+ compute="_compute_lot_serial_count",
+ )
_sql_constraints = [
('name_uniq', 'unique(name, company_id)', 'Reference must be unique per Company!'),
@@ -339,6 +353,11 @@ def _compute_locations(self):
fallback_loc = self.env['stock.warehouse'].search([('company_id', '=', company_id)], limit=1).lot_stock_id
production.location_src_id = production.picking_type_id.default_location_src_id.id or fallback_loc.id
production.location_dest_id = production.picking_type_id.default_location_dest_id.id or fallback_loc.id
+
+ @api.depends("lot_ids")
+ def _compute_lot_serial_count(self):
+ for mo in self:
+ mo.lot_serial_count = len(mo.lot_ids)
@api.model
def _search_components_availability_state(self, operator, value):
@@ -1142,6 +1161,24 @@ def action_update_bom(self):
if production.bom_id:
production._link_bom(production.bom_id)
self.is_outdated_bom = False
+
+ def action_view_pregenerated_serials(self):
+ self.ensure_one()
+ action = self.env["ir.actions.actions"]._for_xml_id("stock.action_production_lot_form")
+ action["domain"] = [("id", "in", self.lot_ids.ids)]
+ action["context"] = {}
+ return action
+
+ def action_open_generate_serials_wizard(self):
+ self.ensure_one()
+ return {
+ "type": "ir.actions.act_window",
+ "name": _("Generate Serials"),
+ "res_model": "mrp.generate.serials",
+ "view_mode": "form",
+ "target": "new",
+ "context": {"active_id": self.id},
+ }
def _get_bom_values(self, ratio=1):
""" Returns the BoM lines, by-products and operations values needed to
diff --git a/addons/mrp/security/ir.model.access.csv b/addons/mrp/security/ir.model.access.csv
index 7f38f01710a89..4a278615945b4 100644
--- a/addons/mrp/security/ir.model.access.csv
+++ b/addons/mrp/security/ir.model.access.csv
@@ -63,3 +63,4 @@ access_mrp_workcenter_capacity_manager,mrp.workcenter.capacity.manager,model_mrp
access_mrp_workcenter_capacity_group_user,mrp.workcenter.capacity,model_mrp_workcenter_capacity,mrp.group_mrp_user,1,0,0,0
access_mrp_batch_produce,access.mrp_batch_produce,model_mrp_batch_produce,mrp.group_mrp_user,1,1,1,0
access_stock_move_mrp_user,stock.move mrp_user,stock.model_stock_move,mrp.group_mrp_user,1,1,1,1
+access_mrp_generate_serials,access.mrp.generate.serials,model_mrp_generate_serials,mrp.group_mrp_user,1,1,1,0
diff --git a/addons/mrp/views/mrp_production_views.xml b/addons/mrp/views/mrp_production_views.xml
index 3c625160fbd72..bed8d670ff852 100644
--- a/addons/mrp/views/mrp_production_views.xml
+++ b/addons/mrp/views/mrp_production_views.xml
@@ -218,11 +218,31 @@