Selected work
Three summaries of the kind of job we take. Each client stays anonymous.
Delivery runs off a spreadsheet
The client: A building-supplies distributor with four depots.
The problem
Delivery runs were planned in a shared spreadsheet that three people edited at the same time.
The hard part
The spreadsheet held rules nobody had written down. We spent the first two weeks sitting with their dispatcher and writing them out.
Built with
TypeScript, PostgreSQL
- Orders from the accounts package
- The hard partPlanning screen
- Driver list
- Nightly export
One client list for nine clinics
The client: A veterinary group with nine clinics.
The problem
Each clinic kept its own client list, so an animal seen at two clinics had two records.
The hard part
Deciding that two records are the same animal. When the owner details disagreed, the pair went to a person.
Built with
PostgreSQL, Python
- Nine clinic exports
- The hard partMatching step
- A person confirms
- One client database
test("holds on mismatch", () => {
const a = { owner: "Pell" };
const b = { owner: "Pell" };
const c = { owner: "Hale" };
expect(match(a, b)).toBe("ask");
expect(match(a, c)).toBe("hold");
});
An invoice run that rounded differently from finance
The client: A training provider that invoices about forty employers each month.
The problem
The new billing screen totalled invoices a few pence away from the accounts package, and finance could not sign it off.
The hard part
Rounding. The accounts package rounded each line, and we had rounded the total.
Built with
TypeScript, Vitest
- Course bookings
- The hard partInvoice calculation
- Billing screen
- Accounts export
test("rounds per line", () => {
const lines = [
{ net: 1999, vat: 0.2 },
{ net: 1001, vat: 0.2 },
];
expect(total(lines)).toBe(3600);
});