# -*- coding: utf-8 -*- # Copyright 2026 Nexa Systems Inc. # License OPL-1 (Odoo Proprietary License v1.0) """Cert-aware extension of fusion.plating.delivery. Hard-blocks action_mark_delivered when the linked job still has any draft certificate (CoC or Thickness Report). AS9100 / Nadcap compliance: parts can't ship without paperwork. Manager bypass: pass context key `fp_skip_cert_gate=True` (matches the existing bypass convention on fp.job.button_mark_done). """ from odoo import _, models from odoo.exceptions import UserError class FusionPlatingDelivery(models.Model): _inherit = 'fusion.plating.delivery' def action_mark_delivered(self): if not self.env.context.get('fp_skip_cert_gate'): Cert = self.env.get('fp.certificate') Job = self.env.get('fp.job') if Cert is not None and Job is not None: for delivery in self: if not delivery.job_ref: continue job = Job.search( [('name', '=', delivery.job_ref)], limit=1, ) if not job: continue dom = [('state', '=', 'draft')] if 'x_fc_job_id' in Cert._fields: dom.append(('x_fc_job_id', '=', job.id)) elif (job.sale_order_id and 'sale_order_id' in Cert._fields): dom.append(( 'sale_order_id', '=', job.sale_order_id.id, )) else: continue draft_certs = Cert.search(dom) if draft_certs: raise UserError(_( 'Cannot mark delivery %(d)s shipped — job ' '%(j)s still has %(n)d draft ' 'certificate(s) (%(types)s). Issue them ' 'first, or pass fp_skip_cert_gate=True ' 'context key to bypass.' ) % { 'd': delivery.name or delivery.id, 'j': job.name, 'n': len(draft_certs), 'types': ', '.join(sorted(set( draft_certs.mapped('certificate_type') ))), }) return super().action_mark_delivered()