290 lines
17 KiB
HTML
290 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-7 – Un‑Activated Filled Complaints Rate</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="alert-octagon" 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">Un‑Activated Filled Complaints</p>
|
||
</div>
|
||
</div>
|
||
<div class="text-right">
|
||
<p class="text-navy font-black text-sm uppercase">KPI - 7</p>
|
||
<p class="text-slate text-xs italic">Target 0% · Threshold 5%</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="text-center mb-8">
|
||
<h2 class="text-lg font-black text-navy uppercase underline underline-offset-4">Un‑Activated Filled Complaints Rate – 2025</h2>
|
||
</div>
|
||
|
||
<!-- ===== MAIN TABLE – exact figures from KPI-7 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: un‑activated filled complaints (numerator) -->
|
||
<tr>
|
||
<td rowspan="3" class="cell font-bold text-blue">7</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">Un‑Activated Filled Complaints Rate</td>
|
||
<td rowspan="3" class="cell">0%</td>
|
||
<td rowspan="3" class="cell">5%</td>
|
||
<td class="cell text-left bg-slate-50">Un‑activated filled requests</td>
|
||
<td class="cell">10</td><td class="cell">20</td><td class="cell">16</td><td class="cell">15</td><td class="cell">4</td><td class="cell">15</td>
|
||
<td class="cell">21</td><td class="cell">29</td><td class="cell">14</td><td class="cell">20</td><td class="cell">19</td><td class="cell font-bold">183</td>
|
||
</tr>
|
||
<!-- row 2: total complaints request received -->
|
||
<tr>
|
||
<td class="cell text-left bg-slate-50">Total complaints received</td>
|
||
<td class="cell">56</td><td class="cell">76</td><td class="cell">49</td><td class="cell">47</td><td class="cell">37</td><td class="cell">70</td>
|
||
<td class="cell">60</td><td class="cell">58</td><td class="cell">79</td><td class="cell">76</td><td class="cell">70</td><td class="cell font-bold">678</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">17.9%</td><td class="cell">26.3%</td><td class="cell">32.7%</td><td class="cell">31.9%</td><td class="cell">10.8%</td><td class="cell">21.4%</td>
|
||
<td class="cell">35.0%</td><td class="cell">50.0%</td><td class="cell">17.7%</td><td class="cell">26.3%</td><td class="cell">27.1%</td><td class="cell bg-navy text-white">27.0%</td>
|
||
</tr>
|
||
</table>
|
||
|
||
<!-- ===== Definition & metadata (inferred) ===== -->
|
||
<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> Percentage of filled complaint requests that remain un‑activated. Target 0% (ideal), Threshold 5% maximum 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</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> —</div>
|
||
<div><span class="font-bold text-navy">Analyzer:</span> —</div>
|
||
</div>
|
||
|
||
<!-- ===== two charts: trend + overall unactivated proportion ===== -->
|
||
<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 Unactivated Rate – Target 0% (Threshold 5%)
|
||
</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> Unactivated vs Activated
|
||
</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 highlights:</p>
|
||
<ul class="list-disc list-inside text-slate mt-1">
|
||
<li>Highest unactivated rate: <span class="font-bold text-red-600">August 50.0%</span> (alarming)</li>
|
||
<li>Also high: July 35.0%, March 32.7%, April 31.9%</li>
|
||
<li>Lowest: May 10.8% (still above threshold 5%)</li>
|
||
<li>Annual average: <span class="font-bold">27.0%</span> – far above threshold</li>
|
||
</ul>
|
||
</div>
|
||
<div>
|
||
<p class="font-semibold text-navy">⚠️ Observations:</p>
|
||
<ul class="list-disc list-inside text-slate mt-1">
|
||
<li>Total unactivated: 183 out of 678 complaints (27%).</li>
|
||
<li>Every month exceeds 5% threshold – critical issue.</li>
|
||
<li>Likely causes: staffing, unclear processes, lack of automated reminders.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<p class="text-xs text-slate mt-3 italic border-t pt-2">Urgent action required to reduce unactivated complaints – target is 0%.</p>
|
||
</div>
|
||
|
||
<!-- ===== Recommendations (inferred from data and typical interventions) ===== -->
|
||
<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>Implement automated alerts for unactivated complaints within 2 hours of filing.</li>
|
||
<li>Assign responsibility to specific staff to monitor unactivated queue daily.</li>
|
||
<li>Conduct root cause analysis for months with >30% unactivated (Mar, Apr, Jul, Aug).</li>
|
||
<li>Reinforce training on complaint activation protocols.</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<!-- ===== department style quick stats ===== -->
|
||
<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 MONTHS</h3>
|
||
<div id="viewMed" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">Aug 50.0% · Jul 35.0% · Mar 32.7% · Apr 31.9%</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 MONTHS</h3>
|
||
<div id="viewAdmin" class="text-[11px] text-slate whitespace-pre-line leading-relaxed italic">May 10.8% · Sep 17.7% · Jan 17.9%</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">27.0% (well above 5% threshold)</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">TOTAL UNACTIVATED</h3>
|
||
<div class="text-[11px] text-slate italic">183 complaints (of 678) never activated</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-7)
|
||
</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">August (peak) / May (lowest)</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="Avg / totals …" 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 (adapted from previous reports) ===== -->
|
||
<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">—</div></div>
|
||
<div><p class="mb-12 uppercase opacity-50">Reviewed by</p><div class="border-t border-slate pt-2">—</div></div>
|
||
<div><p class="mb-12 uppercase opacity-50">Approved by</p><div class="border-t border-slate pt-2">—</div></div>
|
||
</div>
|
||
<!-- placeholder for additional approvers -->
|
||
<div class="flex justify-center gap-8 text-[9px] text-slate mt-3">
|
||
<span>Patient Relations Dept</span>
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
lucide.createIcons();
|
||
|
||
// contextual data for the editable panels
|
||
const data = {
|
||
focus: {
|
||
med: "Peak unactivated: Aug 50.0%, Jul 35.0%, Mar 32.7%, Apr 31.9%",
|
||
admin: "Lowest rates: May 10.8%, Sep 17.7%, Jan 17.9%",
|
||
nur: "Annual avg 27.0% · 183 unactivated out of 678 total",
|
||
rec: "• Automated alerts for unactivated.\n• Assign monitor for queue.\n• RCA for >30% months."
|
||
},
|
||
overview: {
|
||
med: "Worst months: Aug (50%), Jul (35%), Mar (32.7%), Apr (31.9%)",
|
||
admin: "Best (still bad): May (10.8%), Sep (17.7%), Jan (17.9%)",
|
||
nur: "Total unactivated 183/678 = 27.0% – far above 5% threshold.",
|
||
rec: "Implement alerts, assign responsibility, train staff, investigate root causes."
|
||
}
|
||
};
|
||
|
||
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: 'Unactivated %', data: [17.9, 26.3, 32.7, 31.9, 10.8, 21.4, 35.0, 50.0, 17.7, 26.3, 27.1, 27.0] }],
|
||
chart: { height: 180, type: 'line', toolbar: { show: false }, dropShadow: { enabled: true, top: 2, left: 2, blur: 2, opacity: 0.2 } },
|
||
colors: ['#b91c1c'], // red to highlight negative indicator
|
||
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: 0, max: 55, labels: { formatter: v => v + '%' } },
|
||
annotations: { yaxis: [{ y: 5, borderColor: '#16a34a', label: { text: 'Threshold 5%', style: { color: '#fff', background: '#16a34a' } } }] }
|
||
}).render();
|
||
|
||
// small donut: unactivated (183) vs activated (678-183=495)
|
||
new ApexCharts(document.querySelector("#sourceChart"), {
|
||
series: [183, 495],
|
||
chart: { type: 'donut', height: 160 },
|
||
labels: ['Unactivated', 'Activated'],
|
||
colors: ['#b91c1c', '#005696'],
|
||
legend: { position: 'bottom', fontSize: '9px' }
|
||
}).render();
|
||
|
||
function exportPDF() {
|
||
const element = document.getElementById('report');
|
||
html2pdf().from(element).set({
|
||
margin: 0.3,
|
||
filename: 'KPI7_Unactivated_2025.pdf',
|
||
html2canvas: { scale: 2 },
|
||
jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' }
|
||
}).save();
|
||
}
|
||
|
||
// initial load (focus on aug/may)
|
||
loadMonth();
|
||
</script>
|
||
|
||
<p class="text-[9px] text-gray-300 text-center max-w-6xl mx-auto mt-2">KPI-7 – Un‑Activated Filled Complaints Rate – recreated from PDF. All monthly figures, target 0% / threshold 5%, and PX360 theme.</p>
|
||
</body>
|
||
</html> |