first commit

This commit is contained in:
Hamza-Ayed
2026-06-09 08:40:31 +03:00
commit d8901e1a87
3161 changed files with 536187 additions and 0 deletions

View File

@@ -0,0 +1,108 @@
<?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());
}
?>