# -*- coding: utf-8 -*- # Copyright 2026 Nexa Systems Inc. # License OPL-1 (Odoo Proprietary License v1.0) # Part of the Fusion Plating product family. from odoo import api, fields, models class FpFair(models.Model): """First Article Inspection Report (FAIR). Captures the documented first-article inspection for a part at a specific revision. Used heavily in aerospace and automotive: every new part number, every revision change, every customer-mandated PPAP needs a FAIR on file. """ _name = 'fusion.plating.fair' _description = 'Fusion Plating — First Article Inspection Report' _inherit = ['mail.thread', 'mail.activity.mixin'] _order = 'performed_date desc, id desc' name = fields.Char( string='Reference', required=True, copy=False, readonly=True, default=lambda self: self._default_name(), tracking=True, ) part_number = fields.Char( string='Part Number', required=True, tracking=True, ) part_revision = fields.Char( string='Part Revision', tracking=True, ) customer_id = fields.Many2one( 'res.partner', string='Customer', tracking=True, ) process_type_ids = fields.Many2many( 'fusion.plating.process.type', 'fp_fair_process_rel', 'fair_id', 'process_type_id', string='Processes', ) performed_date = fields.Date( string='Inspection Date', default=lambda self: fields.Date.context_today(self), tracking=True, ) performed_by_id = fields.Many2one( 'res.users', string='Inspector', default=lambda self: self.env.user, tracking=True, ) result = fields.Selection( [ ('pass', 'Pass'), ('fail', 'Fail'), ('conditional', 'Conditional'), ], string='Result', default='pass', tracking=True, ) state = fields.Selection( [ ('draft', 'Draft'), ('in_review', 'In Review'), ('approved', 'Approved'), ('rejected', 'Rejected'), ], string='Status', default='draft', required=True, tracking=True, ) notes = fields.Html( string='Notes', ) company_id = fields.Many2one( 'res.company', string='Company', default=lambda self: self.env.company, ) active = fields.Boolean(default=True) @api.model def _default_name(self): seq = self.env['ir.sequence'].next_by_code('fusion.plating.fair') return seq or '/' @api.model_create_multi def create(self, vals_list): for vals in vals_list: if not vals.get('name') or vals.get('name') == '/': vals['name'] = self._default_name() return super().create(vals_list) def action_submit_for_review(self): self.write({'state': 'in_review'}) def action_approve(self): self.write({'state': 'approved'}) def action_reject(self): self.write({'state': 'rejected'}) def action_reset_to_draft(self): self.write({'state': 'draft'})