diff --git a/fusion_plating/fusion_plating_jobs/__manifest__.py b/fusion_plating/fusion_plating_jobs/__manifest__.py index 6f6bde76..67c79c84 100644 --- a/fusion_plating/fusion_plating_jobs/__manifest__.py +++ b/fusion_plating/fusion_plating_jobs/__manifest__.py @@ -3,7 +3,7 @@ # License OPL-1 (Odoo Proprietary License v1.0) { 'name': 'Fusion Plating — Native Jobs', - 'version': '19.0.2.0.0', + 'version': '19.0.2.1.0', 'category': 'Manufacturing/Plating', 'summary': 'Native plating job model — replaces mrp.production / mrp.workorder bridge.', 'description': """ diff --git a/fusion_plating/fusion_plating_jobs/models/fp_job.py b/fusion_plating/fusion_plating_jobs/models/fp_job.py index 11cf3f37..b94c4c03 100644 --- a/fusion_plating/fusion_plating_jobs/models/fp_job.py +++ b/fusion_plating/fusion_plating_jobs/models/fp_job.py @@ -267,6 +267,11 @@ class FpJob(models.Model): # ------------------------------------------------------------------ def action_confirm(self): result = super().action_confirm() + # During migration, lifecycle side-effects are skipped — the + # migration script directly rebinds existing portal/QC/inspection + # records via x_fc_job_id. See scripts/migrate_to_fp_jobs.py. + if self.env.context.get('fp_jobs_migration'): + return result for job in self: job._fp_create_portal_job() job._fp_create_qc_check_if_needed() @@ -383,6 +388,8 @@ class FpJob(models.Model): - Auto-creates a draft fusion.plating.delivery - Triggers certificate auto-generation (best-effort) """ + # During migration, side-effects are skipped — see action_confirm. + skip_side_effects = self.env.context.get('fp_jobs_migration') for job in self: if job.state == 'done': continue @@ -392,9 +399,10 @@ class FpJob(models.Model): ) job.state = 'done' job.date_finished = fields.Datetime.now() - job._fp_create_delivery() - job._fp_create_certificates() - job._fp_fire_notification('job_complete') + if not skip_side_effects: + job._fp_create_delivery() + job._fp_create_certificates() + job._fp_fire_notification('job_complete') return True # ------------------------------------------------------------------ diff --git a/fusion_plating/fusion_plating_jobs/scripts/migrate_to_fp_jobs.py b/fusion_plating/fusion_plating_jobs/scripts/migrate_to_fp_jobs.py index 5d4ef5c0..dc50b716 100644 --- a/fusion_plating/fusion_plating_jobs/scripts/migrate_to_fp_jobs.py +++ b/fusion_plating/fusion_plating_jobs/scripts/migrate_to_fp_jobs.py @@ -391,6 +391,12 @@ def run(env): return None print('=== Migration starting ===') + # The fp_jobs_migration context flag tells fp.job.action_confirm and + # fp.job.button_mark_done to skip lifecycle side-effects (creating + # portal jobs, QC checks, racking inspections, deliveries, certs, + # notifications). The migration script rebinds existing records via + # x_fc_job_id directly — so the side-effects would create duplicates. + env = env(context=dict(env.context, fp_jobs_migration=True)) MO = env['mrp.production'] all_mos = MO.search([]) print('Migrating %d MOs and their WOs...' % len(all_mos))