HH/kpi's_references/MOH1_Patient_Experience.html
2026-02-22 08:35:53 +03:00

295 lines
18 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PX360 · MOH-1 Patient Experience Score</title>
<!-- Tailwind + lucide + apexcharts + html2pdf (consistent theme) -->
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/lucide@latest"></script>
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script>
<script>
tailwind.config = {
theme: { extend: { colors: { navy: '#005696', blue: '#007bbd', light: '#f8fafc', slate: '#64748b' } } }
}
</script>
<style>
body { font-family: 'Segoe UI', Tahoma, sans-serif; background-color: #f1f5f9; }
.excel-border { border: 1px solid #cbd5e1; }
.cell { border: 1px solid #cbd5e1; padding: 6px; text-align: center; font-size: 11px; }
.table-header { background-color: #eef6fb; font-weight: bold; color: #005696; }
.div0 { background-color: #fee2e2; color: #b91c1c; font-style: italic; }
@media print { .no-print { display: none !important; } }
</style>
</head>
<body class="p-4 md:p-8">
<div id="report" class="max-w-6xl mx-auto bg-white p-10 shadow-2xl border excel-border">
<!-- ===== HEADER navy/blue (PX360 identity) ===== -->
<div class="flex items-center justify-between border-b-4 border-navy pb-6 mb-8">
<div class="flex items-center gap-4">
<div class="bg-navy p-3 rounded-2xl shadow-lg">
<i data-lucide="star" class="text-white w-10 h-10"></i>
</div>
<div>
<h1 class="text-3xl font-black text-navy tracking-tighter uppercase">PX360</h1>
<p class="text-[10px] font-bold text-blue tracking-[0.2em] uppercase">Patient Experience Score · MOH-1</p>
</div>
</div>
<div class="text-right">
<p class="text-navy font-black text-sm uppercase">MOH - 1</p>
<p class="text-slate text-xs italic">Target 85% · Threshold 78%</p>
</div>
</div>
<div class="text-center mb-8">
<h2 class="text-lg font-black text-navy uppercase underline underline-offset-4">Patient Experience Score 2025 (JanJun)</h2>
</div>
<!-- ===== MAIN TABLE exact figures from KPI-5 PDF ===== -->
<table class="w-full border-collapse mb-8">
<tr class="table-header cell">
<td class="cell">No.</td>
<td class="cell">Perf. Indicator ID</td>
<td class="cell w-64">Indicator Title</td>
<td class="cell">Target</td>
<td class="cell">Threshold</td>
<td class="cell">Numerator / Denominator</td>
<td class="cell">Jan</td><td class="cell">Feb</td><td class="cell">Mar</td><td class="cell">Apr</td>
<td class="cell">May</td><td class="cell">Jun</td><td class="cell">Jul</td><td class="cell">Aug</td>
<td class="cell">Sep</td><td class="cell">Oct</td><td class="cell">Nov</td><td class="cell bg-navy text-white">TOTAL</td>
</tr>
<!-- row 1: Very Satisfied/Good responses (numerator) -->
<tr>
<td rowspan="3" class="cell font-bold text-blue">4</td>
<td rowspan="3" class="cell font-bold text-navy">MOH - 1</td>
<td rowspan="3" class="cell text-left font-bold text-navy px-2 uppercase">Patient Experience Score</td>
<td rowspan="3" class="cell">85%</td>
<td rowspan="3" class="cell">78%</td>
<td class="cell text-left bg-slate-50">Satisfied responses (Very Good/Good)</td>
<td class="cell">489</td><td class="cell">950</td><td class="cell">1,267</td><td class="cell">232</td><td class="cell">297</td><td class="cell">128</td>
<td class="cell div0" colspan="6"></td><td class="cell font-bold">3,363</td>
</tr>
<!-- row 2: total patients surveyed -->
<tr>
<td class="cell text-left bg-slate-50">Total patients surveyed</td>
<td class="cell">654</td><td class="cell">1,197</td><td class="cell">1,591</td><td class="cell">277</td><td class="cell">370</td><td class="cell">151</td>
<td class="cell div0" colspan="6"></td><td class="cell font-bold">4,240</td>
</tr>
<!-- row 3: result % (with #DIV/0! placeholders) -->
<tr class="font-bold">
<td class="cell text-left text-navy">Result (%)</td>
<td class="cell">74.8%</td><td class="cell">79.4%</td><td class="cell">79.6%</td><td class="cell">83.8%</td><td class="cell">80.3%</td><td class="cell">84.8%</td>
<td class="cell div0">#DIV/0!</td><td class="cell div0">#DIV/0!</td><td class="cell div0">#DIV/0!</td><td class="cell div0">#DIV/0!</td><td class="cell div0">#DIV/0!</td><td class="cell bg-navy text-white">79.3%</td>
</tr>
</table>
<!-- ===== Definition & metadata ===== -->
<div class="text-xs text-slate bg-slate-50 p-3 rounded-lg border excel-border mb-6 italic">
<span class="font-bold text-navy">Definition:</span> Number of Patients Who Responded "Very Satisfied" & "Good". Includes responses to: "Would you recommend the hospital to your friends and family?".
Target (85%) aim; Threshold (78%) minimum acceptable.
</div>
<div class="grid grid-cols-2 md:grid-cols-5 gap-2 text-[10px] bg-slate-50 p-3 rounded-lg border excel-border mb-8">
<div><span class="font-bold text-navy">Category:</span> Organizational</div>
<div><span class="font-bold text-navy">Type:</span> Outcome</div>
<div><span class="font-bold text-navy">Risk:</span> <span class="bg-red-200 px-1.5 py-0.5 rounded-full text-red-800">High</span></div>
<div><span class="font-bold text-navy">Data coll.:</span> Retrospective</div>
<div><span class="font-bold text-navy">Method:</span> Others: IT department</div>
<div><span class="font-bold text-navy">Dimension:</span> Efficiency, Patient-centered</div>
<div><span class="font-bold text-navy">Gather freq.:</span> Monthly</div>
<div><span class="font-bold text-navy">Reporting:</span> Monthly</div>
<div><span class="font-bold text-navy">Collector:</span> Ms. Atheer Alqahtani</div>
<div><span class="font-bold text-navy">Analyzer:</span> Ms. Shahad Alanazi</div>
</div>
<!-- ===== two charts: trend (Jan-Jun only) + overall satisfaction donut ===== -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8 no-break">
<div class="md:col-span-2 border excel-border p-4 rounded-xl bg-slate-50/50">
<p class="text-[10px] font-bold text-navy uppercase mb-4 flex items-center gap-2">
<i data-lucide="trending-up" class="w-3 h-3"></i> Monthly Patient Experience Score (JanJun) Target 85%
</p>
<div id="trendChart"></div>
</div>
<div class="border excel-border p-4 rounded-xl bg-slate-50/50">
<p class="text-[10px] font-bold text-navy uppercase mb-4 flex items-center gap-2">
<i data-lucide="thumbs-up" class="w-3 h-3"></i> Satisfied vs Unsatisfied (overall)
</p>
<div id="sourceChart"></div>
</div>
</div>
<!-- ===== ANALYSIS block with insights based on data ===== -->
<div class="mb-8 p-5 bg-blue/5 border-l-4 border-navy rounded-xl">
<h3 class="text-navy font-bold text-sm uppercase flex items-center gap-2 mb-3"><i data-lucide="bar-chart-3" class="w-4 h-4"></i>Analysis</h3>
<div class="grid md:grid-cols-2 gap-6 text-xs">
<div>
<p class="font-semibold text-navy">📊 Monthly performance (JanJun):</p>
<ul class="list-disc list-inside text-slate mt-1">
<li>Highest score: <span class="font-bold text-green-700">June 84.8%</span> (approaching target)</li>
<li>April: 83.8% · May: 80.3% · March: 79.6%</li>
<li>Lowest: January 74.8% (below threshold 78%)</li>
<li>Annual average (JanJun): <span class="font-bold">79.3%</span> (above threshold, below target)</li>
</ul>
</div>
<div>
<p class="font-semibold text-navy">⚠️ Observations:</p>
<ul class="list-disc list-inside text-slate mt-1">
<li>No data for JulDec (surveys not conducted / #DIV/0!).</li>
<li>Total surveyed: 4,240 · Satisfied: 3,363 (79.3%).</li>
<li>877 patients responded less than "Very Satisfied/Good".</li>
<li>Improvement needed to reach 85% target.</li>
</ul>
</div>
</div>
<!-- Additional insight as per PDF style -->
<p class="text-xs text-slate mt-3 italic border-t pt-2">Focus on factors affecting patient experience: communication, wait times, facility cleanliness.</p>
</div>
<!-- ===== Recommendations (inferred from data) ===== -->
<div class="mb-8 p-4 bg-amber-50/70 border-l-4 border-amber-600 rounded-xl">
<h3 class="text-navy font-bold text-sm uppercase flex items-center gap-2 mb-2"><i data-lucide="message-square" class="w-4 h-4"></i>Recommendations</h3>
<ul class="text-xs text-slate list-disc list-inside">
<li>Enhance patient communication during discharge and follow-up.</li>
<li>Reduce waiting times in OPD and specialty clinics.</li>
<li>Conduct monthly patient satisfaction surveys consistently (avoid missing data).</li>
<li>Address low-score drivers identified in Jan (74.8%) through focused action plans.</li>
</ul>
</div>
<!-- ===== department style quick stats (customised for patient experience) ===== -->
<div class="grid grid-cols-2 border-t border-l excel-border mb-8">
<div class="p-4 border-r border-b excel-border">
<h3 class="bg-navy text-white text-[10px] font-bold px-2 py-1 mb-2 inline-block">HIGHEST SCORES</h3>
<div id="viewMed" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">June 84.8% · April 83.8% · May 80.3%</div>
</div>
<div class="p-4 border-r border-b excel-border">
<h3 class="bg-blue text-white text-[10px] font-bold px-2 py-1 mb-2 inline-block">LOWEST SCORES</h3>
<div id="viewAdmin" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">January 74.8% · March 79.6% (just above threshold)</div>
</div>
<div class="p-4 border-r border-b excel-border">
<h3 class="bg-slate text-white text-[10px] font-bold px-2 py-1 mb-2 inline-block">OVERALL AVERAGE</h3>
<div id="viewNur" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">79.3% (JanJun) · Target 85% not yet met</div>
</div>
<div class="p-4 border-r border-b excel-border bg-slate-50">
<h3 class="bg-slate-400 text-white text-[10px] font-bold px-2 py-1 mb-2 inline-block">SURVEY GAPS</h3>
<div class="text-[11px] text-slate italic">JulDec: no data (#DIV/0!) surveys missing</div>
</div>
</div>
<!-- ===== editable insights panel (like template) with preset data ===== -->
<div class="no-print bg-slate-100 p-6 rounded-xl border-2 border-dashed border-navy/20 mb-8">
<div class="flex justify-between items-center mb-4">
<h4 class="font-bold text-navy text-sm uppercase flex items-center gap-2">
<i data-lucide="edit-3" class="w-4 h-4"></i> Data Insights Editor (MOH-1)
</h4>
<div class="flex gap-2">
<select id="monthSelect" onchange="loadMonth()" class="text-xs border p-1 rounded font-bold text-navy outline-none">
<option value="focus">January (low) / June (high)</option>
<option value="overview">H1 summary</option>
</select>
<button onclick="exportPDF()" class="bg-navy text-white px-4 py-1 rounded text-xs font-bold hover:bg-blue">Download PDF</button>
</div>
</div>
<div class="grid grid-cols-4 gap-4">
<textarea id="editMed" oninput="sync()" placeholder="Highest months …" class="border p-2 text-[10px] h-20 rounded w-full"></textarea>
<textarea id="editAdmin" oninput="sync()" placeholder="Lowest months …" class="border p-2 text-[10px] h-20 rounded w-full"></textarea>
<textarea id="editNur" oninput="sync()" placeholder="Overall / gaps …" class="border p-2 text-[10px] h-20 rounded w-full"></textarea>
<textarea id="editRec" oninput="sync()" placeholder="Recommendations …" class="border p-2 text-[10px] h-20 rounded w-full"></textarea>
</div>
</div>
<!-- ===== recommendations block (view) ===== -->
<div class="mb-12">
<h3 class="text-navy font-bold text-xs uppercase border-b-2 border-navy mb-2">Ongoing recommendations (from editor):</h3>
<div id="viewRec" class="text-xs text-slate bg-blue/5 p-4 rounded-lg border-l-4 border-navy whitespace-pre-line italic"></div>
</div>
<!-- ===== signatures (exact match from PDF style) ===== -->
<div class="grid grid-cols-3 gap-12 text-[10px] font-bold text-navy mt-20 text-center">
<div><p class="mb-12 uppercase opacity-50">Prepared by</p><div class="border-t border-slate pt-2">Ms. Atheer Alqahtani<br>Patient Relation Specialist</div></div>
<div><p class="mb-12 uppercase opacity-50">Reviewed by</p><div class="border-t border-slate pt-2">Ms. Shahad Alanazi<br>Patient Relation Supervisor</div></div>
<div><p class="mb-12 uppercase opacity-50">Approved by</p><div class="border-t border-slate pt-2">Dr. Abdulelah Alsuaili<br>Medical Director</div></div>
</div>
<!-- additional approvers (from PDF) -->
<div class="flex justify-center gap-8 text-[9px] text-slate mt-3">
<span>Mr. Omar Al Humaid (Administrative Director)</span>
<span>Dr. Reema Saleh Alhammadi (Chief Medical Officer)</span>
</div>
</div>
<script>
lucide.createIcons();
// contextual data for the editable panels
const data = {
focus: {
med: "Highest scores: June 84.8%, April 83.8%, May 80.3%",
admin: "Lowest: January 74.8% (below threshold 78%) · March 79.6%",
nur: "H1 average 79.3% · Target 85% · JulDec missing data (#DIV/0!)",
rec: "• Improve Jan low score drivers (communication, wait times).\n• Conduct monthly surveys consistently.\n• Focus on patient-centered care."
},
overview: {
med: "Best months: Jun (84.8%), Apr (83.8%), May (80.3%)",
admin: "Jan (74.8%) only month below threshold. Mar (79.6%) just above.",
nur: "Overall 79.3% (3363/4240). Missing H2 data need continuous surveying.",
rec: "Enhance communication, reduce wait times, address Jan low score causes. Aim for 85%."
}
};
function loadMonth() {
const m = document.getElementById('monthSelect').value; // 'focus' or 'overview'
document.getElementById('editMed').value = data[m].med;
document.getElementById('editAdmin').value = data[m].admin;
document.getElementById('editNur').value = data[m].nur;
document.getElementById('editRec').value = data[m].rec;
sync();
}
function sync() {
document.getElementById('viewMed').innerText = document.getElementById('editMed').value;
document.getElementById('viewAdmin').innerText = document.getElementById('editAdmin').value;
document.getElementById('viewNur').innerText = document.getElementById('editNur').value;
document.getElementById('viewRec').innerText = document.getElementById('editRec').value;
}
// trend chart (JanJun only, other months null chart will show only 6 points)
new ApexCharts(document.querySelector("#trendChart"), {
series: [{ name: 'Patient Experience %', data: [74.8, 79.4, 79.6, 83.8, 80.3, 84.8] }],
chart: { height: 180, type: 'line', toolbar: { show: false }, dropShadow: { enabled: true, top: 2, left: 2, blur: 2, opacity: 0.2 } },
colors: ['#005696'],
stroke: { width: 3, curve: 'smooth' },
markers: { size: 4, colors: ['#007bbd'], strokeColors: '#fff' },
xaxis: { categories: ['Jan','Feb','Mar','Apr','May','Jun'] },
yaxis: { min: 70, max: 90, labels: { formatter: v => v + '%' } },
annotations: { yaxis: [{ y: 85, borderColor: '#16a34a', label: { text: 'Target 85%', style: { color: '#fff', background: '#16a34a' } } }] }
}).render();
// small donut: satisfied (3363) vs dissatisfied (4240-3363=877)
new ApexCharts(document.querySelector("#sourceChart"), {
series: [3363, 877],
chart: { type: 'donut', height: 160 },
labels: ['Satisfied (Very Good/Good)', 'Less satisfied'],
colors: ['#005696', '#cbd5e1'],
legend: { position: 'bottom', fontSize: '9px' }
}).render();
function exportPDF() {
const element = document.getElementById('report');
html2pdf().from(element).set({
margin: 0.3,
filename: 'MOH1_Patient_Experience_2025.pdf',
html2canvas: { scale: 2 },
jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' }
}).save();
}
// initial load (focus on jan/june)
loadMonth();
</script>
<p class="text-[9px] text-gray-300 text-center max-w-6xl mx-auto mt-2">MOH-1 Patient Experience Score recreated from PDF. Includes JanJun data, #DIV/0! placeholders, and PX360 theme.</p>
</body>
</html>