Overview
Your permissions
Checked server-side on every request. This list is what the API will honour.
Products
Customers / Buyers
Buyers of medical devices and equipment. Each device sold at the counter can be attached to one of these records, so a unit can be traced to its owner for a recall or a warranty claim.
Device Traceability
Every serialized unit sold, tied to its buyer's contact details and warranty. This is the recall / warranty ledger — search by serial number, product or buyer.
Expiry
Most manual pharmacies discover an expiry when a customer points at the box. Expired batches are never sold — the allocator excludes them — but they still sit on the books until written off.
Low Stock
At or below reorder point. Counts exclude expired batches — they are not sellable stock.
Stock Counts
A count snapshots what the system believes, you enter what is on the shelf, and posting turns every variance into an adjustment movement with a reason.
Stock Movements
Append-only. Every quantity change in the system is one of these rows — if stock on hand ever disagrees with their sum, these win.
Suppliers
Purchase Orders
Receiving
This is where batches are born. Lot number and expiry are mandatory on every line — they are what FEFO, the expiry dashboard and recall traceability all depend on. A PO is not required: direct deliveries happen constantly.
Supplier Invoices
The invoice creates the payable, not the delivery — a delivery without an invoice is not yet a debt you can pay. Consigned receipts never get one.
Payables Aging
Unpaid and partly-paid supplier invoices. Consigned stock never appears here — it is not a payable until it sells.
By supplier
Invoices
Consignment Settlement
Consigned stock sits on your shelf but is not yours. You owe the consignor for what has sold — this is what their invoice gets matched against.
Prescriptions
The pharmacist encodes the paper prescription here. At the counter, a sale of a prescription drug is linked to it — that decrements the quantity, tracks refills, and writes the dispensing log.
Doctors
Prescribers on file. An S2 licence is required before any dangerous drug they prescribe can be dispensed.
Dangerous Drug (S2) Register
Sales Reports
Inventory Reports
BIR & Tax
Financial Reports
Journal
Every entry posts through one choke point that enforces balance, an open period, and the audit log.
Chart of Accounts
System accounts (referenced by the posting rules) can be renamed but not deleted or restructured.
Expenses
Capture as a draft, then approve to post. At or above the threshold, the approver must be someone other than the person who entered it.
Accounting Periods
Closing a period locks it: nothing can post into it until an admin reopens it, with a reason, in the audit log.
Unposted Documents
Source documents with no journal entry yet. There is no separate queue — a document without an entry is the queue, so this can never drift from reality. Posting is idempotent and safe to retry.
Users & Roles
Roles
Audit Log
Append-only. Every entry is written through one choke point
(src/Audit.php) and is never updated or deleted.
Backup
Run a manual backup before anything risky. Nightly backups run from
tools/backup.php; prove they restore with
tools/verify-restore.php.