registerPage('reports', async (content, params = {}) => { document.getElementById('topbar-title').textContent = 'Reports'; let currentData = null; let currentMode = null; let clients = [], sites = []; // Pre-load clients + sites const [cr, sr] = await Promise.all([ api('clients.php', { action: 'list' }), api('sites.php', { action: 'list' }), ]); clients = cr.clients || []; sites = sr.sites || []; function daysLabel(d) { const n = parseInt(d); if (isNaN(n)) return '—'; const abs = Math.abs(n); const months = Math.round(abs / 30.44); const label = abs < 30 ? `${abs}d` : `${months}mo`; if (n < 0) return `Expired ${label} ago`; if (n === 0) return `Today`; if (n <= 30) return `${label}`; if (n <= 60) return `${label}`; if (n <= 180) return `${label}`; return `${label}`; } function resultBadge(r) { const v = (r || '').toUpperCase(); if (v.includes('COMP') || v.includes('PASS')) return `${r}`; if (v.includes('NYC') || v.includes('FAIL')) return `${r}`; return r ? `${r}` : '—'; } function recBadge(t) { return t === 'assessment' ? 'Assessment' : 'Test'; } // ── Render functions ─────────────────────────────────────────────────── function renderEmployeeMode(data) { const withRecords = (data.employees || []).filter(emp => emp.records?.length > 0); if (!withRecords.length) return emptyHTML('No employees with assessments or tests found'); return withRecords.map((emp, ei) => `
| Type | Name | Surname | ID | Assessment / Test | Vehicle | Date | Result | Expiry | Assessor | Booking | Site |
|---|---|---|---|---|---|---|---|---|---|---|---|
| ${recBadge(r.rec_type)} | ${r.client_employees_name || '—'} | ${r.surname || '—'} | ${r.i_doc_passport || '—'} | ${r.name} | ${r.vehicle_model || '—'} | ${(r.date || '').slice(0, 10)} | ${resultBadge(r.results)} | ${daysLabel(r.days_left)} | ${r.assessor || '—'} | ${r.booking_number || '—'} | ${r.client_sites_name || '—'} |
| Name | Surname | ID/Passport | Occupation | Assessment / Test | Vehicle | Date | Result | Score | Expiry Date | Expiry | Booking # | Assessor |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ${r.client_employees_name || '—'} | ${r.surname || '—'} | ${r.i_doc_passport || '—'} | ${r.occupation || '—'} | ${r.name || '—'} | ${r.vehicle_model || '—'} | ${(r.date || '').slice(0, 10)} | ${resultBadge(r.results)} | ${r.current_mark || '—'}/${r.passmark || '—'} | ${r.expiry_date || '—'} | ${daysLabel(r.days_left)} | ${r.booking_number || '—'} | ${r.assessor || '—'} |
| Type | Assessment / Test | Vehicle | Date | Result | Score | Expiry Date | Expiry | Assessor |
|---|---|---|---|---|---|---|---|---|
| ${recBadge(r.rec_type)} | ${r.name} | ${r.vehicle_model || '—'} | ${(r.date || '').slice(0, 10)} | ${resultBadge(r.results)} | ${r.current_mark || '—'} / ${r.passmark || '—'} | ${r.expiry_date || '—'} | ${daysLabel(r.days_left)} | ${r.assessor || '—'} |