User guide

A walk through ICTHospital the way you would actually use it: register a patient, book them in, admit them, prescribe, order bloods, dispense, bill, and read the reports at the end of the week. Every screenshot below is a real screen from a working install.

ICTHospital in two minutes

Prefer to watch first? This short video tours the main screens, from registering a patient to billing and reports.

Before you start

Sign in with the account created when the system was installed. The default is admin with the password 123456, and you should change it on day one.

ICTHospital dashboard with the main navigation menu down the left

The menu is grouped by what you are doing rather than by which table the data sits in.

Clinical work is at the top of the menu, money in the middle, administration at the bottom. You only see the entries your role is allowed to open, so a receptionist's menu is shorter than an administrator's.

Load the demonstration data

An empty system is hard to judge. If you are evaluating ICTHospital, load a small set of believable records first:

php artisan db:seed --class=DemoDataSeeder

That gives you four departments, four doctors, five patients, a ward with someone in it, a part reported lab request and an invoice that is half paid. It also sets up the front desk: a panel company, charity and online booking patient type, panel prices, a doctor share policy, visit fees, one doctor's weekly clinic hours, two radiology exams and a morning of OPD visits with tokens. It is safe to run twice and it never overwrites anything, but keep it off a live system.

The dashboard

ICTHospital dashboard showing patient, doctor and staff counts with income against expenses

Counts across the top, money in the middle, recent patients underneath.

Nothing here is stored as a running total. Every figure is worked out when you open the page, so it cannot drift away from the records it is counting.

Patients

The front desk starts here. Admissions, prescriptions, lab requests and invoices all hang off a patient record, so this is the first thing you will create.

Patient list in ICTHospital with search, patient IDs, age, phone and assigned doctor

One search box covers name, patient ID, phone and email.

One box rather than a filter per column, because the person on the phone gives you whatever they can remember.

Patient registration form in ICTHospital

Only the name is required.

Someone walking in at two in the morning with no paperwork still has to be registerable, and a form that refuses that record just gets worked around with junk data.

Two things worth knowing. Age is worked out from the date of birth rather than typed, so it cannot go stale the way it did in the system this replaces. And the patient ID comes from the highest one already issued, so deleting a record never hands the next patient a number somebody else is using.

The patient record

Open any patient, from the patient list, a search or a name on the appointment list, and everything recorded about them is on one page.

ICTHospital patient record showing patient ID, age, blood group, contact details and assigned doctor

Who the patient is comes first, then the clinical record underneath.

Patient record in ICTHospital listing OPD visits with blood pressure, pulse, temperature and weight, then prescriptions, lab results, admissions and billing

Every visit with its vitals, then prescriptions, lab results, admissions and billing.

Each visit has a Record vitals link, which reads Edit vitals once something has been entered. The buttons for a new prescription, lab tests, a history note or an invoice only appear for roles that are allowed to use them, so a doctor is not offered an invoice button they cannot save.

A patient who has just been registered has no visits yet, so no vitals show. They appear as soon as an appointment is booked.

Medical history

Medical history list in ICTHospital showing allergies and chronic conditions per patient

Allergies, past operations, chronic conditions, with a scan attached where you have one.

This is the first thing worth reading before a consultation, so it has a screen of its own rather than being buried in the patient record.

The patient's name, address and phone are copied onto each entry when you write it. That looks like duplication and it is deliberate: a note written two years ago should still read correctly after the patient moves house.

Attached reports are private. They open only for signed in staff whose role has the medical history permission, through a link inside ICTHospital. The file itself is never placed in a public folder, so a copied link does not open it for anyone outside.

Doctors and departments

Doctor register in ICTHospital with department, contact details and upcoming appointment counts

Every clinical screen picks a doctor from this list.

Add at least one doctor before you try to book anything. The list shows how many upcoming appointments each one has, which answers the question you actually have when you are looking at it.

A doctor with appointments on file cannot be deleted. The appointment record points at the doctor by id, so removing them would leave every past appointment pointing at nothing.

Department list in ICTHospital showing how many doctors sit in each

