Files
Odoo-Modules/fusion-plating/CLAUDE.md
gsinghpal 8fa53017c4 CLAUDE.md: document per-job recipe overrides feature
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 15:39:21 -04:00

11 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

fusion_plating/                  — Core: facilities, process types, tanks, baths, chemistry, recipes
fusion_plating_shopfloor/        — Tablet UI, plant overview kanban, process tree visualization
fusion_plating_portal/           — Customer portal
fusion_plating_reports/          — PDF reports (WO margin, discharge sample, etc.)
fusion_plating_compliance/       — Compliance framework, jurisdictions
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
fusion_plating_culture/          — Values / fundamentals
fusion_plating_bridge_mrp/       — MRP integration (extends mrp.workorder)
fusion_plating_bridge_sign/      — Digital signatures
fusion_plating_bridge_quality/   — Quality bridge
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

Critical Rules — Odoo 19

  1. NEVER code from memory — Read reference files from the server first.
  2. Backend OWL: static template, static props = ["*"], standalone rpc() from @web/core/network/rpc. NOT useService("rpc").
  3. HTTP routes: type="jsonrpc" — NOT type="json" (deprecated in Odoo 19).
  4. Search views: NO group expand="0", NO string attribute on <search>, NO <group string="..."> wrapper for group-by filters.
  5. res.config.settings: Only boolean/integer/float/char/selection/many2one/datetime. NO Date fields.
  6. Field params: parent_path does NOT accept unaccent parameter in Odoo 19.
  7. SCSS borders: Use $border-color (SCSS variable) for card borders, NOT color-mix() in border shorthand — the SCSS compiler drops it. color-mix() works fine in background-color, box-shadow, etc.
  8. 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. See fusion_plating_shopfloor.scss as the gold standard.

Naming

  • New fields on custom models: standard names (no prefix needed)
  • 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_*)

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)
  • icon is 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_editor client 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_overview in fusion_plating_shopfloor
  • Kanban columns = work centres, cards = active mrp.workorder records
  • Drag & drop between columns (writes workcenter_id on 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, user odoo)
  • 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.conf or Odoo won't find the repackaged enterprise addons

odoo-trial (VM 316 on pve-worker1)

  • Type: Docker (container odoo-trial-app, db odoo-trial-db)
  • DB: trial (user odoo)
  • 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 decisions
  • fusionapps.issues — known issues and fixes
  • fusionapps.code_snippets — reference code
  • fusionapps.quick_commands — deployment and admin commands
  • fusionapps.vm_registry — VM inventory
  • fusionapps.proxmox_nodes — cluster node specs

Custom Workflow (TO BUILD — Next Sessions)

End-to-end plating job lifecycle. This is the core business process.

1. Quotation via Configurator
   └─ sale.order (draft) — configurator picks process type → suggests recipe

2. Quotation Sent
   └─ sale.order (sent)

3. PO Received from Customer
   └─ sale.order (confirmed by customer PO)

4. Sale Order Created → triggers MO
   └─ sale.order confirmed → mrp.production created
   └─ **Recipe assigned to MO** (x_fc_recipe_id on mrp.production)

5. Two paths:
   a. Invoice Directly (simple jobs)
      └─ account.move created from SO
   b. Work Order Created for Factory + Shipping Label
      └─ mrp.workorder records generated from recipe template
      └─ **Per-job opt-in/out overrides configured here**
      └─ Shipping label created (Fusion Shipping module)

6. Work Order Completed
   └─ mrp.production → done

7. Invoice Created
   └─ account.move — but check for account hold (non-payment flag)
   └─ If hold → block invoice until resolved

8. Product Shipped
   └─ stock.picking confirmed
   └─ Fusion Shipping module handles carrier integration

9. Email to Client
   └─ Automated email with:
      - PDF Certificate of Conformance
      - Invoice PDF
      - Shipping tracking information

Per-Job Recipe Overrides (NEW — v19.0.2.0.0 bridge_mrp)

  • x_fc_recipe_id field on mrp.production links MO to a recipe
  • fusion.plating.job.node.override model stores per-job opt-in/out decisions
  • fp.recipe.config.wizard — wizard with checklist for planner to toggle optional steps
  • "Overrides" stat button on MO form opens the wizard
  • Opt-in nodes default unchecked (skipped), opt-out nodes default checked (included)
  • Located in fusion_plating_bridge_mrp module

What Exists vs What Needs Building

Component Status
Sale Order / Quotation Standard Odoo (exists)
Product Configurator Needs building or extending
Recipe assignment to MO Donex_fc_recipe_id on mrp.production
Per-job opt-in/out overrides Donefusion.plating.job.node.override + config wizard
WO generation from recipe Not built — need to convert recipe nodes → mrp.workorder records
Account hold check Needs investigation (may exist in fusion_plating or accounting)
Fusion Shipping integration Module exists (fusion_plating_logistics) — check capabilities
Auto-email with Cert+Invoice+Tracking Needs building (automated action or cron)

Key Architectural Decisions Needed

  1. Does the configurator extend Odoo's standard product configurator or is it custom?
  2. How do recipe nodes map to mrp.workorder? One node = one WO? Or only operation-level nodes?
  3. How does account hold work? Flag on res.partner? On sale.order?
  4. What triggers the final email — shipping confirmation? Invoice validation?

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_enterprise and mail_enterprise are installed on odoo-entech
  • Addons path includes: _dependencies, accounting, inventory_manufacturing, hr, sales, ai, fusion_backend, custom, website