getMessage()); } // finish_ride_updates.php $rideId = filterRequest("rideId"); $driver_id = filterRequest("driver_id"); $passengerId=filterRequest("passengerId"); $newStatus = filterRequest("status"); // "Finished" $price = filterRequest("price"); $passengerToken = filterRequest("passengerToken"); $driver_token =filterRequest("driver_token"); if (empty($rideId) || empty($newStatus) || empty($price) || empty($driver_id)) { jsonError("Missing parameters"); exit; } try { // 1. تحديث الريموت (Remote Server - con_ride) $stmtRemote = $con_ride->prepare("UPDATE ride SET status = ?, rideTimeFinish = NOW(), price = ? WHERE id = ? AND status = 'Begin'"); $stmtRemote->execute([$newStatus, $price, $rideId]); if ($stmtRemote->rowCount() == 0) { // إذا لم يجد الصف (ربما تم إنهاؤها بالفعل) // jsonError("Could not finish ride (Remote)."); // exit; // ملاحظة: الأفضل إكمال العملية محلياً احتياطاً } // 2. التحديث المحلي (Local DB) $con->beginTransaction(); $con->prepare("UPDATE ride SET status = ?, rideTimeFinish = NOW(), price = ? WHERE id = ? AND status = 'Begin'") ->execute([$newStatus, $price, $rideId]); // تحديث driver_orders $checkStmt = $con->prepare("SELECT order_id FROM driver_orders WHERE order_id = ?"); $checkStmt->execute([$rideId]); if ($checkStmt->rowCount() > 0) { $con->prepare("UPDATE driver_orders SET driver_id = ?, status = ?, created_at = NOW() WHERE order_id = ?") ->execute([$driver_id, $newStatus, $rideId]); } else { $con->prepare("INSERT INTO driver_orders (driver_id, order_id, created_at, status) VALUES (?, ?, NOW(), ?)") ->execute([$driver_id, $rideId, $newStatus]); } // ================================================================= // 🔥 الخطوة 3: إشعار الراكب (Socket + FCM) // ================================================================= if ($passenger_id) { // تجهيز القائمة المتوافقة مع الكود القديم (Legacy List) // [driver_id, ride_id, driver_token, price] $legacyList = [ (string)$driver_id, (string)$rideId, (string)$driver_token, (string)$price ]; // أ) إرسال Socket $socketPayload = [ 'ride_id' => $rideId, 'status' => 'finished', 'price' => $price, 'DriverList' => $legacyList // إرسال القائمة للسوكيت أيضاً ]; if (function_exists('notifyPassengerOnRideServer')) { notifyPassengerOnRideServer($passenger_id, $socketPayload); } // ب) إرسال FCM (Internal) if (!empty($passengerToken)) { $fcmData = [ 'ride_id' => (string)$rideId, 'price' => (string)$price, 'DriverList' => $legacyList // ✅ نمرر المصفوفة، والدالة الداخلية تحولها لـ JSON ]; sendFCM_Internal( $passengerToken, // الهدف "تم إنهاء الرحلة 🏁", // العنوان "المبلغ المطلوب: " . $price . " ل.س", // النص (أضفت العملة افتراضياً) $fcmData, // البيانات 'Driver Finish Trip', // التصنيف (كما هو في التطبيق القديم) false // ليس Topic ); } } $con->commit(); jsonSuccess(null, "Ride finished successfully"); } catch (PDOException $e) { if ($con->inTransaction()) $con->rollBack(); jsonError("DB Error: " . $e->getMessage()); } ?>