Renaming a department moves every doctor in it to the new name.

If you are upgrading from an older install, the departments your doctors already use show up as unlisted, and one button adopts them onto the list.

Giving a doctor a login

A doctor on the register and a doctor who can sign in are set up on the same form.

  1. Go to Doctors and choose Add doctor, or open an existing doctor and press Edit.
  2. Fill in the doctor's details: name, department, phone and email.
  3. In the Login section at the bottom, enter a username and a password of at least 8 characters.
  4. Save. The confirmation says Login created, and you can hand the username and password to the doctor.
Add doctor form in ICTHospital with the Login section for a username and password

The Login section is optional. Leave it empty for a doctor who does not sign in.

The doctor gets the Doctor permissions set under Users and Roles, Permissions. Once the login exists, the same section changes the username or sets a new password, for example when someone forgets theirs.

Staff

Nurse list in ICTHospital

Nurses, pharmacists, laboratory staff, receptionists and accountants share one screen.

They share a screen because they share a shape: a name, contact details and a photo. Nurses have their own permission, so you can let ward staff manage the nursing list without handing them the accounts list.

Nurses, pharmacists, laboratory staff, receptionists and accountants each have their own role, so each can be given exactly what their job needs.

Add receptionist form in ICTHospital with the optional Login section

Every staff form has the same Login section as the doctor form.

Pharmacists and laboratory staff start with no permissions at all. Give them what they need on the permissions grid before handing over their login.

Appointments

Appointment day view in ICTHospital filtered by doctor and status

A day view, filtered by doctor and by status.

The system will not let you double book a doctor, but it will let you book back to back, because that is how a clinic actually runs. Cancelling or marking a no-show frees the slot again straight away.

If two clerks try for the same slot at the same moment, one gets it and the other is told. That is a database lock rather than a polite check, so it holds under real pressure.

A doctor's day

  1. Sign in with your own username and password.
  2. Open Appointments. Today's appointments are listed in time order.
  3. Choose your name in the Doctor box and press Show to see only your patients. Change the date to look ahead, or filter by status.
ICTHospital appointment day list filtered to one doctor, with the Open and Vitals buttons

One doctor, one day. Leave the doctor and status boxes on All and Any to see everyone.

Each appointment has two buttons. Open shows the booking. Vitals opens the visit, where you record blood pressure, pulse, temperature and weight and set the status: Arrived when the patient is in, Completed once they have been seen, or No show.

ICTHospital appointment form with the status and the vitals fields for blood pressure, pulse, temperature and weight

Vitals are optional and belong to the visit, so each one keeps its own readings.

If your clinic runs the OPD token queue, a doctor can work from OPD, Token Queue instead: Call in starts the visit and Consult opens the consultation note for that patient.

Booking and cancelling are front desk jobs in the default roles, so the Book appointment button only appears for roles that may book. If your doctors book their own appointments, switch on Appointment Add for doctors on the permissions grid.

Beds and admissions

Ward board in ICTHospital showing bed categories and occupancy

A bed is free when no admission points at it with an open discharge time.

There is a status column on the bed record and it is kept in step, but the admission is the truth. In the system this replaced, a clerk set both by hand and they drifted apart within weeks.

Admissions list in ICTHospital with current and discharged patients

Two rules the old system never enforced: one patient per bed, one bed per patient.

Prescriptions and medicines

Prescription list in ICTHospital showing prescribed drugs per patient

Each drug on a prescription is its own row.

That is what makes "which patients are on this drug" a question you can answer, and it was the main reason the database schema changed during the rebuild.

Medicine catalogue in ICTHospital with stock quantities and prices

You can still prescribe something that is not in the catalogue.

A doctor should not be blocked because the pharmacy has not added a line yet.

Laboratory

Laboratory request list in ICTHospital with per test status

Each test carries its own result and status, so a request can be part reported.

The bloods come back, the culture is still growing, and the screen shows exactly that instead of pretending the whole request is either done or not.

Laboratory test catalogue in ICTHospital with reference ranges

Fill in the reference range. It is copied onto the test when it is requested.

