Turn a whole feature area off for everyone — its pages disappear from the sidebar and its
endpoints stop responding. Nothing is deleted; re-enabling restores it exactly as it was.
Security — Change Credentials
Data Retention & Public URL
Cross-cutting settings that aren't specific to any one module.
Factory Reset
Resets every setting on this page, all compression rules, the receiver AE/port config, and
every module back to its factory default (enabled). Cannot be undone.
Appointment Scheduling
This module has no global settings here — weekly operating hours, closure rules, and slot
generation are configured directly on its own page.
Letterhead
Printed on the Bill/Receipt and Departmental Slip PDFs generated from the Patient Visit List
and the registration wizard's Confirm step.
Reports & Viewer
The report header image, footer image, and disclaimer paragraph are uploaded and previewed
directly on the Report Templates page, not here.
Modality Worklist (MWL/MPPS)
This module has no global settings here — scanners poll the worklist automatically once a
procedure is scheduled; nothing to configure beyond the schedule itself.
Notifications
Provider credentials for actually sending Email, SMS and WhatsApp — configure them below.
Which events fire on which channel, and the message each one sends, are configured on the
Notifications page itself.
Email (SMTP)
SMS Gateway
WhatsApp Business (Meta Cloud API)
Business-initiated messages (every event this app fires) must reference a template Meta
has pre-approved for your WhatsApp Business Account — set the template name per event on
the Notifications page's
Template editor. Without one, sends fall back to freeform text, which Meta only delivers
inside an active 24-hour customer session.
Storage Paths
Storage Layout Migration
Moves existing files under Raw Storage / Compressed Directory from the old
studyUid/seriesUid layout to yyyy/mm/studyUid/seriesUid
(grouped by study date) and updates the database to match. Backs up the database first.
Progress appears in the Activity Feed. Safe to re-run.
Reconcile Unmatched Studies
A study normally links to its registered order automatically the moment images arrive
— including a scan sent straight from the modality's own console with no Modality
Worklist query involved, as long as the patient has exactly one open order for that
modality. Studies received before this existed, or whose order didn't exist yet at
receive time, are left unmatched — click below to re-check all of them now.
Progress appears in the Activity Feed. Safe to re-run.
Remote Configuration API
Fetched at startup (and via the "Sync Config" button on the Dashboard) to update compression rules and destinations automatically.
AE title, port, and buffer size are configured on the Receiver page; per-modality compression
rules on Compression Rules; forwarding destinations on Senders.
Billing & Accounts
This module has no global settings here — price lists, billing parties, and payment types are
each their own Masters page.
Referrals
This module has no global settings here — referring doctors and PRO/referral agents are each
their own Masters page.
HL7 Interface (ADT/ORM/ORU)
Inbound HL7 ADT (patient demographics) and ORM (orders) from a HIS/EMR, plus outbound
ORU (results) sent back when a report is finalized. The listener restarts automatically
the next time the app starts after changing the port — restart the service to apply a
port change immediately.
Sample HL7 Messages
Reference examples matching exactly what this app reads (ADT/ORM) or sends (ORU) — hand
these to whoever is configuring the HIS/EMR side of the integration. Segments are
separated by a carriage return on the wire; shown one per line here for readability.
Encoding characters are always ^~\&, HL7 version 2.3.
Only the first ^-delimited component (P100234) is used — matched/stored as Patient.patientId, the same identifier used everywhere else in the app. Required; a blank PID-3 is rejected.
PID-5
Full field → patient name, as-is.
PID-7
Date of birth, YYYYMMDD → stored as YYYY-MM-DD. Optional.
PID-8
Sex, as-is. Optional.
PID-11
First component only → address. Optional.
PID-13
First component only → phone. Optional.
EVN, PV1
Not read at all — included above only because a real HIS will send them.
No existing patient with this Patient ID → a new patient is created. An existing one → its demographics are updated in place. Replies AA (accepted) or AR (e.g. blank PID-3, ADT disabled) / AE (unexpected error).
ADT^A04 — Register a Patient Inbound
MSH|^~\&|HIS|CityHospital|DCMS|SakshamImaging|20260714093500||ADT^A04|MSG00002|P|2.3
EVN|A04|20260714093500
PID|1||P100235^^^HIS^MR||PATEL^ANITA||19920725|F|||45 Park Street^^Mumbai^MH^400001^IN||9822334455
PV1|1|O
Handled identically to ADT^A01 — this app doesn't distinguish "admit" from "register" beyond accepting both trigger events. Same PID field rules as above.
Same PID-3 (P100234) as the A01 example above, phone changed — this updates the existing patient in place rather than creating a duplicate. Also handled identically to A01/A04 otherwise.
ORM^O01 — New Order Inbound
MSH|^~\&|HIS|CityHospital|DCMS|SakshamImaging|20260714101500||ORM^O01|MSG00004|P|2.3
PID|1||P100234^^^HIS^MR||SHARMA^RAJESH||19850312|M
ORC|NW|ORD5567
OBR|1|ORD5567||CT-HEAD^CT Head Plain^L|||20260714101500
Field
What this app does with it
PID-3/5/7/8
Same rules as ADT above (address/phone are not read from an ORM). Patient is matched or created the same way.
OBR-4
First component (CT-HEAD here) is looked up against Masters → Procedures by its exact code — this is a placeholder; replace it with a real code from your own Procedure Catalog. No match → the whole message is rejected (AR, "Unknown procedure code") and nothing is created.
ORC-1/2
Not read — the accession number is always minted locally (IdGeneratorService), never taken from the sender's own order number.
On success, creates a Visit (assigned to the branch configured in Default Branch above) and one ServiceOrder, priced from the procedure's default rate. No worklist/MWL entry is created — front desk still schedules it locally, same as a walk-in.
ORU^R01 — Result / Report Outbound
MSH|^~\&|DCMS|SakshamImaging|HIS|CityHospital|20260714153000||ORU^R01|MSG00005|P|2.3
PID|1||P100234||SHARMA^RAJESH||19850312|M
OBR|1|ACC202607140042|ACC202607140042||CT Head Plain|||20260714153000||||||||||||||||||F
OBX|1|TX|CT Head Plain||FINDINGS: No acute intracranial abnormality. IMPRESSION: Normal study.||||||F
This is the one message this app sends — fired automatically the moment a report's status is changed to Finalized, to whatever host/port is set under HIS/EMR Host/Port above. MSH-3/4 are this app's own Local Application/Facility; MSH-5/6 are the configured HIS/EMR Application/Facility Name. The accession number appears twice (Placer/Filler Order Number). OBX-5 carries the report body — authored as rich HTML in the report editor, stripped down to plain text for HL7's TX value type; any line break in the report becomes a ~ (HL7's repetition separator), since a single field can't contain a raw line break.
A reply containing |AA| or |CA| is treated as accepted; anything else — including no reply at all, or an unreachable host — is logged as failed but never blocks the report from saving.
Storage Tiers
Three possible storage locations for DICOM files. Active Storage Tier
picks which one brand-new incoming images (received or imported right now) are written
into — switching it takes effect immediately and doesn't move anything already on disk.
Separately, a nightly job (disabled by default) can move studies older than each tier's
age threshold into that tier's directory once Tier 2/3 are enabled below (Tier 3 checked
first, so a very old study goes straight there instead of hopping through Tier 2) —
queries, viewing, and export keep working unchanged either way, since the app always
looks up wherever a study's files currently are.
Run Now
Normally runs automatically every night at 3 AM. Trigger a run immediately to verify
your tier directories are configured correctly. Progress appears in the Activity Feed.
Current Database
What this running instance is actually connected to right now — read-only. Switching
databases always requires editing application.properties and restarting the service;
there is no live switch here.
Target Database
Where to prepare a migration. Nothing here is saved — these values are used only for
the action you trigger below, never stored.
Database Type
Host
Port
Database Name
Username
Password
1 · Blank Schema Only
Creates every table on the target — nothing else. Equivalent to a fresh
publish-mysql/publish-postgresql install's first boot. Safe to run against an
already-correct schema (only missing tables/columns are added).
Staff accounts (with their existing password hashes, copied as-is — nobody needs to
reset a password because of this), roles, permissions, branch assignments, and the
revoked-token denylist. Run after step 2 (staff accounts can reference branches/
referring doctors/referral agents).
4 · Patient & Clinical Data
Patients, visits, orders, studies/series/instances, reports, payments, HL7 log,
activity/audit log, and portal accounts — the largest and most sensitive table set.
Run after steps 2 and 3. This does not move the actual DICOM files on disk, only the
database rows referencing them — the target app instance still needs the same
Raw Storage / Compressed Directory / storage tier paths configured to find them.
UI Preferences
Font, colors, spacing, and corner roundedness for the whole app — saved here, every
browser in the clinic picks it up on next login. The dark/light toggle itself (🌙/☀️
in the topbar) stays a personal choice; this controls what each mode actually looks like.
Time
Patient
MRN
Age/Sex
Accession #
Procedure
Study Description
Modality
Referring Physician
Institution
Device
Priority
Start
Pause
Stop
Complete
Duration
By
Status
Actions
Collection Transactions0 record(s)
#
Reg No
Visit ID
Patient Name
Phone No
Ref By
Visit Date
Received Date
Received Amt
Mode
PRO
Received By
Revenue Trend
Revenue Breakdown
PRO
Visits
Revenue
Time from a scan's completion to its report reaching Finalized/Printed. Reports whose study never reconciled to a
completed scan don't have a measurable TAT and are shown separately as "Unmatched" rather than skewing the averages.
Avg TAT Trend
Radiologist
Reports
Avg TAT
Median TAT
Fastest
Slowest
Busy time (sum of actually-completed scan durations) against each device's configured weekly operating hours.
Retrospective, built from recorded scan timestamps — not a live measure.
Utilization Trend
Device
Modality
Studies
Busy
Available
Utilization
Every event starts disabled per channel — nothing sends until you turn it on here and give it a template.
Email and SMS currently log what they would send (no provider configured yet); WhatsApp is not yet wired up.
Event
Email
SMS
WhatsApp
Recent Outbox
When
Event
Channel
Recipient
Status
Error
Weekly Operating Hours
Set once per branch — every device in it inherits these hours automatically. A device only needs its own
row here if it genuinely runs different hours from the rest of the center.
Day
Closed
Start
End
Interval (min)
Capacity
Closure Rules
Scope
Rule
Label
Active
Actions
Generate / Refresh Range
Applies each device's weekly hours and closure rules across the range below. This also runs automatically
every night for the next 45 days — use this button to backfill further out, or to apply a schedule change immediately.
Manual Override (single day)
For one-off exceptions that don't fit a recurring rule, e.g. extending hours for a single special camp day.
Existing Slots
Start
End
Capacity
Booked
Available
Username
Role
Password
Actions
Resource-based permissions, grouped by role. System-defined roles (seeded on first boot) can have
their permissions edited but not be deleted; custom roles can be added freely. This sits alongside
the legacy Admin/User login role above — a person can hold one or more of these roles in addition.
Role
Type
Permissions
Actions
Every create/update/delete across patient, billing, scheduling and master-data records —
automatically logged with who made the change and when.
When
Action
Entity
ID
User
Summary
Every inbound and outbound HL7 message this app has seen — including messages no handler
was registered for (status UNHANDLED_TYPE), which previously left
no trace anywhere. Use this to troubleshoot a HIS or lab analyzer interface.