diff --git a/fusion_plating/fusion_plating_bridge_mrp/models/mrp_production.py b/fusion_plating/fusion_plating_bridge_mrp/models/mrp_production.py index faa19224..70d46016 100644 --- a/fusion_plating/fusion_plating_bridge_mrp/models/mrp_production.py +++ b/fusion_plating/fusion_plating_bridge_mrp/models/mrp_production.py @@ -1149,6 +1149,78 @@ class MrpProduction(models.Model): 'target': 'current', } + # ------------------------------------------------------------------ + # Sub 2 — Certificate requirement resolution (single source) + # ------------------------------------------------------------------ + def _fp_resolve_cert_requirement(self): + """Resolve which certs are required for this MO. + + Returns (want_coc: bool, want_thickness: bool). + + Logic: + 1. Collect every linked fp.part.catalog via the SO line walk. + 2. For each part: + - if certificate_requirement != 'inherit' -> part wins + - else -> fall back to partner's x_fc_send_coc / + x_fc_send_thickness_report flags + 3. Multi-line MO: strictest wins (any() across lines). + 4. MO with no SO link: partner fallback; safe default (True, False). + + This is the single entry point used by: + - _fp_generate_cert_pdf (MO-done cert cascade) + - QC gate when it audits thickness requirements + - Any future caller (Sub 6 will update this method when + partner-level flags move to per-location / per-contact). + """ + self.ensure_one() + SO = self.env['sale.order'] + + # Resolve partner via origin + partner = False + lines = self.env['sale.order.line'] + if self.origin: + so = SO.search([('name', '=', self.origin)], limit=1) + if so: + partner = so.partner_id + lines = so.order_line + + # No SO link — use partner-level fallback with safe defaults + if not lines: + if partner and 'x_fc_send_coc' in partner._fields: + return ( + bool(partner.x_fc_send_coc), + bool(partner.x_fc_send_thickness_report), + ) + # No partner at all — safe default: CoC yes, thickness no + return (True, False) + + want_coc_any = False + want_thickness_any = False + for line in lines: + part = line.x_fc_part_catalog_id + if part and part.certificate_requirement != 'inherit': + # Part-level override wins + want_coc_line = part.certificate_requirement in ( + 'coc', 'coc_thickness', + ) + want_thickness_line = ( + part.certificate_requirement == 'coc_thickness' + ) + else: + # Inherit (or no part) -> partner fallback + if partner and 'x_fc_send_coc' in partner._fields: + want_coc_line = bool(partner.x_fc_send_coc) + want_thickness_line = bool( + partner.x_fc_send_thickness_report + ) + else: + want_coc_line = True + want_thickness_line = False + want_coc_any = want_coc_any or want_coc_line + want_thickness_any = want_thickness_any or want_thickness_line + + return (want_coc_any, want_thickness_any) + # ------------------------------------------------------------------ # #5 — Delivery auto-prefill helpers # ------------------------------------------------------------------