That way a result from last year is still readable against the range that applied when it was measured.

Pharmacy

Pharmacy dispensing list in ICTHospital

Stock comes out of the catalogue in the same transaction as the sale.

The quantity on the shelf follows what was actually handed over. A sale that fails leaves the stock untouched, reversing a sale puts it back, and two people dispensing the last few units at the same time cannot both succeed.

Invoices and prices

Billable services and price list in ICTHospital

Invoice lines are raised against this list, so fill it in before you bill anyone.

The price here is the current one. It is copied onto the invoice line when the charge is raised, so putting a price up next month does not rewrite what somebody was billed last month.

Invoice list in ICTHospital showing outstanding balances

Payments are rows, so a deposit now and the balance later is something the system can express.

Whether an invoice is unpaid, part paid or settled is worked out from those payments. Nobody types it, so it cannot be wrong. You cannot overpay an invoice, and a refused payment is not recorded at all.

Front desk, OPD and radiology

These screens arrived in October 2026. They follow how a busy outpatient department runs: patient types with their own prices, a token queue, the doctor's consultation note, radiology, doctor share and closing the cash at the end of a shift.

Patient types and prices

ICTHospital patient types: general, charity, a panel company and online booking

Each type decides which price list its invoices use and which day book column the money falls in.

ICTHospital price list for one patient type with OPD and IPD prices per service

One list per patient type, with an OPD and an IPD price for every service.

Every patient has a type: General, a panel company, Charity, an online booking platform or Staff. Set them up under Pricing by Patient Type, then enter what each type pays for each service, separately for outpatients (OPD) and inpatients (IPD). A blank box means the list price.

Update pricing list puts a whole list up or down by a percentage, Copy pricing list starts a new company from an existing one, and Download price list gives you a CSV. Invoices pick the price from the patient's type and whether they're an outpatient or an inpatient.

Fuller registration, health card and wristband

ICTHospital registration details: patient type, CNIC, guardian MR number, medico-legal flag and webcam photo

Patient type, CNIC, guardian, old MR number and the medico-legal flag, with a webcam photo above.

ICTHospital printed health card with the MR number as a barcode

The health card.

ICTHospital printed patient wristband with name, MR number and barcode

The wristband.

The patient form also takes the CNIC, the guardian's relation and MR number, an old MR number from a previous system, an employee or student number, the city, an alternate contact and the medico-legal (MLC) flag. Take photo with webcam works on HTTPS or localhost. From the patient page, Health card and Wristband print a card or a band with the MR number as a barcode.

OPD token queue

ICTHospital OPD token queue for one day with Call in, Consult and Bill fee buttons

The day at a glance: who is waiting, who is with the doctor and who has gone home.

ICTHospital weekly booking slots for a doctor, with blocked dates and the free slots for today

A doctor's weekly clinic hours. The free slots for today are listed underneath.

OPD, Token Queue lists the day's visits. Check in gives the next token for that doctor, Call in starts the consultation and Done checks the patient out, so you can see how long each patient waited and how long they spent with the doctor.

A walk-in is booked, checked in and given a token in one step, and you can bill the visit fee at the same time. Visit fees are set per doctor, visit type and shift under Visit Fees. A doctor's weekly clinic hours and days off are under Booking slots on the doctor's page. Once they're set, bookings have to fit inside them and the booking form offers the free slots. A doctor with no slots can be booked at any time.

Consultation

ICTHospital OPD consultation note with vitals, presenting complaint and the patient's previous visits

Vitals from the visit come in already filled, with the previous visits alongside.

ICTHospital consultation examination by body system, each marked normal, abnormal or not examined

Examination by body system. Anything abnormal gets a finding.

Consult on the queue opens the doctor's note for that visit: vitals, complaint and history, allergies, examination by body system, diagnosis, plan, treatment and follow-up. There are sections for gynae and obstetrics (EDD and gestational age are worked out from the LMP), dental, eye with a glasses prescription, and immunizations.

