Scheduling & Bed/OR Management KPIs & Reporting
KPI Summary
| KPI ID | KPI Name | Formula (Conceptual) | Target | Data Source | Frequency |
|---|---|---|---|---|---|
| KPI-SCHED-001 | Appointment No-Show Rate | No-show appointments / (completed + no-show appointments) × 100 | ≤ 10% | appointments |
Daily / Monthly |
| KPI-SCHED-002 | Average Wait Time (Clinic) | AVG(provider_seen_time − check_in_time) | ≤ 20 minutes | appointments, encounters |
Daily / Weekly |
| KPI-SCHED-003 | Bed Occupancy Rate | AVG(occupied_beds / total_active_beds) per day × 100 | 80–90% | beds, bed_assignments |
Daily / Monthly |
| KPI-SCHED-004 | Average Length of Stay (ALOS) | AVG(discharge_datetime − admission_datetime) for inpatient encounters | By DRG/specialty benchmark | encounters, encounter_details |
Monthly / Quarterly |
| KPI-SCHED-005 | Bed Turnaround Time | AVG(bed_ready_time − bed_released_time) | ≤ 60 minutes | bed_assignments, cleaning timestamps |
Daily / Weekly |
| KPI-SCHED-006 | OR Utilization Rate | (Σ(actual_case_duration + turnover_time) / Σ(available_or_hours)) × 100 | 75–85% | or_cases, or_schedules, or_rooms |
Daily / Monthly |
| KPI-SCHED-007 | OR First-Case On-Time Start | First cases starting within 5 min of scheduled / total first cases × 100 | ≥ 90% | or_cases, or_schedules |
Daily / Monthly |
| KPI-SCHED-008 | Scheduling Lead Time | AVG(appointment_datetime − created_at) | ≤ 7 days routine; ≤ 48h urgent | appointments, appointment_types |
Weekly / Monthly |
| KPI-SCHED-009 | Waitlist Conversion Rate | Waitlist entries resolved as “booked” / total waitlist entries × 100 | ≥ 60% | waitlist_entries, appointments |
Monthly |
| KPI-SCHED-010 | Appointment Cancellation Rate | Cancelled appointments / total appointments × 100 | ≤ 15% | appointments |
Daily / Monthly |
| KPI-SCHED-011 | Discharge Before Noon Rate | Discharges before 12:00 / total discharges × 100 | ≥ 40% | encounters |
Daily / Monthly |
| KPI-SCHED-012 | NABIDH/Malaffi ADT Submission Rate | ADT messages with ACK = AA / total ADT messages × 100 | ≥ 99.5% | integration_message_log |
Real-time / Daily |
Note: Where additional helper tables are implied (e.g., cleaning timestamps, integration logs), they are assumed to exist in the broader HIS (e.g.,
cleaning_tasks,integration_message_log) and are referenced, not owned, by this module.
KPI Definitions
KPI-SCHED-001: Appointment No-Show Rate
Description
Percentage of scheduled outpatient appointments where the patient did not attend and did not cancel in advance. This measures scheduling effectiveness, patient engagement, and clinic efficiency.
Calculation Formula
SELECT
CAST(
COUNT(CASE WHEN a.status = 'no_show' THEN 1 END) * 100.0
/ NULLIF(COUNT(CASE WHEN a.status IN ('completed', 'no_show') THEN 1 END), 0)
AS DECIMAL(5,2)
) AS appointment_no_show_rate_pct
FROM appointments a
WHERE a.appointment_datetime >= :start_date
AND a.appointment_datetime < :end_date
AND a.facility_id = COALESCE(:facility_id, a.facility_id)
AND a.department_id = COALESCE(:department_id, a.department_id)
AND a.provider_id = COALESCE(:provider_id, a.provider_id);
Target / Benchmark
| Metric | Target | Source / Rationale |
|---|---|---|
| Appointment No-Show Rate | ≤ 10% | Common benchmark in GCC outpatient clinics; supports DOH/DHA access and efficiency goals |
Data Source
appointments.status(values:scheduled,checked_in,completed,cancelled,no_show, etc.)appointments.appointment_datetimeappointments.facility_idappointments.department_idappointments.provider_id
Dimensions / Filters
- Time: day, week, month, quarter, year
- Facility (multi-hospital groups)
- Department / specialty
- Provider
- Appointment type (
appointments.appointment_type_id) - Payer (via join to encounters/payers if needed)
Visualization
- Line chart: trend of no-show rate by month
- Bar chart: no-show rate by provider or department
- Table: top patients with repeated no-shows (for internal use, PDPL role-based access)
Alert Thresholds
- Warning: > 10% for 2 consecutive weeks (clinic-level)
- Critical: > 15% for any week or > 12% for 4 consecutive weeks
- Notifications:
- Department head
- Scheduling Administrator
- Quality & Patient Experience team (summary only, no patient identifiers in email to comply with UAE PDPL)
KPI-SCHED-002: Average Wait Time (Clinic)
Description
Average time from patient check-in to provider first seeing the patient. Measures outpatient flow efficiency and patient experience.
Assumption: encounters (or a related table) stores provider_seen_time. If not, a clinic_flow_events table should be used; adjust accordingly.
Calculation Formula
SELECT
CAST(
AVG(
DATEDIFF(
MINUTE,
a.check_in_time,
e.provider_seen_time
)
) AS DECIMAL(6,2)
) AS avg_wait_time_minutes
FROM appointments a
JOIN encounters e
ON e.encounter_id = a.encounter_id
WHERE a.check_in_time IS NOT NULL
AND e.provider_seen_time IS NOT NULL
AND a.appointment_datetime >= :start_date
AND a.appointment_datetime < :end_date
AND a.facility_id = COALESCE(:facility_id, a.facility_id)
AND a.department_id = COALESCE(:department_id, a.department_id)
AND a.provider_id = COALESCE(:provider_id, a.provider_id);
Target / Benchmark
| Metric | Target | Source / Rationale |
|---|---|---|
| Average Wait Time | ≤ 20 minutes | Common UAE private sector benchmark; aligns with patient satisfaction goals |
Data Source
appointments.check_in_timeappointments.encounter_idappointments.facility_id,department_id,provider_idencounters.provider_seen_time(or equivalent field in encounter details/clinic flow table)
Dimensions / Filters
- Time: day, week, month
- Facility
- Department / clinic
- Provider
- Appointment type
- Time of day (session: morning/afternoon/evening)
Visualization
- Line chart: average wait time by day
- Box plot: distribution of wait times by department
- Heatmap: hour-of-day vs. day-of-week average wait time
Alert Thresholds
- Warning: average wait time > 25 minutes for 3 consecutive days
- Critical: average wait time > 35 minutes on any day
- Notifications:
- Clinic manager / Charge Nurse
- Scheduling Administrator
- Operations Director (critical only)
KPI-SCHED-003: Bed Occupancy Rate
Description
Average percentage of active beds occupied over a period. Measures inpatient capacity utilization and informs bed planning.
Assumption: daily occupancy snapshots are derived from bed_assignments and beds.
Calculation Formula
Daily occupancy (subquery):
-- Example for a single day
SELECT
b.facility_id,
b.department_id,
CAST(
COUNT(DISTINCT CASE WHEN ba.assignment_id IS NOT NULL THEN b.bed_id END) * 100.0
/ NULLIF(COUNT(DISTINCT b.bed_id), 0)
AS DECIMAL(5,2)
) AS bed_occupancy_rate_pct
FROM beds b
LEFT JOIN bed_assignments ba
ON ba.bed_id = b.bed_id
AND ba.assigned_datetime <= :day_end
AND (ba.released_datetime IS NULL OR ba.released_datetime > :day_start)
WHERE b.is_active = 1
AND b.facility_id = COALESCE(:facility_id, b.facility_id)
AND b.department_id = COALESCE(:department_id, b.department_id)
GROUP BY b.facility_id, b.department_id;
Period average (conceptual): average of daily occupancy rates over the selected period.
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| Bed Occupancy Rate | 80–90% | Common optimal range to balance utilization vs. surge capacity |
Data Source
beds.bed_id,beds.facility_id,beds.department_id,beds.is_activebed_assignments.bed_id,assigned_datetime,released_datetime
Dimensions / Filters
- Time: daily, weekly, monthly
- Facility
- Ward / department
- Bed type (
beds.ward_type,beds.is_isolation,beds.gender_restriction)
Visualization
- Line chart: daily occupancy rate by ward
- Stacked bar: occupancy by ward type (ICU, medical, surgical)
- Gauge: current occupancy vs. target range
Alert Thresholds
- Warning: occupancy > 90% for 2 consecutive days
- Critical: occupancy > 95% on any day or ICU occupancy > 90%
- Notifications:
- Bed Management Coordinator
- Nursing Administration
- Executive on-call (critical)
KPI-SCHED-004: Average Length of Stay (ALOS)
Description
Average inpatient length of stay (LOS) in days, overall and by DRG/specialty. Used for efficiency, capacity planning, and benchmarking.
Calculation Formula
SELECT
ed.drg_code,
e.department_id,
CAST(
AVG(
DATEDIFF(
DAY,
e.admission_datetime,
e.discharge_datetime
)
) AS DECIMAL(6,2)
) AS alos_days
FROM encounters e
LEFT JOIN encounter_details ed
ON ed.encounter_id = e.encounter_id
WHERE e.encounter_class = 'inpatient'
AND e.discharge_datetime IS NOT NULL
AND e.admission_datetime >= :start_date
AND e.admission_datetime < :end_date
AND e.facility_id = COALESCE(:facility_id, e.facility_id)
GROUP BY ed.drg_code, e.department_id;
Target / Benchmark
Targets are set per DRG/specialty based on internal benchmarks and payer expectations (e.g., Daman, Thiqa).
| Dimension | Target / Benchmark | Source / Rationale |
|---|---|---|
| Medical DRGs | Within ±10% of regional benchmark | Internal benchmarking vs. UAE peers |
| Surgical DRGs | Within ±10% of regional benchmark | Internal + payer LOS guidelines |
| Overall ALOS | Year-on-year reduction where safe | Hospital performance improvement plans |
Data Source
encounters.encounter_class(inpatient)encounters.admission_datetime,discharge_datetimeencounters.facility_id,department_idencounter_details.drg_code,case_weight
Dimensions / Filters
- Time: month, quarter, year
- Facility
- Department / specialty
- DRG
- Payer (via
encounters.payer_id)
Visualization
- Line chart: ALOS trend by month
- Bar chart: ALOS by DRG vs. benchmark
- Scatter plot: case weight vs. LOS (outlier detection)
Alert Thresholds
- Warning: ALOS for a DRG > 15% above target for 2 consecutive months
- Critical: ALOS for a DRG > 25% above target or sudden spike (>1 day increase) month-on-month
- Notifications:
- Quality & Clinical Governance
- Department heads
- Case Management team
KPI-SCHED-005: Bed Turnaround Time
Description
Average time from bed being released (patient discharge/transfer) to bed being ready for next admission (cleaning completed). Measures housekeeping and bed management efficiency.
Assumption: cleaning tasks are tracked in cleaning_tasks (owned by Cleaning module) with timestamps.
Calculation Formula
SELECT
b.facility_id,
b.department_id,
CAST(
AVG(
DATEDIFF(
MINUTE,
ba.released_datetime,
ct.completed_datetime
)
) AS DECIMAL(6,2)
) AS avg_bed_turnaround_minutes
FROM bed_assignments ba
JOIN beds b
ON b.bed_id = ba.bed_id
JOIN cleaning_tasks ct
ON ct.bed_id = ba.bed_id
AND ct.trigger_source = 'bed_released'
AND ct.trigger_reference_id = ba.assignment_id
WHERE ba.released_datetime >= :start_date
AND ba.released_datetime < :end_date
AND b.facility_id = COALESCE(:facility_id, b.facility_id)
AND b.department_id = COALESCE(:department_id, b.department_id)
AND ct.completed_datetime IS NOT NULL
GROUP BY b.facility_id, b.department_id;
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| Bed Turnaround Time | ≤ 60 minutes | Common operational target for acute care |
Data Source
bed_assignments.released_datetimebed_assignments.assignment_idbeds.bed_id,facility_id,department_idcleaning_tasks.bed_id,trigger_source,trigger_reference_id,completed_datetime
Dimensions / Filters
- Time: day, week, month
- Facility
- Ward / department
- Bed type (ICU vs. general)
- Cleaning shift (day/night) if available
Visualization
- Line chart: average turnaround time by day
- Bar chart: turnaround by ward
- Table: list of beds with longest turnaround times
Alert Thresholds
- Warning: average turnaround > 60 minutes for a ward on any day
- Critical: average turnaround > 90 minutes or > 3 delayed beds (>120 minutes) in a day
- Notifications:
- Bed Management Coordinator
- Housekeeping Supervisor
- Nursing Administration (critical)
KPI-SCHED-006: OR Utilization Rate
Description
Percentage of available OR time that is used for cases and turnover. Measures efficiency of operating room scheduling and capacity usage.
Assumption:
or_schedulesdefines blocks per OR per day.or_rooms.max_daily_hoursdefines total available hours if blocks are not explicitly used.turnover_timeis derived from gap between cases or stored inor_cases.turnover_minutesif available.
Calculation Formula
Example using actual case duration and scheduled block hours:
WITH case_times AS (
SELECT
oc.schedule_id,
os.or_room_id,
os.schedule_date,
SUM(
DATEDIFF(MINUTE, oc.actual_start, oc.actual_end)
) AS total_case_minutes
FROM or_cases oc
JOIN or_schedules os
ON os.schedule_id = oc.schedule_id
WHERE oc.actual_start IS NOT NULL
AND oc.actual_end IS NOT NULL
AND os.schedule_date >= :start_date
AND os.schedule_date < :end_date
GROUP BY oc.schedule_id, os.or_room_id, os.schedule_date
),
block_times AS (
SELECT
os.or_room_id,
os.schedule_date,
SUM(
DATEDIFF(MINUTE, os.block_start, os.block_end)
) AS total_block_minutes
FROM or_schedules os
WHERE os.schedule_date >= :start_date
AND os.schedule_date < :end_date
GROUP BY os.or_room_id, os.schedule_date
)
SELECT
bt.or_room_id,
CAST(
SUM(ct.total_case_minutes) * 100.0
/ NULLIF(SUM(bt.total_block_minutes), 0)
AS DECIMAL(5,2)
) AS or_utilization_rate_pct
FROM block_times bt
LEFT JOIN case_times ct
ON ct.or_room_id = bt.or_room_id
AND ct.schedule_date = bt.schedule_date
GROUP BY bt.or_room_id;
(If turnover minutes are stored separately, add them into total_case_minutes.)
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| OR Utilization | 75–85% | Common optimal range; >85% may cause delays |
Data Source
or_schedules.or_room_id,schedule_date,block_start,block_end,block_typeor_cases.schedule_id,actual_start,actual_end,case_statusor_rooms.room_id,facility_id,max_daily_hours
Dimensions / Filters
- Time: day, week, month
- Facility
- OR room
- Surgeon
- Specialty (via procedure code or surgeon specialty)
- Block type (elective, emergency)
Visualization
- Line chart: utilization by OR over time
- Bar chart: utilization by surgeon or specialty
- Gantt-style view: scheduled vs. actual case times (operational dashboard)
Alert Thresholds
- Warning: utilization < 65% or > 90% for a room over a month
- Critical: utilization < 60% or > 95% for 2 consecutive months
- Notifications:
- OR Manager
- Surgical Services Director
- Finance/Operations (monthly summary)
KPI-SCHED-007: OR First-Case On-Time Start
Description
Percentage of first cases in each OR that start within 5 minutes of scheduled start time. Measures morning start discipline and downstream impact on the day’s schedule.
Calculation Formula
WITH first_cases AS (
SELECT
os.or_room_id,
os.schedule_date,
MIN(oc.actual_start) AS first_actual_start,
MIN(oc.scheduled_start) AS first_scheduled_start,
COUNT(*) AS total_cases
FROM or_cases oc
JOIN or_schedules os
ON os.schedule_id = oc.schedule_id
WHERE os.schedule_date >= :start_date
AND os.schedule_date < :end_date
AND oc.case_status IN ('completed', 'in_progress')
GROUP BY os.or_room_id, os.schedule_date
)
SELECT
CAST(
COUNT(
CASE
WHEN DATEDIFF(
MINUTE,
fc.first_scheduled_start,
fc.first_actual_start
) <= 5
THEN 1
END
) * 100.0
/ NULLIF(COUNT(*), 0)
AS DECIMAL(5,2)
) AS first_case_on_time_start_pct
FROM first_cases fc;
Assumption: or_cases.scheduled_start exists; if not, use or_schedules.block_start for first case.
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| First-Case On-Time Start | ≥ 90% | Common OR efficiency benchmark |
Data Source
or_cases.actual_start,scheduled_start,case_statusor_cases.schedule_idor_schedules.or_room_id,schedule_date
Dimensions / Filters
- Time: day, week, month
- Facility
- OR room
- Surgeon
- Specialty
- Reason for delay (if captured in
or_cases.delay_reason)
Visualization
- Line chart: on-time start rate by month
- Bar chart: on-time start by surgeon or OR room
- Table: list of delayed first cases with reasons
Alert Thresholds
- Warning: on-time rate < 85% for a month
- Critical: on-time rate < 75% for 2 consecutive months
- Notifications:
- OR Manager
- Surgical Committee
- Anesthesia Lead
KPI-SCHED-008: Scheduling Lead Time
Description
Average time between appointment creation and appointment date/time. Measures access to care and scheduling responsiveness, especially for routine vs. urgent appointments.
Calculation Formula
SELECT
at.type_name_en AS appointment_type,
CAST(
AVG(
DATEDIFF(
DAY,
a.created_at,
a.appointment_datetime
)
) AS DECIMAL(6,2)
) AS avg_lead_time_days
FROM appointments a
JOIN appointment_types at
ON at.type_id = a.appointment_type_id
WHERE a.appointment_datetime >= :start_date
AND a.appointment_datetime < :end_date
AND a.status IN ('scheduled', 'completed')
AND a.facility_id = COALESCE(:facility_id, a.facility_id)
GROUP BY at.type_name_en;
Target / Benchmark
| Appointment Category | Target Lead Time | Rationale |
|---|---|---|
| Routine | ≤ 7 days | Common access target in UAE private sector |
| Urgent | ≤ 48 hours | Supports DOH/DHA access and triage expectations |
| Follow-up | As per clinical protocol | Defined by specialty |
(Implementation: map appointment types to urgency categories via master data.)
Data Source
appointments.created_at,appointment_datetime,statusappointments.appointment_type_idappointment_types.type_id,type_name_en,requires_referral,requires_pre_auth- Optional:
scheduling_rulesto classify urgency
Dimensions / Filters
- Time: week, month, quarter
- Facility
- Department / specialty
- Provider
- Appointment type / urgency
- Payer (for access by insurance)
Visualization
- Line chart: average lead time by month
- Bar chart: lead time by department or provider
- Table: distribution of lead times (0–2 days, 3–7, 8–14, >14)
Alert Thresholds
- Warning: routine lead time > 10 days or urgent > 72 hours for any department
- Critical: routine > 14 days or urgent > 96 hours
- Notifications:
- Scheduling Administrator
- Department heads
- Operations Director
KPI-SCHED-009: Waitlist Conversion Rate
Description
Percentage of waitlist entries that result in a booked appointment or bed. Measures effectiveness of waitlist management and recovery of cancelled slots.
Calculation Formula
SELECT
CAST(
COUNT(CASE WHEN we.resolution_type = 'booked' THEN 1 END) * 100.0
/ NULLIF(COUNT(*), 0)
AS DECIMAL(5,2)
) AS waitlist_conversion_rate_pct
FROM waitlist_entries we
WHERE we.added_datetime >= :start_date
AND we.added_datetime < :end_date
AND we.waitlist_type = COALESCE(:waitlist_type, we.waitlist_type)
AND we.status IN ('resolved', 'cancelled', 'expired');
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| Waitlist Conversion | ≥ 60% | Internal operational target for access |
Data Source
waitlist_entries.entry_idwaitlist_entries.waitlist_type(appointment, bed, OR)waitlist_entries.added_datetimewaitlist_entries.status(active, resolved, expired)waitlist_entries.resolution_type(booked,cancelled,no_response, etc.)
Dimensions / Filters
- Time: month, quarter
- Facility
- Department / specialty
- Waitlist type (clinic, OR, bed)
- Priority (
waitlist_entries.priority)
Visualization
- Line chart: conversion rate over time
- Bar chart: conversion by department or waitlist type
- Table: average days waiting by priority
Alert Thresholds
- Warning: conversion < 50% for any department over a quarter
- Critical: conversion < 40% or average waiting days > defined threshold (e.g., 30 days)
- Notifications:
- Scheduling Administrator
- Department heads
- Patient Experience (summary only)
KPI-SCHED-010: Appointment Cancellation Rate
Description
Percentage of appointments that are cancelled (by patient or provider) relative to all booked appointments. High rates indicate scheduling instability and potential access issues.
Calculation Formula
SELECT
CAST(
COUNT(CASE WHEN a.status = 'cancelled' THEN 1 END) * 100.0
/ NULLIF(COUNT(*), 0)
AS DECIMAL(5,2)
) AS appointment_cancellation_rate_pct
FROM appointments a
WHERE a.appointment_datetime >= :start_date
AND a.appointment_datetime < :end_date
AND a.facility_id = COALESCE(:facility_id, a.facility_id)
AND a.department_id = COALESCE(:department_id, a.department_id)
AND a.provider_id = COALESCE(:provider_id, a.provider_id);
Optional: separate patient-initiated vs provider-initiated using cancellation_reason.
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| Cancellation Rate | ≤ 15% | Common operational target |
Data Source
appointments.statusappointments.cancellation_reasonappointments.appointment_datetimeappointments.facility_id,department_id,provider_id
Dimensions / Filters
- Time: day, week, month
- Facility
- Department / provider
- Cancellation reason category (patient, provider, system)
- Appointment type
Visualization
- Line chart: cancellation rate trend
- Stacked bar: cancellations by reason category
- Table: high-cancellation providers or clinics
Alert Thresholds
- Warning: cancellation rate > 15% for a department in a month
- Critical: > 20% or sudden spike (>5 percentage points) month-on-month
- Notifications:
- Scheduling Administrator
- Department heads
KPI-SCHED-011: Discharge Before Noon Rate
Description
Percentage of inpatient discharges completed before 12:00 (noon). Earlier discharges improve bed availability and flow from ED and elective admissions.
Calculation Formula
SELECT
CAST(
COUNT(
CASE
WHEN CAST(e.discharge_datetime AS TIME) < '12:00:00'
THEN 1
END
) * 100.0
/ NULLIF(COUNT(*), 0)
AS DECIMAL(5,2)
) AS discharge_before_noon_rate_pct
FROM encounters e
WHERE e.encounter_class = 'inpatient'
AND e.discharge_datetime IS NOT NULL
AND e.discharge_datetime >= :start_date
AND e.discharge_datetime < :end_date
AND e.facility_id = COALESCE(:facility_id, e.facility_id)
AND e.department_id = COALESCE(:department_id, e.department_id);
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| Discharge Before Noon Rate | ≥ 40% | Common flow improvement target |
Data Source
encounters.encounter_classencounters.discharge_datetimeencounters.facility_id,department_id
Dimensions / Filters
- Time: day, week, month
- Facility
- Department / ward
- Discharge disposition (
encounters.discharge_disposition)
Visualization
- Line chart: rate over time
- Bar chart: rate by ward
- Table: list of late discharges with reasons (if captured)
Alert Thresholds
- Warning: rate < 35% for a ward for a month
- Critical: rate < 25% for 2 consecutive months
- Notifications:
- Bed Management Coordinator
- Discharge Planning / Case Management
- Department heads
KPI-SCHED-012: NABIDH/Malaffi ADT Submission Rate
Description
Percentage of ADT messages (A01/A02/A03/A04) successfully acknowledged (ACK status AA) by NABIDH (Dubai) and Malaffi (Abu Dhabi). Measures HIE compliance and data sharing reliability.
Calculation Formula
SELECT
im.target_system,
CAST(
COUNT(CASE WHEN im.ack_status = 'AA' THEN 1 END) * 100.0
/ NULLIF(COUNT(*), 0)
AS DECIMAL(5,2)
) AS adt_submission_success_rate_pct
FROM integration_message_log im
WHERE im.message_type = 'ADT'
AND im.event_type IN ('A01','A02','A03','A04')
AND im.sent_datetime >= :start_date
AND im.sent_datetime < :end_date
AND im.target_system IN ('NABIDH', 'Malaffi')
GROUP BY im.target_system;
Target / Benchmark
| Metric | Target | Source / Rationale |
|---|---|---|
| ADT Submission Success Rate | ≥ 99.5% | Aligns with DOH/DHA HIE reliability expectations |
| ADT Failure (AE/AR) Rate | < 0.5% | Internal integration reliability target |
Data Source
integration_message_log.message_idintegration_message_log.message_type(ADT)integration_message_log.event_type(A01/A02/A03/A04)integration_message_log.target_system(NABIDH,Malaffi)integration_message_log.sent_datetimeintegration_message_log.ack_status(AA,AE,AR)
Dimensions / Filters
- Time: hour, day, month
- Target system (NABIDH vs Malaffi)
- Facility
- Event type (A01/A02/A03/A04)
Visualization
- Line chart: success rate by day per HIE
- Bar chart: count of failures by error code
- Table: failed messages with error details (for integration team)
Alert Thresholds
- Warning: success rate < 99.5% in any 24-hour period
- Critical: success rate < 98% in any 24-hour period or >10 consecutive failures
- Notifications:
- Integration / IT Operations
- HIS Administrator
- Compliance Officer (daily summary, no PHI in email to comply with UAE PDPL)
Standard Reports
| Report ID | Report Name | Purpose | Audience | Frequency | Format |
|---|---|---|---|---|---|
| RPT-SCHED-001 | Outpatient Appointment Performance | Monitor volume, no-shows, cancellations, wait times by clinic/provider | Scheduling Admin, Dept Heads | Daily / Monthly | Interactive dashboard + Excel export |
| RPT-SCHED-002 | Bed Occupancy & Turnaround Report | Track occupancy, admissions, discharges, bed turnaround by ward | Bed Management, Nursing Admin | Daily | PDF + Dashboard |
| RPT-SCHED-003 | Inpatient LOS & Discharge Timeliness | Monitor ALOS and discharge-before-noon rates by specialty/DRG | Quality, Case Management, Medical Dir. | Monthly / Quarterly | PDF + Excel |
| RPT-SCHED-004 | OR Utilization & First-Case Punctuality | Analyze OR utilization, delays, first-case on-time starts | OR Manager, Surgical Committee | Daily / Monthly | Dashboard + PDF summary |
| RPT-SCHED-005 | Waitlist Effectiveness | Review waitlist size, conversion, and waiting times | Scheduling Admin, Dept Heads | Monthly | Dashboard + Excel |
| RPT-SCHED-006 | HIE ADT Compliance (NABIDH/Malaffi) | Track ADT submission success/failure and error patterns | IT, Compliance, HIS Admin | Real-time + Monthly | Dashboard + PDF |
| RPT-SCHED-007 | Provider Schedule Utilization | Compare available slots vs. booked, no-shows, cancellations | Provider Leads, Operations | Monthly | Dashboard + Excel |
| RPT-SCHED-008 | ED Boarding & Bed Availability Snapshot | Show ED holds vs. available beds, discharge pipeline | ED Lead, Bed Management | Intra-day (hourly) | Real-time dashboard |
| RPT-SCHED-009 | Payer-Specific Access & LOS Summary | Access (lead time) and LOS by payer for contract management | Finance, Contracting, Payer Relations | Quarterly | PDF + Excel |
| RPT-SCHED-010 | Holiday & Closure Impact on Scheduling | Analyze impact of UAE holidays/closures on appointment volumes | Operations, Scheduling Admin | Annual / Ad-hoc | PDF + Excel |
Dashboard Wireframe
Below is an HTML wireframe mockup for the Scheduling Analytics Dashboard (SCR-SCH-010), focusing on the KPIs defined above.
Show HTML code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Scheduling Analytics Dashboard</title>
</head>
<body style="font-family: Arial, sans-serif; background-color:#f5f5f5; margin:0; padding:0;">
<div style="padding:16px; background-color:#004b8d; color:#fff;">
<h1 style="margin:0; font-size:20px;">Scheduling & Bed/OR Management Dashboard</h1>
<div style="margin-top:8px;">
<label>Date Range:
<select style="margin-left:4px;">
<option>Last 7 days</option>
<option>Last 30 days</option>
<option>This month</option>
<option>Custom...</option>
</select>
</label>
<label style="margin-left:16px;">Facility:
<select><option>All</option></select>
</label>
<label style="margin-left:16px;">Department:
<select><option>All</option></select>
</label>
</div>
</div>
<div style="padding:16px;">
<!-- KPI Cards Row 1 -->
<div style="display:flex; gap:16px; margin-bottom:16px;">
<div style="flex:1; background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd;">
<h2 style="font-size:14px; margin:0 0 4px;">Appointment No-Show Rate</h2>
<div style="font-size:24px; font-weight:bold; color:#c0392b;">8.5%</div>
<div style="font-size:11px; color:#666;">Target ≤ 10%</div>
</div>
<div style="flex:1; background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd;">
<h2 style="font-size:14px; margin:0 0 4px;">Average Wait Time (Clinic)</h2>
<div style="font-size:24px; font-weight:bold; color:#27ae60;">17 min</div>
<div style="font-size:11px; color:#666;">Target ≤ 20 min</div>
</div>
<div style="flex:1; background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd;">
<h2 style="font-size:14px; margin:0 0 4px;">Bed Occupancy Rate</h2>
<div style="font-size:24px; font-weight:bold; color:#f39c12;">88%</div>
<div style="font-size:11px; color:#666;">Target 80–90%</div>
</div>
<div style="flex:1; background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd;">
<h2 style="font-size:14px; margin:0 0 4px;">ALOS (Inpatient)</h2>
<div style="font-size:24px; font-weight:bold;">4.3 days</div>
<div style="font-size:11px; color:#666;">Compare vs DRG benchmarks</div>
</div>
</div>
<!-- KPI Cards Row 2 -->
<div style="display:flex; gap:16px; margin-bottom:16px;">
<div style="flex:1; background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd;">
<h2 style="font-size:14px; margin:0 0 4px;">Bed Turnaround Time</h2>
<div style="font-size:24px; font-weight:bold; color:#e67e22;">55 min</div>
<div style="font-size:11px; color:#666;">Target ≤ 60 min</div>
</div>
<div style="flex:1; background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd;">
<h2 style="font-size:14px; margin:0 0 4px;">OR Utilization Rate</h2>
<div style="font-size:24px; font-weight:bold; color:#27ae60;">79%</div>
<div style="font-size:11px; color:#666;">Target 75–85%</div>
</div>
<div style="flex:1; background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd;">
<h2 style="font-size:14px; margin:0 0 4px;">First-Case On-Time Start</h2>
<div style="font-size:24px; font-weight:bold; color:#c0392b;">82%</div>
<div style="font-size:11px; color:#666;">Target ≥ 90%</div>
</div>
<div style="flex:1; background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd;">
<h2 style="font-size:14px; margin:0 0 4px;">ADT Submission Rate (HIE)</h2>
<div style="font-size:24px; font-weight:bold; color:#27ae60;">99.7%</div>
<div style="font-size:11px; color:#666;">Target ≥ 99.5%</div>
</div>
</div>
<!-- Charts Row -->
<div style="display:flex; gap:16px; margin-bottom:16px;">
<div style="flex:2; background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd; height:260px;">
<h2 style="font-size:14px; margin:0 0 8px;">Appointment No-Show & Cancellation Trends</h2>
<div style="border:1px dashed #ccc; height:210px; text-align:center; padding-top:90px; color:#999; font-size:12px;">
Line chart: monthly no-show and cancellation rates by department
</div>
</div>
<div style="flex:1; background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd; height:260px;">
<h2 style="font-size:14px; margin:0 0 8px;">Bed Occupancy by Ward</h2>
<div style="border:1px dashed #ccc; height:210px; text-align:center; padding-top:90px; color:#999; font-size:12px;">
Bar chart: current occupancy vs target by ward
</div>
</div>
</div>
<!-- Charts Row 2 -->
<div style="display:flex; gap:16px; margin-bottom:16px;">
<div style="flex:1; background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd; height:260px;">
<h2 style="font-size:14px; margin:0 0 8px;">OR Utilization & First-Case Starts</h2>
<div style="border:1px dashed #ccc; height:210px; text-align:center; padding-top:90px; color:#999; font-size:12px;">
Combined bar/line chart by OR room
</div>
</div>
<div style="flex:1; background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd; height:260px;">
<h2 style="font-size:14px; margin:0 0 8px;">ALOS vs DRG Benchmarks</h2>
<div style="border:1px dashed #ccc; height:210px; text-align:center; padding-top:90px; color:#999; font-size:12px;">
Bar chart: ALOS vs target by DRG group
</div>
</div>
</div>
<!-- Detail Table -->
<div style="background:#fff; padding:12px; border-radius:4px; border:1px solid #ddd;">
<h2 style="font-size:14px; margin:0 0 8px;">Clinic Performance Detail</h2>
<div style="overflow-x:auto;">
<table style="width:100%; border-collapse:collapse; font-size:12px;">
<thead>
<tr style="background:#eee;">
<th style="border:1px solid #ccc; padding:4px;">Clinic</th>
<th style="border:1px solid #ccc; padding:4px;">Provider</th>
<th style="border:1px solid #ccc; padding:4px;">No-Show %</th>
<th style="border:1px solid #ccc; padding:4px;">Cancel %</th>
<th style="border:1px solid #ccc; padding:4px;">Avg Wait (min)</th>
<th style="border:1px solid #ccc; padding:4px;">Lead Time (days)</th>
<th style="border:1px solid #ccc; padding:4px;">Appointments</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border:1px solid #ccc; padding:4px;">Internal Medicine</td>
<td style="border:1px solid #ccc; padding:4px;">Dr. Ahmed Al-Maktoum</td>
<td style="border:1px solid #ccc; padding:4px; color:#27ae60;">7.2%</td>
<td style="border:1px solid #ccc; padding:4px;">11.0%</td>
<td style="border:1px solid #ccc; padding:4px;">18</td>
<td style="border:1px solid #ccc; padding:4px;">5.4</td>
<td style="border:1px solid #ccc; padding:4px;">220</td>
</tr>
<tr>
<td style="border:1px solid #ccc; padding:4px;">Orthopedics</td>
<td style="border:1px solid #ccc; padding:4px;">Dr. Fatima Al-Nahyan</td>
<td style="border:1px solid #ccc; padding:4px; color:#c0392b;">12.5%</td>
<td style="border:1px solid #ccc; padding:4px;">16.3%</td>
<td style="border:1px solid #ccc; padding:4px;">24</td>
<td style="border:1px solid #ccc; padding:4px;">9.1</td>
<td style="border:1px solid #ccc; padding:4px;">185</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
Regulatory Reports
All regulatory references are UAE-specific and must comply with UAE PDPL (Federal Decree-Law No. 45/2021), DOH, DHA, MOH, and TDRA/NESA cybersecurity expectations.
1. MOH / Federal-Level Reporting
Although MOH does not mandate a single national HIS format, typical required indicators that use this module’s data include:
- Inpatient Activity Summary
- Admissions, discharges, transfers by facility and specialty
- ALOS by specialty
- Bed occupancy rates
- Surgical Activity Summary
- Number of surgeries by type (CPT group), elective vs emergency
- OR utilization summary
System Requirements
- Provide exportable aggregated reports (no direct patient identifiers) in CSV/PDF for MOH submissions.
- Support de-identification/anonymization when exporting patient-level data for federal statistical requests.
- Ensure all exports are logged (
report_audit_log) with: - Report name, parameters, user, timestamp
- Whether PHI was included (for PDPL audit)
2. DOH (Abu Dhabi) / Malaffi
- Malaffi ADT Feed Compliance
- ADT A01/A02/A03/A04 messages must be sent in real-time for Abu Dhabi facilities.
- KPI-SCHED-012 directly supports monitoring compliance.
- DOH Statistical Submissions
- Bed occupancy, ALOS, admissions/discharges by specialty.
- ED boarding times (if ED module integrated with encounters).
System Requirements
- Ability to filter reports by emirate and facility to isolate DOH-regulated entities.
- Provide DOH-specific templates (e.g., Excel layouts) for inpatient activity and surgical statistics.
- Maintain an integration log for Malaffi with:
- Message ID, event type, facility, ack status, error code, retry count.
3. DHA (Dubai) / NABIDH
- NABIDH ADT Feed Compliance
- Real-time ADT messages for Dubai facilities.
- KPI-SCHED-012 used to monitor success rates and error patterns.
- DHA Statistical Reporting
- Outpatient volumes, no-show rates, and waiting times by specialty.
- Bed occupancy and LOS for Dubai hospitals.
System Requirements
- Emirate-based filtering to isolate DHA facilities.
- Pre-built “DHA Outpatient Access & No-Show” report:
- Appointment volumes, no-show and cancellation rates by specialty.
- Average lead time and wait time.
4. UAE PDPL Compliance & Audit Reporting
To comply with UAE PDPL:
- Access & Export Audit
- Every scheduling/bed/OR report run must be logged:
- User, role, timestamp
- Filters (date range, facility, department)
- Whether patient identifiers were included
- Export type (CSV, Excel, PDF, API)
- Minimum Necessary Principle
- Default regulatory reports should be aggregated; patient-level detail requires elevated permissions.
- Data Subject Rights Support
- Ability to retrieve all encounters, appointments, and bed/OR events for a given patient (Emirates ID or MRN) for PDPL access requests.
- Ability to show when and by whom the patient’s scheduling data was accessed or exported.
PDPL Audit Report Examples
- RPT-SCHED-PDPL-001: Scheduling Data Access Audit
- Lists all users who accessed appointment/encounter scheduling data for a given patient or date range.
- RPT-SCHED-PDPL-002: Report & Export Audit
- Lists all scheduling-related reports run, with export details.
5. Cybersecurity & TDRA/NESA
- All regulatory and HIE reports must be accessible only over secure channels (HTTPS, VPN).
- Role-based access control enforced via
users,roles,permissions. - Integration failure reports (for NABIDH/Malaffi) must not expose PHI in email or external notifications; detailed PHI only visible inside the secure HIS UI.
Ad-Hoc Reporting
Available Data Fields (Key Domains)
The ad-hoc reporting layer should expose a curated semantic model over the underlying tables. Key field groups:
-
Appointments -
appointments.appointment_id-appointments.patient_id(masked or pseudonymized option) -appointments.encounter_id-appointments.provider_id-appointments.department_id,facility_id-appointments.appointment_type_id-appointments.appointment_datetime-appointments.duration_minutes-appointments.status-appointments.check_in_time-appointments.reason_for_visit-appointments.cancellation_reason-appointments.created_at,created_by -
Encounters -
encounters.encounter_id-encounters.patient_id-encounters.encounter_type,encounter_class-encounters.encounter_status-encounters.admission_datetime,discharge_datetime-encounters.facility_id,department_id-encounters.attending_provider_id,admitting_provider_id-encounters.admission_source,discharge_disposition-encounters.payer_id,insurance_plan_id-encounters.expected_los,actual_los -
Bed Management -
beds.bed_id,facility_id,department_id,ward_type-beds.bed_number,bed_status,is_isolation,gender_restriction-bed_assignments.assignment_id,bed_id,patient_id,encounter_id-bed_assignments.assigned_datetime,released_datetime,assignment_reason-bed_transfers.transfer_id,from_bed_id,to_bed_id,transfer_reason,transfer_datetime -
OR Scheduling -
or_rooms.room_id,facility_id,room_name,room_type-or_schedules.schedule_id,or_room_id,schedule_date,block_start,block_end,block_type-or_cases.case_id,schedule_id,patient_id,encounter_id-or_cases.surgeon_id,anesthesiologist_id-or_cases.procedure_code_cpt,procedure_description-or_cases.estimated_duration,actual_start,actual_end,case_status-or_cases.pre_op_checklist_complete,consent_verified -
Waitlist -
waitlist_entries.entry_id,patient_id-waitlist_entries.waitlist_type,requested_service-waitlist_entries.preferred_provider_id-waitlist_entries.priority-waitlist_entries.added_datetime-waitlist_entries.target_date_from,target_date_to-waitlist_entries.status-waitlist_entries.offered_count-waitlist_entries.resolved_datetime,resolution_type -
Integration & HIE -
integration_message_log.message_id-integration_message_log.message_type,event_type-integration_message_log.target_system-integration_message_log.sent_datetime-integration_message_log.ack_status,error_code,retry_count
All ad-hoc access must respect PDPL and role-based permissions; some fields (e.g., patient identifiers) may be hidden or masked depending on user role.
Export Formats
The reporting engine should support:
- CSV: For data analysis in external tools; UTF-8 encoding; no PHI in unsecured channels.
- Excel (XLSX): For operational and management reports; includes basic formatting and filters.
- PDF: For official reporting, sign-off, and archival.
- JSON / API (optional): For integration with external analytics platforms, with appropriate authentication and authorization.
Each export action must be logged in a report_audit_log table with:
report_audit_idreport_nameparameters_jsonexport_formatrequested_by_user_idrequested_atcontains_phi(boolean)row_count
Scheduled Report Delivery
The system should allow scheduling of recurring reports with the following capabilities:
- Scheduling Options
- Frequency: daily, weekly, monthly, quarterly, yearly
- Time of day (with facility time zone)
-
Start and end dates
-
Delivery Channels
- Secure email with link to download (no PHI in email body; require login to view)
- Internal notification within HIS (inbox/notification center)
-
Secure SFTP drop for integration with corporate BI tools
-
Access Control
- Only users with appropriate permissions can schedule or receive specific reports.
-
Distribution lists must be role-based where possible (e.g., “OR Managers”, “Bed Management Team”).
-
Compliance
- All scheduled runs logged in
report_audit_log. - Ability to revoke or modify schedules centrally (e.g., by HIS admin).
- For reports containing PHI, enforce:
- Encrypted storage at rest
- Time-limited download links
- No automatic attachment of raw PHI data to emails.
This specification provides developer-ready definitions for KPIs, standard and regulatory reports, dashboard layout, and ad-hoc reporting capabilities for the Scheduling & Bed/OR Management module in the UAE regulatory context.