Slink/sos_inventory/models/sos_serial_batch_tracker.py

43 lines
2.1 KiB
Python
Executable File

# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import ValidationError
class SOS_Serial_Batch_Tracker(models.Model):
_name = 'sos_serial_batch_tracker'
_description = 'Batch Number & Serial No Tracker'
name = fields.Char(string="Ref ID",default=lambda self: self._generate_id(),readonly= True, required= True)
customer_name = fields.Selection(selection="_get_unique_customers", string="Customer Name", required=True)
batch_no = fields.Char(string='Batch No')
serial_no = fields.Text(string='Serial No')
indent_no = fields.Many2one('sos_fg_plan', string='Indent Ref No')
serial_ids = fields.One2many("sos_serial_batch_tracker_line", "record_id", string="Serial Numbers") # Stored properly
@api.model
def _get_unique_customers(self):
"""Fetch unique customer names from sos_sales_order"""
customer_records = self.env['sos_sales_order'].search([]).mapped("customer_name")
unique_customers = sorted(set(filter(None, customer_records))) # Remove duplicates & empty values
return [(customer, customer) for customer in unique_customers] # Format for Selection field
@api.onchange("serial_no")
def action_serial_no(self):
"""Convert pasted serials into One2many entries"""
if self.serial_no:
serial_numbers = list(filter(None, map(str.strip, self.serial_no.split("\n")))) # Split by newline
existing_serials = self.serial_ids.mapped("serial_number")
# Remove duplicates before adding
new_serials = [num for num in serial_numbers if num not in existing_serials]
self.serial_ids = [(0, 0, {"serial_number": num}) for num in new_serials]
def _generate_id(self):
sequence_util = self.env['sos_common_scripts']
return sequence_util.generate_sequence('sos_serial_batch_tracker','B&S', 'name')
class SOS_Serial_Batch_Tracker_Line(models.Model):
_name = "sos_serial_batch_tracker_line"
record_id = fields.Many2one("sos_serial_batch_tracker", string="Parent Record", ondelete="cascade")
serial_number = fields.Char(string="Serial Number", required=True, index=True)