folder rename

This commit is contained in:
gsinghpal
2026-04-16 20:53:53 -04:00
parent 3f3ddcbab4
commit 7c7ef06057
634 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,244 @@
# Existing Nickel Plating / Metal Finishing ERP Systems — What They Record
**Prepared:** 2026-04-09
**Purpose:** Benchmark what the industry standard plating ERPs already capture, so `fusion-plating` can match the table stakes and differentiate where it counts.
**Scope:** Commercial software used by actual metal finishing shops in North America. Focus on what they *track and retain*, not on marketing gloss.
---
## 1. The Landscape — Who's Actually in the Market
| Product | Focus | Notes |
|---------|-------|-------|
| **[Steelhead Technologies](https://gosteelhead.com/)** | Purpose-built for metal finishing (plating, anodizing, powder coat). | Most feature-complete plating-specific ERP. NADCAP Scanner is their flagship compliance tool. |
| **[Lab Wizard Cloud](https://lab-wizard.com/en/lab-wizard-cloud/)** | Plating bath chemistry LIMS/SPC. | Specialized in titration, bath tracking, SPC. Often used alongside a general ERP. Free tier for small shops. |
| **[ProShop ERP](https://proshoperp.com/)** | Shop-floor-first ERP with built-in QMS. Strong in aerospace / AS9100 / ITAR. | Paperless travelers, version-controlled work instructions. |
| **[PROPLATE™](https://proplate.pro/)** | Barrel plating and general metal finishing. | Smaller vendor; limited public detail. |
| **[Anoplex](https://www.anoplex.com/)** | Anodizing, plating, painting, NDT, passivation. | Cloud, solution control and chemical inventory. |
| **[PHTPlus](https://phtplus.com/about/)** | Plating, heat treating, finishing services. | Job-shop centric. |
| **[Fitfactory](https://www.fitfactory.com/metal-finishing-production-control)** | UK-based metal finishing production control. | NCR logging, chemical batch tracking for NADCAP. |
| **[JobBOSS² + uniPoint](https://www.ecisolutions.com/blog/manufacturing/jobboss/how-jobboss-and-unipoint-support-iso-9001-and-as9100-certification/)** | General job shop ERP + bolted-on QMS. | Widely used, not plating-specific but common in shops that do plating. |
| **[QT9 QMS / QT9 ERP](https://qt9software.com/as9100)** | Aerospace QMS first, ERP second. | Clean AS9100 workflows, customer portal. |
| **[Global Shop Solutions](https://www.globalshopsolutions.com/)** | General manufacturing ERP with AS9100 modules. | Large installed base, not plating-first. |
| **[Tudodesk](https://www.tudodesk.com/free-chrome-plating-shop-software)** | Chrome plating shop software. | Light-weight, SMB-focused, online quoting/billing. |
| **[Varland Plating portal](https://varland.com/technology)** | Example of a shop-built customer portal. | Useful as a reference for what customers expect to see. |
**Takeaway:** There is **no** single Canadian-made, Toronto-compliance-aware, electroless-nickel-first ERP on the market. The closest competitors are US-based and cover the quality/NADCAP side well but treat **Ontario sewer, RPRA hazardous-waste, ECA air, and Toronto P2 Plan obligations** as something handled outside the ERP. This is the opening.
---
## 2. Feature Inventory — What They Record
Grouped by concern. "✓" = explicitly documented on the vendor page or a credible review; blank = unclear or not mentioned.
### 2.1 Bath / Tank Chemistry Management
| Data point / feature | Steelhead | Lab Wizard | Anoplex | ProShop | PROPLATE |
|----------------------|-----------|------------|---------|---------|----------|
| Titration-driven concentration calculation | | ✓ | ✓ | | |
| Auto-calculated chemical addition (dosing) | | ✓ | ✓ | | |
| Trend visualization (concentration vs time) | ✓ | ✓ | | | |
| Out-of-spec alarm / email / channel alert | | ✓ | | | |
| Scheduled analysis reminder (per bath) | | ✓ | | | |
| Bath age / MTO (Metal Turnover) counter | | ✓ | | | |
| Phosphorus / orthophosphite buildup tracking | | ✓ | | | |
| Temperature / pH / agitation log | ✓ | ✓ | | | |
| Filter / carbon treatment / cleanup log | | ✓ | | | |
| Bath dump & makeup record | | ✓ | ✓ | | |
| IoT / sensor input integration | | ✓ | | | |
| SPC charts with CpK | | ✓ | | | |
| Audit-ready chemistry reports | | ✓ | | ✓ | |
**Reference:** Electroless nickel bath life is measured in **Metal Turnovers (MTO)**: MTO = cumulative Ni replenished ÷ (initial Ni × bath volume). A 5 g/L bath replenished with 5 g/L of Ni = 1 MTO. Most mid-phos EN baths run **59 MTO** before dump; orthophosphite builds at roughly **2430 g/L per MTO**, and phosphorus content in the deposit rises with bath age. Any serious EN plating system must track MTO, orthophosphite, and P-content bands. [Lab Wizard MTO article](https://lab-wizard.com/en/resources/knowledge/metal-turnovers/)
### 2.2 Production / Tank / Line Management
| Feature | Steelhead | ProShop | JobBOSS | PROPLATE | PHTPlus |
|---------|-----------|---------|---------|----------|---------|
| Tank QR code identification | ✓ | | | | |
| Tank time tracking "to the second" | ✓ | | | | |
| Multi-line capacity planning / scheduling | ✓ | ✓ | ✓ | ✓ | ✓ |
| Recipe / process card per part number | ✓ | ✓ | ✓ | ✓ | |
| Racking/packing instructions per part | ✓ | | | | |
| Real-time part-in-process location | ✓ | ✓ | ✓ | | |
| Mobile/tablet operator stations | ✓ | ✓ | | | |
| Photo documentation at workstation | ✓ | ✓ | | | |
| Paperless digital traveler | ✓ | ✓ | ✓ | ✓ | |
| Rework tracking by line / part / finish | ✓ | ✓ | ✓ | | |
### 2.3 Quality & Certification Records
| Feature | Steelhead | ProShop | QT9 | JobBOSS | Fitfactory |
|---------|-----------|---------|-----|---------|------------|
| ISO 9001 compliance workflows | ✓ | ✓ | ✓ | ✓ | ✓ |
| AS9100 Rev D aerospace workflows | ✓ | ✓ | ✓ | ✓ | |
| NADCAP AC7108 traceability (plating) | ✓ | | | | ✓ |
| NADCAP Scanner (cert digitization) | ✓ | | | | |
| ITAR / CMMC controls | | ✓ | ✓ | | |
| ISO 13485 (medical) | | ✓ | ✓ | | |
| Certificate of Conformance auto-generation | ✓ | ✓ | ✓ | ✓ | |
| First Article Inspection Report (FAIR) | | ✓ | ✓ | ✓ | |
| Non-conformance / hold tag workflow | ✓ | ✓ | ✓ | ✓ | ✓ |
| MRB (Material Review Board) routing | | ✓ | ✓ | ✓ | |
| CAPA / corrective action log | ✓ | ✓ | ✓ | ✓ | ✓ |
| Customer specification library | ✓ | ✓ | ✓ | ✓ | |
| Document / revision control | ✓ | ✓ | ✓ | ✓ | ✓ |
| Operator training tied to doc revision | | ✓ | ✓ | | |
| Internal audit schedule + tracking | | ✓ | ✓ | ✓ | |
| Management review agenda/minutes | | ✓ | ✓ | | |
| Supplier approved-vendor list (AVL) | ✓ | ✓ | ✓ | ✓ | |
| Supplier receiving inspection | ✓ | ✓ | ✓ | ✓ | |
| Calibration register (NIST-traceable) | | ✓ | ✓ | ✓ | |
| XRF thickness reading capture | | | | | ✓ |
| Cross-reference to customer specs (AMS, ASTM, MIL) | ✓ | ✓ | ✓ | ✓ | |
### 2.4 Shop Floor / Operator Experience
| Feature | Steelhead | ProShop |
|---------|-----------|---------|
| Touch-screen tablets at each station | ✓ | ✓ |
| Version-controlled setup sheets displayed live | | ✓ |
| Tool list / fixture list at station | ✓ | ✓ |
| Inspection plan linked to the operation | | ✓ |
| Real-time shop-floor dashboard | ✓ | ✓ |
| Operator badge sign-on, time-on-part | ✓ | ✓ |
| Automatic hold if prior step incomplete | ✓ | ✓ |
| Photo capture of defect / process step | ✓ | ✓ |
### 2.5 Customer Portal
| Feature | Steelhead | Varland | Tudodesk | QT9 |
|---------|-----------|---------|----------|-----|
| Near-real-time job status | ✓ | ✓ | ✓ | ✓ |
| Quote request / approval online | ✓ | | ✓ | ✓ |
| Upload drawings / specs | ✓ | | ✓ | |
| Download Certificate of Conformance PDF | ✓ | ✓ | | ✓ |
| Download packing lists / shipping PDF | ✓ | ✓ | ✓ | ✓ |
| Invoice access | ✓ | | ✓ | ✓ |
| Historical orders searchable | ✓ | ✓ (30 days) | ✓ | ✓ |
### 2.6 Environmental / Waste / Health & Safety
| Feature | Plating ERPs | Stand-alone EHS tools |
|---------|--------------|----------------------|
| SDS library with version + review date | ✗ mostly absent | ✓ (Chemical Safety, VelocityEHS, ERA-EHS) |
| Chemical inventory by location | partial (Anoplex, Steelhead) | ✓ |
| WHMIS training matrix | ✗ | ✓ (Cority, VelocityEHS) |
| Exposure monitoring records (air sampling) | ✗ | ✓ |
| Hazardous waste generation log | ✗ | ✓ (Wastelinq, IMEC, ERA, EHSTracks) |
| Cradle-to-grave manifest tracking | ✗ | ✓ (Wastelinq, IMEC) |
| Automated generator reporting | ✗ | partial |
| Sewer discharge monitoring log | ✗ | partial |
| Pollution Prevention Plan builder | ✗ | ✗ |
| Spill incident register | ✗ | ✓ |
| JHSC meeting / minutes | ✗ | partial |
**This is the biggest single gap in the industry.** Plating shops today run a plating ERP (Steelhead / ProShop / JobBOSS) for production, a bath-chemistry tool (Lab Wizard), and a *separate* EHS suite (ERA-EHS / VelocityEHS / Wastelinq) for environmental and waste compliance. Three logins, three sources of truth, and nothing in any of them is written against **Toronto Chapter 681** or **RPRA HWP Registry** specifically.
Vendors handling these separately:
- Waste: [Wastelinq](https://wastelinq.com/), [IMEC Technologies](https://www.imectechnologies.com/hazardous-waste-management-software/), [ERA-EHS Waste](https://www.era-environmental.com/solutions/environmental/waste), [Cority Waste Management](https://www.cority.com/environmental-cloud/waste-management-software/), [VelocityEHS](https://www.ehs.com/solution/environmental-compliance/waste-management/), [Sphera](https://sphera.com/solutions/product-stewardship/hazardous-material-management-for-the-u-s-government/hazardous-waste-management-software/), [Chemical Safety](https://chemicalsafety.com/hazardous-waste-management-software/)
---
## 3. Process-Step Records That Electroless Nickel Specifically Needs
Beyond the general plating ERP fields, electroless nickel has a handful of step-specific data points that *must* be captured to satisfy Nadcap AC7108 and customer specs like AMS 2404 / ASTM B733 / MIL-C-26074:
| Step | Data captured per job / lot | Why |
|------|------------------------------|-----|
| **Pre-clean / degrease** | Time, temperature, bath ID | Contamination risk to EN bath |
| **Acid activation / etch** | Time, concentration, temperature, bath ID | Major source of hydrogen absorption |
| **Strike / Wood's nickel** (stainless, aluminium) | Current, time, bath ID | Adhesion requirement |
| **EN plate** | Time-in, time-out, bath ID, MTO at plate, temperature, pH, Ni concentration, P concentration, target thickness, measured thickness | The core process — all of this is traceable for life-of-part. |
| **Rinse cascade** | Number of rinses, conductivity readings (for zero-discharge shops) | Drag-out management |
| **Passivation / chromate (optional)** | Bath ID, time, temperature | Corrosion spec compliance |
| **Hydrogen embrittlement relief bake** | Time-in, time-out, temperature profile, oven ID, bake duration (typ. 4 h at 375°F / 190°C per AMS 2759/9), recorder chart | **Mandatory within 14 h of plate for high-strength steel**; non-compliance = customer reject, or worse, part failure in service |
| **Thickness measurement** | XRF reading(s) per part/lot, instrument ID, calibration cert reference, P-content reading, operator | NIST-traceable, tamper-proof |
| **Adhesion test** | Method (bend, heat-quench, grit-blast), result, operator | Per Nadcap AC7108 |
| **Corrosion test** (if required) | Method (salt spray, CASS), duration, result | Per customer spec |
| **Final inspection** | Visual, dimensional, operator, photo (optional) | CoC support |
| **Certificate of Conformance** | Auto-generated, pulling every previous step | Customer deliverable |
Nadcap accreditation means *every* one of these is documented and traceable — [AC7108](https://www.newmethodplating.com/nadcap-accreditation-and-as7108-certification-for-chemical-processing/) explicitly audits against this. Existing plating ERPs cover most of it; **none** I found explicitly model the EN-specific fields (MTO, orthophosphite, P-content per MTO, bake time-window enforcement).
---
## 4. Gaps & Opportunities for `fusion-plating`
Stacking the compliance research from the companion document against this feature benchmark:
### 4.1 Gaps in the market
1. **No unified production + environmental compliance system.** Plating shops juggle 23 platforms; `fusion-plating` can be the first to put production, bath chemistry, waste manifests, sewer monitoring, and P2 Plan data under one roof.
2. **No Ontario/Toronto-native regulatory awareness.** Every existing system is built for US regs (EPA RCRA, OSHA) or UK regs. A module that speaks **Chapter 681 Table 1, RPRA HWP, O. Reg. 419/05, MECP ECA** out of the box is unique.
3. **No automated Toronto P2 Plan builder.** Six-year cycles, year-3 updates, 12-heavy-metal inventory — this is a compliance workflow, not a document. It should be a feature, not a Word template.
4. **No EN-specific chemistry engine.** MTO counter, orthophosphite projection, P-content prediction, bake-time-window enforcement (plate → bake must be ≤1 h) — none of the ERPs I examined model this natively.
5. **Delegation-first UX.** The user said the owner likes to delegate. Existing systems are built around a scheduler assigning work. `fusion-plating` can flip this: owner drops the inquiry in, the system routes it (sales → engineer → scheduler → supervisor → operator → inspector → shipper) and the owner sees *status*, not *details*.
### 4.2 Table-stakes `fusion-plating` must match (or it looks cheap)
- Paperless digital traveler
- QR-coded tanks and jobs
- Tablet shop-floor stations
- Customer portal (quote, status, CoC download, invoices)
- Certificate of Conformance auto-generation
- Non-conformance + CAPA workflow
- Document control with revision + trained-on matrix
- Calibration register
- AS9100 / NADCAP audit trail posture (traceability from raw material to shipped part)
- Supplier AVL and receiving inspection
### 4.3 Differentiators `fusion-plating` should own
- **Toronto Chapter 681 real-time discharge monitor** — log every lab report, trigger at 80 % of Table 1, force investigation before the next discharge.
- **Automated P2 Plan document pack** — pulls 6 years of pollutant inventory, calculates trends, pre-writes year-3 and year-6 updates.
- **RPRA HWP Registry handshake** — generator registration number, waste-stream profiles, manifest numbers, carrier approval expiry, annual report scheduling.
- **ECA compliance calendar** — every ECA condition (source testing, annual report, equipment maintenance) on a calendar with responsible party, overdue escalation.
- **EN bath chemistry engine** — MTO counter, orthophosphite projection, phosphorus content band forecast, automatic dump/makeup recommendation.
- **Bake-window enforcer** — when a high-strength-steel part finishes plating, the system starts a **clock** and alarms if the part isn't in an oven within the customer-spec window.
- **Ontario-aware training matrix** — WHMIS 2015 refresh flags, TDG 3-year recert, first-aid CPR renewal, JHSC member term tracking.
- **Delegation inbox** — every new task, quality hold, complaint, inspector letter, or bath alarm lands in a "someone has to do this" inbox and auto-routes by role.
---
## 5. Sources
### Plating / metal finishing ERPs
- [Steelhead Technologies — Compliance](https://gosteelhead.com/compliance)
- [Steelhead — Plating & Anodizing Software](https://gosteelhead.com/plating-anodizing-software)
- [Steelhead — Customer Portal](https://gosteelhead.com/customer-portal-0)
- [Steelhead — Quality Management](https://gosteelhead.com/resource-library/metal-finishing-quality-management-software)
- [Steelhead — NADCAP Scanner](https://www.pfonline.com/products/nadcap-scanner-provides-fully-digital-production-automated-certification-management)
- [Lab Wizard Cloud](https://lab-wizard.com/en/lab-wizard-cloud/)
- [Lab Wizard — Metal Turnovers (MTO) article](https://lab-wizard.com/en/resources/knowledge/metal-turnovers/)
- [ProShop ERP — Quality Management System](https://proshoperp.com/product/quality-management-system/)
- [ProShop ERP — Aerospace](https://proshoperp.com/industries/aerospace/)
- [ProShop ERP — MES](https://proshoperp.com/product/mes/)
- [PROPLATE™](https://proplate.pro/metal-finishing-erp-systems-and-job-shop-management-proplate-strategy-for-high-quality-scalable-operations/)
- [Anoplex Software](https://www.anoplex.com/)
- [PHTPlus](https://phtplus.com/about/)
- [Fitfactory — Metal Finishing Production Control](https://www.fitfactory.com/metal-finishing-production-control)
- [JobBOSS² + uniPoint for AS9100](https://www.ecisolutions.com/blog/manufacturing/jobboss/how-jobboss-and-unipoint-support-iso-9001-and-as9100-certification/)
- [QT9 QMS — AS9100](https://qt9software.com/as9100)
- [QT9 ERP — Customer Portal](https://qt9software.com/erp/customer-portal-software)
- [Global Shop Solutions — AS9100](https://www.globalshopsolutions.com/blog/as9100-certification-doesnt-have-to-be-hard-let-erp-do-the-heavy-lifting)
- [Tudodesk — Chrome Plating Shop Software](https://www.tudodesk.com/free-chrome-plating-shop-software)
- [Varland Plating — Technology & Customer Portal](https://varland.com/technology)
### Stand-alone environmental / waste platforms (what plating ERPs don't cover)
- [Wastelinq](https://wastelinq.com/)
- [IMEC Hazardous Waste Management](https://www.imectechnologies.com/hazardous-waste-management-software/)
- [Ecesis Waste Tracking](https://www.ecesis.net/Waste-Management-Software.aspx)
- [ERA-EHS Waste Management](https://www.era-environmental.com/solutions/environmental/waste)
- [Cority Waste Management](https://www.cority.com/environmental-cloud/waste-management-software/)
- [VelocityEHS Waste Management](https://www.ehs.com/solution/environmental-compliance/waste-management/)
- [Sphera Hazardous Waste Management](https://sphera.com/solutions/product-stewardship/hazardous-material-management-for-the-u-s-government/hazardous-waste-management-software/)
- [Chemical Safety Software](https://chemicalsafety.com/hazardous-waste-management-software/)
- [EHSTracks Waste Compliance](https://ehstracks.com/waste-compliance-software/)
### Process knowledge (EN-specific)
- [Electroless Nickel Plating — Products Finishing overview](https://www.pfonline.com/articles/electroless-nickel-plating)
- [Controlling Phosphorus Content — Products Finishing](https://www.pfonline.com/articles/controlling-phosphorus-content-in-electroless-nickel-phosphorus-coatings)
- [Electroless Nickel-Phosphorus Plating — Wikipedia](https://en.wikipedia.org/wiki/Electroless_nickel-phosphorus_plating)
- [Hydrogen Embrittlement & Electroplating — Sharretts Plating](https://www.sharrettsplating.com/blog/hydrogen-embrittlement-electroplating-what-you-need-to-know/)
- [EN Thickness & P-Content via XRF — VRXRF](https://www.vrxrf.com/blog/electroless-nickel-thickness-phosphorus-content-detection-guide/)
- [Measuring EN Plating with XRF — AZoM](https://www.azom.com/article.aspx?ArticleID=15524)
- [National Electroless Nickel — Specifications & Properties](https://www.nationalelectrolessnickel.com/specs.htm)
- [Nickel Institute — Nickel Plating Handbook (PDF)](https://nickelinstitute.org/media/lxxh1zwr/2023-nickelplatinghandbooka5_printablepdf.pdf)

View File

@@ -0,0 +1,258 @@
# Electroless Nickel Plating — Canadian Compliance & Record-Keeping Reference
**Location:** Toronto, Ontario, Canada
**Prepared:** 2026-04-09
**Purpose:** Pre-engagement reference for scoping an Odoo module covering workflow, compliance, and order management for an electroless nickel plating shop.
**Status:** Research document — verify jurisdiction-specific details with the client's environmental consultant and their current ECA before treating as authoritative.
---
## 1. Executive Summary
An electroless nickel plating operation in Toronto sits at the intersection of **federal, provincial, municipal, and industry-voluntary** compliance regimes. The binding obligations that must be reflected in any operations system are:
| # | Obligation | Authority | Why it matters to the system |
|---|------------|-----------|------------------------------|
| 1 | **Environmental Compliance Approval (ECA — Air)** | Ontario MECP | Every plating line, drying oven and gas-fired source must be operated within the conditions on the facility's ECA — the system must track operating parameters, maintenance, and source testing. |
| 2 | **Toronto Sewer Use By-law Ch. 681** — discharge limits + P2 Plan | City of Toronto | Nickel discharge cap **2 mg/L** to sanitary sewer, **0.08 mg/L** to storm sewer. Self-monitoring, sampling, and a six-year Pollution Prevention Plan are mandatory for metal finishers. |
| 3 | **Ontario Reg. 347 hazardous waste generator registration** | Ontario MECP via RPRA HWP Registry | Spent plating baths, sludges, rinses and filter media are subject wastes — generator registration, manifesting and reporting run through RPRA's Hazardous Waste Program Registry (replaced HWIN in 2023). |
| 4 | **CEPA Schedule 1 — nickel compounds** + NPRI reporting | Environment and Climate Change Canada | Oxidic, sulphidic and soluble inorganic nickel compounds are listed toxic substances. Releases and transfers are reportable to the National Pollutant Release Inventory annually if thresholds are met. |
| 5 | **OHSA + Reg. 833 exposure limits, WHMIS 2015** | Ontario Ministry of Labour | Worker exposure to nickel aerosols, acids and reducing agents must be assessed, controlled, monitored, and documented. SDS library and training records are mandatory. |
| 6 | **Transportation of Dangerous Goods (TDG)** | Transport Canada | Incoming acids, nickel salts, hypophosphite, and outgoing hazardous wastes need classified shipping documents, training certificates and means-of-containment records. |
Beyond law, customers will usually demand **ISO 9001** at minimum, and many will require **AS9100 / Nadcap AC7108** (aerospace electroless plating) or **CGP** (Controlled Goods Program, for defence work). These are not legally binding but functionally mandatory for the customer mix a Toronto shop typically serves.
---
## 2. Compliance Map by Jurisdiction
### 2.1 Federal (Canada)
#### 2.1.1 Canadian Environmental Protection Act (CEPA 1999)
- **Nickel compounds on Schedule 1** (toxic substances): oxidic, sulphidic and soluble inorganic nickel compounds. Triggers risk-management obligations and may trigger pollution-prevention (P2) planning notices from ECCC.
- **National Pollutant Release Inventory (NPRI)** — annual reporting for substances above thresholds. For Part 1A metals (nickel included), the standard threshold is **10 tonnes manufactured/processed/otherwise used at ≥1% concentration**, plus any alternate thresholds applicable to metal finishing. Smaller shops may still trigger the employee-hour threshold.
- **Records:** facility activity logs, substance inventories, calculation methods, supporting documentation — retain **3 years**.
#### 2.1.2 Transportation of Dangerous Goods Act (TDG) and Regulations
- Applies to incoming drums of nickel sulphate/sulphamate, acids, caustics, hypophosphite; outgoing hazardous waste shipments.
- Shipping documents (consignor, classification, UN number, PG, quantity, emergency info), **means-of-containment selection and inspection**, TDG **training certificates** (valid 3 years by road), placarding.
- **Records:** shipping documents retained for **2 years** (federal), training records for duration of employment + common practice is 5 years.
#### 2.1.3 Hazardous Products Act + Hazardous Products Regulations (WHMIS 2015 / GHS)
- SDS library maintained current (each SDS must be no older than 3 years or confirmed current).
- Container labels (supplier + workplace).
- Worker training documented; refreshed when new products or processes are introduced.
#### 2.1.4 Controlled Goods Program (CGP) — optional, required only for defence/aerospace work
- Registration with Public Services and Procurement Canada.
- Security assessments of personnel with access to controlled goods.
- Record-keeping of controlled technology and physical access.
---
### 2.2 Provincial (Ontario)
#### 2.2.1 Environmental Compliance Approval — Air (Ontario EPA, R.S.O. 1990, c. E.19)
- Electroless nickel plating facilities require an **ECA with Limited Operational Flexibility (air)** covering plating lines, drying ovens, and natural-gas-fired equipment.
- Conditions typically include source-specific emission limits, equipment inventories, maintenance protocols, source testing schedules, ambient-air impact assessments (ESDM report), and record-keeping clauses.
- Annual **Ontario Regulation 419/05** (Local Air Quality) compliance — emission summary and dispersion modelling report updates.
#### 2.2.2 Ontario Regulation 347 — General (Waste Management) / RPRA Hazardous Waste Program
- Generator registration and annual update via the **RPRA HWP Registry** (replaced MECP HWIN in 2023).
- Waste characterisation (ignitable, reactive, corrosive, leachate toxic, severely toxic, acute hazardous).
- Manifest system for every off-site hazardous-waste shipment — carrier, receiver, waste class.
- **Records:** generator reports and manifests retained per RPRA guidance (minimum **2 years**, longer if referenced by ECA or federal requirement).
#### 2.2.3 Ontario Water Resources Act + Environmental Protection Act (spills, releases)
- Spill-reporting obligation: any spill that may cause an adverse effect must be reported immediately to the Spills Action Centre.
- Site contingency plan required.
#### 2.2.4 Occupational Health and Safety Act + Regulation 833 (chemical/biological agents) + Reg. 851 (industrial establishments)
- **Note:** Nickel is **not** one of the 11 designated substances under O. Reg. 490/09. It is regulated as a general hazardous chemical agent under **Reg. 833** — the Ontario Table / ACGIH 2017 TLVs apply.
- Employers must limit exposure to or below the TWA and short-term limits, carry out exposure assessments, provide engineering controls and PPE, and document the program.
- **JHSC** (Joint Health and Safety Committee) required ≥ 20 workers; minutes retained.
- WSIB registration and premium reporting.
- First-aid regulation (Reg. 1101): kits, trained first-aiders, log of injuries.
#### 2.2.5 Technical Standards and Safety Authority (TSSA)
- Natural-gas-fired ovens, boilers, compressed-gas storage fall under TSSA — installation inspections, periodic maintenance, operator certifications.
#### 2.2.6 Fire Code (Ontario Reg. 213/07)
- Hazardous chemical storage classification, ventilation, spill containment, fire-separation, inspection log.
---
### 2.3 Municipal (City of Toronto)
#### 2.3.1 Sewer Use By-law — Toronto Municipal Code Chapter 681
*Last amended 15 May 2023.*
**Prohibited discharges (§ 681-2A(3))** — absolute prohibition regardless of concentration:
acute hazardous waste chemicals, combustible liquid, fuels, hauled waste (without permit), hazardous industrial waste, hazardous waste chemicals, pathological waste, PCBs, pesticides, reactive waste, severely toxic waste, ignitable waste, solid obstructing substances.
**Table 1 — Limits for Sanitary and Combined Sewers Discharge** (key parameters for a plating shop):
| Parameter | Limit | Unit |
|-----------|-------|------|
| pH | > 6.0 to < 11.5 | SU |
| Temperature | < 60 | °C |
| Biochemical oxygen demand (BOD) | 300 | mg/L |
| Suspended solids (total) | 350 | mg/L |
| Phosphorus (total) | 10 | mg/L |
| Cyanide (total) | 2 | mg/L |
| Fluoride | 10 | mg/L |
| Oil & grease (mineral & synthetic) | 15 | mg/L |
| Phenolics (4AAP) | 1.0 | mg/L |
| **Nickel (total)** | **2** | **mg/L** |
| Copper (total) | 2 | mg/L |
| Chromium (total) | 4 | mg/L |
| Chromium (hexavalent) | 2 | mg/L |
| Zinc (total) | 2 | mg/L |
| Lead (total) | 1 | mg/L |
| Cadmium (total) | 0.7 | mg/L |
| Cobalt (total) | 5 | mg/L |
| Arsenic (total) | 1 | mg/L |
| Mercury (total) | 0.01 | mg/L |
| Molybdenum (total) | 5 | mg/L |
| Aluminum (total) | 50 | mg/L |
| Manganese (total) | 5 | mg/L |
**Table 2 — Storm Sewer Discharge** limits are **dramatically stricter** (e.g. Nickel 0.08 mg/L, Zinc 0.04 mg/L, Mercury 0.0004 mg/L). Plating rinse and spill water must be kept out of storm sewers.
**§ 681-3 Prohibition of dilution** — cannot dilute to meet a limit.
**§ 681-5 Pollution Prevention Plan (P2)**:
- Required for every **subject sector industry** (metal finishing is listed) and for any industry discharging a **subject pollutant** (Table 3 — includes nickel, chromium, copper, zinc, cobalt, cadmium, arsenic, lead, molybdenum, mercury, selenium).
- First plan due within **1 year** of commencing operations.
- Full re-plan every **6 years**; update at **year 3**.
- Plan contents: process description, subject-pollutant inventory, current quantities discharged, current reduction activities, options evaluation, **3- and 6-year reduction targets**, implementation schedule.
- Non-compliance updates required within **90 days** of any new subject pollutant being discharged.
**§ 681-6 Agreements** — an **Industrial Waste Surcharge Agreement (IWSA)** or **Over-strength Agreement / Compliance Agreement** may be needed where a parameter cannot be met; subject to surcharge fees, self-monitoring and reporting.
**§ 681-8 Sampling and analytical requirements** — composite or grab sampling per City-approved Standard Methods; samples must be analysed by an **ISO/IEC 17025-accredited laboratory**.
**§ 681-13 Self-monitoring** — ongoing obligation to sample, record and report under the terms of any agreement or permit.
**§ 681-14.3 Document retention** — records referenced in the by-law must be retained per the by-law's own retention clause (verify current duration with City; historically **five years** is typical for sampling and P2 supporting records).
#### 2.3.2 Fire Services — hazardous-material inventory reporting, on-site emergency plan filed with Toronto Fire.
#### 2.3.3 Zoning & Building Permits — confirm current use permits, building compliance for process wastewater pre-treatment equipment.
---
### 2.4 Industry / Customer-Driven (Voluntary but Usually Mandatory in Practice)
| Standard | What it requires | Record obligations |
|----------|------------------|--------------------|
| **ISO 9001:2015** | Quality management system, document control, corrective actions, internal audits. | Controlled documents, CAPA, management review minutes, audit reports, training records. |
| **ISO 14001:2015** | Environmental management system, aspects/impacts register, legal register, operational controls, emergency preparedness. | EMS manual, objectives & targets, non-conformance log, monitoring results. |
| **AS9100 Rev D** | ISO 9001 + aerospace: risk, configuration management, counterfeit-part prevention, full traceability. | Certificate of Conformance per lot, full heat/batch traceability, calibration records. |
| **Nadcap AC7108 (electroless plating)** | Audit criteria specific to EN plating — process control, bath chemistry monitoring, thickness testing, adhesion testing, hydrogen embrittlement relief, corrosion testing. | Process control charts, bath analysis logs, operator certification, customer specification cross-reference. |
| **CGP (Controlled Goods Program)** | Personnel security screening, visitor control, physical security of controlled technology. | Security plan, personnel assessments, visitor logs, transfer records. |
---
## 3. Record-Keeping Obligations — Consolidated Table
| Record type | Source regulation | Minimum retention | Must be stored/searchable in the system? |
|-------------|-------------------|-------------------|--------------------------------------------|
| ECA-required source monitoring & maintenance | Ontario ECA condition | Life of ECA + specified years (often 5) | **Yes** — auto-generate compliance reports |
| Source-testing reports (stack tests) | ECA / Reg. 419/05 | 5 years | Yes |
| Waste generator reports + manifests | Reg. 347 / RPRA | 2 years minimum | **Yes** |
| Bath analysis / process control logs | Customer specs / Nadcap | 510 years (often life of part + 7) | **Yes** |
| Calibration records (thickness gauges, pH meters, thermocouples, balances) | ISO 9001 / AS9100 / Nadcap | Life of equipment + 35 years | **Yes** |
| Sewer self-monitoring samples & lab reports | By-law Ch. 681 | Per by-law (verify — typically 5 years) | **Yes** |
| Pollution Prevention Plan + updates | By-law Ch. 681 § 681-5 | 6-year cycle kept permanently on file | Yes |
| NPRI reports + calculation support | CEPA / NPRI | 3 years | Yes |
| TDG shipping documents | TDG Regs | 2 years (road) | **Yes** |
| TDG training certificates | TDG Regs | Duration of employment + 2 years | Yes |
| WHMIS SDS library | HPR / WHMIS 2015 | Current + rolling 3-year window | **Yes** |
| WHMIS training records | OHSA / HPR | Duration of employment; best practice 7 years | Yes |
| Exposure monitoring (air sampling for nickel, acids) | OHSA / Reg. 833 | Minimum 1 year in Ontario; best practice 30 years for carcinogens | **Yes** |
| JHSC minutes | OHSA | 1 year minimum; best practice permanent | Yes |
| First-aid log & incident investigations | OHSA / Reg. 1101 | 5 years (WSIB) | **Yes** |
| Preventive maintenance / equipment files | ISO 9001 | Life of equipment | **Yes** |
| Certificates of Conformance / customer part traceability | AS9100 / Nadcap | Per customer contract — commonly 710 years or part life | **Yes** |
| Internal audit reports | ISO 9001 / AS9100 | Typically 3 audit cycles | Yes |
| Management review minutes | ISO 9001 | 3 years minimum | Yes |
| Non-conformance / CAR / corrective action log | ISO 9001 / AS9100 | 5 years | **Yes** |
| Supplier approval / material certifications | AS9100 | Per customer contract (710 years common) | **Yes** |
**Bold "Yes"** flags the records where the module has to actively capture, validate, and make retrievable the data at the point of work — not just store a file somewhere.
---
## 4. How Compliance Translates into Module Features
Grouping the above into operational concerns the Odoo module must address:
### 4.1 Environmental compliance surface
- **Chemical inventory** tied to SDS library, expiry tracking, supplier certificates.
- **Bath chemistry log** — scheduled titration, pH, temperature, nickel concentration, hypophosphite concentration, contaminant tracking, bath life and rejuvenation events.
- **Waste generation log** — by waste stream, tied to manifests and RPRA registration.
- **Sewer monitoring log** — grab and composite samples, accredited-lab reports, automatic flagging if any result approaches an 80 % trigger of Table 1 limits.
- **Emission & energy log** (for ECA and NPRI) — consumption of nickel, hypophosphite, acids; calculation worksheets; annual NPRI roll-up.
- **Spill / incident register** with Spills Action Centre reporting workflow.
### 4.2 Worker safety surface
- **SDS library** with version control and review dates.
- **Training matrix** per employee × competency (WHMIS, TDG, confined-space, spill response, process-specific). Auto-flag expiring certs.
- **Exposure monitoring records** — air sampling, medical surveillance opt-in, hearing, respiratory fit-test.
- **JHSC meeting register** and corrective actions.
- **First-aid / injury / near-miss** register feeding WSIB claims.
### 4.3 Quality / customer surface
- **Customer & part master** with specification references (e.g. AMS 2404, ASTM B733, MIL-C-26074, customer-internal specs).
- **Router / process card** — every step, time, temperature, bath, concentration requirement, sign-off.
- **Traceability** — job → lot → bath → operator → equipment → test results → certificate of conformance.
- **Calibration register** with due-date alerts and out-of-tolerance impact assessment.
- **Non-conformance / CAR** workflow with root cause, containment, corrective and preventive actions.
- **Document control** (procedures, work instructions, forms) with revision history and trained-on-revision matrix.
- **Internal audit schedule** and management-review dashboard.
### 4.4 Order processing surface (where "the team worries about the work, not the system")
- **Quote → sales order → router → production → inspection → certificate → shipping → invoice** — one chain, one record.
- **Delegation and task routing** — the boss can drop an incoming order into the system and it self-assigns: sales confirms, engineer scopes, scheduler slots, supervisor releases, operator logs, inspector releases, shipper labels.
- **Customer portal** — drop drawings, approve quotes, see job status, download Certificates of Conformance.
- **Shop-floor dashboards** on tablets — "what's next on my line", "what's parked waiting for first-piece inspection", "what's my bath chemistry telling me to do in 30 minutes".
---
## 5. Items to Confirm with the Client
When the owner meeting happens, these are the questions whose answers change the module scope:
1. **Scope of work** — aerospace / defence / automotive / electronics / general industrial? Determines whether AS9100 / Nadcap / CGP are in scope.
2. **Existing ECA** — do they already hold one, when was it last updated, what are the specific conditions?
3. **Sewer permit / IWSA status** — are they discharging under a Compliance Agreement or at Table 1 limits?
4. **Waste volumes** — are they a Small Quantity Generator or Large? Drives RPRA reporting cadence.
5. **Certifications held** — ISO 9001? AS9100? Nadcap? CGP? Audit calendar?
6. **Existing systems** — is there an ERP today? Paper? Spreadsheets? What has to be migrated?
7. **Payroll / HR** — will fusion_payroll play into this or is that separate?
8. **Stakeholders** — owner, plant manager, quality manager, environment/EHS lead, sales, accounting. Who signs off on what?
9. **Shop-floor reality** — are operators comfortable with tablets? Rugged kiosks? Barcode / RFID?
10. **Integrations** — accounting (Odoo core?), customer EDI, shipping (Canada Post / courier APIs?), laboratory LIMS for bath analyses?
---
## 6. Sources
- [Ontario Environmental Compliance Approval guide](https://www.ontario.ca/page/environmental-compliance-approval)
- [Guide to Applying for an Environmental Compliance Approval (PDF)](https://dr6j45jk9xcmk.cloudfront.net/documents/962/5-8-2-eca-guide-en.pdf)
- [Toronto Municipal Code Chapter 681, Sewers (PDF, 15 May 2023)](https://www.toronto.ca/legdocs/municode/1184_681.pdf)
- [Toronto Sewers By-law program page](https://www.toronto.ca/services-payments/water-environment/water-sewer-related-permits-and-bylaws/sewers-by-law/)
- [Toronto Pollution Prevention (P2) Program](https://www.toronto.ca/services-payments/water-environment/water-sewer-related-permits-and-bylaws/sewers-by-law/pollution-prevention-p2-program/)
- [Ontario Reg. 347 Registration Guidance Manual](https://www.ontario.ca/document/registration-guidance-manual-generators-liquid-industrial-and-hazardous-waste)
- [RPRA Hazardous Waste Program Registry](https://rpra.ca/programs/hwp/)
- [Guide to the Designated Substances Regulation (O. Reg. 490/09)](https://www.ontario.ca/document/guide-designated-substances-workplace/overview-regulation) — note: nickel is not designated
- [Ontario OELs under Regulation 833](https://www.ontario.ca/page/current-occupational-exposure-limits-ontario-workplaces-under-regulation-833)
- [CEPA Schedule 1 — oxidic, sulphidic, soluble inorganic nickel compounds](https://www.canada.ca/en/environment-climate-change/services/management-toxic-substances/list-canadian-environmental-protection-act/oxidic-sulphidic-soluble-inorganic-nickel.html)
- [NPRI Substance list by threshold](https://www.canada.ca/en/environment-climate-change/services/national-pollutant-release-inventory/substances-list/threshold.html)
- [CCOHS Transportation of Dangerous Goods overview](https://www.ccohs.ca/oshanswers/legisl/tdg/tdg_overview.html)
- [Nadcap AC7108 Electroless Plating audit criteria — supplier references](https://www.newmethodplating.com/nadcap-accreditation-and-as7108-certification-for-chemical-processing/)
---
**This is a working reference. Verify all limits, thresholds and retention periods with an Ontario-licensed environmental consultant before incorporating them into a signed proposal or compliance undertaking.**

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,854 @@
# EN Tech Plating — End-to-End Workflow Design Spec
**Date:** 2026-04-12
**Author:** Nexa Systems (Claude-assisted)
**Client:** EN Technologies (Electroless Nickel Technologies Inc.)
**Status:** Approved for implementation planning
---
## 1. Overview
Complete end-to-end ERP workflow for an electroless nickel plating shop, replacing Steelhead Software. The system covers customer inquiry through invoicing, with a quotation configurator, parts receiving/inspection, flexible invoicing strategies, automated email notifications, certificate management, and local delivery dispatch.
### Model Naming Convention
| Context | Convention | Example |
|---------|-----------|---------|
| New custom models (all new modules) | `fp.*` prefix | `fp.part.catalog`, `fp.certificate` |
| Existing custom models (already in codebase) | Keep `fusion.plating.*` | `fusion.plating.portal.job`, `fusion.plating.delivery` |
| New fields on standard Odoo models | `x_fc_*` prefix | `x_fc_po_number` on `sale.order` |
| Legacy fields (from Studio era) | `x_studio_*` | Preserved, not renamed |
The `fp.*` prefix is the new short-form convention for all models created in the new modules. Existing `fusion.plating.*` models are NOT renamed — they keep their current `_name`. All references in this spec use canonical `_name` values.
### Architecture: Approach 2 — Dedicated Modules per Sub-System
| Module | Purpose | Location |
|--------|---------|----------|
| `fusion_plating_configurator` | Quotation configurator, 3D viewer, pricing engine, part catalog | `fusion-plating/` |
| `fusion_plating_receiving` | Parts receiving, inspection, damage logging, PO matching | `fusion-plating/` |
| `fusion_plating_invoicing` | Invoice strategy engine (deposit/progress/net/COD), account holds | `fusion-plating/` |
| `fusion_plating_notifications` | Auto-email engine, notification templates, audit log | `fusion-plating/` |
| `fusion_plating_certificates` | Certificate registry (CoC, thickness, Nadcap, customer-specific) | `fusion-plating/` |
| `fusion_tasks` | Local delivery dispatch (forked from Westin, stripped of claims) | `Entech Plating/` |
Plus updates to existing modules:
- `fusion_plating_bridge_mrp` — Recipe-to-WO generation (lightweight; gates live in their own modules)
- `fusion_plating_portal` — Customer-facing configurator UI, 3D preview
- `fusion_plating_reports` — CoC template updates, thickness report template
- `fusion_plating_quality` — Thickness reading model for Fischerscope data
---
## 2. Sales Integration — Fusion Plating as Single Hub
The Fusion Plating app becomes the single workspace. Users never leave it. Sale orders are managed with custom plating-specific views.
### Menu Structure
```
Fusion Plating (app)
├── Sales (default landing)
│ ├── Quotations (sale.order, state=draft/sent)
│ ├── Sale Orders (sale.order, state=sale)
│ ├── Customers (res.partner, customer_rank > 0)
│ └── Part Catalog (fp.part.catalog)
├── Configurator
│ ├── New Quote (fp.quote.configurator, persistent model)
│ ├── Coating Configurations (fp.coating.config)
│ └── Pricing Rules (fp.pricing.rule)
├── Manufacturing
│ ├── Manufacturing Orders
│ ├── Work Orders
│ └── Plant Overview
├── Receiving & Inspection
├── Shipping & Delivery
│ ├── Deliveries (fp.delivery)
│ ├── Local Delivery Tasks (fusion.delivery.task)
│ └── Routes (fp.route)
├── Certificates
│ ├── All Certificates (fp.certificate)
│ ├── Certificates of Conformance (filtered: type=coc)
│ └── Thickness Reports (filtered: type=thickness_report)
├── Quality
├── Portal Jobs
├── Reports
└── Configuration
```
### Sale Order Extensions (fields on `sale.order`)
- `x_fc_configurator_id` — link back to configurator session
- `x_fc_part_catalog_id` — customer part being ordered
- `x_fc_coating_config_id` — coating configuration
- `x_fc_po_number` — customer PO reference (Char)
- `x_fc_po_attachment_id` — uploaded PO document
- `x_fc_po_received` — Boolean
- `x_fc_po_override` — Boolean (manager override — proceed without PO)
- `x_fc_po_override_reason` — Text
- `x_fc_invoice_strategy` — Selection (deposit, progress, net_terms, cod_prepay)
- `x_fc_deposit_percent` — Float
- `x_fc_rush_order` — Boolean
- `x_fc_delivery_method` — Selection (local_delivery, shipping_partner, customer_pickup)
- `x_fc_receiving_status` — Selection (not_received, partial, received, inspected) — computed
- Smart buttons: Portal Job, Manufacturing Order, Delivery, Receiving, Invoices, Certificates
### Custom Sale Order Views
- **List**: Customer, PO#, Part, Coating, Qty, Total, Receiving Status, Job Status, Delivery Method
- **Form**: inherits sale.order form, adds plating tabs (Part Details, Coating Config, Receiving, Job Tracking)
- **Kanban**: cards grouped by stage (Draft → Quoted → PO Received → Parts Received → In Production → Shipped → Invoiced)
### Permission-Based Visibility
The existing codebase defines a 4-level privilege hierarchy in `fusion_plating/security/fp_security.xml`: Operator → Supervisor → Manager → Administrator. These new groups are **role-based** and work **alongside** (not replacing) the existing privilege levels. A user has both a privilege level (what they can do: read/write/create/delete) and one or more roles (what they can see: which menus appear).
| Role Group | Menu Visibility | Required Privilege Level |
|------------|----------------|------------------------|
| `fp_group_estimator` | Sales, Configurator, Customers, Part Catalog | Supervisor+ |
| `fp_group_shop_manager` | Everything (full menu) | Manager+ |
| `fp_group_shop_floor` | Manufacturing, Work Orders, Plant Overview only | Operator+ |
| `fp_group_receiving` | Receiving & Inspection, can view Sales (read-only) | Operator+ |
| `fp_group_shipping` | Shipping & Delivery, can view Sales (read-only) | Operator+ |
| `fp_group_quality` | Quality, can view Manufacturing | Supervisor+ |
| `fp_group_accounting` | Sales (invoicing fields), Reports | Supervisor+ |
Users are assigned to one or more role groups. The existing privilege hierarchy controls CRUD permissions; role groups control menu/view visibility. `fp_group_shop_manager` implies all other role groups (full access).
Standard Odoo groups are still required for underlying model access (e.g. `sales_team.group_sale_salesman` for SO access).
---
## 3. `fusion_plating_configurator` — Quotation Configurator & Pricing Engine
### Users
- **Primary:** Internal estimator (full control, detailed configurator, price override)
- **Secondary:** Portal customer (simplified self-service, estimated pricing, 3D preview, lead gen)
### Core Models
#### `fp.part.catalog` — Customer Part Library
| Field | Type | Description |
|-------|------|-------------|
| `partner_id` | Many2one res.partner | Customer (required) |
| `name` | Char | Part name/description |
| `part_number` | Char | Customer's part number |
| `revision` | Char | Revision letter/number |
| `substrate_material` | Selection | aluminium, steel, stainless, copper, titanium, other |
| `geometry_source` | Selection | 3d_model, manual, pdf_drawing |
| `model_attachment_id` | Many2one ir.attachment | STEP/STL/IGES file |
| `drawing_attachment_ids` | Many2many ir.attachment | PDF drawings |
| `surface_area` | Float | Surface area value |
| `surface_area_uom` | Selection | sq_in, sq_ft, sq_cm, sq_m |
| `weight` | Float | For shipping cost calc |
| `dimensions_length` | Float | Manual measurement |
| `dimensions_width` | Float | Manual measurement |
| `dimensions_height` | Float | Manual measurement |
| `complexity` | Selection | simple, moderate, complex, very_complex |
| `masking_zones` | Integer | Number of areas requiring masking |
| `masking_description` | Text | e.g. "mask threaded holes" |
| `has_blind_holes` | Boolean | Complexity flag |
| `has_recesses` | Boolean | Complexity flag |
| `has_threads` | Boolean | Complexity flag |
| `notes` | Html | |
| `active` | Boolean | Archivable |
#### `fp.coating.config` — Coating Configuration Template
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | e.g. "EN Mid-Phos AMS 2404" |
| `process_type_id` | Many2one fusion.plating.process.type | Process type |
| `recipe_id` | Many2one fusion.plating.process.node | Default recipe. **Domain: `[('node_type', '=', 'recipe')]`** |
| `phosphorus_level` | Selection | low_phos, mid_phos, high_phos, na |
| `thickness_min` | Float | Min thickness |
| `thickness_max` | Float | Max thickness |
| `thickness_uom` | Selection | mils, microns, inches |
| `spec_reference` | Char | e.g. "AMS 2404" |
| `certification_level` | Selection | commercial, mil_spec, nadcap, nuclear |
| `pre_treatment_ids` | Many2many fp.treatment | Bead blast, zincate, etc. |
| `post_treatment_ids` | Many2many fp.treatment | Bake, passivate, chromate, etc. |
| `active` | Boolean | |
#### `fp.treatment` — Pre/Post Treatment
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | e.g. "Bead Blast", "Zincate", "Bake" |
| `treatment_type` | Selection | pre, post |
| `default_duration_minutes` | Float | Estimated duration |
| `currency_id` | Many2one res.currency | Company currency (default) |
| `default_cost` | Monetary | Cost per application |
#### `fp.pricing.rule` — Formula-Based Pricing Engine
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Rule description |
| `coating_config_id` | Many2one fp.coating.config | Optional filter (global if blank) |
| `substrate_material` | Selection | Optional filter |
| `certification_level` | Selection | Optional filter |
| `pricing_method` | Selection | per_sqin, per_sqft, per_piece, flat_rate, formula |
| `currency_id` | Many2one res.currency | Company currency (default) |
| `base_rate` | Monetary | $ per unit |
| `thickness_factor` | Float | Multiplier per mil of thickness |
| `complexity_surcharge_ids` | One2many fp.pricing.complexity.surcharge | Surcharges by complexity level |
| `masking_rate_per_zone` | Monetary | $ per masking area |
| `setup_fee` | Monetary | One-time per batch |
| `minimum_charge` | Monetary | Floor price |
| `rush_surcharge_percent` | Float | Rush premium % |
| `sequence` | Integer | Priority — first matching rule wins |
| `active` | Boolean | |
#### `fp.pricing.complexity.surcharge` — Complexity-Based Surcharge Line
| Field | Type | Description |
|-------|------|-------------|
| `rule_id` | Many2one fp.pricing.rule | Parent rule (cascade) |
| `complexity` | Selection | simple, moderate, complex, very_complex |
| `surcharge_percent` | Float | Surcharge % for this complexity level |
#### `fp.quote.configurator` — The Configurator Session (Persistent Model)
This is a `models.Model` (NOT transient). Records persist for audit trail, re-quoting, and linking back from sale orders. The SO links back via `x_fc_configurator_id`.
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Auto-sequence (CFG-00001) |
| `state` | Selection | draft, confirmed, cancelled |
| `partner_id` | Many2one res.partner | Customer |
| `part_catalog_id` | Many2one fp.part.catalog | For repeat parts |
| `coating_config_id` | Many2one fp.coating.config | Coating selection |
| `quantity` | Integer | Number of parts |
| `batch_size` | Integer | Parts per rack/barrel |
| `surface_area` | Float | From catalog or entered |
| `thickness_requested` | Float | |
| `masking_zones` | Integer | |
| `complexity` | Selection | simple, moderate, complex, very_complex |
| `rush_order` | Boolean | |
| `turnaround_days` | Integer | |
| `delivery_method` | Selection | local_delivery, shipping_partner, customer_pickup |
| `currency_id` | Many2one res.currency | Company currency (default) |
| `shipping_fee` | Monetary | |
| `delivery_fee` | Monetary | |
| `calculated_price` | Monetary | Computed from pricing rules |
| `price_breakdown_html` | Html | Rendered breakdown |
| `estimator_override_price` | Monetary | Final price (defaults to calculated) |
| `sale_order_id` | Many2one sale.order | Created SO (set on "Create Quotation") |
| `notes` | Text | |
**Lifecycle:** draft → (estimator builds quote) → confirmed (when SO created) → cancelled (if abandoned). Confirmed records are read-only. Re-quoting creates a new configurator record.
### Price Calculation Flow
```
Part Catalog (surface area, complexity, masking)
+ Coating Config (process, thickness, spec level)
+ Pricing Rules (matched by coating + substrate + cert level)
+ Quantity / Batch Size
+ Rush surcharge (if applicable)
+ Delivery / Shipping fees
= Calculated Price
→ Estimator reviews & overrides if needed
→ Final quote price
```
### 3D Viewer
- OWL component using **Three.js** for STL rendering and **OCCT (OpenCascade) WASM** for STEP parsing
- Renders on both backend configurator form and portal page
- Features: wireframe/solid toggle, rotate/zoom, surface area highlight
- Server-side surface area calculation: Python `trimesh` (STL) / `cadquery`/`OCP` (STEP)
- Fallback: manual measurements if server can't parse the file
- Roadmap: Claude Vision for PDF drawing measurement extraction
### Portal Side (Customer-Facing)
- Simplified wizard: upload part → select coating type → see estimated price range
- Uses same `fp.quote.configurator` model with restricted fields
- Customer sees estimated price range (not exact), 3D preview
- Submits → creates `fp.quote.request` with configurator data attached
- Internal estimator sees customer's config and refines it
### Configurator → Sale Order Flow
1. Estimator opens Configurator → builds quote
2. Clicks "Create Quotation" → sale.order created with all x_fc_* fields
3. SO line(s) auto-created (product = service product per coating type, qty, price = estimator's final price)
4. Estimator reviews SO → sends quotation
5. Customer accepts → confirms SO → triggers downstream flow
---
## 4. `fusion_plating_receiving` — Parts Receiving & Inspection
### Core Models
#### `fp.receiving` — Receiving Record
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Auto-sequence (RCV-00001) |
| `sale_order_id` | Many2one sale.order | Required. **Design decision:** one receiving record per SO. If a customer ships parts for multiple SOs in one box, create separate receiving records per SO (receiver splits the count). This keeps the SO↔receiving link clean and avoids Many2many complexity. |
| `partner_id` | Many2one res.partner | Related from SO |
| `po_number` | Char | Related from SO x_fc_po_number |
| `received_by_id` | Many2one res.users | Who logged it |
| `received_date` | Datetime | Default=now |
| `state` | Selection | draft, inspecting, accepted, discrepancy, resolved |
| `expected_qty` | Integer | From SO line |
| `received_qty` | Integer | Entered by receiver |
| `qty_match` | Boolean | Computed: received == expected |
| `carrier_name` | Char | Who delivered |
| `carrier_tracking` | Char | Inbound tracking # |
| `notes` | Html | |
| `line_ids` | One2many fp.receiving.line | Per-part detail |
| `damage_ids` | One2many fp.receiving.damage | Damage log |
| `attachment_ids` | Many2many ir.attachment | Photos |
#### `fp.receiving.line` — Per-Part Receiving Detail
| Field | Type | Description |
|-------|------|-------------|
| `receiving_id` | Many2one fp.receiving | Cascade |
| `part_catalog_id` | Many2one fp.part.catalog | Optional |
| `part_number` | Char | |
| `description` | Char | |
| `expected_qty` | Integer | |
| `received_qty` | Integer | |
| `condition` | Selection | good, damaged, mixed |
| `notes` | Text | |
#### `fp.receiving.damage` — Damage Log Entry
| Field | Type | Description |
|-------|------|-------------|
| `receiving_id` | Many2one fp.receiving | Cascade |
| `description` | Text | What's damaged |
| `severity` | Selection | cosmetic, functional, rejected |
| `photo_ids` | Many2many ir.attachment | |
| `action_required` | Selection | none, notify_customer, return_parts, proceed_as_is |
| `customer_notified` | Boolean | |
| `customer_response` | Text | |
| `resolved` | Boolean | |
### Workflow
```
SO Confirmed → Receiving record auto-created (state=draft)
→ Parts arrive → receiver enters qty, inspects condition
→ Match + good → state=accepted
→ Mismatch or damage → state=discrepancy
→ SO flagged, follow-up activity created
→ Customer contacted → resolution logged → state=resolved
→ Accepted/Resolved → SO x_fc_receiving_status = 'received'
→ Manufacturing can proceed
```
### Manufacturing Gate
- `mrp.production.action_confirm()` checks `sale_order.x_fc_receiving_status`
- If not received → warning dialog (manager can override)
- Soft gate — warns, doesn't hard-block (flexibility for handshake deals, urgent jobs)
---
## 5. `fusion_plating_invoicing` — Invoice Strategy Engine
### Invoice Strategies
| Strategy | Behaviour |
|----------|-----------|
| `deposit` | Deposit invoice for X% on SO confirmation. Balance after shipping. |
| `progress` | Invoice per MO as each completes. |
| `net_terms` | Single invoice after shipping. Payment on terms. |
| `cod_prepay` | Full invoice on SO confirmation. Manufacturing blocked until paid. |
### Core Models
#### `fp.invoice.strategy.default` — Customer-Level Default
| Field | Type | Description |
|-------|------|-------------|
| `partner_id` | Many2one res.partner | Unique per customer |
| `default_strategy` | Selection | deposit, progress, net_terms, cod_prepay |
| `default_deposit_percent` | Float | e.g. 50.0 |
| `payment_term_id` | Many2one account.payment.term | |
| `notes` | Text | |
### Auto-Population Rules
When a customer is selected on a new SO:
1. Look up `fp.invoice.strategy.default` for that `partner_id`
2. If found → auto-fill `x_fc_invoice_strategy` and `x_fc_deposit_percent` from the default
3. If not found → leave blank (estimator must select manually)
4. Estimator can always override per order
When a coating config is selected in the configurator:
1. Auto-fill `thickness_requested` from `coating_config.thickness_min` (default to minimum)
2. Auto-fill surface area UOM from company default setting
When a part catalog entry is selected:
1. Auto-fill `surface_area`, `complexity`, `masking_zones`, `substrate_material` from the catalog entry
2. These can be overridden per-quote if the part has changed
### Account Hold (extends `res.partner`)
| Field | Type | Description |
|-------|------|-------------|
| `x_fc_account_hold` | Boolean | Manually set by accounting |
| `x_fc_account_hold_reason` | Text | Why hold was placed |
| `x_fc_account_hold_date` | Datetime | When placed (Datetime for audit precision) |
| `x_fc_account_hold_by_id` | Many2one res.users | Who placed it |
### Account Hold Behaviour
| Action | Hold Active | Result |
|--------|-------------|--------|
| Create new SO | Yes | Warning banner. SO can still be created. |
| Confirm SO | Yes | Blocked. Manager override available. |
| Create invoice | Yes | Blocked. Manager override available. |
| Ship / mark delivered | Yes | Blocked. Manager override available. |
| Customer visits portal | Yes | No visible indication. |
Roadmap: auto-hold computed from account.move aging.
### Invoice Automation
- **Deposit:** SO confirmed → auto-create deposit invoice (X%) → balance invoice after shipping
- **Progress:** Each MO done → invoice for that MO's portion → final invoice for remaining balance
- **Net terms:** Delivery complete → auto-create full invoice → payment terms applied
- **COD/Prepay:** SO confirmed → auto-create full invoice → MO blocked until payment reconciled
### Shipping Method Price Adjustment
- Method changes after invoicing:
- Draft invoice → amend the line
- Posted invoice → supplementary invoice or credit note
---
## 6. `fusion_plating_notifications` — Auto-Email Engine
### Notification Triggers
| Trigger Event | Email Name | Attachments | Recipient |
|---------------|-----------|-------------|-----------|
| Quotation sent | Quote Ready | Quote PDF | Customer contact |
| SO confirmed | Order Confirmation | SO PDF | Customer contact |
| Parts received | Parts Received | — | Customer contact |
| MO complete | Ready for Pickup/Ship | — | Customer contact |
| Delivery shipped (carrier) | Shipment Notification | CoC, Thickness Report, Invoice | Customer contact |
| Delivery completed (local) | Delivery Confirmation | CoC, Thickness Report, Invoice, POD | Customer contact |
| Invoice posted | Invoice Notification | Invoice PDF | Billing contact |
| Deposit invoice created | Deposit Required | Deposit Invoice PDF | Billing contact |
### Core Models
#### `fp.notification.template` — Configurable Email Templates
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Template name |
| `trigger_event` | Selection | Event type |
| `mail_template_id` | Many2one mail.template | Actual Odoo template |
| `active` | Boolean | Can disable specific notifications |
| `attach_coc` | Boolean | |
| `attach_thickness_report` | Boolean | |
| `attach_invoice` | Boolean | |
| `attach_packing_list` | Boolean | |
| `attach_pod` | Boolean | |
| `cc_internal_ids` | Many2many res.users | Internal CCs |
#### `fp.notification.log` — Audit Trail
| Field | Type | Description |
|-------|------|-------------|
| `template_id` | Many2one fp.notification.template | |
| `trigger_event` | Selection | |
| `sale_order_id` | Many2one sale.order | |
| `partner_id` | Many2one res.partner | |
| `sent_date` | Datetime | |
| `recipient_email` | Char | |
| `attachment_names` | Text | Comma-separated list |
| `status` | Selection | sent, failed, bounced |
| `error_message` | Text | |
| `mail_mail_id` | Many2one mail.mail | |
### Document Assembly (Shipment Email)
1. Find portal job linked to SO/MO
2. Generate CoC PDF (bilingual EN/FR, customer logo, Nadcap badge if applicable)
3. Attach thickness report if available
4. Attach invoice PDF
5. Include tracking info in email body (carrier tracking # or driver ETA)
6. Send to customer contact
7. Log in fp.notification.log
### CoC Report Updates
- Customer logo placement (from partner.image_1920)
- Nadcap badge (conditional)
- EN Tech branding (replace Steelhead)
- Recorded thickness field
- Process description with spec references
- Bilingual certification statement
- Quantities: Shipped/Exp, NC Qty columns
- Configurable certifying authority signature
### Thickness / Measurement Report (NEW template)
Based on Fischerscope XDAL 600 output:
- EN Tech header
- Equipment info (model, product, application)
- Microscope image (attached photo)
- Reading data table (NiP mils, Ni %, P %)
- Statistical summary (Mean, Std Dev, CoV%, Range)
- Calibration standard reference
- Operator, date/time
- Data entry: manual for now, future Fischerscope CSV import
### Work Centre Mapping Note
The codebase has two work centre models: `fusion.plating.work.center` (core) and `mrp.workcenter` (standard MRP). Recipe nodes reference `fusion.plating.work.center`; MRP work orders use `mrp.workcenter`. The recipe-to-WO generation logic in `fusion_plating_bridge_mrp` must map between them. Each `fusion.plating.work.center` should have an `x_fc_mrp_workcenter_id` field linking to the corresponding `mrp.workcenter`. This mapping field should be added to the core module.
---
## 7. `fusion_plating_certificates` — Certificate Registry
**Module owner:** `fusion_plating_certificates` (NEW dedicated module).
**Dependencies:** `fusion_plating`, `fusion_plating_portal`, `fusion_plating_reports`, `mrp`
This module owns `fp.certificate` and `fp.thickness.reading`. It depends on `fusion_plating_portal` for the `fusion.plating.portal.job` link and on `fusion_plating_reports` for report generation.
### Model: `fp.certificate`
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Auto-sequence (CERT-00001) |
| `certificate_type` | Selection | coc, thickness_report, mill_test, nadcap_cert, customer_specific |
| `partner_id` | Many2one res.partner | Customer |
| `sale_order_id` | Many2one sale.order | |
| `production_id` | Many2one mrp.production | |
| `portal_job_id` | Many2one fusion.plating.portal.job | Uses canonical model name |
| `part_number` | Char | Denormalized for fast search |
| `process_description` | Char | e.g. "ELECTROLESS NICKEL PLATING PER AMS 2404" |
| `spec_reference` | Char | |
| `po_number` | Char | Customer PO ref |
| `entech_wo_number` | Char | Internal WO # |
| `quantity_shipped` | Integer | |
| `issued_by_id` | Many2one res.users | |
| `certified_by_id` | Many2one res.users | Signing authority |
| `issue_date` | Date | Default=today |
| `attachment_id` | Many2one ir.attachment | Generated PDF |
| `thickness_reading_ids` | One2many fp.thickness.reading | Linked measurements |
| `state` | Selection | draft, issued, voided |
| `void_reason` | Text | |
| `notes` | Html | |
### Model: `fp.thickness.reading` — Fischerscope Measurement Data
| Field | Type | Description |
|-------|------|-------------|
| `certificate_id` | Many2one fp.certificate | Parent certificate (cascade) |
| `production_id` | Many2one mrp.production | Link to MO (independent of cert) |
| `reading_number` | Integer | Reading sequence (n=1, n=2, n=3) |
| `nip_mils` | Float(10,4) | NiP thickness in mils |
| `ni_percent` | Float(6,3) | Nickel content % |
| `p_percent` | Float(6,4) | Phosphorus content % |
| `position_label` | Char | Where on the part this reading was taken |
| `equipment_model` | Char | e.g. "Fischerscope XDAL 600" |
| `product_ref` | Char | e.g. "2805031 / NiP/Al-alloys 2805030" |
| `calibration_std_ref` | Char | e.g. "NiP/Al STD SET SN 100174568" |
| `microscope_image_id` | Many2one ir.attachment | Microscope photo |
| `operator_id` | Many2one res.users | Who took the reading |
| `reading_datetime` | Datetime | When reading was taken |
| `measuring_time_seconds` | Integer | e.g. 120 |
**Statistical fields** (computed from reading lines per certificate):
- `mean_nip_mils`, `stddev_nip_mils`, `cov_percent`, `range_nip_mils` — computed on `fp.certificate` from its `thickness_reading_ids`
### Auto-Creation
When CoC or thickness report is generated, `fp.certificate` record auto-created with PDF attached.
### Views
- **List** (default, newest first): Issue Date, Cert #, Type, Customer, Part #, PO #, Entech WO#, Process, Qty, Issued By, Status
- **Search**: Quick filters by Customer, Certificate Type, Date Range, Part Number, PO Number. Group by: Customer, Type, Month, Issued By.
- **Form**: Certificate type badge, state buttons (Issue/Void), customer info, part details, tabs for Thickness Readings, Attachments, Notes. "Regenerate PDF" and "Send to Customer" buttons.
### CoC Bilingual Implementation
The bilingual EN/FR certification statement uses QWeb template logic with `t-if` on a `bilingual` flag (default: True for Canadian compliance). The English and French text blocks are both rendered in the same template — not using Odoo's `ir.translation` system, since both languages must appear on the same document simultaneously.
---
## 8. `fusion_tasks` (Entech Plating) — Local Delivery Dispatch
### Fork & Strip Strategy
**Remove:**
- Cross-instance sync (fusion.task.sync.config, shadow tasks)
- `fusion_claims.*` config parameters → rename to `fusion_tasks.*`
- `sales_team` dependency
- Irrelevant task types (repair, troubleshoot, assessment, ltc_visit, maintenance, installation)
- All sync-related fields (x_fc_sync_*)
**Keep:**
- Google Maps integration (Leaflet.js map view)
- GPS tracking (fusion.technician.location → fusion.driver.location)
- Geocoding (_geocode_address())
- Route planning / scheduling / conflict avoidance
- Push notifications (fusion.push.subscription)
- Map view JS/SCSS/XML
### Adapted Model: `fusion.delivery.task`
Renamed from `fusion.technician.task`.
**Task Types** (reduced):
- `delivery` — outbound delivery
- `pickup` — collect parts from customer
- `return` — return rejected/damaged parts
- `rush` — same-day urgent
**Status Workflow:**
- `pending``scheduled``en_route``delivered` (or `failed`)
**Key Fields:**
| Field | Type | Description |
|-------|------|-------------|
| `delivery_id` | Many2one fusion.plating.delivery | Links to logistics |
| `sale_order_id` | Many2one sale.order | |
| `portal_job_id` | Many2one fusion.plating.portal.job | Uses canonical model name |
| `partner_id` | Many2one res.partner | Customer |
| `driver_id` | Many2one hr.employee | Renamed from technician_id |
| `vehicle_id` | Many2one fusion.plating.vehicle | From logistics module |
| `packages_count` | Integer | Number of boxes/crates |
| `weight_total` | Float | Total weight |
| `requires_signature` | Boolean | POD required |
| `requires_photo` | Boolean | Photo proof required |
| `coc_attachment_id` | Many2one ir.attachment | CoC to hand to customer |
**Delivery Integration:**
- `action_mark_delivered()`: logs GPS + timestamp, captures signature/photo, updates fp.delivery → delivered, cascades to portal job → shipped, triggers shipment notification email
- `action_mark_failed()`: logs reason, creates follow-up activity
### Dependencies & Deployment
```python
'depends': ['base', 'mail', 'hr', 'fusion_plating_logistics'],
```
**Deployment strategy:** `fusion_tasks` lives in a separate repo (`Entech Plating/`) but is deployed to the SAME server as the fusion_plating modules. Both repos are copied to `/mnt/extra-addons/custom/` on the target server. The `fusion_plating_logistics` dependency is therefore always available at install time. There is no standalone driver-only install scenario — drivers access the system via the same Odoo instance. The standalone "Delivery Dispatch" menu (below) provides a driver-focused view without needing a separate deployment.
### Menu Placement
Inside Fusion Plating: Shipping & Delivery → Local Delivery Tasks, Driver Map
Standalone (optional): Delivery Dispatch app for drivers.
---
## 9. Complete End-to-End Workflow
### Stage 1: Customer Inquiry
- **Portal path:** Customer uploads 3D/PDF on portal → sees estimated price → submits → fp.quote.request created
- **Email/phone path:** Estimator creates fp.quote.request manually, uploads customer's files
- **Modules:** fusion_plating_portal, fusion_plating_configurator
### Stage 2: Quotation
- Estimator opens Configurator inside Fusion Plating app
- Selects/creates part in Part Catalog
- 3D model → auto surface area + 3D preview; PDF → manual measurements
- Selects Coating Configuration
- Pricing engine calculates from rules; estimator reviews/overrides
- Adds delivery/shipping fees, sets invoice strategy
- "Create Quotation" → sale.order with all x_fc_* fields
- Sends quotation → email notification with Quote PDF
- **Modules:** fusion_plating_configurator, fusion_plating_notifications
### Stage 3: Order Confirmation
- Customer accepts + submits PO (email or portal)
- PO number entered on SO, PO document uploaded (or manager override for handshake deals)
- SO confirmed:
- Account hold check → blocked if hold active (manager override)
- Invoice strategy fires (deposit/COD → auto-invoice; net_terms/progress → no invoice yet)
- Email: Order Confirmation + SO PDF
- Receiving record auto-created (draft)
- Portal job auto-created (received)
- **Modules:** fusion_plating_invoicing, fusion_plating_receiving, fusion_plating_bridge_mrp, fusion_plating_notifications
### Stage 4: Parts Receiving
- Parts arrive → receiver opens receiving record
- Counts parts, inspects condition
- Good → accepted; damage/mismatch → discrepancy → follow-up → resolved
- Email: Parts Received
- Portal job → in_progress
- **Modules:** fusion_plating_receiving, fusion_plating_notifications
### Stage 5: Manufacturing Planning
- MO created from SO (standard sale_mrp)
- Receiving gate: warns if parts not received
- COD gate: warns if prepay not paid
- Planner assigns recipe, configures opt-in/out steps
- Recipe → Work Orders generated (one WO per operation node, steps = WO instructions)
- **Modules:** fusion_plating_bridge_mrp
### Stage 6: Manufacturing Execution
- Operators work WOs on shopfloor (Plant Overview kanban, timers, bath/tank assignment)
- Quality holds if needed
- All WOs done → MO done:
- Portal job → ready_to_ship
- fp.delivery auto-created (draft)
- Thickness readings entered
- CoC + thickness report generated → fp.certificate records created
- Progress invoicing: if strategy=progress, invoice this MO's portion
- **Modules:** fusion_plating_shopfloor, fusion_plating_bridge_mrp, fusion_plating_quality, fusion_plating_invoicing
### Stage 7: Shipping / Local Delivery
**Shipping Partner (Purolator, FedEx, UPS, etc.):**
- fp.delivery scheduled with carrier + tracking #
- Packing list generated, delivery marked shipped
- Module: fusion_plating_logistics
**Local Delivery (EN Tech driver):**
- fusion.delivery.task created, driver + vehicle assigned
- Driver Map shows live GPS tracking
- Driver delivers → signature/photo POD → cascades to fp.delivery
- Module: fusion_tasks (Entech Plating)
**Customer Pickup:**
- Email: Ready for Pickup
- Customer arrives → parts released → signature → fp.delivery marked delivered
**All paths:**
- Portal job → shipped
- Email: CoC + Thickness Report + Invoice + Tracking/ETA
- **Modules:** fusion_plating_logistics, fusion_tasks, fusion_plating_notifications
### Stage 8: Invoicing & Payment
- Strategy determines timing:
- deposit → balance invoice after shipping
- progress → final invoice for remaining balance
- net_terms → full invoice after shipping
- cod_prepay → already invoiced & paid
- Delivery method change after invoice → supplementary invoice or credit note
- Invoice posted → portal job → complete → email with Invoice PDF
- **Modules:** fusion_plating_invoicing, fusion_plating_bridge_mrp, fusion_plating_notifications
### Stage 9: Customer Portal
- Full job lifecycle visible: progress bar (received → complete)
- Documents tab: CoC, thickness report, invoice — downloadable
- Part catalog: saved parts with 3D preview
- Order history: past orders, re-order from catalog
- Quote request history, tracking info, notification history
- **Modules:** fusion_plating_portal
---
## 10. Module Dependency Graph
```
fusion_plating (core)
├── fusion_plating_configurator
│ └── depends: fusion_plating, sale_management
├── fusion_plating_receiving
│ └── depends: fusion_plating, sale_management
│ └── provides: mrp.production gate mixin (overrides action_confirm)
├── fusion_plating_invoicing
│ └── depends: fusion_plating, sale_management, account
│ └── provides: invoice strategy automation, account hold on res.partner
├── fusion_plating_notifications
│ └── depends: fusion_plating, fusion_plating_reports, mail
├── fusion_plating_certificates
│ └── depends: fusion_plating, fusion_plating_portal,
│ fusion_plating_reports, mrp
├── fusion_plating_bridge_mrp (lighter — gates live in receiving/invoicing)
│ └── depends: fusion_plating, fusion_plating_configurator, mrp
│ └── soft-depends: fusion_plating_receiving, fusion_plating_invoicing
├── fusion_plating_portal
│ └── depends: fusion_plating, fusion_plating_configurator,
│ fusion_plating_notifications, portal
├── fusion_plating_logistics
│ └── depends: fusion_plating
└── fusion_tasks (Entech Plating — separate repo, same server)
└── depends: fusion_plating_logistics, hr, mail
```
**Note on bridge_mrp:** The receiving gate and invoice strategy gates are implemented as lightweight mixins within `fusion_plating_receiving` and `fusion_plating_invoicing` respectively (each overrides `mrp.production` independently). This avoids funnelling all dependencies through bridge_mrp. Bridge_mrp focuses on recipe-to-WO generation and the configurator link.
---
## 11. Pricing Variables Reference
All 10 pricing variables that drive the configurator:
1. **Surface area** — more area = more chemistry consumed
2. **Coating type** — EN, chrome, anodize, black oxide (different bath costs)
3. **Thickness spec** — more passes/dwell time
4. **Substrate material** — aluminium needs zincate pre-treatment
5. **Quantity / batch size** — more parts per rack = lower per-unit cost
6. **Part complexity** — blind holes, recesses, masking areas
7. **Masking requirements** — labour-intensive
8. **Spec / certification level** — Nadcap/aerospace = more QC overhead
9. **Turnaround time** — rush = premium
10. **Pre/post treatment** — bead blast, bake, passivate
---
## 12. Key Architectural Decisions
| Decision | Resolution |
|----------|------------|
| Configurator primary user | Internal estimator; portal is simplified lead-gen |
| 3D file handling | STEP/STL auto surface area calc + 3D preview; PDF manual (Claude Vision roadmap) |
| Pricing model | Formula-calculated with estimator override |
| Part catalog | Customer part library for repeat business + one-off support |
| PO requirement | Required before manufacturing, but manager override available |
| Invoice strategies | All 4 supported (deposit, progress, net_terms, cod_prepay), configurable per order |
| Account hold | Manual for now, auto from aging on roadmap |
| Shipping decision | Set at quote time, changeable later with price adjustment |
| Local delivery | Fork fusion_tasks, strip claims, keep GPS/maps |
| Certificate management | Unified fp.certificate registry with filters, auto-creation on report generation |
| Recipe → WO mapping | One WO per operation node, steps become WO instructions |
---
## 13. Data Migration: Existing Quote Request Flow
The existing `fusion.plating.quote.request` model has an `action_create_sale_order()` method that creates basic SOs. The new configurator introduces a parallel, richer path.
**Coexistence strategy:**
- The existing `action_create_sale_order()` on `fusion.plating.quote.request` remains functional — it is the "quick path" for simple quotes that don't need the full configurator
- The new configurator is the "full path" for detailed quotes with part catalog, coating config, and pricing rules
- When a quote request comes in via portal, the estimator chooses: use the configurator (creates `fp.quote.configurator` → SO) or use the quick path (existing `action_create_sale_order()`)
- Both paths create SOs with `x_fc_*` fields. The quick path leaves configurator-specific fields blank; the full path populates everything
- No existing data needs migration — the two paths coexist
---
## 14. Roadmap Items (Not in Initial Build)
- Claude Vision for PDF drawing measurement extraction
- Auto account hold computed from invoice aging
- Fischerscope CSV import (auto-populate thickness readings)
- Multi-driver route optimization
- Customer-specific certificate templates
- Product configurator on portal (dynamic pricing preview)
- Tags on recipe nodes
- Dashboard transitions on recipe nodes
- Treatment groups / choices on recipe nodes