89 lines
3.5 KiB
PHP
89 lines
3.5 KiB
PHP
<?php
|
|
// ============================================================
|
|
// Admin/safety/update_incident.php — معالجة بلاغ سلامة
|
|
//
|
|
// يحوّل البلاغ من "مفتوح" إلى حالة نهائية، ويرفع تجميد السائق عند
|
|
// الإغلاق. بدون هذه النقطة يبقى السائق مجمّداً إلى الأبد — التجميد بلا
|
|
// TTL عمداً، فرفعه قرار إنسان لا انقضاء وقت.
|
|
//
|
|
// تحت Admin/ فترث بوّابة الدور من connect.php.
|
|
// ============================================================
|
|
|
|
require_once __DIR__ . '/../../connect.php';
|
|
|
|
$incidentId = filterRequest("incident_id", 'int');
|
|
$newStatus = filterRequest("status");
|
|
$note = filterRequest("note");
|
|
$releaseHold = filterRequest("release_hold");
|
|
|
|
$allowed = ['acknowledged', 'resolved', 'false_alarm'];
|
|
|
|
if (!$incidentId || !in_array($newStatus, $allowed, true)) {
|
|
jsonError("Missing incident_id or invalid status");
|
|
}
|
|
|
|
try {
|
|
$stmt = $con->prepare("SELECT * FROM safety_incidents WHERE id = ? LIMIT 1");
|
|
$stmt->execute([$incidentId]);
|
|
$incident = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if (!$incident) {
|
|
jsonError("Incident not found", 404);
|
|
}
|
|
|
|
$con->prepare("
|
|
UPDATE safety_incidents
|
|
SET status = ?, acknowledged_by = ?, acknowledged_at = NOW(), resolution_note = ?
|
|
WHERE id = ?
|
|
")->execute([
|
|
$newStatus,
|
|
$user_id ?? 'admin',
|
|
$note ? mb_substr($note, 0, 500) : null,
|
|
$incidentId,
|
|
]);
|
|
|
|
// ── رفع التجميد ─────────────────────────────────────────
|
|
// افتراضياً يُرفع عند الإغلاق (resolved / false_alarm) ولا يُرفع عند
|
|
// مجرد الاطلاع (acknowledged). ويمكن للمراجع أن يقرر صراحةً.
|
|
$shouldRelease = $releaseHold !== null
|
|
? in_array(strtolower((string) $releaseHold), ['1', 'true', 'yes'], true)
|
|
: in_array($newStatus, ['resolved', 'false_alarm'], true);
|
|
|
|
$released = false;
|
|
$driverId = $incident['driver_id'] ?? null;
|
|
|
|
if ($shouldRelease && $driverId) {
|
|
try {
|
|
// نرفع فقط إن كان التجميد من هذا البلاغ تحديداً: سائق عليه
|
|
// بلاغ ثانٍ أحدث يجب ألا يُفرَج عنه بإغلاق الأقدم.
|
|
$upd = $con->prepare("
|
|
UPDATE driver SET safetyHoldIncidentId = NULL
|
|
WHERE id = ? AND safetyHoldIncidentId = ?
|
|
");
|
|
$upd->execute([$driverId, $incidentId]);
|
|
|
|
if ($upd->rowCount() > 0) {
|
|
if (isset($redisLocation) && $redisLocation) {
|
|
$redisLocation->del("driver:$driverId:safety_hold");
|
|
}
|
|
$released = true;
|
|
}
|
|
} catch (Throwable $e) {
|
|
error_log("[safety/update] تعذّر رفع تجميد السائق $driverId: " . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
error_log("[safety] بلاغ #$incidentId → $newStatus بواسطة "
|
|
. ($user_id ?? 'admin') . ($released ? " (رُفع التجميد)" : ""));
|
|
|
|
jsonSuccess([
|
|
'incident_id' => $incidentId,
|
|
'status' => $newStatus,
|
|
'hold_released' => $released,
|
|
], "Incident updated");
|
|
|
|
} catch (PDOException $e) {
|
|
error_log("[safety/update] " . $e->getMessage());
|
|
jsonError("DB Error", 500);
|
|
}
|