Files
intaleq_v3_pure_php/ride/cancelRide/addCancelTripFromDriverAfterApplied.php
2026-04-28 13:04:27 +03:00

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());
}
?>
?>