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>