Files
2026-08-09 16:56:13 +03:00

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);
}