Files
intaleq_v3_pure_php/ride/rides/cancel_ride_by_driver.php
2026-05-29 17:06:03 +03:00

148 lines
5.3 KiB
PHP
Executable File

<?php
// cancel_ride_by_driver.php
require_once __DIR__ . '/../../connect.php';
try {
$con_ride = Database::get('ride');
} catch (Exception $e) {
error_log("[cancel_ride_by_driver] Failed to connect to Ride Database: " . $e->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) && $passenger_id) {
$stmtToken = $con->prepare("SELECT token FROM tokens WHERE passengerID = ? ORDER BY id DESC LIMIT 1");
$stmtToken->execute([$passenger_id]);
$rawToken = $stmtToken->fetchColumn();
if ($rawToken) {
$passengerToken = $rawToken;
if (!empty($encryptionHelper)) {
try {
$decrypted = $encryptionHelper->decryptData($rawToken);
if ($decrypted !== false && !empty($decrypted)) {
$passengerToken = trim($decrypted);
}
} catch (Exception $e) {
// Fallback
}
}
}
}
if (!empty($passengerToken)) {
$fcmData = [
'category' => 'Cancel Trip from driver',
'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());
}
?>