287 lines
17 KiB
HTML
287 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-6 – Complaint Activation Within 2 Hours</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="clock" 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">Activation Within 2 Hours</p>
|
||
</div>
|
||
</div>
|
||
<div class="text-right">
|
||
<p class="text-navy font-black text-sm uppercase">KPI - 6</p>
|
||
<p class="text-slate text-xs italic">Target 95% · Threshold 90%</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="text-center mb-8">
|
||
<h2 class="text-lg font-black text-navy uppercase underline underline-offset-4">Complaint Activation Within 2 Hours – 2025</h2>
|
||
</div>
|
||
|
||
<!-- ===== MAIN TABLE – exact figures from KPI-6 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: activated within 2h (numerator) -->
|
||
<tr>
|
||
<td rowspan="3" class="cell font-bold text-blue">6</td>
|
||
<td rowspan="3" class="cell font-bold text-navy">—</td>
|
||
<td rowspan="3" class="cell text-left font-bold text-navy px-2 uppercase">Complaint Activation Within 2 Hours</td>
|
||
<td rowspan="3" class="cell">95%</td>
|
||
<td rowspan="3" class="cell">90%</td>
|
||
<td class="cell text-left bg-slate-50">Activated ≤2h</td>
|
||
<td class="cell">45</td><td class="cell">23</td><td class="cell">35</td><td class="cell">40</td><td class="cell">41</td><td class="cell">44</td>
|
||
<td class="cell">51</td><td class="cell">46</td><td class="cell">53</td><td class="cell">59</td><td class="cell">37</td><td class="cell font-bold">474</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 % (exact values from PDF) -->
|
||
<tr class="font-bold">
|
||
<td class="cell text-left text-navy">Result (%)</td>
|
||
<td class="cell">63.4%</td><td class="cell">40.4%</td><td class="cell">70.0%</td><td class="cell">70.2%</td><td class="cell">63.1%</td><td class="cell">83.0%</td>
|
||
<td class="cell">76.1%</td><td class="cell">70.8%</td><td class="cell">67.1%</td><td class="cell">77.6%</td><td class="cell">75.5%</td><td class="cell bg-navy text-white">68.8%</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> Measuring the percentage of complaints that are activated within specified timeframes (within 2 hours).
|
||
Target (95%) aim; Threshold (90%) 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> Process</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: Excel</div>
|
||
<div><span class="font-bold text-navy">Dimension:</span> Efficiency, Timeliness</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 activation 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 Activation ≤2h – Target 95%
|
||
</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="zap" class="w-3 h-3"></i> Activated ≤2h vs Delayed
|
||
</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">📊 Comparison to Target and Threshold:</p>
|
||
<ul class="list-disc list-inside text-slate mt-1">
|
||
<li>The result of <span class="font-bold">75.7%</span> (annual avg) was below target (95%) and threshold (90%).</li>
|
||
<li>However, it is close to the last month's percentage, which is good as it has not dropped in level.</li>
|
||
<li>Best month: June 83.0% · Worst: February 40.4%</li>
|
||
</ul>
|
||
</div>
|
||
<div>
|
||
<p class="font-semibold text-navy">⚠️ Reasons behind delay of activations:</p>
|
||
<ul class="list-disc list-inside text-slate mt-1">
|
||
<li>The staff attempts to resolve issues immediately, but some patients refuse it.</li>
|
||
<li>Unclear content of the complaint, which requires contacting the patient for clarification, sometimes taking more than 2 hours for a response.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<p class="text-xs text-slate mt-3 italic border-t pt-2">Annual average: 68.8% (474/689) – significantly below threshold.</p>
|
||
</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>
|
||
<ul class="text-xs text-slate list-disc list-inside">
|
||
<li>Establishing a timer notification within the complaints request platform to remind staff to follow up on filled request promptly.</li>
|
||
<li>Adding a feature to the complaints platform that indicates the reason for delay in activation for more than 2 hours.</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<!-- ===== department style quick stats (customised for activation) ===== -->
|
||
<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 ACTIVATION</h3>
|
||
<div id="viewMed" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">June 83.0% · Oct 77.6% · Jul 76.1% · Nov 75.5%</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 ACTIVATION</h3>
|
||
<div id="viewAdmin" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">Feb 40.4% · Jan 63.4% · May 63.1% · Sep 67.1%</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">ANNUAL AVERAGE</h3>
|
||
<div id="viewNur" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">68.8% (far below target 95%)</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 DELAY REASONS</h3>
|
||
<div class="text-[11px] text-slate italic">Patient refusal · Unclear content requiring clarification</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 (KPI-6)
|
||
</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">February (low) / June (high)</option>
|
||
<option value="overview">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="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="Delay reasons …" 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. Ather Alqahani<br>Patient Relations & Experience 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 & Experience Supervisor</div></div>
|
||
<div><p class="mb-12 uppercase opacity-50">Approved by</p><div class="border-t border-slate pt-2">Mr. Turki Alkhamis<br>Patient Affairs 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 (Chief Administrative Officer)</span>
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
lucide.createIcons();
|
||
|
||
// contextual data for the editable panels
|
||
const data = {
|
||
focus: {
|
||
med: "Highest activation: June 83.0%, Oct 77.6%, Jul 76.1%, Nov 75.5%",
|
||
admin: "Lowest: Feb 40.4% (critical), Jan 63.4%, May 63.1%, Sep 67.1%",
|
||
nur: "Delay reasons: patient refusal, unclear complaint content requiring clarification.",
|
||
rec: "• Implement timer notification in complaints platform.\n• Add reason-for-delay feature.\n• Train staff on clarifying complaints promptly."
|
||
},
|
||
overview: {
|
||
med: "Best months: Jun (83.0%), Oct (77.6%), Jul (76.1%)",
|
||
admin: "Worst: Feb (40.4%), Jan (63.4%), May (63.1%)",
|
||
nur: "Annual avg 68.8% – far below target. Main delays: patient refusal, unclear content.",
|
||
rec: "Establish timer notification & delay reason feature. Improve initial complaint clarity."
|
||
}
|
||
};
|
||
|
||
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 (12 months data from PDF)
|
||
new ApexCharts(document.querySelector("#trendChart"), {
|
||
series: [{ name: 'Activation ≤2h %', data: [63.4, 40.4, 70.0, 70.2, 63.1, 83.0, 76.1, 70.8, 67.1, 77.6, 75.5, 68.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: ['J','F','M','A','M','J','J','A','S','O','N','D'] },
|
||
yaxis: { min: 35, max: 100, labels: { formatter: v => v + '%' } },
|
||
annotations: { yaxis: [{ y: 95, borderColor: '#16a34a', label: { text: 'Target 95%', style: { color: '#fff', background: '#16a34a' } } }] }
|
||
}).render();
|
||
|
||
// small donut: activated ≤2h (474) vs delayed (689-474=215)
|
||
new ApexCharts(document.querySelector("#sourceChart"), {
|
||
series: [474, 215],
|
||
chart: { type: 'donut', height: 160 },
|
||
labels: ['Activated ≤2h', 'Delayed (>2h)'],
|
||
colors: ['#005696', '#cbd5e1'],
|
||
legend: { position: 'bottom', fontSize: '9px' }
|
||
}).render();
|
||
|
||
function exportPDF() {
|
||
const element = document.getElementById('report');
|
||
html2pdf().from(element).set({
|
||
margin: 0.3,
|
||
filename: 'KPI6_Activation_2h_2025.pdf',
|
||
html2canvas: { scale: 2 },
|
||
jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' }
|
||
}).save();
|
||
}
|
||
|
||
// initial load (focus on feb/june)
|
||
loadMonth();
|
||
</script>
|
||
|
||
<p class="text-[9px] text-gray-300 text-center max-w-6xl mx-auto mt-2">KPI-6 – Complaint Activation Within 2 Hours – recreated from PDF. Includes all monthly figures, analysis, and PX360 theme.</p>
|
||
</body>
|
||
</html> |