Adds 8-12 orders that originate from the direct order entry wizard (used by estimators for bulk entry without quotation flow) instead of plain sale.order create. Exercises the wizard's action_create_order() method which builds the SO with all the x_fc_* header fields, then we confirm to fire _fp_auto_create_job in one step. Each wizard creates 1-3 lines with realistic part/coating combos, treatments, surface area, deadlines, and the wo_group_tag flag (30% chance) to test multi-line job collapsing. Mixes po_pending (30%) and PO-doc orders, plus a spread of invoice strategies (deposit / progress / net_terms / cod_prepay). Orders distribute across confirmed / in_progress_mid / delivered / invoiced / paid states, reusing the state-advancement pattern from seed_workflow_states.py. Verified on entech: 10/11 orders created (one invoice failure on a SO with no invoiceable lines, handled gracefully via savepoint). 22 fp.job records generated across confirmed / in_progress / done. Part of: native job model migration (spec 2026-04-25) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Native job migration scripts
migrate_to_fp_jobs.py
Copies live mrp.production / mrp.workorder records into the native
fp.job / fp.job.step model. Idempotent — safe to run multiple times.
Usage
Run from the host (e.g. entech) using odoo shell:
ssh pve-worker5 "pct exec 111 -- bash -c 'su - odoo -s /bin/bash -c \"/usr/bin/odoo shell -c /etc/odoo/odoo.conf -d admin\" < /mnt/extra-addons/custom/fusion_plating_jobs/scripts/migrate_to_fp_jobs.py'"
Or interactively from odoo shell (Python exec builtin, not a shell call):
exec(open('/mnt/extra-addons/custom/fusion_plating_jobs/scripts/migrate_to_fp_jobs.py').read())
What it does
- For every
mrp.productionrecord, creates a parallelfp.jobwith the same name and fields. Skips MOs that already have a fp.job mirror (fp.job.legacy_mrp_production_id == mo.id). - For every
mrp.workorderrecord, creates a parallelfp.job.step. Skips already-migrated WOs. - Migrates
mrp.workorder.time_idstofp.job.step.timelog. - Rebinds cross-references on dependent models (batches, holds, certs, deliveries, portal jobs, racking inspections).
- Audit log written to
/tmp/fp_jobs_migration.logand to a chatter post on each migrated job.
Safety
- Idempotent. Re-running skips already-migrated records.
- Read-only on legacy MO/WO records. Original data untouched.
- Cross-reference rebinds add new x_fc_job_id / x_fc_step_id values without removing legacy production_id / workorder_id values. Both stay populated for the 2-week shadow period.
- Wrap in a transaction (default for
odoo shell); if anything fails, rollback.
Pre-migration audit
Run audit_pre_migration.py first to see what's about to happen. The
script uses Python's exec builtin to load the file inside the running
shell session — no shell exec involved.
Reports counts of MO/WO/dependent records and any data-quality concerns (MOs with no recipe, WOs with no work centre, etc).
Post-migration audit
Run audit_post_migration.py after to verify counts match.
Reports row counts on fp.job, fp.job.step, and confirms all dependent records have new x_fc_*_id values.