From 10b44d9a1ac20c384e1c5d405a59e93d6c5a618f Mon Sep 17 00:00:00 2001 From: bonamin Date: Mon, 20 Apr 2026 18:47:49 +0300 Subject: [PATCH] Update session instructions: Phase 3 complete, document all fixes and known issues --- .../CLAUDE_CODE_INSTRUCTIONS.md | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/PLANS AND STRATEGIES/CLAUDE_CODE_INSTRUCTIONS.md b/PLANS AND STRATEGIES/CLAUDE_CODE_INSTRUCTIONS.md index 709f15a..c08b21a 100644 --- a/PLANS AND STRATEGIES/CLAUDE_CODE_INSTRUCTIONS.md +++ b/PLANS AND STRATEGIES/CLAUDE_CODE_INSTRUCTIONS.md @@ -36,7 +36,7 @@ We are building a local-first restaurant POS system. Full architecture and specs > Update this line as you progress: > Phase 1: Local Backend — [x] Complete. Smoke tested: health, auth, products, tables, orders, printer routing all working. > Phase 2: Waiter PWA — [x] Complete. Smoke tested end-to-end: login, table list, open order, add items, select/pay with confirmation, close order. See "Phase 2 Known Issues & Fixes" below. -> Phase 3: Manager Dashboard — [ ] Not Started +> Phase 3: Manager Dashboard — [x] Complete. Scaffolded and smoke tested. Known issues remain (see below) — not blockers for Phase 4. > Phase 4: Cloud Backend — [ ] Not Started > Phase 5: Sysadmin Panel — [ ] Not Started @@ -45,13 +45,37 @@ We are building a local-first restaurant POS system. Full architecture and specs - `OrderOut` schema now includes `waiters: List[OrderWaiterOut]` — required for `isMyOrder` check on the frontend. - Close order button is enabled when there are zero active items (not just when all are paid) — allows closing an empty order. - Printing silently skips items with no `printer_zone_id` — **expected**. Printer zones are assigned in Phase 3 (Manager Dashboard). No code change needed. -- `selected_options` and `removed_ingredients` on `OrderItemInput` accept `List[dict]` from the PWA (name+price_delta objects and name strings respectively), stored as JSON in the DB. The printer service reads them as raw JSON — modifier names print correctly. +- `selected_options` and `removed_ingredients` on `OrderItemInput` now accept `List[dict]` from the PWA (name+price_delta objects and name strings respectively), stored as JSON in the DB. The printer service reads them as raw JSON — modifier names print correctly. + +## Phase 3 — What Was Built +- Manager Dashboard: React+Vite, TailwindCSS, React Query, react-hot-toast. Port 5174. +- Pages: Login (PIN pad, manager/sysadmin only), Dashboard (live table grid, 30s polling), OrderDetailPage (full actions), ProductsPage, WaitersPage, TablesPage, ReportsPage, SettingsPage. +- Docker Compose service added. + +## Phase 3 Known Issues & Fixes Applied +- `isMyOrder` was always false after page reload — fixed: `AuthRehydrator` fetches `/auth/me` on app load to rehydrate user from token. +- `OrderItemInput` schema mismatch fixed: backend now accepts `selected_options` as `List[{id, name, price_delta}]` objects (not int IDs). +- Blocked waiter now force-logged out of PWA on next request (401 interceptor). +- `opt.price_delta` fixed to read `opt.extra_cost` from backend schema. +- `GET /api/products/?all=true` added for manager to see unavailable products (greyed out, not hidden). +- `PUT /api/products/{id}` now replaces options, ingredients, and preference_sets. +- New: ProductPreferenceSet + ProductPreferenceChoice models (exclusive-choice per product). +- New: Product image upload — POST `/api/products/{id}/image`, stored at `/app/data/product_images`, served as static files. Docker volume: `./data/product_images:/app/data/product_images`. +- New: TableGroup model + endpoints (`/api/tables/groups`). Tables have `group_id` FK. +- New: `DELETE /api/tables/{id}?hard=true` for permanent delete vs deactivate. +- New: `POST /api/tables/batch` for bulk table creation with prefix + count. +- New: `POST /api/auth/me` endpoint. +- Auto-migration on startup adds new columns to existing SQLite DB without dropping data. + +## Phase 3 Known Remaining Issues (to revisit) +- Some PWA/manager interactions still have rough edges — to be addressed in a dedicated polish pass before or after Phase 5. +- Product image upload requires the product to already exist (no upload on creation, only on edit). ## Phase 2 Dev Data (seeded manually, not in seed.py) - Tables 1–6 exist (table 1 was from Phase 1 smoke test) - Category "food" (id=1) exists from Phase 1 smoke test — contains product "arakas" - Categories: Ποτά, Σαλάτες, Κυρίως — 3 products each -- No printer zones assigned to any product yet +- Printer zones can now be assigned via ProductsPage in the Manager Dashboard. ## Environment Variables