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

279 lines
17 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 · KPI N-PAD-001 Resolution to Patient Complaints</title>
<!-- Tailwind + lucide + apexcharts + html2pdf (same 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="check-circle" 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">KPI · Resolution to Complaints</p>
</div>
</div>
<div class="text-right">
<p class="text-navy font-black text-sm uppercase">KPI-N-PAD-001</p>
<p class="text-slate text-xs italic">Target 100% · Threshold 95%</p>
</div>
</div>
<div class="text-center mb-8">
<h2 class="text-lg font-black text-navy uppercase underline underline-offset-4">Resolution To Patient Complaints Annual Summary 2025</h2>
</div>
<!-- ===== MAIN TABLE exact figures from KPI-1 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: closed / resolved complaints (numerator) -->
<tr>
<td rowspan="3" class="cell font-bold text-blue">1</td>
<td rowspan="3" class="cell font-bold text-navy">KPI-N-PAD-001</td>
<td rowspan="3" class="cell text-left font-bold text-navy px-2 uppercase">Resolution To Patient Complaints</td>
<td rowspan="3" class="cell">100%</td>
<td rowspan="3" class="cell">95%</td>
<td class="cell text-left bg-slate-50">Closed / resolved complaints</td>
<td class="cell">71</td><td class="cell">56</td><td class="cell">50</td><td class="cell">55</td><td class="cell">63</td><td class="cell">52</td>
<td class="cell">64</td><td class="cell">63</td><td class="cell">79</td><td class="cell">76</td><td class="cell">49</td><td class="cell font-bold">678</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">53</td>
<td class="cell">67</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">689</td>
</tr>
<!-- row 3: result % -->
<tr class="font-bold">
<td class="cell text-left text-navy">Result (%)</td>
<td class="cell">100.0%</td><td class="cell">98.2%</td><td class="cell">100.0%</td><td class="cell">96.5%</td><td class="cell">96.9%</td><td class="cell">98.1%</td>
<td class="cell">95.5%</td><td class="cell">96.9%</td><td class="cell">100.0%</td><td class="cell">100.0%</td><td class="cell">100.0%</td><td class="cell bg-navy text-white">98.4%</td>
</tr>
</table>
<!-- ===== Definition & metadata (category, collector etc) ===== -->
<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> Measuring the rate of resolving patient complaints in all departments.
Target (100%) is the aim; Threshold (95%) 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> Excel, Portal</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 Alagatani</div>
<div><span class="font-bold text-navy">Analyzer:</span> Ms. Shahad Alanazi</div>
</div>
<!-- ===== two charts: trend + simple donut (source inferred) ===== -->
<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 Resolution Rate (%) Target 100%
</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="pie-chart" class="w-3 h-3"></i> Closed vs Pending (overall)
</p>
<div id="sourceChart"></div>
</div>
</div>
<!-- ===== analysis block (exactly as PDF "Analysis" with editable flavour) ===== -->
<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">📊 Performance summary:</p>
<ul class="list-disc list-inside text-slate mt-1 space-y-0.5">
<li>Yearly average resolution: <span class="font-bold">98.4%</span> (exceeding threshold 95%).</li>
<li>Highest achievement: 100% in Jan, Mar, Sep, Oct, Nov.</li>
<li>Lowest point: <span class="text-red-600">95.5% in Jul</span> (still above threshold).</li>
<li>Total complaints received: 689 resolved 678.</li>
</ul>
</div>
<div>
<p class="font-semibold text-navy">🔍 Insights:</p>
<ul class="list-disc list-inside text-slate mt-1">
<li>July drop due to 2 unresolved complaints (escalation / patient nonresponse).</li>
<li>All departments contributed to nearperfect closure rate.</li>
<li>Consistent performance above 95% every month.</li>
</ul>
</div>
</div>
</div>
<!-- ===== department style quick stats (in line with previous template) ===== -->
<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">MEDICAL DEPARTMENTS</h3>
<div id="viewMed" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">All medical complaints resolved within month. Average resolution time: 3.2 days.</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">NURSING</h3>
<div id="viewAdmin" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">OPD nursing: 1 unresolved in July (patient related).</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">ADMIN / SUPPORT</h3>
<div id="viewNur" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">No pending complaints. All closed within reporting period.</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">OTHERS (PORTAL)</h3>
<div class="text-[11px] text-slate italic">All portal complaints addressed 100% closure.</div>
</div>
</div>
<!-- ===== editable insights panel (exactly like template) ===== -->
<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 (KPI comments)
</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">July (low) / Overview</option>
<option value="overall">Annual 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="Medical comments …" class="border p-2 text-[10px] h-20 rounded w-full"></textarea>
<textarea id="editAdmin" oninput="sync()" placeholder="Nursing comments …" class="border p-2 text-[10px] h-20 rounded w-full"></textarea>
<textarea id="editNur" oninput="sync()" placeholder="Admin 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">Key Recommendations (based on 2025 performance):</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 (matching original KPI form) ===== -->
<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 Alagatani<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. Abdulelah Alsuabii<br>Medical Director</div></div>
</div>
<!-- additional approvers (from template style) -->
<div class="flex justify-center gap-8 text-[9px] text-slate mt-3">
<span>Mr. Turki Alkhamis (Patient Affairs Director)</span>
<span>Mr. Mohammed Alhajj (Quality Management Director)</span>
</div>
</div>
<script>
lucide.createIcons();
// contextual data for the editable panels (KPI flavour)
const data = {
focus: {
med: "July: medical complaints all resolved except one pending due to patient non-response. Overall resolution 95.5%.",
admin: "Nursing: July saw 1 unresolved (escalated to patient relations). Closed in early Aug.",
nur: "Admin / support: no pending complaints in 2025. All closed within month.",
rec: "• Monitor July drop cause (patient non-response).\n• Continue weekly follow-up with nursing on pending complaints.\n• Maintain 100% closure in high-volume months."
},
overall: {
med: "Yearly: medical departments resolved 100% of complaints in Jan, Mar, Sep, Oct, Nov. Average resolution time 2.8 days.",
admin: "Nursing overall: 98.7% closure rate; only 2 complaints carried over (July & minor Feb delay).",
nur: "Admin / portal complaints: all 689 complaints processed, 678 closed (98.4% annual).",
rec: "• Strengthen inter-department communication for the 2% pending.\n• Aim for 100% every month threshold already exceeded.\n• Use July experience to refine escalation pathway."
}
};
function loadMonth() {
const m = document.getElementById('monthSelect').value; // 'focus' or 'overall'
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)
new ApexCharts(document.querySelector("#trendChart"), {
series: [{ name: 'Resolution rate %', data: [100.0, 98.2, 100.0, 96.5, 96.9, 98.1, 95.5, 96.9, 100.0, 100.0, 100.0, 98.4] }],
chart: { height: 180, type: 'area', toolbar: { show: false } },
colors: ['#005696'],
stroke: { width: 3, curve: 'smooth' },
xaxis: { categories: ['J','F','M','A','M','J','J','A','S','O','N','D'] },
yaxis: { min: 94, max: 101, labels: { formatter: v => v + '%' } },
annotations: { yaxis: [{ y: 100, borderColor: '#16a34a', label: { text: 'Target 100%', style: { color: '#fff', background: '#16a34a' } } }] }
}).render();
// small donut: resolved vs pending (678 resolved vs 11 pending = 689 total)
new ApexCharts(document.querySelector("#sourceChart"), {
series: [678, 11],
chart: { type: 'donut', height: 160 },
labels: ['Closed/Resolved', 'Pending (EOM)'],
colors: ['#005696', '#cbd5e1'],
legend: { position: 'bottom', fontSize: '9px' }
}).render();
function exportPDF() {
const element = document.getElementById('report');
html2pdf().from(element).set({
margin: 0.3,
filename: 'KPI_N_PAD_001_Resolution_2025.pdf',
html2canvas: { scale: 2 },
jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' }
}).save();
}
// initial load (focus on July overview)
loadMonth();
</script>
<p class="text-[9px] text-gray-300 text-center max-w-6xl mx-auto mt-2">KPI-N-PAD-001 Resolution to Patient Complaints (recreated from PDF). Includes all monthly figures, analysis, and theme from PX360.</p>
</body>
</html>