Tablet Station rebuilt as a live dashboard (not just a QR scanner):
* KPI strip — WOs Ready/Progress, Awaiting/Missed bakes,
First-Piece pending, Quality Holds (each tinted by state)
* Active WO banner with pulsing indicator when a WO is running
* My Queue panel (left) — priority-badged operator next-up list,
clickable rows that jump to the WO/bake/gate form
* Baths tile grid (right) — last-log status chips, MTO count,
hover jump to chemistry log
* Bake Windows list — inline Start/End/Open actions, colour-coded
by state (awaiting / in-progress / missed)
* First-Piece Gates — Pass/Fail buttons for pending inspections
* Quality Holds — Review jump when any open holds exist
* Station picker + scan drawer (collapsed by default)
* 30s auto-refresh, persists picked station in localStorage
New controller endpoints: /fp/shopfloor/tablet_overview,
/fp/shopfloor/pair_station, /fp/shopfloor/mark_gate.
Demo seeder (Phase 12.5) now populates:
* 5 shop-floor stations (Plating, Bake, Inspection, Shipping, Receiving)
* +3 bake windows (awaiting / in-progress / near-due)
* 4 first-piece gates (1 pending, 1 passed+released, 1 passed-holding, 1 failed)
* 2 quality holds on active MOs (one on_hold, one under_review)
All four Shop Floor menu pages (Plant Overview, Tablet Station, Bake
Windows, First-Piece Gates) now have meaningful content.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
bridge_mrp._generate_workorders_from_recipe was writing 'description'
on mrp.workorder, which doesn't exist in Odoo 19 — instead the step
instructions now post to each WO's chatter after bulk create, which
is where the operator sees them anyway.
Demo seeder now creates the full WO chain:
- 9 MRP work centres paired with 9 FP work centres (FP-QUEUE, -RACK,
-MASK, -EN, -BAKE, -INSP, -DERACK, -DEMASK, -POSTBAKE) with
costs_hour set so actuals-vs-quoted margin can compute.
- Wires the existing ENP-ALUM-BASIC recipe's 9 operation nodes to
those FP work centres by matching names.
- Links every coating config to the recipe so the auto-assign hook
(mrp.production.action_confirm → _auto_assign_recipe_from_so) has
something to pull.
- Backfills work orders on all existing demo MOs: calls the generator
once recipe is set. For historical (done) MOs, marks all their WOs
done with backdated durations (25-90 min). For the Cyclone active
MO, sets a realistic progression: first WO done, second in progress
(priority: Hot), rest in 'ready'.
Verified: 90 WOs live, 10 per work centre. One MO shows the full
progression state mix. WO Traveller PDF renders (132KB) — both
portrait + landscape variants still work.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Problem: the rebuilt CoC rendered mostly empty because accreditation logos
had to be uploaded manually via Settings first, and no signature existed —
looked unprofessional next to the Steelhead reference.
Fix:
- Seeder now auto-generates clean text-based accreditation badges with PIL
(Nadcap blue, AS9100D/ISO 9001 blue, CGP red) sized to match the
reference layout. Client can swap in real trademarked logos via Settings
→ Fusion Plating → Accreditation Logos at any time.
- Seeder creates a demo "Kris Pathinather" user, sets them as the
certificate owner on res.company, and renders a scripted-looking
signature image that matches the printed name on the cert.
- Seeder uploads a generated "Amphenol Canada Corp." badge to Amphenol's
res.partner.image_1920 so that customer's CoCs include their logo
on the top-right corner (mirrors how the reference shows it).
- coc_body template: guard hr.employee.signature access with a field-
exists check (the field is provided by an optional module not
installed on every Odoo).
- CoC uses web.html_container directly instead of wrapping in
web.basic_layout — the outer wrapper was injecting top padding that
pushed the title ~25% down the page. Now starts cleanly at the top.
- Tightened CoC CSS: removed unused label classes, added @page margin
directive, fixed vertical-align on header cells so logos and company
contact stay middle-aligned regardless of row height.
- Invoice PDF PAID stamp now also triggers on payment_state =
'in_payment', so historical demo invoices look paid without needing
full bank reconciliation.
Verified: renders a 152KB PDF with 5 embedded images, signer name
matches signature, all accreditation badges visible.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Demo seeder (scripts/fp_demo_seed.py):
- Idempotent Python script run via odoo shell; populates ~60 records
across 6 customer stories covering every workflow state for live demo
- Customers: Amphenol (net-terms, deep history), Magellan (progress
billing, active), Cyclone (deposit, in-production), Honeywell
(net-terms, just confirmed), Westin (COD, direct-order path),
Delinquent Industries (account hold — Confirm raises UserError)
- Coating configs with realistic AMS specs (2404, 2700 Rev G, 2406)
and bake-relief flags set on applicable processes
- Part catalog with revision chains (Rev 1 / Rev 2 / Rev 3 for hot parts)
- Customer price lists with volume tiers
- Per-customer invoice strategy defaults
- Bath chemistry logs (15 readings, last 2 OOS → pending replenishment
suggestion visible in menu)
- Racks: 4 active + 1 needing strip (MTO 3.2 / 3.0) for kanban demo
- Bake windows: 1 awaiting (ticking down), 1 baked, 1 missed (alert)
- Quote configurator sessions: 3 draft, 3 confirmed/won, 3 lost (with
reasons), 1 expired — populates the win/loss analysis
- Historical closed orders: 8 jobs backdated across 4 months with
SO → MO → Delivery → Invoice → Payment run through each hook so
portal-job progression, certificates with thickness readings, and
invoice AR aging all look real
- Active orders at every workflow stage for the live demo cycle
Polish:
- report_fp_invoice PAID stamp now also triggers on payment_state ==
'in_payment' (in addition to 'paid'). Odoo leaves payments in
'in_payment' until the bank reconciliation job matches them against
a statement line, so historical demo invoices would otherwise never
show as stamped even though the payment is posted and the customer
owes nothing.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>