product_lot_sequence_per_pr.../models/mrp_production.py
2025-09-29 11:47:29 +07:00

49 lines
1.8 KiB
Python

from odoo import models, _
from odoo.exceptions import UserError
class MrpProduction(models.Model):
_inherit = 'mrp.production'
def _prepare_stock_lot_values(self):
self.ensure_one()
name = False
product = self.product_id
tmpl = product.product_tmpl_id
seq = getattr(tmpl, 'lot_sequence_id', False)
if seq:
tried = set()
# Try generating a unique candidate from the per-product sequence
for _i in range(10):
candidate = seq.next_by_id()
if not candidate:
break
if candidate in tried:
continue
tried.add(candidate)
exist_lot = self.env['stock.lot'].search([
('product_id', '=', product.id),
'|', ('company_id', '=', False), ('company_id', '=', self.company_id.id),
('name', '=', candidate),
], limit=1)
if not exist_lot:
name = candidate
break
# Fallback to default behavior if no per-product candidate was found
if not name:
name = self.env['ir.sequence'].next_by_code('stock.lot.serial')
exist_lot = (not name) or self.env['stock.lot'].search([
('product_id', '=', product.id),
'|', ('company_id', '=', False), ('company_id', '=', self.company_id.id),
('name', '=', name),
], limit=1)
if exist_lot:
name = self.env['stock.lot']._get_next_serial(self.company_id, product)
if not name:
raise UserError(_("Please set the first Serial Number or a default sequence"))
return {
'product_id': product.id,
'name': name,
}