279 lines
17 KiB
HTML
279 lines
17 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 · 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 non‑response).</li>
|
||
<li>All departments contributed to near‑perfect 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> |