query("SELECT * FROM shs_records ORDER BY id DESC LIMIT 12")->fetchAll(); // Current SHS $shs = $pdo->query("SELECT * FROM shs_records ORDER BY id DESC LIMIT 1")->fetch(); // MRR $stmt = $pdo->query("SELECT SUM(sla_price_monthly) as mrr FROM sla_contracts WHERE status='active'"); $mrrData = $stmt->fetch(); $mrr = (float)($mrrData['mrr'] ?? 0); // Active SLA contracts $stmt = $pdo->query("SELECT COUNT(*) FROM sla_contracts WHERE status='active'"); $activeSla = $stmt->fetchColumn(); // Total objects $stmt = $pdo->query("SELECT COUNT(*) FROM objects WHERE status='active'"); $totalObjects = $stmt->fetchColumn(); // Engineer count $stmt = $pdo->query("SELECT COUNT(*) FROM users WHERE role IN ('engineer','technician') AND is_active=1"); $engineerCount = $stmt->fetchColumn(); // SLA compliance $stmt = $pdo->query("SELECT COUNT(*) as total, SUM(CASE WHEN sla_compliant=TRUE THEN 1 ELSE 0 END) as compliant FROM tasks WHERE closed_at IS NOT NULL"); $slaData = $stmt->fetch(); $slaCompliance = $slaData['total'] > 0 ? round(($slaData['compliant'] / $slaData['total']) * 100, 1) : 0; // Incident rate $stmt = $pdo->query("SELECT COUNT(*) FROM incidents WHERE created_at > NOW() - INTERVAL '30 days'"); $incident30 = $stmt->fetchColumn(); $incidentRate = $totalObjects > 0 ? round($incident30 / $totalObjects, 2) : 0; // Retention (active sla / total ever) $stmt = $pdo->query("SELECT COUNT(DISTINCT object_id) FROM sla_contracts WHERE status IN ('active','expired','cancelled')"); $totalEver = $stmt->fetchColumn(); $retention = $totalEver > 0 ? round(($activeSla / $totalEver) * 100, 1) : 0; // Engineer KPI last period $kpiLatest = $pdo->query("SELECT ek.*, u.full_name FROM engineer_kpi ek JOIN users u ON u.id=ek.engineer_id ORDER BY ek.period_end DESC LIMIT 10")->fetchAll(); // Avg engineer score $stmt = $pdo->query("SELECT AVG(engineer_score) FROM engineer_kpi WHERE period_end > NOW() - INTERVAL '30 days'"); $avgEngineerScore = round((float)$stmt->fetchColumn(), 1); // Revenue per engineer $rpe = $engineerCount > 0 ? round($mrr / $engineerCount, 2) : 0; require __DIR__ . '/../../inc/header.php'; ?>
Нет данных SHS. Записи появятся после создания KPI и расчётов.
| Период | SLA Stability | Revenue | Retention | Engineer Perf | Incident Stability | SHS Score | Статус |
|---|---|---|---|---|---|---|---|
| = $s['period_start'] ?> — = $s['period_end'] ?> | = $s['sla_stability'] ?>% | = $s['revenue_stability'] ?>% | = $s['retention'] ?>% | = $s['engineer_performance'] ?>% | = $s['incident_stability'] ?>% | = $s['shs_score'] ?> | = $s['shs_status'] ?> |
Нет KPI записей.
| Инженер | Период | SLA Compliance | Engineer Score | Грейд |
|---|---|---|---|---|
| = htmlspecialchars($k['full_name']) ?> | = $k['period_start'] ?> — = $k['period_end'] ?> | = $k['sla_compliance'] ?>% | = $k['engineer_score'] ?> | = $k['grade'] ?> |