Worked productHealthcare · running one hospital

Clinical records are the invoice’s only source.

Twenty destinations across care, pharmacy, finance, business, people and the workspace, joined by one rule: an invoice line names the procedure, the bed days or the medication course it bills. Looking at it should settle whether operations and revenue can sit in one product without either lying about the other.

Preview interactive design
OperatorWard manager or clinicianthe role decides what exists
The clock09:20, mid-handoverbed waits and dose clocks run live
StatusTen fields, 49 valuesoverdue and expiring in none of them
MoneyPence, nothing summed storedtotals are the sum of their lines
The hospital at handover · two waiting for a bed, one of them past four hours, and one of the four in theatre today without consent recordedthe screen the shift starts on
The screensHealthcare · five of the twenty

One record, read by the ward and then by finance.

Forty registered routes: twenty destinations over six rail categories, six records, the profile, seven under settings and six for auth. There is deliberately no /admissions/:id and no bed record — an admission is one row on the ward board, and a bed is only ever reached through its ward.

02The status set →
Screen 01

What is waiting on somebody, before anything else

A figure row, the ward board, then the work owed to a person: bed waits, held discharges, the theatre list. No occupancy percentage without the bed count that divides it, and no summing unlike work into one number.

  • “Waiting for a bed 2 — 1 of them past four hours”, the oldest requested at 04:20
  • One pip per bed against each ward’s own establishment: Beaumont 6, Linden 4, Corvid 4, Aster 3, Hollis 4
  • “Fit for discharge, still here (2)” — Ivy Trethewey, 30 hours over, day 6 of an expected 5
/board · read-first
Screen 02

The procedure record, and the transitions it will offer

A timed ladder rather than a table, because the question is what is next and what is late. The record carries the clock and the gate: what it is over by, and which transitions exist at all.

  • “In theatre” — central line insertion, Theatre 3, started 08:20 and an hour over
  • Consent recorded 06:20 on this one; one of the four in theatre today has none
  • “Record as abandoned” is danger and cancelled is neutral — one started and could not be finished
/interventions/:idrecord · gated
Screen 03

Courses grouped by where their dose clock has got to

Not a list of prescriptions: what is overdue, due this hour, and later today, derived from each course’s frequency against the clock. Recording a dose moves the next one by that interval.

  • Overdue 1, due within the hour 1, later today 4 — one array, cut by the clock
  • “Awaiting a pharmacist 3 — not on the round until they are verified”
  • Eluned Pryce’s 07:20 paracetamol, two hours over, last given 01:20
/roundsqueue · time-ordered
Screen 04

An invoice whose every line names the care it bills

One invoice per episode, each line pointing at the intervention, admission or course behind it. The contracted price is looked up at render, so a line billed off contract is a finding.

  • HG-2026-0342 — two lines, £4,060.00 invoiced, £0 cleared, balance £4,060.00
  • Six surgical bed days at £480.00 and one debridement at £1,180.00, both at contract
  • Due 15 Apr, 29 days left — the commissioner’s own 30-day terms, not a default
/invoices/:idrecord · reconciliation
Screen 05

The chase list, and the invoice it will not chase

Balance, terms, last contact, and the step the ladder says comes next. Overdue is not stored, so an invoice arrives on this screen without anybody moving it — and a disputed one is never chased.

  • £9,790 chaseable across 4 invoices, and the 1 disputed invoice is not among them
  • HG-2026-0347 — £1,440.00 returned by the sending bank, and the patient written to
  • £600.00 promised by the private insurer moves nothing until it clears
/credit-controlworklist · derived
StatusA closed set with defined transitions

Where an invoice has got to is stored. Whether it is late is not.

The value nobody finds here is overdue: a due date in the past with a balance outstanding, computed at render, so an invoice becomes overdue on its own and the worklist, the aged-debt buckets and the nav badge read one predicate. Expiring is absent for the same reason.

03The awkward cases →
draftawaiting_codingissuedpart_paidpaiddisputedwritten_off
Seven values, two terminal, and written_off is deliberately neutral rather than a failure: writing a balance off is a decision somebody took under a threshold Settings owns, not money that went missing. Disputed sits outside the payment path because it is the payer’s answer, not a stage of collection. Ten fields carry 49 values in all — patient, admission, intervention, medication, stock, staff, invoice, payment, transfer and contract.
The dataHealthcare · three fixtures that break a screen

The fixture set was written to make screens fail.

All three are records in the fixture rather than hypotheticals, and each one is why a figure on some other screen is derived rather than stored.

04The audit →
Case 01A payment the bank sent back
NaivelyThe payment row exists for the full amount, so the balance renders £0.00 and the invoice moves to paid. The chase list drops it, and nobody looks at it again.
HereA failed bank transfer of £1,440.00 against £1,440.00 of lines, and the balance still reads £1,440.00 — only cleared payments are paid money. The chase ladder records a letter sixteen hours later.
Case 02A procedure whose consent is not on the record
Naively“Start in theatre” renders, disabled, with a tooltip — or worse, it renders enabled and the consent field is left for somebody to notice afterwards.
HereThe transition does not exist: the set is built from the record, so with consent absent there is no start action to press — and the record says why, in the sentence the note thread is already arguing about.
Case 03An invoice the payer has formally queried
NaivelyIt is past its due date with a balance, so it appears on the chase list between two ordinary reminders and gets a statement sent.
HereOne invoice is disputed — 11 bed days against a 9-day expected stay — and credit control excludes it by predicate, not by somebody remembering. It still counts in outstanding; it just is not chased.
The auditHealthcare · audited

The contract lookup had to become the join.

The contracted price for a line lived in two places — on the tariff item, and implied by the line’s own unit price — with nothing checking they agreed, so a line billed off contract was invisible unless somebody compared them by eye. The price is looked up at render now, and a line that disagrees is a finding on three screens at once.

05Back to the top →
One price, looked up · 21 contracted prices over 4 payer contracts, of 60 possible pairs — and the 2 lines that disagree, worth £710, namedtraced

Reckon

One record, both jobs.
Most products split it.

The ward writes the facts and finance bills them months later. If a figure cannot be walked back to the bed day that produced it, it is not a figure — it is a guess with a currency symbol.

Built for Claude Design · plain markdown · nothing to run