Lab tests and radiology exams you tick on the page are ordered when you save, and Save and discharge completes the visit. Text you write often can be saved as a template and applied at the next visit. Every consultation can be printed.

Radiology

ICTHospital radiologist worklist with urgent orders first

The worklist puts urgent orders first.

ICTHospital radiology order with schedule, mark performed and a findings template

The exam's report template fills the findings box, ready to complete.

Radiology is the worklist, with urgent orders first. Open an order to schedule it, mark it performed, write the findings and impression, and print the report. Exams, their modality and the service they're billed as live in the Exam catalogue.

Doctor share

ICTHospital doctor share policy with rules by department and patient type and the doctors on it

The most specific rule wins: a service beats a department, which beats a catch-all.

ICTHospital doctor share report with pending, approved and paid shares per doctor

Pending, approved and paid, per doctor and per invoice line.

Under Doctor Share, Policies, a policy is a set of rules (service, department, patient type, doctor percentage, referral percentage), and each doctor is put on one policy. Shares are worked out on every invoice line. In the Doctor share report you can approve a share once its invoice is paid in full, and Pay share records the payout as an expense in Accounting.

Closing the cash

ICTHospital day book split private, panel and charity, with money collected by payment mode

Billed by department and patient group on the left, collected by payment mode on the right.

ICTHospital final settlement across one patient's invoices

Every open invoice for one patient, settled in one payment.

Front Desk Cash, Sale Close shows the payments you've taken since your last close, by payment mode. Count the drawer, enter it and close the shift; the slip records any difference. The Day Book shows what was billed by department, split private, panel and charity, with each line's doctor and hospital share and what was collected by mode, and it downloads as a CSV. Final Settlement takes one payment across all of a patient's open invoices, oldest first, with an optional write-off that needs a reason.

Video visits and branches

ICTHospital booking form with the Video consultation option

Tick Video consultation when you book.

Tick Video consultation when booking. The appointment page shows the link to send the patient, and the doctor starts the call from the queue. Calls run on Jitsi Meet: the public meet.jit.si server works out of the box, or you can point ICTHospital at your own. The link isn't sent for you, so copy it into an SMS or WhatsApp message.

Under Settings, Branches, add the hospital's sites and tick the users who work at each. Users tied to a branch see that branch only. Everyone else picks a branch from the top bar or sees all of them.

Reports

Report menu in ICTHospital

Four questions a hospital asks most weeks.

Outstanding lab work report in ICTHospital

Tests requested and not yet reported, oldest first, with anything past three days marked.

Drug usage report in ICTHospital comparing prescribed against dispensed

What was prescribed next to what was actually dispensed.

The gap between the two columns is the part worth reading. A drug prescribed and never dispensed here is usually a stock problem, or a script being filled somewhere else.

Aged debtors report in ICTHospital

Who owes what, aged into the usual buckets.

The age comes from the patient's oldest unsettled invoice rather than their most recent one, so a long standing balance does not look fresh just because something new was added to it.

Bed occupancy report in ICTHospital with average length of stay

Occupancy per day, the busiest day, discharges and average length of stay.

Users and permissions

User list in ICTHospital

Accounts and the role each one belongs to.

ICTHospital permission grid with the role picker for Admin, Doctors, Nurses, Accountants, Receptionists, Pharmacists and Laboratory Staff

Tick the roles to compare, press Get List, and switch each permission on or off.

Admin is granted everything when the system is installed. Everyone else starts with nothing and is given what they need on this grid. The menu hides what a role cannot open, so nobody is offered a link that bounces them.

Upgrading from ICTSchool? Run this once after migrating, or every role including Admin will be locked out of every screen:

php artisan hospital:sync-permissions

It only adds what is missing and never hands back a right you deliberately took away, so it is safe to run again.

Some areas are for administrators only, whatever the grid says: Messaging, the ICTCore link, Users and Roles, Settings and the Activity log. They are hidden from other roles and closed to them on the server, so typing the address does not open them either. Everyone keeps My Profile for their own details and password.

ICTHospital menu for an administrator, including Accounting, Messaging, ICTCore, Users and Roles, Settings and Activity Log

