Kickoff brief, design spec, both implementation plans (rates foundation + booking wizard), the UI mockup, and the hands-off Westin clone-verify/deploy script for the Technician Service Booking feature. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
128 lines
7.6 KiB
Markdown
128 lines
7.6 KiB
Markdown
# KICKOFF BRIEF — Implement "Technician Service Booking & Auto-Quote" (hands-off)
|
||
|
||
You are a fresh Claude Code session. **Implement this feature end-to-end, autonomously, from the
|
||
plans below.** The design is already locked through brainstorming — **do NOT re-design or
|
||
re-brainstorm.** Build it.
|
||
|
||
---
|
||
|
||
## 1. Mission
|
||
|
||
Replace the raw `fusion.technician.task` booking modal with a polished **OWL "Book a Service"
|
||
wizard** that: captures the client (incl. brand-new clients inline), books the technician task,
|
||
prices the call-out from an **editable rate table**, and **auto-creates a draft repair Sale Order**
|
||
— with correct, consistent timezone handling. Works in dark + light.
|
||
|
||
## 2. Read these first, in order
|
||
|
||
1. `K:\Github\Odoo-Modules\CLAUDE.md` (repo Odoo-19 rules) + the global `K:\Github\CLAUDE.md`.
|
||
2. Spec: `docs/superpowers/specs/2026-06-03-technician-service-booking-design.md`
|
||
3. **Plan 1** (do first): `docs/superpowers/plans/2026-06-03-service-rates-foundation-plan.md`
|
||
4. **Plan 2** (do second): `docs/superpowers/plans/2026-06-03-service-booking-wizard-plan.md`
|
||
5. UI source of truth (port its markup/CSS): `docs/superpowers/mockups/technician-booking-wizard.html`
|
||
|
||
The plans are bite-sized (TDD, exact files, full code). They are the authority — follow them
|
||
task-by-task. The spec/mockup are context.
|
||
|
||
## 3. Method
|
||
|
||
- Use the **`superpowers:subagent-driven-development`** skill (the plan headers require it). One
|
||
task at a time; write test → implement → verify → **commit per task** with the messages in the plan.
|
||
- **Order: Plan 1 fully, then Plan 2** (Plan 2 consumes Plan 1's `fusion.service.rate`).
|
||
- Before writing any model/view/OWL code, obey repo rule #1: **read the real reference from Docker
|
||
first** (`docker exec odoo-modsdev-app cat …` or, for the Enterprise classes, read the on-disk
|
||
source) — never code Odoo APIs from memory. The plans flag the specific signatures to confirm
|
||
(`_get_local_tz`, `_compute_datetimes`, `_calculate_travel_time`, real task field names like
|
||
`in_store`/`client_name`/`address_lat`, the `crm.tag` vs `sale.order` tag model).
|
||
|
||
## 4. Branch
|
||
|
||
```bash
|
||
git -C K:\Github\Odoo-Modules checkout main
|
||
git -C K:\Github\Odoo-Modules checkout -b claude/technician-service-booking
|
||
```
|
||
Create it **off `main`** — NOT off `claude/fusion-schedule-audit-fixes` (that branch has unrelated
|
||
calendar-sync fixes). The spec/plans/mockup are already on disk under `docs/superpowers/`; keep them.
|
||
|
||
## 5. Hard constraints (do not violate)
|
||
|
||
- **Odoo 19 idioms** (from CLAUDE.md): declarative `models.Constraint` / `models.Index` (never
|
||
`_sql_constraints`); `group_ids` not `groups_id`; HTTP routes `type="jsonrpc"`; backend OWL uses
|
||
**standalone `rpc()`** from `@web/core/network/rpc` (not `useService("rpc")`), client action
|
||
`static props = ["*"]`; **dark mode** = branch on `$o-webclient-color-scheme` at SCSS compile
|
||
time and register the SCSS in **both** `web.assets_backend` **and** `web.assets_web_dark`; new
|
||
fields use the **`x_fc_`** prefix; **Canadian English**; any `message_post(body=…)` HTML wrapped
|
||
in `Markup()`.
|
||
- **Enterprise-only:** `fusion_claims` pulls `ai` → it **cannot install on local Community
|
||
(`odoo-modsdev`)**. Do **not** attempt `-d modsdev -u fusion_claims`. (`fusion_tasks` alone may
|
||
install locally — the tz-fix test in Plan 2 Task 1 can be tried there; everything else is clone-only.)
|
||
- **The design is LOCKED** — implement exactly §6 below; don't add scope or re-open decisions.
|
||
|
||
## 6. Locked design (build exactly this)
|
||
|
||
- **Time:** 12-hour **AM/PM** entry on the wizard (custom control — Odoo's native widget is 24h).
|
||
Fix the `fusion_tasks` tz bug: the `_inverse_datetime_*` methods must use `self._get_local_tz()`
|
||
(same resolver as `_compute_datetimes`), not `self.env.user.tz`.
|
||
- **Client:** inline **new-client** (name / phone / email / address) on the page; **no forced SO**
|
||
(relax `fusion_claims` `_check_order_link` to a no-op); find-or-create the `res.partner` on save
|
||
(match by email then phone).
|
||
- **View:** a **full OWL client action** wizard (complete design freedom), ported from the mockup,
|
||
dark + light.
|
||
- **Pricing → SO:** pick service type → call-out fee → **auto draft repair `sale.order`** with the
|
||
call-out line **+ auto per-km line** for Rush/After-Hours (qty = `travel_distance_km × 2`,
|
||
$0.70/km). On-screen **estimate is UI-only** (labour/parts added later as actuals). Tag the SO
|
||
(`x_fc_is_service_repair` + a "Service Repair" tag).
|
||
- **Rates are an editable table** — `fusion.service.rate` with a **Service Rates** menu. The card
|
||
only **seeds** it (`noupdate=1`). Pricing is read from this table, never hardcoded.
|
||
- **Rate card seed:** Standard call $95 / Rush $120 / After-Hours $140; Lift & Elevating $160 /
|
||
**Rush $185** / **After-Hours $205** (the $185/$205 are *suggested* fills — seed them but they're
|
||
confirm-pending; leave a code comment). Labour: on-site $85, in-shop $75 (reuse existing `LABOR`
|
||
product), lift $110. Per-km $0.70 ×2-way. Delivery/setup: local $35 / outside $60 / rush $60+km /
|
||
lift-chair $120 / bed $120 / stairlift $300 / removal $300. **In-shop = no call-out, labour @ $75.**
|
||
- **Module split:** the tz fix goes in **`fusion_tasks`**; everything else (rate model, products,
|
||
menu, resolver, SO builder, `action_book_from_wizard`, controller, OWL wizard, SCSS, entry point)
|
||
goes in **`fusion_claims`**.
|
||
|
||
## 7. Verification (you probably can't reach the Enterprise clone — handle both cases)
|
||
|
||
- **Always do (no Odoo needed):** after each Python file, run `python -m py_compile <file>` and
|
||
`python -m pyflakes <file>` (or `docker exec odoo-modsdev-app python3 -m pyflakes …`). **Fix every
|
||
warning you introduce.** This is your local gate.
|
||
- **Full tests + smoke require a Westin Enterprise clone.** A one-command harness already exists:
|
||
`scripts/verify_service_booking.sh` (runs on the `odoo-westin` host: clones the DB, the
|
||
orphaned-tax-FK cleanup, stages the branch, `-u` + tests, PASS/FAIL; `--deploy` ships on green).
|
||
- If you have access to `odoo-westin`: push the branch, then run that script (verify-only first).
|
||
- If you do **not**: finish all code, ensure `py_compile`/`pyflakes` are clean, **commit the
|
||
branch task-by-task**, and clearly report **"clone-verification pending — run
|
||
`scripts/verify_service_booking.sh` on odoo-westin."** Do not fake a green test.
|
||
- **Never deploy to prod yourself.** Leave `--deploy` to the human.
|
||
|
||
## 8. Definition of done
|
||
|
||
- [ ] Branch `claude/technician-service-booking` off `main`.
|
||
- [ ] Plan 1 + Plan 2 implemented, **committed task-by-task** with the plans' commit messages.
|
||
- [ ] `py_compile` + `pyflakes` clean on every touched `.py`.
|
||
- [ ] OWL wizard renders the mockup layout in **both** light and dark bundles.
|
||
- [ ] Either **clone-verified GREEN** via the script, **or** branch committed + verification
|
||
explicitly flagged pending (with the exact command to run).
|
||
- [ ] A short final report: what was built, files changed, how to verify + deploy (`scripts/verify_service_booking.sh`),
|
||
and the one open business item (confirm Lift Rush/After-Hours $185/$205).
|
||
|
||
## 9. Don't
|
||
|
||
- Don't test on `odoo-modsdev` (Community — `fusion_claims` won't install).
|
||
- Don't re-brainstorm or change the design in §6.
|
||
- Don't hardcode prices (they live in `fusion.service.rate`).
|
||
- Don't deploy to prod or run `--deploy` — hand that to the human.
|
||
- Don't change the suggested $185/$205 silently — keep them, flag them confirm-pending.
|
||
|
||
---
|
||
|
||
### Optional: launch it headless
|
||
|
||
```bash
|
||
# from the repo root, on a machine with this checkout:
|
||
claude -p "$(cat docs/superpowers/EXECUTE-technician-service-booking.md)" --permission-mode acceptEdits
|
||
```
|
||
…or just paste this file into a fresh Claude Code session and say "go".
|