---
module: recon.cash-forecast
title: Cash Forecast
tab: Testing
order: 35
audience: dev
---

Frontend test checklist for **Cash Forecast** (`recon.bcos.dev` → **Cash Forecast**). Click through in the UI and mark each row Pass or Fail.

## Set up
Log in at **recon.bcos.dev** — test accounts (all password `Passw0rd-d3v!`):

| Login | Role | Sees |
|-------|------|------|
| `bcos_a@bcos.dev` | Admin | All institutions · can Recompute |
| `msp_a@msp1.bcos.dev` | MSP admin | C1 + C2 only · can Recompute |
| `customer_a@customer1.bcos.dev` | Customer | C1 only · read-only |

Rows are per-cassette forecasts for the enrolled simulator ATMs (**C1-ATM-001…**, **C1-TCR-001…**, and C2-/C3- for the other institutions).

## What to test

| # | Do this | ✅ Pass if |
|---|---------|-----------|
| 1 | As `msp_a`, open **Cash Forecast** | Table **Cassette Runout Forecast** loads with columns ATM · Slot · Denomination · Current Level · Burn Rate / Day · Projected Runout · Fill By · Status |
| 2 | Look at the default row order | Rows are sorted **soonest runout first** — the top rows show the nearest Projected Runout (e.g. "overdue" / "today" / "3d") |
| 3 | Open the **Filters** sidebar (the `»` toggle on the left), type an ATM into **Search ATM** (e.g. `C1-ATM-001`) | List narrows to just that ATM; the sidebar count pill updates (e.g. `4 / 60`) |
| 4 | Set **Institution** = `C2BD`, then set **Forecast Status** = `No Burn`, then click **✕ Clear all** | Each filter narrows the table live (only C2 rows, then only **No Burn** badges); Clear all restores the full list |
| 5 | Click the **Current Level** column header, then click it again | Table re-sorts by that column ascending, then descending (sort arrow flips) |
| 6 | Scan the rows for urgency colour | Cassettes due to run out within ~3 days show **amber**, and rows whose Fill By date has passed show **red** |
| 7 | Click **↻ Recompute** in the header | Button shows "Recomputing…", then an **Updated <time>** stamp appears and the table reloads with **no error banner** |
| 8 | Log in as `customer_a`, open **Cash Forecast** | You see **only C1** rows; the **Institution** filter dropdown lists **only C1BD** — no C2 or C3 |
| 9 | Still as `customer_a`, click **↻ Recompute** | A red **error banner** appears (recompute is admin-only) — the customer can view but not recompute; **no crash** |
| 10 | Log in as `bcos_a`, open the **Institution** filter | All institutions are listed (**C1BD, C2BD, C3BD**) and rows from every institution appear |

**Report a fail with:** the row #, which login you used, and what you actually saw.
