██████╗ ██████╗ ███████╗███████╗ ██╗███╗ ██╗███╗ ██╗███████╗███████╗ ██╔══██╗██╔═══██╗██╔════╝██╔════╝ ██║████╗ ██║████╗ ██║██╔════╝██╔════╝ ██████╔╝██║ ██║███████╗█████╗ █████╗ ██║██╔██╗ ██║██╔██╗ ██║█████╗ ███████╗ ██╔══██╗██║ ██║╚════██║██╔══╝ ╚════╝ ██║██║╚██╗██║██║╚██╗██║██╔══╝ ╚════██║ ██║ ██║╚██████╔╝███████║███████╗ ██║██║ ╚████║██║ ╚████║███████╗███████║ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚══════╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═══╝╚══════╝╚══════╝
and its faithful PWA re-implementation. Every behaviour described herein was
verified against the running original. East London, South Africa.
This system runs an auction house. It keeps three master files — sellers, buyers and the vendue roll — and two history files, sales and purchases. During an auction, every lot that goes under the hammer is entered onto the vendue roll: which seller brought it, what it was, which buyer took it, and for how much. After the auction the system prints each buyer an invoice and each seller a statement, collects money in both directions, and finally archives the whole event into the history files, wiping the slate for the next auction.
The word vendue is an old term for a public auction sale. The vendue roll is the paged ledger of everything sold — the beating heart of the system. Everything else exists to feed it or settle it.
Buyers owe the auction house for what they bought. Their paperwork is an invoice; their payments are receipts.
The auction house owes sellers for what was sold on their behalf, minus commission and costs. Their paperwork is a statement; their payments are cheques.
The system is built around a strict cycle. Understanding it explains almost every screen:
┌──────────────┐ ┌──────────────┐ ┌──────────────────┐
│ 1. ENTER │ │ 2. ENTER │ │ 3. ENTER THE │
│ SELLERS ├────►│ BUYERS ├────►│ VENDUE ROLL │
└──────────────┘ └──────────────┘ └────────┬─────────┘
│
┌─────────────────────────────────┘
▼
┌──────────────────────────┐ ┌───────────────────────────┐
│ 4. PRINT EVERY BUYER'S │ │ 5. PRINT EVERY SELLER'S │
│ INVOICE ├─────►│ STATEMENT │
└──────────────────────────┘ └────────────┬──────────────┘
│
┌─────────────────────────────┘
▼
┌──────────────────────────┐ ┌───────────────────────────┐
│ 6. CONTROL CHECK │ │ 7. UPDATE ANALYSIS │
│ (do the books ├─────►│ archive + wipe for │
│ balance?) │ │ the next auction │
└──────────────────────────┘ └───────────────────────────┘
then, at any time afterwards:
RECEIPTS from buyers · CHEQUES to sellers · REPORTS
Two flags drive the cycle's safety interlocks:
PRINTED — every seller and buyer record carries a printed flag. Printing an account sets it; editing anything afterwards clears it again, forcing a reprint. The UPDATE run (chapter 12) refuses to archive while anyone is unprinted. This guarantees no account is ever archived without paperwork having been produced from its final figures.
PERMANENT — sellers and buyers marked permanent survive the end-of-auction wipe; the rest are cleared out. In practice the house keeps all regular buyers permanent, so the buyer book carries over from auction to auction.
The system is keyboard-only. Every screen is 80 columns by 25 rows. Entry fields show as highlighted blocks ; the blinking cursor sits in the active field.
Inside any entry form
| Key | Action |
|---|---|
| Enter | Accept the field and move to the next one. Every field needs Enter — even a full field waits for it. The last field's Enter completes the form. |
| ↓ / ↑ | Next / previous field, keeping what you typed. |
| Tab / Shift-Tab | Same as ↓ / ↑. |
| Ctrl-W | Save everything and finish the form at once — no need to Enter through remaining fields. The power user's best friend. |
| Ctrl-Home / Ctrl-End | Jump to the first / last field of the form. |
| Ctrl-Y | Delete from the cursor to the end of the field. |
| Ins | Toggle insert mode. The cursor becomes a block and a small Ins indicator appears at the top of the screen. Sticky — stays on until pressed again. |
| Backspace | Delete the character to the left (the rest shifts left). |
| Esc | Nothing. Forms cannot be abandoned — this system predates the idea. You leave a form by completing it (enter 0 in a reference field, or answer N to the "another?" question). |
Inside any browse (full-screen table)
| Key | Action |
|---|---|
| ↑ ↓ PgUp PgDn Home End | Move through records. |
| → ← | Pan across columns too wide for the screen. |
| Esc | Leave the browse. (Here it does work.) |
The scoreboard
The top right of the screen (row 0) is the scoreboard. It shows Ins while insert mode is on, and complaints such as Invalid date (the date field blanks and waits for a proper one) or RANGE is 0 to 255 (the number you typed is outside the allowed range — fix it before you may leave the field).
Yes/No questions
Questions like DO YOU WANT TO ADD? show a highlighted Y or N. Type Y or N then Enter, or just Enter to accept what is shown. Take note of the default — it is usually Y for "carry on" questions and N for dangerous ones.
╔══════════════════════════════════════════════════════════════════════════════╗
║ M A I N M E N U ║
╠══════════════════════════════════════════════════════════════════════════════╣
1. ENTER SELLERS
2. ENTER BUYERS
3. ENTER VENDUE ROLL
4. PRINT BUYERS A/C
5. PRINT SELLERS A/C
6. DISPLAY DETAILS ON SCREEN
7. ENTER CHEQUES
8. ENTER RECEIPTS
9. SYSTEM MAINTENANCE AND REPORTS
0. EXIT
║ select 0 ║
╚══════════════════════════════════════════════════════════════════════════════╝
Type the option number and Enter. Option 0 backs out of any menu; at the main menu it closes the system. The menu order mirrors the auction cycle — on auction day you will walk it nearly top to bottom.
A seller is anyone whose goods the house auctions. Each has a reference number from 1 to 999. The seller record carries their contact details, banking details, an inventory of goods received, and — most importantly — their commission code and advertising code, which decide what the house deducts from their proceeds (see Appendix A).
1 · Amend sellers — adding and editing
The screen suggests the next free reference number. Accept it with Enter to add a new seller, or type an existing number to edit that seller. An unknown number asks SELLER NOT ON FILE — DO YOU WANT TO ADD?
╔══════════════════════════════════════════════════════════════════════════════╗ ║ SELLERS DETAILS ║ ╠══════════════════════════════════════════════════════════════════════════════╣ ║ REF. 82 DATE 18/08/2026 NAME TEST SELLER VAT ║ ║ ADDRESS1 1 TEST ROAD VAT REG. 4123456789 ║ ║ PERMANENT N ║ ║ TEL. ║ ║ ║ ║ CARTAGE 50.00 COMM. A ║ ║ MISC. 10.00 ADV. A ║ ║ BANK ACOUNT. ║ ║ BRANCH ║ ║ ITEMS : HOUSEHOLD GOODS ║ ╚══════════════════════════════════════════════════════════════════════════════╝
Field notes, in entry order:
| Field | Meaning |
|---|---|
| DATE | Date the goods were delivered. Defaults to today. |
| VAT REG. | The VAT switch. If this is filled in, every one of this seller's lots gets 15% VAT added on top of the hammer price. Leave it blank for private (non-VAT) sellers. The house convention for "registered but number unknown" is 99999999999. |
| PERMANENT | Y = survives the end-of-auction wipe. |
| CARTAGE / MISC. | Fixed rand amounts deducted from this seller's proceeds (transport, sundries). These survive the UPDATE wipe and carry into the next auction as defaults. |
| COMM. / ADV. | One-letter deduction codes — the money rules. See Appendix A. |
| ITEMS | Fourteen free-text lines describing the goods received. |
After the form, the system offers to print the goods-received document — a full page for the seller to sign, listing their goods and the house conditions ("reserve" items, 14-day collection, etc.).
Editing a seller clears their PRINTED flag: their statement must be reprinted before the next UPDATE run will proceed. This is deliberate.
2 · Delete sellers
Shows the seller read-only and asks for confirmation. Deleted records vanish from every screen immediately, and are physically removed at the next re-index (chapter 11).
A buyer is anyone bidding at the auction. The record is small: reference number, name, address, telephone, and the permanent flag. Money fields (amount owed, received, balance) are filled in by the system, never by hand.
╔══════════════════════════════════════════════════════════════════════════════╗ ║ BUYERS DEATILS ║ ╠══════════════════════════════════════════════════════════════════════════════╣ ║ BUYER CODE 199 ║ ║ NAME TEST BUYER ONE ║ ║ ADDRESS 9 BUYER LANE ║ ║ ║ ║ TELEPHONE ║ ║ PERMANENT N ║ ╚══════════════════════════════════════════════════════════════════════════════╝
(Yes, the title really says DEATILS. It has said so since 1992 and it is preserved on purpose — see Appendix C.)
The suggested "next" buyer code is unreliable — it wraps back to 1 once numbers pass 99, and the house's numbers run higher. Ignore the suggestion and type the code you want. Numbers up to 999 work fine.
This is auction day's screen. The roll is organised as numbered pages, each holding up to 19 lines — mirroring the paper sheets used at the podium. Each line is one lot sold.
1 · Add to vendue
DATE 18/08/2026 PAGE 1 ╔══════════════════════════════════════════════════════════════════════════════╗ ║ SELL DESCRIPTION BUY PRICE VAT TOTAL ║ ╠══════════════════════════════════════════════════════════════════════════════╣ ║ 8V OAK TABLE 199 333.33 50.00 383.33 ║ ║ 83 TOOL SET 199 50.00 0.00 50.00 ║ ║ ║ ╚══════════════════════════════════════════════════════════════════════════════╝ ENTER ANOTHER ITEM? Y 383.33 50.00 433.33
The rhythm per lot: seller ref Enter → description Enter → buyer ref Enter → price Enter → ENTER ANOTHER ITEM? The bottom row keeps running totals for the page.
The system validates as you go: an unknown seller ref stops with SELLER NOT ON FILE!!! and an unknown buyer with BUYER NOT ON FILE!!! (press any key, then re-enter the line). VAT is computed automatically the moment the price is entered — if and only if the seller has a VAT registration — and a V marker appears beside the seller number on VAT lines.
When a page fills (line 22 of the screen), answer ENTER ANOTHER PAGE? and continue on the next page number.
2 · Edit existing entries
Walks an existing page line by line. For each line: seller ref Enter, description Enter, buyer Enter, price Enter — press Enter through a line to leave it unchanged, or overtype to correct it. VAT is recalculated from the (possibly new) seller's registration on every pass. Enter 0 as the seller ref to stop early.
Three things to know about the edit screen: (1) The date at the top restamps the entire roll — every line on every page takes the date you accept there. (2) Changing which seller a line belongs to silently clears the old seller's PRINTED flag — both statements will need reprinting. Correct, and automatic. (3) There is no way to delete a single line — set its price to 0.00 instead, or correct the line to what it should be.
Both printing screens ask for a range of reference numbers (default: everyone)
and SEND OUTPUT TO PRINTER? — answer Y to print, or N to
write the output to a file (XXX.PRN) instead. Printing is not just
paperwork: it computes and locks in the money.
Menu 4 · Buyers' invoices
One invoice per buyer who bought anything. Lots are split into VENDOR (VAT lines) and NON-VENDOR columns, VAT is totalled, and the grand total is written onto the buyer's record as the amount they owe. Buyers with no purchases are quietly marked printed with nothing produced.
ROSE-INNES AUCTIONS
Reg. No. 2004/073930/23 VAT No. 4640156982
TAX INVOICE, 26 MAGNOLIA ROAD, BRAELYN, EAST LONDON
DATE 19/08/2026
REF NO. 199 NAME TEST BUYER ONE
ADDRESS 9 BUYER LANE
SELL DESCRIPTION VAT VENDOR NON-VENDOR
===============================================================================
82 OAK TABLE 50.00 333.33
83 TOOL SET 0.00 50.00
82 CHAIR 18.52 123.45
======================================
68.52 456.78 50.00
NON-VENDOR 50.00
VENDOR 456.78
VAT 68.52
==========
575.30
Menu 5 · Sellers' statements
One statement per seller who sold anything. The system totals their lots, then applies the deductions in this order: it computes commission from the commission code, advertising from the advertising code, and subtracts both plus the fixed miscellaneous and cartage amounts:
NETT = GROSS + VAT − MISC − COMMISSION − ADVERTISING − CARTAGE
Worked example (verified): gross 456.78, VAT 68.52, comm code A → 94.55, adv code A → 26.26, misc 10.00, cartage 50.00 → NETT 344.49.
Codes E (commission) and B (advertising) are "manual": the printing run pauses, shows that seller's figures on screen, and asks you to type the amount. See Appendix A for the full code table.
Print buyers (menu 4) before sellers (menu 5) — the cycle expects it, and the UPDATE run checks buyers first.
Menu 6 is the read-only wing: browses over every file (options 2–6), a drill-down (option 1) showing one buyer's purchases with totals — from which you can jump straight to printing their invoice or taking their receipt — and the control check (option 7):
╔══════════════════════════════════════════════════════════════════════════════╗ ║ C O N T R O L C H E C K ║ ╠══════════════════════════════════════════════════════════════════════════════╣ ║ GROSS VAT TOTAL ║ ║ VENDUE ROLL 506.78 68.52 575.30 ║ ║ ║ ║ BUYERS 575.30 ║ ║ ║ ║ SELLERS 506.78 68.52 575.30 ║ ║ - MISCELLANEOUS 10.00 ║ ║ - COMMISSION 100.30 ║ ║ - ADVERTISING 26.26 ║ ║ - CARTAGE 50.00 ║ ║ TOTAL 388.74 ║ ║ NETT 388.74 ║ ╚══════════════════════════════════════════════════════════════════════════════╝
Three independent tallies of the same auction — the roll itself, what buyers owe, what sellers grossed — must agree, and the two bottom figures must equal each other. If they do, the books balance. If not, something was mis-entered; find it before running UPDATE. (The UPDATE run shows you this same screen and asks Is the control correct?)
Menu 8 · Receipts — money in from buyers
First question: Enter receipts for current vendue roll? Y means the buyer is paying for the auction just entered (before UPDATE) — you give the buyer's ref. N means paying for a past, archived auction — you give the date of that sale plus the ref. Then enter the receipt number and the amount paid. The system accumulates: RECEIVED grows, and BALANCE = AMOUNT − RECEIVED. Part-payments are normal; pay in as many receipts as needed.
Menu 7 · Cheques — money out to sellers
Cheques always work against archived auctions (after UPDATE): give the date of the sale and the seller's ref, and the statement figures appear. Enter the cheque number and amount paid; BALANCE = NETT − PAID.
The system allows overpayment without complaint — pay a seller 400.01 against a 344.49 statement and the balance simply shows −55.52. Watch the sign.
| Option | What it does |
|---|---|
| 1 · COMPANY DETAILS | The letterhead and settings: name, addresses, registration and VAT numbers, phone/fax, printer control codes, and the VAT rate (0.15). These print on every document. (Note: the first address line doubles as the document heading — it currently reads "TAX INVOICE" on purpose.) |
| 2 · INDEX FILES | Housekeeping: physically removes deleted records and rebuilds all indexes. Run it if anything ever looks out of order. Harmless. |
| 3/4 · MASTER LISTINGS | Prints the full seller / buyer address books. |
| 5/6 · ANALYSIS REPORTS | Prints archived purchases (sellers' side) or sales (buyers' side) for a date range — including outstanding balances. This is where you chase debtors: run the sales analysis and look at the OUTSTANDING column. |
| 7 · CLEAR ANALYSIS | Permanently deletes archived history up to a date you give. Only ever run this after a backup. The current file holds history back to 2009 — there is no reason to run this in normal use. |
| 8 · UPDATE ANALYSIS | The end-of-auction run. Big enough for its own chapter → |
UPDATE closes an auction. It is the one truly irreversible action in daily use, and the system guards it accordingly. What it does, in order:
After UPDATE, the current auction lives only in the history files — which is exactly where receipts (non-current) and cheques then find it.
The best way to understand the system is to run one tiny auction end to end.
This walkthrough takes about fifteen minutes. If you are using the PWA, open it
with ?reset on the address to start from a fresh copy of the data —
nothing you do here can hurt anything. Every figure below is what the system
will actually show.
Step 1 — two sellers
Step 2 — a buyer
Step 3 — the auction itself
Step 4 — paperwork
Step 5 — some money arrives
Step 6 — check and close the auction
Step 7 — settle up afterwards
You have now touched every part of the system that matters. Reset the data and run it again until the rhythm feels automatic — then you understand the software.
VAT
Commission codes (deducted from the seller)
| Code | Rate | Formula | On gross 456.78 |
|---|---|---|---|
| A | 18% | gross × 0.18 × 1.15 | 94.55 |
| B | 12.5% | gross × 0.125 × 1.15 | 65.66 |
| C | 10% | gross × 0.10 × 1.15 | 52.53 |
| D | 6% | gross × 0.06 × 1.15 | 31.52 |
| E | manual | typed during the statement run | — |
The × 1.15 makes every commission VAT-inclusive — the statement says so at the bottom: (All above inclusive of vat).
Advertising codes
| Code | Formula |
|---|---|
| A | gross × 0.05 × 1.15 |
| B | typed during the statement run, then × 1.15 applied |
| (blank) | no advertising charge |
Balances
Seller: BALANCE = NETT − PAID. Negative = overpaid.
| File | Contents | Lifecycle |
|---|---|---|
| SELLER | Seller book: details, codes, goods inventory, current-auction money | Kept forever; money fields wiped by UPDATE (misc/cartage kept) |
| BUYER | Buyer book: details, current-auction amount/receipts | Permanent buyers kept, others deleted by UPDATE |
| VENDUE | The current roll: one record per lot (page, line, seller, desc, buyer, price, VAT) | Wiped completely by UPDATE |
| SALES | History of every buyer invoice ever archived (31,000+ records back to the 1990s) | Grows at each UPDATE; receipts against old sales update it |
| PURCHASE | History of every seller statement archived | Grows at each UPDATE; cheques update it |
| DETAILS | Company letterhead, registration numbers, printer codes, VAT rate | Edited via menu 9 · 1 |
The re-implementation reproduces the original exactly — including its warts. Knowing them saves confusion:
| Quirk | Detail |
|---|---|
| "BUYERS DEATILS" | The buyer screen title has carried this typo since 1992. |
| Buyer ref suggestion | Wraps at 99 and suggests numbers already in use. Type your own. |
| "ACOUNT." label | The seller banking section misspells ACCOUNT. |
| V marker collision | On the vendue screen the V flag overwrites part of a 2-digit seller ref's display (e.g. "8V" for seller 82). The stored data is correct. |
| UPDATE refusal message | Shows refs over 99 mangled ("Buyer 0" or "**") — the message truncates to two digits. The check itself is correct. |
| Receipt screen labels | A label paints over another; the visible result is correct. |
| Date order in browses | History browses order dates as text, day-first — so 12/05/2009 is followed by 12/05/2017. Use the date prompt to jump; scrolling order looks odd but is faithful. |
| No line delete on the roll | Edit the line or zero its price instead. |
| Esc does nothing in forms | By design (the original disabled it). 0 or N exits. |
╔═══════════════════ FORM KEYS ═══════════════════╗ ╔═══════ BROWSE KEYS ═══════╗ ║ Enter accept field / next ║ ║ ↑ ↓ PgUp PgDn Home End ║ ║ ↑ ↓ previous / next field ║ ║ move ║ ║ Ctrl-W SAVE ALL and finish form ║ ║ ← → pan columns ║ ║ Ctrl-Home first field Ctrl-End last field ║ ║ Esc leave browse ║ ║ Ctrl-Y delete to end of field ║ ╚═══════════════════════════╝ ║ Ins insert mode (block cursor, "Ins") ║ ║ Esc (nothing — use 0 / N to exit) ║ ╚═════════════════════════════════════════════════╝ AUCTION DAY, IN ORDER: 1 sellers → 2 buyers → 3 roll → 4 print buyers → 5 print sellers → 6·7 control check → 9·8 UPDATE → 7 cheques / 8 receipts GOLDEN RULES · VAT follows the SELLER's VAT REG field, nothing else. · Editing anyone after printing = reprint before UPDATE will run. · UPDATE only with a balanced control check. It cannot be undone. · MISC and CARTAGE on a seller carry over to the next auction — check them.