295 lines
18 KiB
HTML
295 lines
18 KiB
HTML
<!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 (Jan–Jun)</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 (Jan–Jun) – 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 (Jan–Jun):</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 (Jan–Jun): <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 Jul–Dec (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% (Jan–Jun) · 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">Jul–Dec: 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% · Jul–Dec 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 (Jan–Jun 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 Jan–Jun data, #DIV/0! placeholders, and PX360 theme.</p>
|
||
</body>
|
||
</html> |