from odoo import models, fields, api from odoo.exceptions import ValidationError from datetime import datetime from odoo.exceptions import UserError class SOS_CCRF(models.Model): _name = 'sos_ccrf' _description = 'Customer Complaint Registration Form' _rec_name = 'ccrf_no' ccrf_no = fields.Char(string="CCRF No", readonly= True, required= True, default=lambda self: self._generate_id()) complaint_received_on = fields.Date(string="Complaint Received On") complaint_received_mode = fields.Selection([ ('email', 'Email'),('telephone', 'Telephone'),('oral', 'Oral')], default='email' , string="Complaint Received Mode") customer_name = fields.Many2one('sos_inventory_customers', string="Customer Name") customer_address = fields.Text(string="Address") customer_phone_number = fields.Char(string="Contact No") customer_email = fields.Char(string="Email Id") fg_name = fields.Selection( [ ('BHMS 1.2V', 'BHMS 1.2V'), ('BHMS 2V', 'BHMS 2V'), ('BHMS 12V', 'BHMS 12V'), ('BHMS 48V', 'BHMS 48V'), ('BMS-HV', 'BMS-HV'), ('BMS-LV 100A', 'BMS-LV 100A'), ('BMS-LV 40A', 'BMS-LV 40A'), ('SBMS 55A', 'SBMS 55A'), ('MC 250W', 'MC 250W'), ('HeartTarang', 'HeartTarang') ], string="Product Type" ) sub_fg_name = fields.Many2one('sos_fg', string="Product Name") batch_no = fields.Char(string="Batch No") complaint_details = fields.Text(string="Nature Of Complaint") incident_place = fields.Char(string="Place of Incident") incident_date = fields.Date(string="Date of Incident") invoice_no = fields.Char(string="Invoice No") quantity_dispatched = fields.Integer(string="Quantity Dispatched") batch_release_date = fields.Date(string="Invoice Date") brcoa_no = fields.Char(string="BRCOA No") brcoa_date = fields.Date(string="BRCOA Date") other_complaints = fields.Text(string="Defective Details/Symptom") data_collected_by = fields.Many2one('res.users', string='Data Collected By') data_collected_image = fields.Image(related="data_collected_by.signature_image",string='Data Collected Sign',readonly=True) data_collected_on = fields.Datetime(string="Data Collected On") interin_containment_actions = fields.Html(string="Interim Containment Action") device_failed_to_meet_specification = fields.Selection([ ('yes', 'YES'),('no', 'No')], default='no' , string="Device Failed To Meet Specification") labelling_error = fields.Selection([ ('yes', 'YES'),('no', 'No')], default='no' , string="Labelling Error") ifu = fields.Selection([ ('yes', 'YES'),('no', 'No')], default='no' , string="Error in Instruction For Use(IFU)") packaging_details = fields.Selection([ ('yes', 'YES'),('no', 'No')], default='no' , string="Packaging Error") processing = fields.Selection([ ('yes', 'YES'),('no', 'No')], default='no' , string="Processing") raw_materials = fields.Selection([ ('yes', 'YES'),('no', 'No')], default='no' , string="Raw Materials / Components") investigation_carriedout_by = fields.Many2one('res.users', string='Investigation Carried Out By') investigation_carriedout_image = fields.Image(related="investigation_carriedout_by.signature_image",string='Investigation Carried Out Sign',readonly=True) investigation_carriedout_on = fields.Datetime(string="Investigation Carried Out On") root_cause = fields.Html(string="Root Cause", default="
Why #1 :
Why #2 :
Why #3 :
Why #4 :
Why #5 :
") #team_formation = fields.Html(string="Team Formation", #default="Name :
Department :
Roles :
") #problem_description = fields.Html(string="Problem Description", #default="Clear Statement :
Photo :
What :
Where :
When :
Why :
Who :
How :
How many :
") rootcause_carriedout_by = fields.Many2one('res.users', string='Root Cause Carried Out By') rootcause_carriedout_image = fields.Image(related="rootcause_carriedout_by.signature_image",string='Root Cause Carried Out Sign',readonly=True) rootcause_carriedout_on = fields.Datetime(string="Root Cause Carried Out On") corrective_action = fields.Html(string="D5:Permanent Corrective Action") implement_validate_corrective_action = fields.Html(string="D6:Implement & Validate Corrective Actions") preventive_action = fields.Html(string="D7:Preventive Recurrence") capa_status = fields.Selection([ ('open', 'OPEN'),('close', 'Close')], default='open' , string="Status") status_reviewed_by = fields.Many2one('res.users', string='Status Reviewed By') status_reviewed_image = fields.Image(related="status_reviewed_by.signature_image",string='Status Reviewed Out Sign',readonly=True) status_reviewed_on = fields.Datetime(string="Status Reviewed On") response_sent_date = fields.Date(string="Response Sent to Customer On") customer_feedback_on_response = fields.Text(string="Customer Feedback") qa_comments=fields.Text(string="QA Comments") qa_by = fields.Many2one('res.users',string='QC In-Charge',readonly=True) qa_sign = fields.Image(related="qa_by.signature_image",string='QC In-Charge',readonly=True) qa_closed_on = fields.Datetime(string="Approved On") rootcause_verifiedout_by = fields.Many2one('res.users', string='Root Cause Verified By') rootcause_verifiedout_image = fields.Image(related="rootcause_verifiedout_by.signature_image",string='Root Cause Verified By Sign',readonly=True) rootcause_verifiedout_on = fields.Datetime(string="Root Cause Verified On") helper_field = fields.Many2many('sos_fg', string="Helper Field") team_recognition = fields.Html(string="Team Recognition (Image)") capa_line_ids = fields.One2many('sos_ccrf_capa_line', 'ccrf_id', string="CAPA Line Ids",copy=True) team_formation_line_ids = fields.One2many('sos_ccrf_team_formation_line', 'ccrf_id', string="Team Formation Line Ids",copy=True) problem_description_line_ids = fields.One2many('sos_ccrf_problem_description_line', 'ccrf_id', string="Problem Description Line Ids",copy=True) @api.onchange('fg_name') def _onchange_fg_name(self): if self.fg_name: if " " in self.fg_name: second_half = self.fg_name.split(" ")[1] else: second_half = self.fg_name self.helper_field = self.env['sos_fg'].search([('sub_type', '=', second_half)]) def action_report_ccrf_btn(self): try: action = self.env.ref("sos_inventory.action_report_ccrf").report_action(self) return action except ValueError as e: print(f"Failed to find report action: {e}") def _generate_id(self): sequence_util = self.env['sos_common_scripts'] return sequence_util.generate_sequence('sos_ccrf','CCRF', 'ccrf_no') def action_data_esign_btn(self): sequence_util = self.env['sos_common_scripts'] sequence_util.action_assign_signature( self, 'data_collected_by', 'data_collected_on' ) def action_rootcause_esign_btn(self): sequence_util = self.env['sos_common_scripts'] sequence_util.action_assign_signature( self, 'rootcause_carriedout_by', 'rootcause_carriedout_on' ) def action_investigation_esign_btn(self): sequence_util = self.env['sos_common_scripts'] sequence_util.action_assign_signature( self, 'investigation_carriedout_by', 'investigation_carriedout_on' ) def action_capa_esign_btn(self): sequence_util = self.env['sos_common_scripts'] sequence_util.action_assign_signature( self, 'status_reviewed_by', 'status_reviewed_on' ) def action_qa_esign_btn(self): sequence_util = self.env['sos_common_scripts'] sequence_util.action_assign_signature( self, 'qa_by', 'qa_closed_on' ) def action_rootcause_verify_btn(self): sequence_util = self.env['sos_common_scripts'] sequence_util.action_assign_signature( self, 'rootcause_verifiedout_by', 'rootcause_verifiedout_on' ) class CCRF_Model_CAPA_Line(models.Model): _name = 'sos_ccrf_capa_line' _description = 'CAPA Lines' ccrf_id = fields.Many2one('sos_ccrf', string="CCRF Reference", ondelete="cascade") issue = fields.Char(string="Issue") corrective_action = fields.Html(string="D5:Permanent Corrective Action") implement_validate_corrective_action = fields.Html(string="D6:Implement & Validate Corrective Actions") preventive_action = fields.Html(string="D7:Preventive Recurrence") class CCRF_Model_TEAM_FORMATION_Line(models.Model): _name = 'sos_ccrf_team_formation_line' _description = 'Team Formation Lines' ccrf_id = fields.Many2one('sos_ccrf', string="CCRF Reference", ondelete="cascade") name = fields.Char(string="Name") department = fields.Char(string="Department") role = fields.Char(string="Role") class CCRF_Model_PROBLEM_DESCRIPTION_Line(models.Model): _name = 'sos_ccrf_problem_description_line' _description = 'Problem Description Lines' ccrf_id = fields.Many2one('sos_ccrf', string="CCRF Reference", ondelete="cascade") clear_statement = fields.Text(string="Clear Statement") photos = fields.Html(string="Photos") what = fields.Text(string="What") where = fields.Text(string="Where") when = fields.Text(string="When") why = fields.Text(string="Why") who = fields.Text(string="Who") how = fields.Text(string="How") how_many = fields.Text(string="How many")