diff --git a/models/__init__.py b/models/__init__.py index 23e3486..ede103c 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -2,4 +2,5 @@ from . import product_template from . import stock_move from . import stock_lot from . import stock_move_line -from . import mrp_production \ No newline at end of file +from . import mrp_production +from . import stock_picking \ No newline at end of file diff --git a/models/stock_picking.py b/models/stock_picking.py new file mode 100644 index 0000000..7a8f31b --- /dev/null +++ b/models/stock_picking.py @@ -0,0 +1,34 @@ +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