150 lines
6.7 KiB
PHP
150 lines
6.7 KiB
PHP
<?php
|
|
/*
|
|
require_once __DIR__ . '/../../connect.php';
|
|
|
|
// 🚀 تسجيل بداية العملية المدمجة
|
|
error_log("🚀 [cancelRideAndLog.php] Request Started: Cancel Ride + Log Driver Action.");
|
|
|
|
// 1. استقبال كافة البيانات المطلوبة للعمليتين
|
|
$rideId = filterRequest("id"); // معرف الرحلة
|
|
$driverID = filterRequest("driver_id");// معرف السائق
|
|
$note = filterRequest("notes"); // ملاحظات الإلغاء
|
|
|
|
// التحقق من البيانات الأساسية
|
|
if (!$rideId || !$driverID) {
|
|
error_log("❌ [cancelRideAndLog.php] Missing ID or Driver ID.");
|
|
jsonError("Missing Required Data (id or driver_id)");
|
|
exit;
|
|
}
|
|
|
|
// إعدادات عملية الإلغاء
|
|
$newStatus = "cancelRideFromDriver";
|
|
// الحالات المسموح بالإلغاء فيها (تأكد من مطابقتها لقاعدة البيانات)
|
|
$allowedStatuses = "'wait', 'waiting', 'Apply'";
|
|
|
|
$sqlCancel = "UPDATE `ride`
|
|
SET `status` = '$newStatus', `updated_at` = CURRENT_TIMESTAMP
|
|
WHERE `id` = :id
|
|
AND `status` IN ($allowedStatuses)";
|
|
|
|
$params = [':id' => $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());
|
|
}
|
|
?>
|
|
?>
|