chore: استيراد أولي من سيرو (ecfe7568) — بلا أي تعديل

نسخة كاملة من مستودع سيرو عند ecfe7568 لتكون أساس تطبيق «انطلق».
نُسخ المتعقَّب في git فقط (12,509 ملفاً / 302 م.ب) بـ git archive، لا
`cp -r` — فاستُثنيت تلقائياً مخلفات البناء (build · node_modules ·
.dart_tool · .gradle · Pods ≈ 10.7 غ.ب) وكل ما يستثنيه .gitignore.

هذا الكوميت **بلا أي تعديل عمداً** حتى يكون كل ما يليه فرقاً مقروءاً
مقابل سيرو الأصلي. سيرو نفسه لم يُمسّ.

⚠️ لا يبني بعد: `.env` و`lib/env/env.g.dart` غير متعقَّبين في سيرو (وهذا
صحيح — أسرار لكل مستأجر). كل تطبيق فلاتر هنا يحتاج .env خاصاً بانطلق ثم
توليد env.g.dart عبر build_runner. لا تُنسخ أسرار سيرو.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hamza-Ayed
2026-07-27 05:10:29 +03:00
co-authored by Claude Opus 5
commit 92dc6b3641
3654 changed files with 896478 additions and 0 deletions
+32
View File
@@ -0,0 +1,32 @@
<?php
require_once __DIR__ . '/../../connect.php';
// استقبال المتغيرات — force user IDs from JWT based on role
$rideID = filterRequest("rideID");
$note = filterRequest("note");
// Force driverID/passengerID from JWT based on user role
if ($role === 'driver') {
$driverID = $user_id;
$passengerID = filterRequest("passengerID");
} else {
$passengerID = $user_id;
$driverID = filterRequest("driverID");
}
// تنفيذ الإدخال بطريقة آمنة
$sql = "INSERT INTO `canecl` (`driverID`, `passengerID`, `rideID`, `note`)
VALUES (:driverID, :passengerID, :rideID, :note)";
$stmt = $con->prepare($sql);
$stmt->bindParam(':driverID', $driverID);
$stmt->bindParam(':passengerID', $passengerID);
$stmt->bindParam(':rideID', $rideID);
$stmt->bindParam(':note', $note);
$stmt->execute();
if ($stmt->rowCount() > 0) {
jsonSuccess(null, "Record inserted successfully");
} else {
jsonError("Failed to insert record");
}
?>
@@ -0,0 +1,151 @@
<?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("An internal error occurred. Please try again later.");
*/
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) {
error_log("[addCancelTripFromDriverAfterApplied.php] " . $e->getMessage());
jsonError("An internal error occurred. Please try again later.");
}
?>
?>
+16
View File
@@ -0,0 +1,16 @@
<?php
require_once __DIR__ . '/../../connect.php';
$id = filterRequest("id");
$sql = "DELETE FROM `canecl` WHERE `id` = :id";
$stmt = $con->prepare($sql);
$stmt->bindParam(":id", $id, PDO::PARAM_INT); // تأكيد أن id رقم
$stmt->execute();
if ($stmt->rowCount() > 0) {
jsonSuccess(null, "Record deleted successfully");
} else {
jsonError("Failed to delete record");
}
?>
+15
View File
@@ -0,0 +1,15 @@
<?php
require_once __DIR__ . '/../../connect.php';
$sql = "SELECT * FROM `canecl`";
$stmt = $con->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($stmt->rowCount() > 0) {
jsonSuccess($result);
} else {
jsonError("No records found");
}
?>
+52
View File
@@ -0,0 +1,52 @@
<?php
require_once __DIR__ . '/../../connect.php';
$id = filterRequest("id");
// تهيئة المتغيرات
$columnValues = [];
$params = [];
// التعامل مع كل حقل ديناميكيًا
if (isset($_POST["driverID"])) {
$columnValues[] = "`driverID` = :driverID";
$params[':driverID'] = filterRequest("driverID");
}
if (isset($_POST["passengerID"])) {
$columnValues[] = "`passengerID` = :passengerID";
$params[':passengerID'] = filterRequest("passengerID");
}
if (isset($_POST["rideID"])) {
$columnValues[] = "`rideID` = :rideID";
$params[':rideID'] = filterRequest("rideID");
}
if (isset($_POST["note"])) {
$columnValues[] = "`note` = :note";
$params[':note'] = filterRequest("note");
}
// تأكد من وجود بيانات لتحديثها
if (empty($columnValues)) {
jsonError("No data provided to update");
exit;
}
// بناء الاستعلام النهائي
$setClause = implode(", ", $columnValues);
$sql = "UPDATE `canecl` SET $setClause WHERE `id` = :id";
$params[':id'] = $id;
// تنفيذ الاستعلام
$stmt = $con->prepare($sql);
$stmt->execute($params);
// التحقق من النتيجة
if ($stmt->rowCount() > 0) {
jsonSuccess(null, "Data updated successfully");
} else {
jsonError("Failed to update data or no changes made");
}
?>