← All work

Retail — appliance sales on instalment · Deployed and running

Installment System

A complete system for running instalment sales at an appliance showroom — from the customer's request to the last instalment, with every approval step and every pound in between.

Client
An appliance showroom (not named) — The showroom is not named anywhere in this package.
System type
Full internal operations system
Installment System
1 / 6

The showroom sold on instalments with no system: paper notebooks for the contracts and schedules, Excel files for follow-up, and a hand calculator for every sale. This system puts the whole cycle in one place — request, investigation, manager approval, contract execution, instalment schedule, collections, treasuries and stock — where each step unlocks the next, balances are derived rather than typed, and every change writes an audit row with a before/after snapshot.

67
Database tables
51
API routes
250
Server actions
61
Permission keys
26
Pages in navigation
97,855
Lines of code
1,063
Commits
Sector
Retail — appliance sales on instalment
System type
Full internal operations system (requests · contracts · collections · treasuries · stock · reports)
Coverage
26 pages in the app · 51 API routes · 67 database tables
Users
Showroom staff in different roles: manager, cashier, investigator
Language
Arabic throughout, right-to-left, with Eastern Arabic numerals (٠-٩)
Devices
Desktop and mobile — the same system, not a cut-down version
Timeline
26 January 2026 to 5 July 2026 (1,063 commits)

The problem before the system

The showroom sold on instalments with no system. The work was spread across three things at once: paper notebooks for the contracts and the instalment schedules, Excel files for follow-up, and hand-calculator arithmetic for every sale.

Read the detailHide the detail5 points
No single correct number
— The treasury balance was on one sheet, the receipts in an Excel file, and what the client still owed in a third notebook. A simple question like "how much is left on this client?" meant opening three sources and reconciling them.
The instalment was recalculated from scratch every time
— Appliance price, down payment, administrative fees, margin by term — all of it on a hand calculator, and any multiplication slip stayed in the contract until its last day.
Collections ran on memory
— Who is late today? The answer was flipping through pages, so whoever was late stayed late until somebody happened to remember them.
Responsibility was not on the record
— Who took this money? Who approved this request? Paper does not answer.
Staff floats grew unnoticed
— Nobody noticed, because there was no number updating in real time.

The approach

Read the detailHide the detail

Before any code, the first job was understanding how the showroom actually works — not how it is supposed to work.

Selling on instalment is not a transaction, it is a relationship that runs for up to 20 months. The system has to hold that whole relationship: the appliance, the guarantor, the instalment schedule, every payment, and every follow-up call.

Trust is the real product. The showroom hands over goods against a promise. So the investigation, the guarantor and the trust receipt are not paperwork formalities — they are the substance of the business, and they have to be mandatory steps in the system rather than optional fields.

Money comes in through more than one door — cash at the showroom, a digital wallet, and collection out in the street. Any system that does not unify those paths into one understandable treasury will leave a gap.

Staff will not drop their work to fill in data. Any screen that takes longer than the paper did will not get used.

Arabic and responsiveness

Not a translation — Arabic by design from the start. The whole layout is right-to-left, and displayed numbers are Eastern Arabic (٠-٩) through a global converter that runs before paint so there is no flash of Latin digits.

Read the detailHide the detail5 points
  • Wide tables scroll inside their own container and the page itself never scrolls sideways.
  • Field font size is large enough that mobile does not auto-zoom when typing.
  • Height uses dynamic viewport units, because of the browser bars that move on Android.
  • It installs as an app: there is a manifest and icons, so staff add it to the home screen and open it without a browser bar.
  • Collecting outside the showroom runs on the same complete system on mobile, not a reduced version of it.

Logging in from mobile

1 / 10

The screens

28 screens

Every name, number and amount in the screenshots is fully generated demo data, produced on a separate, disposable local database instance with a seeded random generator. There is no real customer data and no real amount, and no real figure was rescaled — so the showroom's actual numbers cannot be inferred from these images. The showroom's own identity (name, address, phone, wallet number) was written into the source code in 40 files, including logo SVGs that hold the name as text; it was substituted in the copy that the captured build came from. Before every shot the page text is swept, and a check rejects the shot outright if any forbidden string is found — no image was written to disk without passing that check.

Daily work

Login screenThe session is a row in the database, not just a cookie
Payments screen — the starting pointEach transaction type has its own path and its own record
Collections screenThe repayment percentage is computed from the actual instalment rows, not typed in by hand
Instalment calculatorThe showroom's real pricing rule, implemented in one place

The request cycle — from submission to execution

Sales request boardA request moves through gated stages, not a free-form status
The same board through the investigator's eyesPermissions change what the server returns
Approvals screenExecution stays locked until the manager approves
New instalment request formValidation at entry, and the instalment is calculated live
Benevolent loansA separate track with the same discipline and no interest at all

Treasuries and money movement

Treasuries and staff floatsEach treasury balance is derived from its movements, never written
Treasury movement logEvery pound in or out has a row that explains it
Financial transactionsOne table carrying every display feature the system needs
Confirming digital transfersDigital money does not enter the treasury until a person reviews it
Jam'iyyas — rotating savings groupsA recurring monthly commitment tracked inside the same treasury
Partner settlementThe profit split is computed from an actual ledger

Client files and instalments

Client registerPaid and remaining are calculated per client
Client fileThe client's whole history on a single screen
Instalment matrixEvery due date in a single grid
Client levelsThe classification rules live in the database, not in the code

Stock and suppliers

Stock — unit by unitEvery unit is tracked through to the contract it went out on
SuppliersEach supplier balance is derived from their ledger

Permissions and audit

Users and permissionsOne permission matrix drives both the interface and the server
Activity logEvery change is recorded with a before and after picture
ReportsReport figures match the operational screens
Recycle binDeletion is reversible; the data is never actually removed
Database documentationThe documentation lives inside the app and is tied to the real schema

The same screen in different roles

Payments screen on a cashier accountA cashier sees only their own float
Client register on a cashier accountSame data, fewer permissions

What changed

BeforeAfter
"How much is left on this client?" — open and reconcile three sourcesOne number on the screen, derived from the instalments
Calculating the instalment — on a hand calculator every timeOne formula, the same number in the calculator and in the contract
Who is late today — flipping pages from memoryA work list ordered by what is due
Who took the money / who approved — not recordedAn audit log with actor, time, and the value before and after
Treasury balance — worked out at the end of the dayDerived live from the movements
Manager approval — verbalA gate locked in the code; no execution without it
Collecting outside the showroom — paperThe same complete system on mobile
  • Before

    "How much is left on this client?" — open and reconcile three sources

    After

    One number on the screen, derived from the instalments

  • Before

    Calculating the instalment — on a hand calculator every time

    After

    One formula, the same number in the calculator and in the contract

  • Before

    Who is late today — flipping pages from memory

    After

    A work list ordered by what is due

  • Before

    Who took the money / who approved — not recorded

    After

    An audit log with actor, time, and the value before and after

  • Before

    Treasury balance — worked out at the end of the day

    After

    Derived live from the movements

  • Before

    Manager approval — verbal

    After

    A gate locked in the code; no execution without it

  • Before

    Collecting outside the showroom — paper

    After

    The same complete system on mobile

The operational impact here is described in terms of what became possible, not in performance figures — because the showroom's real operating numbers are not measured here, and were deliberately not measured.