getMessage()); } $rideId = filterRequest("ride_id"); $driverId = filterRequest("driver_id"); $reason = filterRequest("reason"); $passengerToken = filterRequest("passenger_token"); // تثبيت الحالة $statusText = "CancelFromDriverAfterApply"; if (!$rideId || !$driverId) { jsonError("Missing parameters"); exit; } try { $con->beginTransaction(); // --------------------------------------------------------- // 1. معالجة driver_orders (Insert or Update) // --------------------------------------------------------- $checkStmt = $con->prepare("SELECT order_id FROM driver_orders WHERE order_id = ? AND driver_id = ?"); $checkStmt->execute([$rideId, $driverId]); if ($checkStmt->rowCount() > 0) { // موجود: تحديث $stmtLog = $con->prepare("UPDATE driver_orders SET status = ?, notes = ?, created_at = NOW() WHERE order_id = ? AND driver_id = ?"); $stmtLog->execute([$statusText, $reason, $rideId, $driverId]); } else { // غير موجود: إدخال $stmtLog = $con->prepare("INSERT INTO driver_orders (driver_id, order_id, status, created_at, notes) VALUES (?, ?, ?, NOW(), ?)"); $stmtLog->execute([$driverId, $rideId, $statusText, $reason]); } // --------------------------------------------------------- // 2. منطق الحظر (Business Logic) // --------------------------------------------------------- $stmtCount = $con->prepare(" SELECT COUNT(*) FROM driver_orders WHERE driver_id = ? AND status = ? AND created_at >= NOW() - INTERVAL 1 DAY "); $stmtCount->execute([$driverId, $statusText]); $cancelCount = $stmtCount->fetchColumn(); $isBlocked = false; $blockUntil = ""; if ($cancelCount >= 3) { $isBlocked = true; $blockUntil = date('Y-m-d H:i:s', strtotime('+4 hours')); // يمكنك هنا تحديث حالة السائق في جدول driver إذا لزم الأمر } // --------------------------------------------------------- // 3. تحديث حالة الرحلة في جدول ride // --------------------------------------------------------- $sqlRide = "UPDATE ride SET status = ?, driver_id = 0 WHERE id = ?"; // Local DB $con->prepare($sqlRide)->execute([$statusText, $rideId]); // Remote DB (إن وجد) if (isset($con_ride)) { $con_ride->prepare($sqlRide)->execute([$statusText, $rideId]); } // --------------------------------------------------------- // 4. إشعار الراكب // --------------------------------------------------------- // أ) Socket (يحتاج Passenger ID) $stmtPas = $con->prepare("SELECT passenger_id FROM ride WHERE id = ?"); $stmtPas->execute([$rideId]); $passenger_id = $stmtPas->fetchColumn(); if ($passenger_id) { $socketPayload = [ 'ride_id' => $rideId, 'status' => 'cancelled_by_driver', 'msg' => 'تم إلغاء الرحلة من قبل السائق' ]; if (function_exists('notifyPassengerOnRideServer')) { notifyPassengerOnRideServer($passenger_id, $socketPayload); } } // ب) FCM (Internal) if (!empty($passengerToken)) { $fcmData = [ 'ride_id' => (string)$rideId ]; // 🔥 استخدام الدالة الجديدة sendFCM_Internal( $passengerToken, // الهدف "تم إلغاء الرحلة ❌", // العنوان "عذراً، قام السائق بإلغاء الرحلة.", // النص $fcmData, // البيانات "Cancel Trip from driver", // التصنيف (تأكد أنه يطابق ما في تطبيق الراكب) false // ليس Topic ); } $con->commit(); // 5. الرد للفلاتر echo json_encode([ "status" => "success", "cancel_count" => $cancelCount, "is_blocked" => $isBlocked, "block_until" => $blockUntil ]); } catch (PDOException $e) { if ($con->inTransaction()) $con->rollBack(); jsonError("DB Error: " . $e->getMessage()); } ?>