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

290 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-3 Overall Satisfaction With Complaint Resolution</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; }
@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="smile" 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 Satisfaction · Complaint Resolution</p>
</div>
</div>
<div class="text-right">
<p class="text-navy font-black text-sm uppercase">MOH - 3</p>
<p class="text-slate text-xs italic">Target 80% · Threshold 70%</p>
</div>
</div>
<div class="text-center mb-8">
<h2 class="text-lg font-black text-navy uppercase underline underline-offset-4">Overall Satisfaction with Complaint Resolution 2025</h2>
</div>
<!-- ===== MAIN TABLE exact figures from KPI-3 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-56">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: satisfied responses (numerator) -->
<tr>
<td rowspan="3" class="cell font-bold text-blue">3</td>
<td rowspan="3" class="cell font-bold text-navy">MOH - 3</td>
<td rowspan="3" class="cell text-left font-bold text-navy px-2 uppercase">Overall Satisfaction with Complaint Resolution</td>
<td rowspan="3" class="cell">80%</td>
<td rowspan="3" class="cell">70%</td>
<td class="cell text-left bg-slate-50">Satisfied responses</td>
<td class="cell">37</td><td class="cell">27</td><td class="cell">25</td><td class="cell">33</td><td class="cell">29</td><td class="cell">22</td>
<td class="cell">41</td><td class="cell">37</td><td class="cell">31</td><td class="cell">35</td><td class="cell">19</td><td class="cell font-bold">336</td>
</tr>
<!-- row 2: total complaints received -->
<tr>
<td class="cell text-left bg-slate-50">Total complaints received</td>
<td class="cell">71</td><td class="cell">57</td><td class="cell">50</td><td class="cell">57</td><td class="cell">65</td><td class="cell">50</td>
<td class="cell">63</td><td class="cell">65</td><td class="cell">79</td><td class="cell">76</td><td class="cell">49</td><td class="cell font-bold">682</td>
</tr>
<!-- row 3: result % (exact values from PDF) -->
<tr class="font-bold">
<td class="cell text-left text-navy">Result (%)</td>
<td class="cell">52.1%</td><td class="cell">47.4%</td><td class="cell">50.0%</td><td class="cell">57.9%</td><td class="cell">44.6%</td><td class="cell">44.0%</td>
<td class="cell">65.1%</td><td class="cell">56.9%</td><td class="cell">39.2%</td><td class="cell">46.1%</td><td class="cell bg-red-200 text-red-800">38.8%</td><td class="cell bg-navy text-white">49.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> The satisfaction of patients/family/others from the complaint resolution/outcome.
Target (80%) aim; Threshold (70%) 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</div>
<div><span class="font-bold text-navy">Dimension:</span> Efficiency</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. Ather Alqahani</div>
<div><span class="font-bold text-navy">Analyzer:</span> Ms. Shahad Alanazi</div>
</div>
<!-- ===== two charts: trend + overall satisfaction gauge-like 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-down" class="w-3 h-3 text-red-500"></i> Monthly Satisfaction Rate (%) Target 80%
</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="frown" class="w-3 h-3"></i> Satisfied vs Dissatisfied (Overall)
</p>
<div id="sourceChart"></div>
</div>
</div>
<!-- ===== ANALYSIS block verbatim from PDF ===== -->
<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">📊 Satisfaction Rate (monthly):</p>
<ul class="list-disc list-inside text-slate mt-1 grid grid-cols-2 gap-x-2">
<li>January: 61.67%</li><li>February: 48.21%</li>
<li>March: 50.00%</li><li>April: 61.11%</li>
<li>May: 49.15%</li><li>June: 45.83%</li>
<li>July: 68.33%</li><li>August: 56.92%</li>
<li>September: 43.06%</li><li>October: 48.61%</li>
<li class="font-bold text-red-600">November: 43.18% (lowest)</li>
</ul>
</div>
<div>
<p class="font-semibold text-navy">⚠️ MOH Overall Satisfaction (Nov): <span class="text-red-600">38.8%</span></p>
<p class="text-slate mt-1">The satisfaction rate has marked a significant drop compared to previous months, as it is the lowest in 2025.</p>
<p class="font-semibold text-navy mt-2">Reasons for decline:</p>
<ul class="list-decimal list-inside text-slate text-[10px]">
<li>Complaints are taking a long time to be addressed, leading to frustration.</li>
<li>Many patients are dissatisfied with outcomes, finding responses unconvincing and escalating to administration.</li>
<li>Rights are seen as belonging to the patient rather than the hospital.</li>
</ul>
</div>
</div>
</div>
<!-- ===== Recommendations (exact from PDF) ===== -->
<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>
<p class="text-xs text-slate italic">It is recommended that coordinators maintain a strong focus on this KPI. Additionally, specialists should advocate for patients by thoroughly reviewing responses to complaints. If a response is deemed unsatisfactory, they should follow up with the department to ensure the final reply meets the patient's needs and expectations.</p>
</div>
<!-- ===== department style quick stats (customised for satisfaction) ===== -->
<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 SATISFACTION</h3>
<div id="viewMed" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">July: 68.33% · April: 61.11% · January: 61.67%</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 SATISFACTION</h3>
<div id="viewAdmin" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">November: 38.8% · September: 39.2% · June: 44.0%</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">AVERAGE 2025</h3>
<div id="viewNur" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">Overall satisfaction: 49.3% (below target 80%)</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">KEY FOCUS</h3>
<div class="text-[11px] text-slate italic">Reduce resolution time · Improve outcome clarity · Patient advocacy</div>
</div>
</div>
<!-- ===== editable insights panel (like template) with preset analysis ===== -->
<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-3)
</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="nov">November (critical drop)</option>
<option value="overview">Full year overview</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="Avg & comments …" 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) ===== -->
<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. Ather Alqahani<br>Patient Relations Coordinator</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 Relations Supervisor</div></div>
<div><p class="mb-12 uppercase opacity-50">Approved by</p><div class="border-t border-slate pt-2">Dr. Abdulreh Alsuaibi<br>Medical Director</div></div>
</div>
<!-- additional approvers -->
<div class="flex justify-center gap-8 text-[9px] text-slate mt-3">
<span>Mr. Turki Alkhamis (Patient Affairs Director)</span>
<span>Mr. Mohammed Alhajiy (Quality Management Director)</span>
</div>
</div>
<script>
lucide.createIcons();
// contextual data for the editable panels (based on PDF)
const data = {
nov: {
med: "Highest satisfaction months: July 68.33%, April 61.11%, January 61.67%",
admin: "Lowest satisfaction: November 38.8% (lowest of year), September 39.2%, June 44.0%",
nur: "2025 avg satisfaction 49.3% · far below 80% target. Critical drop in Nov.",
rec: "• Reduce complaint resolution time.\n• Review responses for clarity/convincing outcomes.\n• Advocate patient rights more strongly.\n• Focus on departments with long delays."
},
overview: {
med: "Best performers: Jul (68.33%), Apr (61.11%), Jan (61.67%).",
admin: "Worst: Nov (38.8%), Sep (39.2%), Jun (44.0%), May (44.6%)",
nur: "Overall satisfaction 49.3%. Threshold 70% never reached. Urgent action needed.",
rec: "Coordinators must maintain strong focus on this KPI. Specialists should advocate for patients, review responses, and follow up to ensure final reply meets patient expectations."
}
};
function loadMonth() {
const m = document.getElementById('monthSelect').value; // 'nov' 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 (12 months data from PDF)
new ApexCharts(document.querySelector("#trendChart"), {
series: [{ name: 'Satisfaction %', data: [52.1, 47.4, 50.0, 57.9, 44.6, 44.0, 65.1, 56.9, 39.2, 46.1, 38.8, 49.3] }],
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: ['J','F','M','A','M','J','J','A','S','O','N','D'] },
yaxis: { min: 30, max: 80, labels: { formatter: v => v + '%' } },
annotations: { yaxis: [{ y: 80, borderColor: '#16a34a', label: { text: 'Target 80%', style: { color: '#fff', background: '#16a34a' } } }] }
}).render();
// small donut: satisfied vs dissatisfied (336 satisfied, 346 dissatisfied = 682 total)
new ApexCharts(document.querySelector("#sourceChart"), {
series: [336, 346],
chart: { type: 'donut', height: 160 },
labels: ['Satisfied', 'Dissatisfied'],
colors: ['#005696', '#cbd5e1'],
legend: { position: 'bottom', fontSize: '9px' }
}).render();
function exportPDF() {
const element = document.getElementById('report');
html2pdf().from(element).set({
margin: 0.3,
filename: 'MOH3_Satisfaction_2025.pdf',
html2canvas: { scale: 2 },
jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' }
}).save();
}
// initial load (nov focus)
loadMonth();
</script>
<p class="text-[9px] text-gray-300 text-center max-w-6xl mx-auto mt-2">MOH-3 Overall Satisfaction with Complaint Resolution (recreated from PDF). Includes all monthly figures, detailed analysis, and PX360 theme.</p>
</body>
</html>