Overview
CareChart is a self-hosted hospital management system built on Laravel 12 with a server-rendered Blade + Bootstrap 5 frontend — no Vue, no React, no build step. It covers thirteen staff roles across twenty-three modules: patient intake through discharge, pharmacy and lab operations, billing and insurance, HR and payroll, and hospital-wide security and audit logging.
This document describes what each module does and how the roles relate to each other. For installation steps, see the Setup Guide.
Tech Stack
| Layer | Choice |
|---|---|
| Backend framework | Laravel 12, PHP 8.2+ |
| Frontend | Blade templates, Bootstrap 5 (CDN), Bootstrap Icons |
| Database | MySQL 8 / MariaDB 10.4+, 45+ tables |
| File storage | Local disk — public/uploads/, no S3 required |
| AI provider | OpenAI Chat Completions API, optional, admin-toggleable |
| Auth | Session-based, single guard, role column on users |
| 2FA | Self-implemented TOTP (RFC 6238) — no third-party SMS/email service |
composer install, migrate, and you're serving pages.Roles & Permissions
Every login lands on a dashboard built for that role specifically — nobody sees a menu item they can't use. Route-level middleware enforces this on the server, not just by hiding sidebar links.
| Role | Primary area | Typical dashboard |
|---|---|---|
| super_admin | Everything, including audit logs | Hospital-wide stats |
| hospital_admin | Everything except audit logs | Hospital-wide stats |
| doctor | Appointments, OPD, lab/radiology orders | Today's schedule |
| nurse | Assigned tasks, vitals rounds | Pending task list |
| receptionist | Patients, appointments, front desk | General admin view |
| cashier | Billing and payments | General admin view |
| pharmacist | Dispensing, medicine catalog | Pending prescriptions |
| lab_technician | Lab orders and results | Pending lab orders |
| radiologist | Radiology orders and reports | Pending radiology orders |
| accountant | Billing, expenses, reports | Revenue reports |
| hr_manager | Employees, payroll | Employee list |
| insurance_officer | Providers, policies, claims | General admin view |
| patient | Own records only | Own appointments & bills |
Patients & Appointments
Patients self-register and book their own appointments by department and doctor; front-desk staff can do the same on their behalf, including a walk-in patient who's never logged in. Every appointment carries a full status lifecycle: pending → confirmed → completed, cancelled, or no-show.
- Doctor availability, consultation fee, and department drive what a patient can book
- Doctors manage their own bio, fee, and availability from their profile — no admin round-trip needed
- Status changes notify the other side automatically (patient told when confirmed; doctor told when requested)
OPD Visits
An OPD visit is where the record actually gets written: chief complaint, vitals, diagnosis, and a prescription with as many line items as the case needs. An optional AI summary condenses free-text notes into a clean clinical note.
IPD & Wards
Wards hold beds; beds hold one admission at a time. Admitting a patient occupies the bed automatically, discharging frees it. Day-count and ward daily-rate feed straight into billing.
Emergency
Triage by severity (critical / urgent / semi-urgent / non-urgent), register a patient who's never been seen before in the same form, and assign a doctor. "Admit to IPD" from an emergency case opens a real admission form pre-filled with that patient and links back to the case — there's no separate "admitted" checkbox that isn't actually backed by a bed.
Nursing
Nurses get their own portal: a task list assigned by admins or doctors (vitals check, medication, dressing, other), and a vitals log tied to a specific admission. Completing a task and logging vitals are two clicks, not a form hunt.
Operation Theatre
A small theatre status board (available / occupied / maintenance) and a surgery schedule. Marking a surgery "in progress" occupies its theatre; marking it complete or cancelled frees it again — the board is always accurate without a manual toggle.
Pharmacy
A medicine catalog with stock, reorder level, batch number, and expiry. Dispensing works two ways — against a doctor's prescription, or a walk-in/OTC sale — and both immediately decrement stock and flag anything that drops below its reorder level.
Laboratory
A lab test catalog (name, sample type, normal range, price). Doctors order from the OPD visit; technicians move an order from pending → sample collected → completed, entering a result and remarks per test.
Radiology
Same shape as the lab module, tuned for imaging: modality (X-ray/CT/MRI/ultrasound), findings, impression, and an optional uploaded report file the patient can later download from their own portal.
Inventory
General hospital supplies and equipment — separate from the pharmacy's medicine stock — organized by category, with stock in/out/adjustment transactions and the same low-stock flagging pattern used everywhere else in the app.
Blood Bank
A donor registry, per-blood-group stock levels, and patient blood requests. Issuing a request decrements the matching group's stock and notifies hospital admins if that group drops low.
Ambulance
A small fleet register and a trip log — dispatch, complete, or cancel a trip, and the vehicle's availability status updates itself accordingly.
Billing
Itemized bills across every category — consultation, OPD, IPD, pharmacy, lab, procedure, other — with partial payments, running balance, and a print-friendly invoice layout that hides everything except the invoice itself when you hit print.
Insurance
An insurance provider directory, per-patient policies with expiry tracking, and a claims workflow (pending → approved/rejected → paid) that can optionally tie back to a specific bill.
HR & Payroll
Employee profiles wrap an existing staff login — designation, joining date, salary structure. Monthly payroll generates net pay from that structure for every active employee at once, then tracks paid/pending per person.
Finance & Reports
Expense logging by category, and a reports dashboard that nets total revenue (bills + pharmacy sales) against expenses for a selected date range, alongside appointment volume and top-performing doctors.
AI Features
Two features, both optional, both toggled from a single switch in Admin → Settings:
- Patient Symptom Checker — a patient describes symptoms and gets a cautious, non-diagnostic read plus a recommended department. Every response states plainly that it isn't a diagnosis.
- Clinical Note Summarization — a doctor's free-text OPD notes get condensed into a clean summary for the record.
Security & Audit
- Two-factor authentication — self-implemented TOTP (RFC 6238), works with Google Authenticator, Authy, or any standard app. No SMS provider, no per-message cost.
- Audit log — create/update/delete events on the records that matter (users, patients, bills, admissions, prescriptions, payroll, and more) are logged automatically via a shared
Auditabletrait, viewable only by Super Admin. - Role middleware — every route checks the logged-in user's role server-side; there's no page that's merely hidden from the menu but still reachable by URL.
Notifications
An in-app bell icon with a live unread count — no email or SMS service required. Currently wired into new appointment requests, appointment status changes, nursing task assignment, and low-stock alerts for pharmacy and blood bank.
Extending CareChart
A few things worth knowing before you add your own module:
- Kebab-case resource routes (like
lab-tests) bind a snake_case parameter ($lab_test) for implicit model binding — match your controller method argument names accordingly. - To add audit logging to a new model, add
use Auditable;to its trait list — no other wiring needed. - To send an in-app notification, call
app(NotificationService::class)->send($user, $title, $body, $url, $icon)from any controller. - Set
DB_PREFIXin.envif you need a table prefix — every migration has been checked to stay under MySQL's 64-character identifier limit with a prefix applied.
Common Questions
For pricing, licensing, and demo-account questions, see the FAQ on the main product page. For every install step in order, see the Setup Guide.