From 5a699de1caa77ace3ac33a25bcd4740058be7c02 Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Mon, 25 May 2026 19:57:44 -0400 Subject: [PATCH] docs: Express Orders brainstorm handoff to Mac session Captures all clarifying-question answers + exploration findings so a fresh Claude Code session on Mac can resume at 'propose architectural approaches' without re-running the discovery work. Co-Authored-By: Claude Opus 4.7 (1M context) --- ...05-25-express-orders-brainstorm-handoff.md | 160 ++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 fusion_plating/docs/superpowers/handoffs/2026-05-25-express-orders-brainstorm-handoff.md diff --git a/fusion_plating/docs/superpowers/handoffs/2026-05-25-express-orders-brainstorm-handoff.md b/fusion_plating/docs/superpowers/handoffs/2026-05-25-express-orders-brainstorm-handoff.md new file mode 100644 index 00000000..2490116d --- /dev/null +++ b/fusion_plating/docs/superpowers/handoffs/2026-05-25-express-orders-brainstorm-handoff.md @@ -0,0 +1,160 @@ +# Express Orders — Brainstorming Handoff (2026-05-25) + +**Status:** Mid-brainstorming. Clarifying questions answered. NOT yet at "propose 2-3 architectural approaches" or "present design sections" stages. + +**Why this handoff exists:** Previous session ran on a Windows machine (the user works from a Mac via Tailscale). Browser preview kept fighting cross-network localhost issues. User asked to restart natively on Mac. This doc preserves everything the brainstorming had reached so the new Mac session resumes instantly without re-asking. + +**How to resume:** When the user opens Claude Code on their Mac and points it at this repo, kick off with: + +> "Resume the Express Orders brainstorming from `docs/superpowers/handoffs/2026-05-25-express-orders-brainstorm-handoff.md`. Skip the visual companion entirely — design in text using the Excel mockup the user already sent. Pick up at 'propose 2-3 architectural approaches'." + +--- + +## What "Express Orders" is + +A new sale-order entry surface that will eventually replace the current Direct Order Wizard. UX inspiration: a customer-shared Excel mockup showing a spreadsheet-style flat entry — header grid on top with customer/PO/job#/material-process/lead-time/terms/delivery, line table in the middle with per-row Part-#/Description/Specification/Job#/Thickness/Masking-checkbox/Baking-pill/Notes/Qty/UOM/Price/Subtotal + per-line Upload-Drawing + Open-Part buttons, footer with sub-total/tooling/tax/currency-selector/grand-total. + +Goal: faster repeat-customer order entry. Type once on the line, no jumping to a separate part screen for routine work, every column inline. + +--- + +## Clarifying questions ANSWERED + +| # | Question | Answer | Implication | +|---|---|---|---| +| 1 | Model strategy | **D — new view on existing `fp.direct.order.wizard`** | Reuse the 500+ lines of onchange / recipe-cloning / spec-auto-fill / thickness-carry / tax-seeding logic that already debugged. Add masking/baking/currency fields to the existing model. Write a new "Express" form view. Retire the old direct-order view. Open drafts seamlessly become Express Orders (same DB rows). | +| 2 | Specification text storage | **Free-text on the part** — `default_specification_text` Text field on `fp.part.catalog` | Type once → saves to part. Next order for same part → auto-fills. Cell value writes to `sale.order.line.name` (customer-facing). Bypasses the structured `fusion.plating.customer.spec` model entirely — simpler. | +| 3 | Per-line Job# column (ABC/DEF/GHJ) | **NEW per-line customer sub-job-ref field** | Header keeps `x_fc_customer_job_number` (e.g. 12345). Add NEW `x_fc_customer_line_ref` Char on sale.order.line. Both print on customer docs. | +| 4 | Masking checkbox scope | **Both masking AND de-masking together** | Unchecking creates override(included=False) for every node where `default_kind` IN ('masking', 'de_masking'). Logical pairing — can't unmask what was never masked. | +| 5 | Baking field shape | **Free-text input + auto-fill from part default** | Add `default_bake_instructions` Text on `fp.part.catalog`. Type once → saves. Next order → auto-fills. Empty cell = exclude baking node (override included=False on all baking-kind nodes). Non-empty cell = include baking node + write the text to `fp.job.step.instructions` for the bake step at job-creation time. | +| 6 | Currency mechanic | **Pricelist-per-currency, labelled "Currency"** | Selector shows currencies the company has pricelists for. Picking USD → looks up company's USD pricelist → sets `sale.order.pricelist_id`. `currency_id` flows from there. Admin must configure one pricelist per currency. | +| 7-14 | 8 default interpretations | **All 8 accepted** | PO Pending = keep existing flag + chase mechanism; Material Process = new informational Char; Upload Part Drawing = per-line button to part.drawing_attachment_ids; Create Part = per-line modal opening fp.part.catalog form; Lead Time = reuse min/max days; Blanket SO = reuse boolean; Delivery Method = reuse x_fc_delivery_method; phase-out path = both menus visible initially, retire old view after Express is stable on entech. | + +--- + +## Exploration findings (already verified by reading source — these are GROUND TRUTH) + +### Existing `fp.direct.order.wizard` model +- Persistent (not transient) — state machine `draft → confirmed → cancelled` +- File: `fusion_plating_configurator/wizard/fp_direct_order_wizard.py` +- Line model: `fp.direct.order.line` in `fusion_plating_configurator/wizard/fp_direct_order_line.py` +- Creates SO in quotation state on confirm. Does NOT auto-confirm SO or auto-email. + +### Existing `sale.order.line` x_fc_* fields (verified — keep using these) +- `x_fc_part_catalog_id` Many2one(fp.part.catalog) +- `x_fc_internal_description` Text REQUIRED — Notes column maps here +- `x_fc_description_template_id` Many2one +- `x_fc_serial_ids` Many2many(fp.serial) + `x_fc_serial_id` (primary, computed) +- `x_fc_thickness_range` Char — Thickness column maps here +- `x_fc_revision_snapshot` Char (frozen at line save time) +- `x_fc_process_variant_id` Many2one(fusion.plating.process.node) — recipe +- `x_fc_save_as_default_process` Boolean +- `x_fc_job_number` Char — shop's auto-sequenced ref (NOT customer's; that's the new x_fc_customer_line_ref) +- `x_fc_customer_job_number` related from order +- `x_fc_po_number` related from order +- `x_fc_part_deadline` Date + offset_days + effective computes +- `x_fc_archived` Boolean +- `name` (Odoo standard) = customer-facing description — Specification column writes here + +### NEW fields the Express Orders feature must add +On `sale.order.line`: +- `x_fc_customer_line_ref` Char — per-line customer sub-job (the ABC/DEF/GHJ column) +- `x_fc_masking_enabled` Boolean default=True — Masking checkbox +- `x_fc_bake_instructions` Text — Baking free-text + +On `fp.part.catalog`: +- `default_specification_text` Text — for Spec auto-fill +- `default_bake_instructions` Text — for Baking auto-fill + +On `fp.direct.order.wizard` (header): +- `material_process` Char — informational order-level tag (ENP-STEEL-HP-ADVANCED) + +On `fp.direct.order.line` (wizard mirror, to be carried to SO line on confirm): +- `customer_line_ref` Char +- `masking_enabled` Boolean default=True +- `bake_instructions` Text + +### Existing `fp.job.node.override` model (verified — schema is exactly 3 fields) +File: `fusion_plating_jobs/models/fp_job_node_override.py` +- `job_id` Many2one(fp.job) required ondelete=cascade +- `node_id` Many2one(fusion.plating.process.node) +- `included` Boolean + +**No instructions-text override field.** For the bake free-text feature, do NOT extend this model — instead write the typed text to `fp.job.step.instructions` directly at job-creation time. Simpler, less schema churn. + +### Existing recipe model (`fusion.plating.process.node`) +File: `fusion_plating/models/fp_process_node.py` +- `default_kind` is a Char (line 526), not Selection — flexible +- Values seen: `masking`, `de_masking`, `baking`, plating, inspection, contract_review, racking, etc. +- `node_type` is a Selection (line 54): `opt_in`, `opt_out`, `mandatory`, `recipe` + +### Job-creation hook +File: `fusion_plating_jobs/models/sale_order.py` — `action_confirm()` calls `_fp_auto_create_job()` which groups lines by recipe. New Express-Orders-driven overrides should be injected here: +- Walk each SO line +- Resolve the line's recipe +- If `x_fc_masking_enabled == False`, create `fp.job.node.override(included=False)` for every node in recipe where `default_kind IN ('masking', 'de_masking')` +- If `x_fc_bake_instructions` empty, create `fp.job.node.override(included=False)` for every node in recipe where `default_kind == 'baking'` +- If `x_fc_bake_instructions` non-empty, write the text to `fp.job.step.instructions` for the baking step (find by recipe_node_id.default_kind == 'baking') + +### Currency +- `sale.order.currency_id` related from `pricelist_id.currency_id` (Odoo native) +- No multi-currency customisations in fusion_plating modules — using Odoo standard +- Per the answer to Q6, the Express Orders feature adds a selector on the wizard that looks up the matching pricelist by currency code + +### `fp.part.catalog` (file: `fusion_plating_configurator/models/fp_part_catalog.py`) +Verified key fields: +- `x_fc_default_customer_spec_id` (added by quality module) — NOT used by Express Orders per Q2 +- `x_fc_default_thickness_range` Char +- `description_template_ids` O2M(fp.sale.description.template) with internal + customer descriptions +- `drawing_attachment_ids` M2M(ir.attachment) — Upload Part Drawing button writes here +- `model_attachment_id` M2O — 3D model +- `x_fc_certificate_requirement` Selection — inherit/none/coc/coc_thickness + +--- + +## What's LEFT to do (resume here) + +1. ✅ Exploration complete +2. ✅ Clarifying questions complete +3. ❌ **Propose 2-3 architectural approaches** with the answered constraints baked in. Lead with recommendation. (Most of the architectural picture is already settled by Q1=D; this section should be brief — mostly the "where exactly does the recipe override logic live: in the wizard's `_prepare_order_vals`, or post-confirm in `_fp_auto_create_job`, or a model hook?") +4. ❌ **Present design in sections**, get approval after each: + - Section 1 — Header layout + field-to-model mapping + - Section 2 — Line widget design (the spreadsheet table behavior) + - Section 3 — Masking + baking override flow at job creation + - Section 4 — Currency switcher mechanic + - Section 5 — Inline part create + drawing upload buttons + - Section 6 — Phase-out path for direct order +5. ❌ **Write design doc** to `docs/superpowers/specs/2026-05-25-express-orders-design.md` and commit +6. ❌ **Spec self-review** + user review gate +7. ❌ **Transition to writing-plans** skill (after user approves spec) + +--- + +## Lesson: SKIP the visual companion on this user's setup + +The user runs Claude Code from their **Mac** via Tailscale into a **Windows** machine (this `Home` host). Browser previews bound to `localhost` on the Windows side are unreachable from the Mac browser. The bash-script brainstorm server (port 65170) hit this. The Python http.server (port 8765) hit this. We spent 20 minutes fighting it. + +**Resolution:** the user said to switch to a native Mac Claude Code session entirely. On Mac the visual companion should "just work" — but consider whether it's necessary. The user already provided an Excel mockup as reference. Text-based design discussion using ASCII tables / structured lists is plenty for this feature. Don't push the visual companion unless the user explicitly asks for it. + +--- + +## Recent in-flight work (NOT Express Orders, but on the same Windows host) + +For context: this Windows session also shipped these things today (2026-05-25) — they're DEPLOYED on entech but may need follow-up on the Mac: + +1. **Tablet PIN self-service** (cycle 4) — fully shipped, code 4018 last sent. `fusion_plating_shopfloor` 19.0.36.0.3. Three improvements during the day: SCSS undefined-variable bug fix, switch to `force_send=True`, mail template `email_from` aligned to mail-server `from_filter` (fixes M365 DMARC misalignment / delivery delay). +2. **fp_shopfloor_landing removal** — entire OWL component deleted, QR scanner ported into `fp_plant_kanban`, all references cleaned up. Same module version above. +3. **Tablet lock-screen orphan localStorage** — cleared `fp_landing_station_id` to fix empty-tiles bug. + +All committed to git on `main`. Pushed via the multi-remote (GitHub + Gitea). On Mac, you'll need to `git pull origin main` from the fresh local clone before doing anything. + +--- + +## Files written this session that the new Mac session should know exist + +- `K:\Github\Odoo-Modules\fusion_plating\.claude\launch.json` — Mockups preview config (port 8765). Mac equivalent path will be the same but on local Mac filesystem. +- `K:\Github\Odoo-Modules\fusion_plating\.claude\mockups\index.html` — 15KB layout-direction mockup with A/B comparison. Can be deleted (was for the failed Windows-side preview); if you want to show it on Mac it works fine. +- `K:\Github\Odoo-Modules\fusion_plating\.superpowers\brainstorm\944-1779751836\` — dead bash-script brainstorm server directory; safe to delete. +- This handoff doc. + +End of handoff.