# Flow — Fill Checklist with Photo Evidence (Cleaning Supervisor)

> Persona: **Suresh** (CS), Cleaning / Hygiene · Morning, Game Zone Ahmedabad-1. Source: `WORKFLOW_GUIDE` Stage E (mirrored for cleaning) + `PROJECT_PLAN §4a/§9 #7/#9`. Screens: `CS-CHK-TODAY` → `CS-CHK-FILL`. Sheets: `bottom-sheets/photo-capture.html`, `bottom-sheets/a-item-note-photo.html`.
> **Same flow as the anchor** (`staff-court-monitor-mobile/flows/fill-checklist-with-photo.md`); only the item content (cleaning/hygiene) differs.

---

## Preconditions
- Suresh is logged in (`/me` resolved role = CS); the roster for today is **Published**, so auto-assign has created his **Cleaning / Hygiene — Daily** instance (state `NOT_STARTED`). It is visible on `CS-CHK-TODAY`.

## Steps

1. **Open the checklist.** Suresh taps **Cleaning / Hygiene — Daily** on `CS-CHK-TODAY`.
   → App `GET /checklist-instances/:id`; opens `CS-CHK-FILL`. First interaction will move state to `IN_PROGRESS`.

2. **Answer item by item (G/A).** For each `ChecklistItem` (e.g. "Clean & sanitize all playing surfaces (no ammonia)"):
   - Tap **G (Good)** → row gets a green left rail; `value=G`; **server time auto-stamps** (read-only); **initials auto-derived** ("SY"); note optional.
   - Tap **A (Action required)** → the **A-note+photo sheet** opens (`a-item-note-photo.html`): Suresh types what's wrong and taps the camera tile → the **photo-capture sheet** (`photo-capture.html`) offers **Camera / Gallery**. He shoots the issue. The row now has a red-orange left rail + the attached issue photo. The item is **flagged photo-satisfied**.
   - Each answer saves via `PATCH …/responses` (`If-Match: <version>`), keeping the draft (`IN_PROGRESS`). The client sends only `itemId` + `value` + optional `note` — the **server** stamps `recordedAt` + `initials` (§9 #9).

3. **Attach the completion photo.** At the bottom, the **completion-photo** tile (`PhotoUpload`, ≥96px) opens the photo-capture sheet. Suresh shoots proof the area is clean → `POST /uploads/photos` (`kind=COMPLETION`) → thumbnail appears. (One or more allowed; **≥1 required**, §9 #7.)

4. **Photo storage.** Every photo is a multipart upload → **local disk on the VPS** → a `Photo` row with uploader (Suresh), timestamp, device, and kind (`COMPLETION` or `NEGATIVE`+itemId). These are visible up the chain and in the negative report (§4a).

5. **Proceed to review.** Suresh taps **Review & Submit** → `CS-CHK-SUBMIT` (see `submit-and-track-approval.md`).

## Example cleaning/hygiene items (seed "Cleaning / Hygiene — Daily")
- Remove foreign matter from all play areas
- Clean & sanitize all playing surfaces (**no ammonia**)
- Washroom — no odours; toilets flushing; soap & paper stocked; bins emptied; surfaces sanitized
- Baby-changing station disinfected
- Café tables & high-touch surfaces sanitized

> Exact seed rows are confirmed at the client demo (engine generic, `§9 #2/#12`); these are realistic placeholders drawn from the Park Opening/Closing hygiene items.

## Rules enforced in this flow
- **An A item cannot be left without its issue photo** — the item stays photo-required and will block submit.
- **Time-stamp + initials** are **server-derived** per response (§9 #9), not entered by hand.
- **Offline (L10):** if the network drops mid-fill, the "No connection — retry" state shows; Suresh's G/A picks, notes, and staged photos are **held in memory** and re-POST on retry — no tap is lost.
- **Scope:** Suresh can only open instances assigned to him in his Game Zone; any other id → 403.

## Result
- The instance is `IN_PROGRESS` with: a response per item, a note + issue photo on every A item, and ≥1 completion photo — ready to submit.
