initial commit

This commit is contained in:
ray
2026-07-12 10:17:17 -04:00
commit dab5a4ebc6
1424 changed files with 330463 additions and 0 deletions
@@ -0,0 +1,138 @@
# Repair Order Status Workflow (6-Status System)
Introduced June 2026. Replaced the original 4-status system (in-progress, waiting-for-parts, completed, waiting-for-pickup).
## Statuses and Display Colors
| Status | Label | Color | Badge Class |
|--------|-------|-------|-------------|
| `diagnosing` | DIAGNOSING | amber-100/800 | `bg-amber-100 text-amber-800 dark:bg-amber-900 dark:text-amber-200` |
| `in-progress` | IN PROGRESS | green | `bg-green-100 text-green-800` |
| `waiting-for-approval` | WAITING APPROVAL | rose | `bg-rose-100 text-rose-800` |
| `waiting-for-parts` | WAITING FOR PARTS | orange | `bg-orange-100 text-orange-800` |
| `waiting-for-pickup` | WAITING FOR PICK-UP | blue | `bg-blue-100 text-blue-800` |
| `completed` | COMPLETED | purple | `bg-purple-100 text-purple-800` |
## Sorting Priority (renderRepairOrders)
```
diagnosing: 0, in-progress: 1, waiting-for-approval: 2,
waiting-for-pickup: 3, waiting-for-parts: 4, completed: 5
```
New ROs default to `diagnosing`.
## Segmented Control Status Modal
`openWorkStatusModal()` in `repair-orders.js` renders a 2-column × 3-row grid of pill buttons (replacing the old vertical list).
- Active status is highlighted with ring-2 + colored border
- Hover shows subtle bg-gray-50
- **Parts Info Section**: when `waiting-for-parts` is the active or selected status, an inline form appears showing vendor/ETA fields. Pre-populated from `ro.partsInfo`.
- **Completed → Financial**: clicking "Completed" closes the status modal and opens `openFinancialSummaryModal(roId, 'completed')` directly — no intermediate confirmation dialog.
- **Parts-Leaving Warning**: changing FROM `waiting-for-parts` to any other status shows a "Parts Received?" confirmation before proceeding.
## Status History Tracking
Every status change pushes an entry to `ro.statusHistory[]`:
```js
{
from: oldWorkStatus || 'none',
to: newWorkStatus,
timestamp: new Date().toISOString()
}
```
Synced to PocketBase as part of `updateData` / `createData` in `updateRepairOrderWorkStatus()`.
A collapsible "Status History" section in the edit modal (`openEditModal()`) displays the timeline:
```
● Completed — Jun 23 14:32
● Waiting Pick-Up — Jun 22 09:15
● In Progress — Jun 22 08:00
● Diagnosing — Jun 21 16:45
```
## Parts Info (waiting-for-parts)
Stored as `ro.partsInfo = { vendor: string, eta: string }`.
- Captured from the inline form in the work status modal
- Displayed in the RO card when status is `waiting-for-parts`
- Synced to Firebase with every status update
## Pickup Tracking (waiting-for-pickup)
- `ro.pickupSetAt` timestamp saved when status changes to `waiting-for-pickup`
- RO card shows elapsed waiting time with color coding:
- < 1 day: green "Just ready"
- 1-3 days: yellow "2d waiting"
- 3+ days: red "3d waiting" (semibold)
- Time-until-due field shows blue **"READY FOR PICKUP"** text instead of "OVERDUE" — regardless of whether the promised time has passed
- Copy Pickup SMS button was REMOVED (June 2026)
## Financial Modal on Completion
When completing from the status modal, `openFinancialSummaryModal(roId, 'completed')` shows:
- A purple notice: "Marking RO #XXX as completed. Enter financial details below and click 'Save & Complete'."
- Pre-populated CP fields parsed from services string (extracts dollar amounts, estimates from service line count)
- LocalStorage saves/loads last-used labor rate (`shopProQuote_financialRates` key)
- On save, status history is updated with the completed transition
- Works as both completion AND editing flow (the `context` parameter controls appearance only)
## Dashboard Widget Counts
`dashboard.js``updateDashboardStats()` now counts:
- `parts-on-order-count`: ROs with `workStatus === 'waiting-for-parts'`
- `ready-for-pickup-count`: ROs with `workStatus === 'waiting-for-pickup'`
- Breakdown text updated dynamically
## Edit Modal Updates
The `#edit-work-status` dropdown in `repair-orders.html` includes all 6 statuses.
The `#status-history-section` collapsible timeline is rendered when `openEditModal()` finds `ro.statusHistory` entries.
## Customer Notes (per-customer, across ROs)
Introduced June 2026. Notes are tied to the customer (by phone number), not the RO — they persist across different repair orders for the same customer.
**Storage**: `localStorage` keyed by `cust_notes_{phone}` (phone digits only). Full text string.
**UI**:
- "Customer Notes" button in each RO card's three-dot dropdown menu (teal icon, between Invoice Lines and Delete)
- Opens a modal showing customer name/phone, a textarea with existing notes, Cancel/Save
- If notes exist for that customer, a small teal checkmark badge appears next to the customer name on EVERY RO card for that customer
**Key code**: `openCustomerNotesModal(roId)` in `repair-orders.js`. Triggered by `.customer-notes-btn` in `handleROMenuClicks`.
## Due Time Modal
Clicking the due date/time on any RO card opens `openDueTimeModal(roId)` with two options:
1. **Set exact date/time**: `datetime-local` input pre-filled with current due, "Set Due Time" button
2. **Add hours**: number input (default 1, min 1, max 168) + "Add Hours" button — pushes the due out by that many hours from current
Both options call `updateDueTime(roId, newISO)` which:
- Updates `repairOrders[].promisedTime` locally
- Syncs to PocketBase via `updateDoc()`
- Re-renders the active orders list
- Shows success notification
**Due date format** (`formatDueDate`) now includes clock time: "Today 3:15 PM", "Tomorrow 10:30 AM", "Wed 2:00 PM", "Jun 28 11:00 AM". The "Due: " prefix was removed.
| Feature | File | Function |
|---------|------|----------|
| Status modal + segmented control | `repair-orders.js` | `openWorkStatusModal()` |
| Status update + history tracking | `repair-orders.js` | `updateRepairOrderWorkStatus()` |
| RO card rendering | `repair-orders.js` | `createROHTML()` |
| Edit modal status history | `repair-orders.js` | `openEditModal()` |
| Financial modal (completion) | `repair-orders.js` | `openFinancialSummaryModal()`, `handleFinancialCompletion()` |
| Dashboard widget counts | `dashboard.js` | `updateDashboardStats()` |
| Due time modal | `repair-orders.js` | `openDueTimeModal()`, `updateDueTime()` |
| Customer notes modal | `repair-orders.js` | `openCustomerNotesModal()` |
| Due date formatting (with time) | `repair-orders.js` | `formatDueDate()` |
| Status modal HTML (segments, parts) | `repair-orders.js` | Generated in `openWorkStatusModal()` |
| Status history list HTML | `repair-orders.html` | `#status-history-section` |