Pharmacy & Dispensing¶
Dispense medication against prescriptions, manage drug batches and expiry, track controlled drugs, keep a hospital formulary, and move stock between locations. Stock is shared with Inventory and only decremented when a dispense is confirmed.
Screenshot: Pharmacy dashboard — TODO
Medical → Pharmacy (/medical/pharmacy/dashboard) shows pending dispenses, dispensed counts,
controlled-drug inventory, low-stock alerts, near-expiry and recalled batches.
Drug master: generic, brand & rates¶
Medical → Pharmacy → Formulary (/medical/pharmacy/formulary) is the approved-prescribing drug
list. Each drug carries a generic name (what doctors prescribe — the only name shown to
prescribers) and, for pharmacy use, an optional brand / trade name. Two per-unit rates are
configured per drug:
- Paid rate — cash / self-pay price.
- Insurance rate — the negotiated HIB/insurer price.
Free is always zero. Prescribers never see the brand or the rates — only the generic.
Dispense a prescription¶
Medical → Pharmacy → Dispenses (/medical/pharmacy/dispenses):
- New Dispense — if a medication order ID is supplied, the form pre‑fills from the prescription. Capture patient, drug item, quantity, warehouse, dispense date, batch/lot, expiry, dispensed‑by, remarks. Created as Pending.
- Rate — pick Free / Insurance / Paid for this dispense. The default is Insurance when the patient has an active policy, otherwise Paid (always overridable). The per-unit price comes from the drug's configured rate; you can override it in the Unit rate field.
- Dispense — issues the stock (decrements the warehouse) → Dispensed. A non-free dispense auto-raises an unbilled patient charge at the chosen rate, so nothing is dispensed-but-unbilled. Cancelling voids that charge (if not yet invoiced). When the dispense has a batch/lot on record, a Scan batch barcode field appears next to the Dispense button (camera-scan button or type it in); for a controlled/narcotic drug scanning the lot is mandatory and a mismatch refuses the dispense — for any other drug it's optional but still checked if you scan one (the same scan-verify already used when recording a drug return).
- Label — print a patient medication label; Cancel reverses any issued stock.
Dispense Register (/medical/pharmacy/dispense-register) is the day‑book — filter by drug,
status, and date range with a dispensed‑quantity total.
Allergy safety gate¶
If the patient has a recorded drug allergy matching the drug being dispensed — by name or by drug‑class cross‑sensitivity (e.g. penicillin → amoxicillin) — confirming the dispense is blocked. A red alert replaces the Dispense button with an override‑reason form; a clinician must enter a clinical justification to proceed. The override is recorded on the dispense and in the Allergy Overrides register. See Allergies & Safety.
Formulary (approved-prescribing list)¶
Medical → Pharmacy → Formulary (/medical/pharmacy/formulary) — the hospital's approved drug
list (generic name, RxNorm, strength, form, route, restricted flag). When a formulary is curated,
EMR medication orders are checked against it: a placed order for a drug not on the active formulary
saves with a formulary advisory warning to the prescriber (doctors may prescribe unavailable /
off-formulary drugs; the hard stop remains the dispense allergy gate). Each item also carries a
supply classification — Insurance / Free (Supply) / Paid — which pre-selects the dispense
rate, plus the HIB (IMIS) and SSF benefit-package item codes.
Batches, expiry & recall¶
Medical → Pharmacy → Drug Batches (/medical/pharmacy/batches) — register batches (number, item,
warehouse, quantity, supplier, pack unit, manufactured date, expiry). The dashboard flags
near‑expiry and expired stock.
Set up the drug catalog first
A batch is recorded against a drug in the inventory item master — create your drug categories and drug items under Inventory → Setup Masters (Item Categories, then Items) before registering batches. The Getting Started checklist walks this order: drug categories → drug catalog → batches.
- Bulk stock upload (
/medical/pharmacy/batches/import) — load a whole medicine list from one.xlsxwith columns Generic Name, Brand Name, Unit, Batch, Mfd Date, Expiry, Price. Rows upsert by item + batch number (re-upload is safe); unmatched drugs are reported as skipped, never guessed. -
At dispense, the batch picker lists lots earliest-expiry first and shows each lot's on-hand quantity and the item's supply classification, so the pharmacist can choose the right brand/lot.
-
Recall a batch — flags the lot, builds the affected‑dispense contact list, and notifies every patient who received that lot: each gets a Drug recall alert in their record/portal so they can be contacted.
- Write‑Off expired stock (posts the adjustment to inventory).
Stock report & low-stock alerts¶
Medical → Pharmacy → Stock Report (/medical/pharmacy/stock-report) shows, per drug, the usable
on-hand quantity (from in-date, un-recalled batches) against its reorder level, flagged
OK / LOW / OUT, alongside the near-expiry batches (≤ 90 days).
- A drug at or below its reorder level raises a Low stock alert; a drug with no usable stock raises a Out of stock (critical) alert. These appear in Clinical Alerts.
- Alerts fire automatically when a dispense drops stock below the level, and on a daily sweep. Use Run stock check & alerts to refresh them on demand. Alerts are idempotent — one per drug until resolved.
- The Low / out-of-stock drugs count is a dashboard KPI. The reorder level is the item's setting in Inventory.
- The stock table and the near-expiry list are downloadable as CSV, and a High-consumption drugs card (top-dispensed over a chosen date range, also CSV) supports purchase planning.
Sales report¶
Medical → Pharmacy → Sales Report (/medical/pharmacy/sales-report) — dispense revenue for any
date range, broken down by payer: Insurance / Paid (cash) / Free, with counts, per-payer totals and
a grand total. Downloadable as CSV for management and HMIS submissions.
Controlled drugs, reconciliation & transfers¶
- Controlled Drugs (
/medical/pharmacy/controlled-drugs) — designate narcotic/restricted drugs by schedule for compliance tracking and a separate register. - Narcotic Reconciliation (
/medical/pharmacy/narcotic-reconciliation) — a physical count of a controlled drug reconciled against the system balance; a non‑zero variance flags a discrepancy to investigate (Narcotic Drugs Control Act). - Stock Transfers (
/medical/pharmacy/transfers) — move drugs between warehouses.
Ward indents¶
Medical → Pharmacy → Ward Indents (/medical/pharmacy/indents) — a pharmacy-branded requisition
screen for a ward/department to request drugs from a pharmacy store. It's a thin front end over the
same Inventory → Stock Issue workflow (Inventory), restricted to drugs on
the formulary:
- New Indent — pick the issuing pharmacy store, the requesting ward/department, and one or more drugs with quantities. Saved as Draft.
- Submit for approval — Draft → Pending.
- Approve & issue stock — Pending → Posted, decrementing the pharmacy store's stock (a different user than the submitter must approve — segregation of duties). Reject sends it back with a reason instead.
- Reverse — undoes a Posted indent's stock effect.
Stock moves on confirmation, not order
A Pending dispense doesn't touch stock; only Dispense issues it. Cancelling a dispensed item reverses the stock movement.
Benefit packages & FIFO dispensing¶
- Benefit package (सुविधा थैली) — formulary items can be grouped by their HIB/SSF benefit package for package-wise views and claim bundling (alongside the IMIS/SSF item codes and caps).
- FIFO / lot-level stock — dispensing consumes the earliest-expiry lot first and decrements stock at the lot level (not just the aggregate), so near-expiry stock clears first and every batch register stays accurate. A cancelled dispense restores the lot.