$rideId]; try { // ================================================================================= // المرحلة الأولى: إلغاء الرحلة (نفس منطق السكريبت الأول) // ================================================================================= // 1. التحديث على سيرفر التتبع (Remote DB) error_log("🔄 [Step 1] Attempting to cancel on REMOTE Tracking DB..."); $stmtRemote = $con_ride->prepare($sqlCancel); $stmtRemote->execute($params); $count = $stmtRemote->rowCount(); // إذا نجح التحديث في السيرفر البعيد (أو لم ينجح نتحقق من المحلي أيضا لضمان التزامن) // لكن المنطق الأساسي يعتمد على أن الرحلة قابلة للتعديل if ($count > 0) { // 2. التحديث على السيرفر المحلي (Local DB) error_log("🔄 [Step 1] Remote success. Cancelling on LOCAL Main DB..."); $stmtLocal = $con->prepare($sqlCancel); $stmtLocal->execute($params); error_log("✅ [Step 1] Ride cancelled successfully on database."); // ================================================================================= // المرحلة الثانية: تسجيل الطلب وتنظيف البيانات (نفس منطق السكريبت الثاني) // لن يتم الدخول هنا إلا إذا نجح الإلغاء فعلياً // ================================================================================= error_log("🔄 [Step 2] Inserting into driver_orders and cleaning background tasks..."); // أ. إضافة سجل في driver_orders $orderStatus = 'pending'; // كما في السكريبت الثاني $sqlInsertOrder = "INSERT INTO driver_orders (driver_id, order_id, notes, status) VALUES (?, ?, ?, ?)"; $stmtInsert = $con->prepare($sqlInsertOrder); $stmtInsert->execute([$driverID, $rideId, $note, $orderStatus]); // ب. حذف آخر سجل من write_argument_after_applied_from_background // نستخدم نفس الاستعلام الفرعي الذي كنت تستخدمه $sqlDelete = "DELETE FROM write_argument_after_applied_from_background WHERE id = ( SELECT id FROM ( SELECT id FROM write_argument_after_applied_from_background WHERE driver_id = ? ORDER BY time_of_order DESC LIMIT 1 ) AS t )"; $stmtDelete = $con->prepare($sqlDelete); $stmtDelete->execute([$driverID]); error_log("✅ [Step 2] Driver order logged and background task cleaned."); // ================================================================================= // النهاية: إرجاع رسالة النجاح // ================================================================================= jsonSuccess(null, "Ride cancelled and driver log updated successfully"); } else { // فشل الإلغاء (الرحلة غير موجودة أو حالتها لا تسمح) error_log("⚠️ [cancelRideAndLog.php] Failed to cancel. Status might be started/completed or ID invalid."); jsonError("Cannot cancel ride. Status might be started or already completed."); } } catch (PDOException $e) { error_log("❌ [cancelRideAndLog.php] Database Error: " . $e->getMessage()); jsonError("Database Error: " . $e->getMessage()); */ require_once __DIR__ . '/../../connect.php'; $rideId = filterRequest("id"); $driverID = filterRequest("driver_id"); $note = filterRequest("notes"); $status = "cancelRideFromDriver"; if (!$rideId || !$driverID) { jsonError("Missing Data"); exit; } try { // 1. محاولة الإلغاء في السيرفر البعيد $stmtRemote = $con_ride->prepare("UPDATE `ride` SET `status` = ?, `updated_at` = NOW() WHERE `id` = ? AND `status` IN ('wait', 'waiting', 'Apply', 'accepted')"); $stmtRemote->execute([$status, $rideId]); if ($stmtRemote->rowCount() > 0) { // 2. التحديث المحلي $con->prepare("UPDATE `ride` SET `status` = ?, `updated_at` = NOW() WHERE `id` = ?")->execute([$status, $rideId]); // 3. تسجيل اللوج (كما في ملفك) $con->prepare("INSERT INTO driver_orders (driver_id, order_id, notes, status) VALUES (?, ?, ?, 'pending')")->execute([$driverID, $rideId, $note]); // تنظيف الخلفية (اختياري حسب الحاجة) // ... كود التنظيف ... // 4. 🔥 إشعار الراكب بالإلغاء 🔥 $stmtPas = $con->prepare("SELECT passenger_id FROM ride WHERE id = ?"); $stmtPas->execute([$rideId]); $passenger_id = $stmtPas->fetchColumn(); if ($passenger_id) { notifyPassengerOnRideServer($passenger_id, [ 'ride_id' => $rideId, 'status' => 'cancelled', 'msg' => 'نعتذر، قام السائق بإلغاء الرحلة' ]); } jsonSuccess(null, "Ride Cancelled"); } else { jsonError("Cannot cancel ride (Status might be started or finished)"); } } catch (PDOException $e) { jsonError("DB Error: " . $e->getMessage()); } ?> ?>