108 lines
4.8 KiB
PHP
108 lines
4.8 KiB
PHP
<?php
|
||
// cancelRideFromDriver.php
|
||
|
||
// تأكد أن هذا الملف يحتوي على دوال الإشعارات (notifyPassengerOnRideServer)
|
||
require_once __DIR__ . '/../../connect.php';
|
||
|
||
// 🚀 تسجيل بداية العملية
|
||
error_log("🚀 [cancelRide.php] Request Started to Cancel Ride From Driver.");
|
||
|
||
$id = filterRequest("id"); // Ride ID
|
||
|
||
if (!$id) {
|
||
error_log("❌ [cancelRide.php] Missing Ride ID.");
|
||
jsonError("Missing ID");
|
||
exit;
|
||
}
|
||
|
||
// الحالة الجديدة (إلغاء نهائي من طرف السائق)
|
||
$newStatus = "cancelRideFromDriver";
|
||
|
||
// الحالات المسموح بإلغاء الرحلة فيها فقط
|
||
// نسمح بالإلغاء إذا كانت في وضع الانتظار أو القبول المبدئي
|
||
$allowedStatuses = "'wait', 'waiting', 'Apply', 'accepted', 'arrive'";
|
||
|
||
try {
|
||
// ---------------------------------------------------------
|
||
// 1. التحديث على سيرفر التتبع (Remote DB)
|
||
// ---------------------------------------------------------
|
||
// نستخدم شرط الحالة لضمان عدم إلغاء رحلة بدأت بالفعل (Start/Begin)
|
||
$sql = "UPDATE `ride`
|
||
SET `status` = ?, `updated_at` = CURRENT_TIMESTAMP
|
||
WHERE `id` = ?
|
||
AND `status` IN ($allowedStatuses)";
|
||
|
||
// استخدام Prepared Statements للأمان
|
||
$stmtRemote = $con_ride->prepare($sql);
|
||
$stmtRemote->execute([$newStatus, $id]);
|
||
|
||
$count = $stmtRemote->rowCount();
|
||
error_log("ℹ️ [cancelRide.php] Remote DB Rows Affected: $count");
|
||
|
||
// التحقق: هل تم التحديث؟
|
||
if ($count > 0) {
|
||
|
||
// ---------------------------------------------------------
|
||
// 2. التحديث على السيرفر المحلي (Local DB)
|
||
// ---------------------------------------------------------
|
||
// نبدأ معاملة لضمان تكامل البيانات
|
||
if (isset($con)) {
|
||
$con->beginTransaction();
|
||
try {
|
||
$stmtLocal = $con->prepare($sql);
|
||
$stmtLocal->execute([$newStatus, $id]);
|
||
|
||
// تحديث جدول driver_orders أيضاً لتوحيد الحالة (اختياري ولكنه مفضل)
|
||
$stmtDriverOrder = $con->prepare("UPDATE driver_orders SET status = ? WHERE order_id = ?");
|
||
$stmtDriverOrder->execute([$newStatus, $id]);
|
||
|
||
$con->commit();
|
||
} catch (Exception $eLocal) {
|
||
$con->rollBack();
|
||
error_log("⚠️ Local DB Update Failed: " . $eLocal->getMessage());
|
||
}
|
||
}
|
||
|
||
// ---------------------------------------------------------
|
||
// 3. 🔥 إشعار الراكب عبر السوكيت (القطعة المفقودة) 🔥
|
||
// ---------------------------------------------------------
|
||
|
||
// أ. جلب معرف الراكب لإرسال الإشعار له
|
||
// نستخدم connection الرحلات لضمان وجود البيانات
|
||
$stmtPas = $con_ride->prepare("SELECT passenger_id FROM ride WHERE id = ?");
|
||
$stmtPas->execute([$id]);
|
||
$passenger_id = $stmtPas->fetchColumn();
|
||
|
||
if ($passenger_id) {
|
||
$payload = [
|
||
'ride_id' => $id,
|
||
'status' => 'cancelled', // هذه الحالة يستقبلها الفلاتر ويغلق الواجهة
|
||
'msg' => 'للأسف، قام السائق بإلغاء الرحلة.'
|
||
];
|
||
|
||
// استدعاء الدالة المعرفة في functions.php/connect.php
|
||
if (function_exists('notifyPassengerOnRideServer')) {
|
||
notifyPassengerOnRideServer($passenger_id, $payload);
|
||
error_log("📡 [cancelRide.php] Notification sent to Passenger ID: $passenger_id");
|
||
} else {
|
||
error_log("⚠️ [cancelRide.php] Function notifyPassengerOnRideServer not found!");
|
||
}
|
||
}
|
||
|
||
// ---------------------------------------------------------
|
||
// 4. إنهاء العملية
|
||
// ---------------------------------------------------------
|
||
error_log("✅ [cancelRide.php] Ride cancelled successfully.");
|
||
jsonSuccess(null, "Ride cancelled successfully");
|
||
|
||
} else {
|
||
// الفشل يعني أن الرحلة غير موجودة أو حالتها لا تسمح بالإلغاء (مثلاً بدأت بالفعل)
|
||
error_log("⚠️ [cancelRide.php] Failed. ID invalid OR Status not allowed (maybe started?).");
|
||
jsonError("Cannot cancel ride. Status might be started or already completed.");
|
||
}
|
||
|
||
} catch (PDOException $e) {
|
||
error_log("❌ [cancelRide.php] Database Error: " . $e->getMessage());
|
||
jsonError("Database Error: " . $e->getMessage());
|
||
}
|
||
?>
|