Per-part contract review record (fp.contract.review) gated by a customer-level toggle, signed in two sections (QA Assistant → QA Manager), settings-based signer rosters (no new res.groups), banner on the part form that auto-dismisses once the first MO for the part hits confirmed. QA-005 Rev. 0 paper form reproduced 1:1 in a QWeb PDF. Never blocks MO/SO/WO — review is purely an audit artefact. Smoke test run on entech: 12 assertions pass including the 25-cell risk matrix parity with the paper form and 22 KB PDF render. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
32 KiB
Fusion Plating — Claude Code Instructions
Project
Fusion Plating is a multi-module Odoo 19 ERP for electroless nickel plating and metal finishing shops. Built by Nexa Systems for EN Technologies (the client). Replaces Steelhead Software.
Module Structure (30 modules)
fusion_plating/ — Core: facilities, process types, tanks, baths, chemistry, recipes
fusion_plating_batch/ — Rack/barrel batch tracking (FpBatch, FpBatchChemistry)
fusion_plating_kpi/ — KPI definitions, daily auto-compute, dashboard views
fusion_plating_configurator/ — Quotation configurator, pricing engine, part catalog, 3D viewer
fusion_plating_receiving/ — Parts receiving, inspection, damage logging
fusion_plating_invoicing/ — Invoice strategies (deposit/progress/net/COD), account holds
fusion_plating_certificates/ — Certificate registry (CoC, thickness reports), Fischerscope data
fusion_plating_notifications/ — Auto-email engine, notification templates, audit log
fusion_plating_shopfloor/ — Tablet UI, plant overview kanban, process tree visualization
fusion_plating_portal/ — Customer portal + self-service configurator wizard
fusion_plating_reports/ — PDF reports (WO margin, discharge sample, CoC, etc.)
fusion_plating_compliance/ — Compliance framework, jurisdictions
fusion_plating_compliance_on/ — Ontario compliance reference data (data-only, no menus)
fusion_plating_compliance_tor/ — Toronto bylaw discharge limits (data-only, no menus)
fusion_plating_aerospace/ — AS9100 / Nadcap
fusion_plating_nuclear/ — CSA N299 / CNSC
fusion_plating_cgp/ — Controlled Goods Program
fusion_plating_safety/ — SDS, WHMIS, JHSC
fusion_plating_quality/ — QMS (NCR, CAPA, calibration)
fusion_plating_logistics/ — Pickup & delivery, chain of custody
fusion_plating_culture/ — Values / fundamentals (⚠️ RETIRED — do NOT auto-install)
fusion_plating_bridge_mrp/ — MRP integration (recipe→WO, portal job, work order priorities)
fusion_plating_bridge_sign/ — Digital signatures
fusion_plating_bridge_quality/ — Quality bridge
fusion_plating_bridge_documents/ — Odoo Documents integration (NCR, CAPA, FAIR, Doc Control)
fusion_plating_process_en/ — Electroless nickel process pack
fusion_plating_process_chrome/ — Chrome process pack
fusion_plating_process_anodize/ — Anodizing process pack
fusion_plating_process_black_oxide/ — Black oxide process pack
fusion_tasks/ — Local delivery dispatch (GPS, maps, driver scheduling)
Menu Structure (Plating App)
The Plating app (menu_fp_root, seq 46) has these top-level menus:
| Seq | Menu | Module | Children |
|---|---|---|---|
| 3 | KPIs | fusion_plating_kpi | KPIs, KPI History, Production/Quality/Finance dashboards |
| 5 | Sales | fusion_plating_configurator + portal | Quotations, Sale Orders, Customers, Part Catalog, Quote Requests, Portal Jobs |
| 8 | Configurator | fusion_plating_configurator | New Quote, Coating Configs, Pricing Rules, Treatments |
| 12 | Shop Floor | fusion_plating_shopfloor | Plant Overview, Tablet Station, Bake Windows, First-Piece Gates |
| 15 | Receiving | fusion_plating_receiving | All Receiving, Pending Inspection, Discrepancies |
| 18 | Operations | fusion_plating (core) | Process Recipes, Production Priorities (bridge_mrp), Batches (batch), Baths, Chemistry Logs, Tanks |
| 25 | Certificates | fusion_plating_certificates | All, CoC, Thickness Reports |
| 30 | Quality | fusion_plating_quality | Holds, NCRs, CAPAs, FAIR, Audits, Doc Control |
| 40 | Compliance | fusion_plating_compliance | Permits, Discharge, Waste, Calendar, Spills, Config |
| 45 | Safety | fusion_plating_safety | SDS, Training, Exposure, JHSC, Incidents, PPE |
| 50 | Logistics | fusion_plating_logistics + fusion_tasks | Pickups, Deliveries, Routes, CoC, POD, Field Tasks, Task Map, Task Calendar |
| 60 | Aerospace | fusion_plating_aerospace | AS9100, Nadcap, Counterfeit, Config Items, Risk |
| 65 | Nuclear | fusion_plating_nuclear | Program, ITP, 10CFR21, Pedigree, CNSC |
| 70 | CGP | fusion_plating_cgp | Registration, AI, PSA, Visitors, Goods, Shipments, Security, Access Log |
| 90 | Configuration | fusion_plating (core) + many | Facilities, Work Centres, Process Categories/Types, Bath Params, Stations, Ovens, Invoice Strategy, Account Holds, Training Types, Chemicals, Notification Templates/Log, Calibration, Specs, AVL, Value Sets/Rotations, N299 Levels, Vehicles |
Field Service (fusion_tasks) also has its own standalone root app (seq 45) with Map View, Tasks, Calendar, Configuration. The same task actions are also accessible under Plating > Logistics.
Key rule: Sales menu is unified in fusion_plating_configurator. Portal module adds Quote Requests + Portal Jobs as children (referencing fusion_plating_configurator.menu_fp_sales). Do NOT create a separate Sales menu in portal.
Retired / Do-Not-Install Modules
These modules have source code in this repo but are intentionally NOT installed on entech (the client's live Odoo). Do not:
- Include them in any
-ior-usequence that installs modules automatically. - Add them as a
dependstarget from any other Fusion Plating module. - Re-sync their folders to
/mnt/extra-addons/custom/on entech. - Recommend installing them to the user without explicit confirmation.
| Module | State on entech | Retired because | What to do if revisiting |
|---|---|---|---|
fusion_plating_culture |
state=uninstalled, dir removed from entech disk |
Soft people-ops feature (peer kudos / "Fundamental of the Week"); zero data entered; not a client priority. Top-level "Culture" menu confused operators. | Ask the client whether they want it before reinstalling. If yes: re-sync folder + -i fusion_plating_culture + seed a value set. |
fusion_plating_sensors |
deleted entirely (not in repo anymore) | Duplicated fusion_plating_iot's scope but with no working alerting logic. Its valuables (sensor_type taxonomy, dashboard, location flexibility) were ported into fusion_iot/fusion_plating_iot/. |
N/A — gone. Any new sensor work goes in fusion_iot/fusion_plating_iot/. |
Critical Rules — Odoo 19
- NEVER code from memory — Read reference files from the server first.
- Backend OWL:
static template,static props = ["*"], standalonerpc()from@web/core/network/rpc. NOTuseService("rpc"). - HTTP routes:
type="jsonrpc"— NOTtype="json"(deprecated in Odoo 19). - Search views: NO
group expand="0", NOstringattribute on<search>, NO<group string="...">wrapper for group-by filters. Use bare<group>for group-by. - res.config.settings: Only boolean/integer/float/char/selection/many2one/datetime. NO Date fields.
- res.groups: Use
privilege_id(NOTcategory_id).user_idsis OK but the deprecatedusersalias is NOT. Always includesequencefield. - Field params:
parent_pathdoes NOT acceptunaccentparameter in Odoo 19. - SCSS borders: Use
$border-color(SCSS variable) for card borders, NOTcolor-mix()in border shorthand — the SCSS compiler drops it.color-mix()works fine inbackground-color,box-shadow, etc. - Theme awareness: All colours must use CSS custom properties (
var(--bs-body-bg),var(--bs-body-color),var(--bs-border-color),var(--bs-secondary-color),var(--o-action)). NO hardcoded hex. Seefusion_plating_shopfloor.scssas the gold standard. - XML comments: No double-hyphens (
--) inside<!-- -->comments — invalid XML, causes lxml parse error. - XML data ordering: Window actions must be defined BEFORE
<menuitem>elements that reference them in the same file. - Module install on new modules: Use
--update=basealongside-i MODULEto ensure Odoo rescans the addons path and finds the new module directory. - Implied group cascade:
implied_idsonres.groupsdoes NOT reliably propagate to users on module install. Always includeuser_idsto explicitly assign admin, or fix via SQL post-install.
Naming
- New custom models (post-2026-04):
fp.*prefix (e.g.fp.part.catalog,fp.certificate) - Existing custom models: Keep
fusion.plating.*(e.g.fusion.plating.portal.job,fusion.plating.delivery) - New fields on standard Odoo models:
x_fc_*prefix - Legacy fields:
x_studio_* - Canadian English for all user-facing text
- SCSS class prefix:
o_fp_*(shopfloor:o_fp_po_*,o_fp_pt_*; recipes:o_fp_recipe_*) - Monetary fields: always pair with
currency_idfield on the same model
Process Recipe System (NEW — v19.0.2.x)
Model: fusion.plating.process.node (in fusion_plating core)
- Hierarchical tree with
_parent_store = True - Node types:
recipe,sub_process,operation,step - Companion model:
fusion.plating.process.node.input(operator inputs) iconis a Selection field (24 curated plating icons), NOT a Char- Auto-icon: JS
guessIcon(name)maps keywords → icons when adding nodes - OWL tree editor: registered as
fp_recipe_tree_editorclient action - Controller:
fusion_plating/controllers/recipe_controller.py(7 endpoints) - SCSS:
fusion_plating/static/src/scss/recipe_tree_editor.scss
Recipe Endpoints
POST /fp/recipe/tree — full nested tree for OWL editor
POST /fp/recipe/node/create — add child node
POST /fp/recipe/node/write — update fields
POST /fp/recipe/node/unlink — delete + cascade
POST /fp/recipe/node/reorder — bulk sequence update
POST /fp/recipe/node/move — change parent_id
POST /fp/recipe/duplicate — deep-copy recipe
Steelhead Features Status
| Feature | Status |
|---|---|
| Hierarchical process tree | Done |
| Node types (recipe/sub/op/step) | Done |
| Auto-complete flag | Done |
| Customer visible flag | Done |
| Manual/automated flag | Done |
| Requires sign-off | Done |
| Opt In/Out (disabled/opt-in/opt-out) | Done |
| Icon picker | Done |
| Time tracking (created/updated with seconds) | Done |
| Operator inputs | Done |
| Description (rich text) | Done |
| File attachments (via mail.thread) | Done |
| OWL tree editor with drag-drop | Done |
| Tags | Not yet |
| Dashboard Transitions | Not yet |
| Treatment Groups / Choices | Not yet |
| Go To Node Options | Not yet |
| Spec Fields | Not yet |
Client Recipes Created
ENP-ALUM-BASIC— Electroless Nickel Plating Aluminium Basic (9 operations, 15 steps). Data file:fusion_plating/data/fp_recipe_enp_alum_basic.xml
Plant Overview Dashboard
- OWL client action:
fp_plant_overviewinfusion_plating_shopfloor - Kanban columns = work centres, cards = active
mrp.workorderrecords - Drag & drop between columns (writes
workcenter_idon the work order) - Endpoint:
POST /fp/shopfloor/plant_overview - Move endpoint:
POST /fp/shopfloor/plant_overview/move_card - Auto-refreshes every 30s
Deployment
odoo-entech (LXC 111 on pve-worker5)
- Type: Native Odoo (apt package, NOT Docker)
- IP: 10.200.1.26
- DB:
admin(PostgreSQL local, userodoo) - Config:
/etc/odoo/odoo.conf - Addons:
/mnt/extra-addons/custom/(fusion_plating modules live here) - Service:
systemctl {start|stop|restart} odoo - Update command:
ssh pve-worker5 "pct exec 111 -- bash -c 'systemctl stop odoo && su - odoo -s /bin/bash -c \"/usr/bin/odoo -c /etc/odoo/odoo.conf -d admin -u MODULE_NAME --stop-after-init\" && systemctl start odoo'" - Copy files:
cat LOCAL_FILE | ssh pve-worker5 "pct exec 111 -- bash -c 'cat > /mnt/extra-addons/custom/REMOTE_PATH'" - IMPORTANT: Must pass
-c /etc/odoo/odoo.confor Odoo won't find the repackaged enterprise addons
odoo-trial (VM 316 on pve-worker1)
- Type: Docker (container
odoo-trial-app, dbodoo-trial-db) - DB:
trial(userodoo) - Host addons path:
/opt/odoo/custom-addons/→ mounts as/mnt/extra-addons/in Docker - Docker network:
odoo_odoo-network - Copy files (base64 pipe through qm guest exec):
B64=$(base64 -w0 "LOCAL_FILE") ssh pve-worker1 "qm guest exec 316 -- bash -c 'echo $B64 | base64 -d > /opt/odoo/custom-addons/REMOTE_PATH'" - Clear asset cache (required after SCSS/JS changes):
ssh pve-worker1 "qm guest exec 316 -- bash -c \"docker exec odoo-trial-db psql -U odoo -d trial -c \\\"DELETE FROM ir_attachment WHERE url LIKE '%/web/assets/%';\\\"\"" - Update command:
ssh pve-worker1 "qm guest exec 316 -- bash -c 'docker stop odoo-trial-app && docker run --rm --network odoo_odoo-network -v odoo_odoo-data:/var/lib/odoo -v /opt/odoo/custom-addons:/mnt/extra-addons -v /opt/odoo/enterprise-addons:/mnt/enterprise-addons -v /opt/odoo/odoo.conf:/etc/odoo/odoo.conf odoo:19 odoo -d trial -u MODULE_NAME --stop-after-init && docker start odoo-trial-app'"
Git Push
cd K:/Github/Odoo-Modules/fusion-plating && git push origin main
Pushes to both GitHub and Gitea (nexasystems.ca) via multiple remotes.
Supabase Knowledge Base
Project: nexasystems (id: ikvdlqkbqsitabxidvnq)
fusionapps.decisions— past architecture decisionsfusionapps.issues— known issues and fixesfusionapps.code_snippets— reference codefusionapps.quick_commands— deployment and admin commandsfusionapps.vm_registry— VM inventoryfusionapps.proxmox_nodes— cluster node specs
End-to-End Business Workflow
Full Lifecycle (What Exists Today)
┌─ QUOTATION ──────────────────────────────────────────────────────┐
│ 1. Customer submits RFQ on portal [DONE] │
│ → FpQuoteRequest (state: new → under_review → quoted) │
│ → Model: fusion_plating_portal/models/fp_quote_request.py │
│ │
│ 2. Customer accepts → "Create Sale Order" button [DONE] │
│ → action_create_sale_order() creates SO with lines │
│ → Links SO origin back to RFQ ref │
│ │
│ 3. SO confirmed → MRP creates Manufacturing Order [DONE] │
│ → Standard Odoo sale_mrp flow │
└──────────────────────────────────────────────────────────────────┘
┌─ MANUFACTURING ──────────────────────────────────────────────────┐
│ 4. MO confirmed → Portal Job auto-created [DONE] │
│ → MrpProduction.action_confirm() override │
│ → Creates FpPortalJob (state: in_progress) │
│ → Links via x_fc_portal_job_id │
│ │
│ 5. Planner assigns recipe + configures steps [DONE] │
│ → x_fc_recipe_id set on MO │
│ → Opens fp.recipe.config.wizard for opt-in/out │
│ → Creates fusion.plating.job.node.override records │
│ │
│ 6. Work orders generated from recipe [DONE] │
│ → _generate_workorders_from_recipe() in bridge_mrp │
│ → One WO per operation node, steps become WO instructions │
│ → Respects opt-in/out overrides from job.node.override │
│ │
│ 7. Operators execute WOs on shopfloor [DONE] │
│ → Plant Overview kanban (drag between work centres) │
│ → Batch chemistry tracking (FpBatch + FpBatchChemistry) │
│ → Quality holds (FpQualityHold → FpNcr → FpCapa) │
│ │
│ 8. MO marked done → Portal job ready_to_ship [DONE] │
│ → MrpProduction.button_mark_done() override │
│ → Auto-creates FpDelivery (draft) │
└──────────────────────────────────────────────────────────────────┘
┌─ SHIPPING & INVOICING ───────────────────────────────────────────┐
│ 9. CoC report generated [DONE] │
│ → report_coc.xml (PDF with job info, certification, sig) │
│ → Attached to delivery + portal job │
│ │
│ 10. Delivery scheduled & executed [DONE] │
│ → FpDelivery: draft → scheduled → en_route → delivered │
│ → Chain of custody auto-logged (FpChainOfCustody) │
│ → Proof of delivery captured (FpProofOfDelivery) │
│ → Routes with stops (FpRoute + FpRouteStop) │
│ │
│ 11. Delivery marked → Portal job shipped [DONE] │
│ → FpDelivery.action_mark_delivered() override │
│ → Sets actual_ship_date + tracking_ref on portal job │
│ │
│ 12. Account hold check before invoicing [DONE] │
│ → x_fc_account_hold on res.partner (fusion_plating_invoicing)│
│ → Blocks SO confirm, invoice post, shipping for non-managers │
│ │
│ 13. Invoice posted → Portal job complete [DONE] │
│ → AccountMove.action_post() override │
│ → Sets invoice_ref on portal job, state → complete │
│ │
│ 14. Auto-email with CoC + Invoice + Tracking [DONE] │
│ → fusion_plating_notifications module │
│ → fp.notification.template (configurable per trigger event) │
│ → fp.notification.log (audit trail) │
└──────────────────────────────────────────────────────────────────┘
┌─ CUSTOMER PORTAL ────────────────────────────────────────────────┐
│ 15. Customer sees on portal [DONE] │
│ → Job progress bar (received → complete) │
│ → CoC download, invoice access, tracking ref │
│ → Quote request history │
└──────────────────────────────────────────────────────────────────┘
Per-Job Recipe Overrides (v19.0.2.0.0 bridge_mrp)
x_fc_recipe_idonmrp.production→ links MO to recipefusion.plating.job.node.override→ per-job opt-in/out decisionsfp.recipe.config.wizard→ checklist wizard for planner- "Overrides" stat button on MO form
- Located in
fusion_plating_bridge_mrp
All Gaps Resolved (2026-04-12/13)
| Gap | Resolution | Module |
|---|---|---|
| Recipe → Work Orders | _generate_workorders_from_recipe() — one WO per operation, steps become instructions |
fusion_plating_bridge_mrp v2.1.0 |
| Account Hold Check | x_fc_account_hold on res.partner, blocks SO/invoice/shipping for non-managers |
fusion_plating_invoicing |
| Auto-Email Package | fp.notification.template + fp.notification.log with hooks on SO confirm, receiving, invoice |
fusion_plating_notifications |
| Quotation Configurator | Part catalog, coating configs, pricing engine, 3D STL viewer, portal wizard | fusion_plating_configurator |
| Parts Receiving | Receiving records, inspection, damage logging, SO auto-create, MRP soft gate | fusion_plating_receiving |
| Certificate Registry | Unified fp.certificate with thickness readings, CoC/thickness/Nadcap types | fusion_plating_certificates |
| Local Delivery | Forked fusion_tasks with GPS/maps, stripped of claims/sync, delivery-specific fields | fusion_tasks |
Architectural Decisions Made
- Recipe → WO: One WO per
operationnode, childstepnodes become numbered instructions in WO description - Account hold: Manual flag on
res.partner(auto from aging is roadmap) - Email triggers: SO confirmed, parts received, invoice posted (configurable per trigger)
- Configurator: Custom build with formula-based pricing, estimator override, portal self-service wizard
- Model naming: New models use
fp.*prefix, existing keepfusion.plating.* - Security groups: Role-based (Estimator, Receiving, Accounting, Shop Manager) layered on existing privilege hierarchy (Operator→Supervisor→Manager→Admin)
Key Models Quick Reference
| Model | Module | Purpose |
|---|---|---|
fusion.plating.process.node |
fusion_plating |
Recipe tree (template) |
fusion.plating.process.node.input |
fusion_plating |
Operator input definitions |
fusion.plating.job.node.override |
fusion_plating_bridge_mrp |
Per-job opt-in/out |
fp.part.catalog |
fusion_plating_configurator |
Customer part library (geometry, material) |
fp.coating.config |
fusion_plating_configurator |
Coating configuration templates |
fp.treatment |
fusion_plating_configurator |
Pre/post treatment steps |
fp.pricing.rule |
fusion_plating_configurator |
Formula-based pricing engine |
fp.pricing.complexity.surcharge |
fusion_plating_configurator |
Complexity surcharge lines |
fp.quote.configurator |
fusion_plating_configurator |
Configurator session + price calc |
fp.receiving |
fusion_plating_receiving |
Parts receiving record |
fp.receiving.line |
fusion_plating_receiving |
Per-part receiving detail |
fp.receiving.damage |
fusion_plating_receiving |
Damage log entry |
fp.invoice.strategy.default |
fusion_plating_invoicing |
Customer-level invoice strategy |
fp.certificate |
fusion_plating_certificates |
Certificate registry (CoC, thickness, etc.) |
fp.thickness.reading |
fusion_plating_certificates |
Fischerscope measurement data |
fp.notification.template |
fusion_plating_notifications |
Configurable email notification |
fp.notification.log |
fusion_plating_notifications |
Email audit trail |
fusion.plating.quote.request |
fusion_plating_portal |
Customer RFQ |
fusion.plating.portal.job |
fusion_plating_portal |
Portal-facing job tracker |
fusion.plating.customer.spec |
fusion_plating_quality |
Spec library |
fusion.plating.quality.hold |
fusion_plating_quality |
Parts on hold |
fusion.plating.ncr |
fusion_plating_quality |
Non-conformance reports |
fusion.plating.capa |
fusion_plating_quality |
Corrective actions |
fusion.plating.batch |
fusion_plating_batch |
Rack/barrel batch tracking |
fusion.plating.kpi |
fusion_plating_kpi |
KPI definition (OTD, yield, throughput, etc.) |
fusion.plating.kpi.value |
fusion_plating_kpi |
KPI daily value (auto-computed or manual) |
fusion.plating.delivery |
fusion_plating_logistics |
Delivery with chain of custody |
fusion.plating.pickup.request |
fusion_plating_logistics |
Customer pickup requests |
fusion.plating.route |
fusion_plating_logistics |
Driver routes with stops |
fusion.technician.task |
fusion_tasks |
Local delivery task (GPS, maps) |
fusion.technician.location |
fusion_tasks |
Driver GPS tracking |
Repackaged Enterprise Modules
See K:\Github\RePackaged-Odoo\CLAUDE.md for full details. Key points:
- Odoo 19 enterprise modules repackaged for community edition
- All OEEL-1 licenses changed to LGPL-3
- Phone-home/telemetry gutted
web_enterpriseandmail_enterpriseare installed on odoo-entech- Addons path includes:
_dependencies,accounting,inventory_manufacturing,hr,sales,ai,fusion_backend,custom,website
Fine-Tuning Initiative (Started 2026-04-21)
System-wide UX gap closure. Running PLAN → SPEC → IMPLEMENT per sub-project so we don't
rewrite code as new requirements surface. Each sub-project has its own design doc in
docs/superpowers/specs/ and its own implementation plan before any code lands.
Sub-Project Roadmap
| # | Sub-project | Status | Gaps |
|---|---|---|---|
| 1 | Direct Order Wizard fix (no auto-confirm/auto-email) | Shipped 2026-04-22 (commit afd8bae+) | Gap 1 |
| 2 | Part Data Model Overhaul (part#/rev required, dual descriptions, per-part cert requirement, SKU→Part Number on customer docs) | Shipped 2026-04-22 (commits 868b418..afd8bae) | 2b, 2c, 2d, 4 |
| 3 | Default Process + Composer per part (reuse recipe tree) | Shipped 2026-04-22 (commits ce07daa..f059348) | 2e, 2f |
| 4 | Contract Review (optional, per-part, settings-driven QA roster, QA-005 1:1 PDF) | Shipped 2026-04-22 | 2i |
| 5 | Order-line fields (serial, job#, thickness dropdown, revision picker) | Pending | 5, 6, Q2 |
| 6 | Contact Profiles & Communication Routing (sub-contacts + per-location notification lists + global contacts) | Pending | client transcript A/B/C |
| 7 | IoT tuning (configurable polling interval 15–30 min, seed 6–10 tank sensors) | Pending | client transcript D |
| 8 | Receiving / Inspection / QC flow restructure (split receiving vs inspection; racking crew inspects, not receiver) | Pending | client transcript E |
| ∞ | First-off / last-off QC | Deferred | client transcript F |
| ∞ | VEC machine auto-ingest (Word-format thickness report from network-connected XRF; different machine from Fischerscope) | Deferred | client transcript G |
Sub 2 Locked Decisions (2026-04-21)
| Q | Decision |
|---|---|
| Q1 — Cert requirement precedence | Part wins; partner is fallback. New selection certificate_requirement on fp.part.catalog: inherit / none / coc / coc_thickness. Default inherit preserves current behaviour for existing records. |
| Q2 — Revision handling | Keep existing chain (parent_part_id, is_latest_revision, revision_ids). Out-of-scope for Sub 2. The "revision picker at order entry" moves to Sub 5. |
| Q3 — Required-field flip | Strict + backfill. On upgrade: part_number = name if empty; revision = 'A' if empty. Then required=True for both. name becomes optional. |
| Q4 — Descriptions shape | Split fp.sale.description.template.description into internal_description + customer_facing_description. Repeater on the part's Descriptions tab gains two columns. Old description column dropped in migration. |
| Q5 — SKU vs Part Number | Use fp.part.catalog.part_number directly as the source of truth. Don't sync to default_code. Customer-facing reports print part_number; internal reports keep showing default_code (service code). Odoo-native screens untouched. |
| Q6 — Description required at order entry | Both required. SO line carries name (customer-facing, already Odoo standard) + new x_fc_internal_description (ops workflow). Both required before save. |
Sub 2 Defensive Measures (Prevent Rework When Later Subs Land)
- Single-source cert resolution function —
mrp.production._fp_resolve_cert_requirement(self)returns(want_coc, want_thickness). Every caller (cert cascade, QC gate, notification routing) goes through this. When Sub 6 restructures partner-level flags into location / contact permissions, one function updates — no call-site hunt. - Shared QWeb line-header macro —
fusion_plating_reports.customer_line_headerrenderspart_number + revision + customer-facing descriptionwith fallback to product name for non-part lines. All 4 customer-facing reports (SO, invoice, packing slip, BoL) call the macro. Sub 5's revision picker updates the macro once, all reports follow. - Isolated migration — Sub 2's
post_init_hookis idempotent (NULL/empty checks). Safe to re-run. Doesn't fight Sub 3/4/5/6 migrations. - Additive SO line fields —
x_fc_internal_description,x_fc_description_template_idsit alongside future Sub 5 fields (x_fc_serial_number,x_fc_job_number,x_fc_thickness,x_fc_revision_snapshot) with zero touchpoints. - Clean removal of old
descriptioncolumn — migrated then dropped. Not kept as deprecated. One clean break now beats two migrations later.
Sub 6 Preview — Contact Profiles & Communication Routing (client transcript A/B/C)
- Sub-contacts under
res.partnerwith per-contact permissions: certs / QC / quotes+SO / invoices. - Multiple delivery locations per customer; each location has its own notification list.
- Global contact (company-level + location-level) gets all communications.
- Will restructure or augment the partner-level
x_fc_send_coc/x_fc_send_thickness_reportflags that Sub 2 currently falls back to. Sub 2's_fp_resolve_cert_requirementis the update point.
Sub 7 Preview — IoT Tuning (client transcript D)
- 6–10 active tanks (of ~20–25 total) need continuous monitoring.
- Polling interval: 30 minutes acceptable, 15 minutes ideal. Configurable per tank.
- Temperature, pH, nickel concentration — all on automated controller (existing
fusion_plating_iotmodule). - Work scope: ensure per-sensor interval field exists + defaults + seed 6–10 tank.sensor records.
Sub 8 Preview — Receiving / Inspection / QC Restructure (client transcript E)
Current flow (wrong): Direct order → receiving entry → receiver inspects on arrival. Correct flow:
- Customer ships parts in boxes. Receiver counts boxes (does NOT inspect individual parts).
- Boxes sit in staging until racking.
- Racking crew opens boxes, inspects each part as they load racks (inspection ≠ receiving).
- Parts go through plating process.
- Post-plate QC on machine (thickness / depth / coating thickness) — existing QC gate (Phase 1–3 work).
- Pack back into the SAME boxes they arrived in. Same qty out as in.
Implication: The current fusion_plating_receiving module conflates receiving + inspection. Sub 8 splits them. Racking-time inspection becomes its own record, linked to WOs not to receiving.
Deferred Items (Future)
- First-off / last-off QC — first and last part of each batch get full QC inspection; middle parts sampled. Not priority.
- VEC machine auto-ingest — different from Fischerscope. Exports a Word doc (picture + data) named
workorder_PO.docxto a network share. Plan: auto-scan the share, parse, attach to QC as thickness_report. Defer until core flow is solid.
Client-Confirmed Operational Thresholds
- Tank polling: 15–30 min, half-hour acceptable
- Active tanks: 6–10 (not all 20–25)
- Boxes round-trip: parts ship back in the same boxes they arrived in, same quantity per box
How to Resume This Work in a Fresh Session
- Read this section (Fine-Tuning Initiative).
- Check the sub-project status table — which sub is in flight.
- Read the corresponding spec in
docs/superpowers/specs/YYYY-MM-DD-sub<N>-*-design.md. - Read the implementation plan if one exists.
- Continue from the next un-checked step.