The menu an administrator sees.

ICTHospital menu for a doctor, with clinical screens and My Profile only

The same system signed in as a doctor.

Payment gateways

Payment gateway settings in ICTHospital with write only credentials

Credentials are stored ready for the online payment work still to come.

Be clear on what this is. Nothing in this release charges a card. The settings are stored so they are ready when online payment lands, and the screen says so rather than implying you can take a payment today.

Credentials are write only. They are never shown back to you, because a settings page that prints an API password puts it in every browser cache and every screenshot. Leave a field blank when you are editing and whatever is stored stays.

Questions people ask

Can I register a patient without a date of birth or a phone number?

Yes. Only the name is required.

What happens if two people book the same appointment slot?

One booking succeeds, the other is refused with a message naming the clash. The same applies to admitting two patients to one bed, dispensing the last of a medicine, and paying off the same invoice twice.

Can I delete a doctor, a medicine or a service?

Only if nothing refers to it. Anything already used stays, so old records keep reading correctly. Rename it instead.

If I change a price, does it change old invoices?

No. The price is copied onto the line when the charge is raised. The same goes for lab reference ranges and prescribed drug names.

Why does the menu look different for my colleague?

The menu only shows what your role can open. Clinical and money screens follow the permissions grid, so an administrator can grant them there. Messaging, ICTCore, Users and Roles, Settings and the Activity log are for administrators only.

How does a doctor see only their own appointments?

Open Appointments, choose your name in the Doctor box and press Show. Pick a different date to see another day.

How do I give someone a login?

On the doctor or staff form, fill in the Login section with a username and a password, then save. The person signs in with those and gets the permissions of their role.

Can a doctor see a patient by video?

Yes. Tick Video consultation when booking, then send the patient the link from the appointment page. The call runs on Jitsi Meet, on the public server or one you host yourself.

How do I get rid of the demonstration data?

Delete the records from the screens, or reinstall with php artisan migrate:fresh --seed and skip the demo seeder. Do not run migrate:fresh on anything real.

Installing it

Two ways in. If you only want a look, use Docker and you will not have to install PHP on your machine. If you are putting it on a server, install it properly.

The quick look

git clone https://github.com/ictinnovations/ICTHospital.git
cd ICTHospital
docker compose up -d
docker compose exec app php artisan migrate --seed

That gives you an administrator account, an empty hospital record and the permission catalogue with everything granted to Admin. Sign in and change the password before you do anything else. Add php artisan db:seed --class=DemoDataSeeder if you want the demonstration records too.

On a server

You need PHP 8.2 or newer, MySQL or MariaDB, and Composer.

composer install
cp .env.example .env
php artisan key:generate
php artisan passport:keys
php artisan migrate --seed

If you are moving from an older version, run the schema check first. It reports what it would change and touches nothing until you tell it to.

php artisan hospital:modernise-schema
php artisan hospital:modernise-schema --apply

When something goes wrong

The install fails partway through migrating

Almost always the database user cannot create tables. Grant it CREATE, ALTER, INDEX and REFERENCES on its own schema and run the migration again. It is safe to rerun.

Pages load but nothing saves

Check that the storage and bootstrap cache directories are writable by the user your web server runs as. Laravel writes its compiled views there, and a read-only storage directory produces exactly this symptom.

The API returns a server error

Run the key generator. The API guard needs a keypair that is not in the repository, on purpose, because it is a secret.

php artisan passport:keys

A user can see something they should not

Permissions are granted per role, not per person. Open Permissions, tick the roles you want to edit, press Get List, and set them.

Something else

Check the application log first. It is more specific than the page you are looking at, and it is the first thing we will ask for.

tail -100 storage/logs/laravel.log

Where to get help

Issue tracker

Bugs and feature requests, in public. Give us the PHP version, the database version and the exact error and you will get a useful answer faster.

Source code

The full application, the installation notes, the licence and the release history. Pull requests are welcome.

Talk to us

If you would rather we ran it for you, or you need it changed to fit how your hospital already works.

Developed by Tahir Almas, ICT Innovations.