Skip to content

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):

  1. 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.
  2. 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.
  3. 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).
  4. 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 classificationInsurance / 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 .xlsx with 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:

  1. New Indent — pick the issuing pharmacy store, the requesting ward/department, and one or more drugs with quantities. Saved as Draft.
  2. Submit for approval — Draft → Pending.
  3. 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.
  4. 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.