Update: 2026-08-07 02:58:47
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
// ============================================================
|
||||
// safety/list_incidents.php — قائمة بلاغات السلامة للوحة الإدارة
|
||||
//
|
||||
// قراءة خالصة. الترتيب: المفتوح أولاً ثم الأحدث — غرفة العمليات تحتاج
|
||||
// ما لم يُعالَج بعد، لا أحدث ما وقع.
|
||||
// ============================================================
|
||||
|
||||
// تحت Admin/ عمداً: بوّابة connect.php المسارية تفرض دور admin أو
|
||||
// super_admin على كل ما تحت هذا المجلد. لو بقي في safety/ لقرأه أي حامل
|
||||
// JWT صالح — بما فيه راكب — وفيه معرّفات ومواقع أطراف الحادثة.
|
||||
require_once __DIR__ . '/../../connect.php';
|
||||
|
||||
$status = filterRequest("status"); // open | acknowledged | resolved | false_alarm | (فارغ = الكل)
|
||||
$limit = (int) (filterRequest("limit", 'int') ?: 50);
|
||||
$limit = max(1, min(200, $limit));
|
||||
|
||||
$allowed = ['open', 'acknowledged', 'resolved', 'false_alarm'];
|
||||
|
||||
try {
|
||||
if ($status && in_array($status, $allowed, true)) {
|
||||
$stmt = $con->prepare("
|
||||
SELECT * FROM safety_incidents
|
||||
WHERE status = ?
|
||||
ORDER BY created_at DESC
|
||||
LIMIT $limit
|
||||
");
|
||||
$stmt->execute([$status]);
|
||||
} else {
|
||||
// FIELD() يضع 'open' أولاً مهما كان تاريخه — بلاغ مفتوح من أمس
|
||||
// أهم من بلاغ عولج قبل دقيقة.
|
||||
$stmt = $con->query("
|
||||
SELECT * FROM safety_incidents
|
||||
ORDER BY FIELD(status, 'open', 'acknowledged', 'resolved', 'false_alarm'),
|
||||
created_at DESC
|
||||
LIMIT $limit
|
||||
");
|
||||
}
|
||||
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// عدّاد المفتوح — الرقم الذي يظهر كشارة على اللوحة
|
||||
$openCount = (int) $con->query(
|
||||
"SELECT COUNT(*) FROM safety_incidents WHERE status = 'open'"
|
||||
)->fetchColumn();
|
||||
|
||||
jsonSuccess(['open_count' => $openCount, 'incidents' => $rows], "ok");
|
||||
|
||||
} catch (PDOException $e) {
|
||||
error_log("[safety/list] " . $e->getMessage());
|
||||
jsonError("DB Error", 500);
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
<?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);
|
||||
}
|
||||
Reference in New Issue
Block a user