User guide and support

A walk through the system as it actually looks, from installing it to booking a lab test. Screenshots throughout, and a public issue tracker when something is wrong.

Getting it running

You have 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

Clone the repository, bring the containers up, create the tables, and open your browser. Three commands.

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, the permission catalogue with everything granted to Admin, and no invented patients. Sign in and change the password before you do anything else.

On a server

You need PHP 8.2 or newer, MySQL or MariaDB, and Composer. Install the dependencies, copy the environment file, generate the application key and the API keys, then point it at your database and migrate.

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

The full installation notes, the licence and the release history live in the repository README.

A walk through the system

Six screens, in the order you would meet them on a normal day.

1The dashboard

What you land on after signing in. Counts across the top for doctors, patients, appointments, prescriptions, case histories, lab reports, documents and payment invoices, then income against expense by month and a share of the current month underneath. If a number here looks wrong, the module behind it is one click away.

ICTHospital dashboard showing counts for doctors, patients, appointments and prescriptions, with an income against expense chart

The dashboard, with the module menu down the left.

2Set up your departments first

Departments come before doctors, because a doctor belongs to one. Give each a name and a description that means something to whoever is booking, since the description is what a receptionist reads when they are not sure where to send someone. Every list in the system exports to Excel, CSV, PDF or the printer from the same row of buttons.

List of departments in ICTHospital with name, description and edit controls

Departments, with the export buttons that appear on every list in the system.

3Book a lab test and bill it in one form

Pick the collection centre, the patient and the referring doctor, record who took the sample and the specimen type, then add the tests. The totals column on the right adds up as you go, takes a discount, and accepts a deposit with the payment type against it. You are not raising an order in one screen and an invoice in another, which is where the two usually drift apart.

Lab test booking form in ICTHospital with patient, referring doctor, specimen and a running total with discount and deposit

Lab test booking. The billing panel on the right is part of the same form.

4Track the report through to the invoice

Every booking appears in the lab patient list with its report number, the patient, a contact number and a status you can change inline as the sample moves. The invoice button on each row prints what the patient owes for that test without you leaving the list.

Lab patient list in ICTHospital showing report id, patient, status and per-row invoice buttons

The lab patient list, with status changed in place and an invoice on every row.

5Run the pharmacy as its own business

The pharmacy has its own dashboard, because the money in it behaves differently from the rest of the hospital. Sales and expenses for the day, the medicine count, and a statistics panel that tells you the number of sales, the totals, and how many lines are out of stock. That last figure is the one to watch.

Pharmacy dashboard in ICTHospital with today's sales, expenses, medicine count and an out of stock figure

The pharmacy dashboard, reported separately from the hospital ledger.

6Keep a donor register

If you hold your own blood supply, the donor register is a short form: name, blood group, age, the date they last gave, and a contact number. The point is being able to find three matching donors quickly at two in the morning, so fill in the phone number even when the rest is thin.

Add new donor form in ICTHospital with name, blood group, age, last donation date and phone

Adding a donor to the blood bank register.

Turning on SMS and voice

Messaging is the one part that needs something outside the application. It runs on ICTCore, our open source communications framework, and until you point the system at an ICTCore server the reminder jobs will tell you politely that they have nothing to talk to.

Set the ICTCore address, user and password under Settings, choose whether appointment and payment reminders go out as SMS or as voice, and then let the two scheduled jobs run from cron:

php artisan hospital:appointment-reminder
php artisan hospital:payment-reminder

The first texts everyone with an appointment tomorrow. The second texts everyone whose invoice is short of what they have paid. Both report why they did nothing rather than failing, so it is safe to put them on cron before the rest is configured.

If you are weighing up what else the same engine can do, from fax to interactive voice response, the ICTCore use cases are worth reading before you design your own integration. Video consultation targets LiveKit and is configured separately.

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. There are ninety of them across Admin, Doctor, Nurse and Accountant, grouped by module, and every change is written as a complete set rather than a patch.

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 whole application under the GPL-3.0. When the documentation and the software disagree, the source settles it.

Guide as a PDF

The older manual in one file, for printing or for handing to staff who will not be at a screen.

All screenshots

Every screen, not just the six above, so you can judge the software before installing anything.

Support ticket

Deployment, customisation, migrating data out of an existing system, or anything you would rather not discuss in public.

Our other projects

The PBX, the fax server, the dialer and the communication framework underneath all of them.