from odoo import models class StockPicking(models.Model): _inherit = 'stock.picking' def action_auto_generate_lots_subcontract(self): """ Auto-generate lot names for move lines in this picking that: 1. Have a product with tracking enabled (serial or lot). 2. Have an empty 'lot_name' and no 'lot_id'. 3. Have a product template with a configured 'lot_sequence_id'. """ for picking in self: # We iterate over move_line_ids (operations) # Filter for lines that need a lot generated lines_to_process = picking.move_line_ids.filtered( lambda ml: ( ml.product_id and ml.product_id.tracking in ('serial', 'lot') and not ml.lot_name and not ml.lot_id and getattr(ml.product_id.product_tmpl_id, 'lot_sequence_id', False) ) ) for line in lines_to_process: # Get the sequence from the product template seq = line.product_id.product_tmpl_id.lot_sequence_id if seq: # strict=True ensures we skip if next_by_id fails, though usually it returns None/False new_lot_name = seq.next_by_id() if new_lot_name: line.lot_name = new_lot_name return True