إليك التوثيق التقني العميق (Deep Technical Documentation) لتطبيق السائق (Driver App) في منصة انطلق (Intaleq). تم إعداد هذا التقرير بناءً على تحليل الكود المصدري، مع التركيز على البنية التحتية، تدفق البيانات، والخدمات الخلفية.
📘 Intaleq Driver App - Technical Documentation
الإصدار: 1.0 المعمارية: MVC using GetX اللغة: Dart (Flutter) إدارة الحالة: GetX (Reactive State Management)
1. 🔐 التسجيل والتحقق (Onboarding & KYC)
نظام التسجيل في تطبيق السائق معقد لأنه يتطلب التحقق من الهوية والأهلية قبل السماح للسائق بالعمل.
أ. دورة تسجيل السائق (Driver Registration Flow)
- المسار:
lib/controller/auth/captin/register_captin_controller.dart - الآلية:
- التحقق من الهاتف: يتم استخدام
SmsEgyptControllerأوPhoneAuthHelperلإرسال OTP. يتم التحقق مما إذا كان الرقم مسجلاً مسبقاً عبرcheckPhoneNumberISVerfiedDriver. - إدخال البيانات الأساسية: (الاسم، البريد، تاريخ الميلاد) يتم جمعها في
RegistrationView. - إنشاء الحساب: يتم استدعاء
signUpCaptin.phpلإنشاء سجل أولي للسائق بحالةyet(بانتظار التوثيق).
- التحقق من الهاتف: يتم استخدام
ب. نظام رفع الوثائق والمعالجة بالذكاء الاصطناعي (AI & OCR)
- المسؤوليـة:
lib/controller/functions/gemeni.dart(الكلاسAI). - العملية التقنية:
- التقاط الصورة: يتم استخدام
ImagePickerوImageCropperلضمان جودة الصورة. - الضغط: يتم ضغط الصورة باستخدام
FlutterImageCompressلتقليل استهلاك البيانات. - التحليل (AI Extraction):
- يتم رفع الصورة إلى
uploadImageToAi. - يتم تمرير
promptهندسي دقيق لنموذج الذكاء الاصطناعي (مثل Gemini أو نماذج OCR مخصصة) لاستخراج البيانات كـ JSON (مثل:vin,make,model,plate_number).
- يتم رفع الصورة إلى
- التعبئة التلقائية: البيانات المستخرجة تُعبأ تلقائياً في
RegisterCaptainControllerليقوم السائق بمراجعتها فقط، مما يقلل أخطاء الإدخال اليدوي.
- التقاط الصورة: يتم استخدام
ج. حالة "بانتظار الموافقة" (Pending Approval)
- المسؤوليـة:
LoginDriverControllerوDriverVerificationScreen. - المنطق:
- عند تسجيل الدخول، يتحقق النظام من الحقل
statusوis_verifiedفي استجابة الـ login. - إذا كانت الحالة
yet، يتم توجيه السائق إجبارياً إلى شاشةDriverVerificationScreenالتي تعرض رسالة "Your Application is Under Review" وتمنع الوصول للخريطة.
- عند تسجيل الدخول، يتحقق النظام من الحقل
2. 📡 الخدمات الخلفية والتتبع (Background Services & Tracking)
يعتمد التطبيق على نظام تتبع ذكي (Batch Tracking) لتقليل استهلاك البطارية والبيانات مع الحفاظ على الدقة.
أ. محرك الموقع (LocationController)
- المسار:
lib/controller/functions/location_controller.dart. - آلية العمل في الخلفية:
- التهيئة: يتم تفعيل
location.enableBackgroundMode(enable: true)لضمان استمرار الخدمة عند إغلاق الشاشة. - التخزين المؤقت (Buffering): بدلاً من إرسال كل نقطة GPS للسيرفر، يتم تخزين النقاط في قائمة محلية
_trackBuffer. - التصفية الذكية (Smart Filtering): لا يتم تسجيل النقطة إلا إذا تحرك السائق مسافة معينة (
onMoveMetersNormal = 15m) أو مرّ وقت محدد (30 ثانية) لضمان تسجيل التوقفات.
- التهيئة: يتم تفعيل
ب. إرسال البيانات (Batch Upload)
- يوجد مؤقت
_uploadTimerيعمل كل دقيقتين (في الوضع العادي). - يقوم هذا المؤقت بجمع كل النقاط في
_trackBuffer، تحويلها لـ JSON، وإرسالها بطلب واحدPOSTإلىadd_batch.php. هذا يقلل الحمل على السيرفر بنسبة كبيرة جداً.
ج. وضع توفير الطاقة (Power Saving Mode)
- يراقب التطبيق حالة البطارية عبر
BatteryNotifier. إذا انخفضت عن 20%، يتم تقليل معدل التحديث (تسجيل كل 6 ثواني ورفع كل 4 دقائق).
3. 🔔 استقبال الطلبات (Request Handling)
أ. النافذة العائمة (Overlay Window)
- التقنية:
flutter_overlay_window. - المسار:
lib/main.dart(Background Handler) وlib/views/home/Captin/orderCaptin/order_over_lay.dart. - كيفية العمل:
- عند وصول إشعار FCM من نوع
Orderوالتطبيق في الخلفية، يتم استدعاءbackgroundMessageHandler. - يتم التحقق من إذن الرسم فوق التطبيقات. إذا مُنح، يتم استدعاء
FlutterOverlayWindow.showOverlayوتمرير بيانات الطلب (DriverList). - ملف
order_over_lay.dartهو تطبيق Flutter مصغر يعمل بشكل مستقل فوق التطبيقات الأخرى. يحتوي على منطق قبول/رفض خاص به ويتصل بالسيرفر مباشرة.
- عند وصول إشعار FCM من نوع
ب. منطق القبول والرفض (OrderRequestController)
- المسار:
lib/controller/home/captin/order_request_controller.dart. - العداد التنازلي: يتم تشغيل
startTimerلمدة 15-20 ثانية. إذا انتهى الوقت، يتم رفض الطلب تلقائياً. - القبول: عند الضغط على "قبول"، يتم استدعاء
updateStausFromSpeed.phpلحجز الطلب ومنع تضارب السائقين (Race Condition).
4. 🚗 تنفيذ الرحلة (Trip Execution Workflow)
يدير MapDriverController دورة حياة الرحلة بالكامل.
أ. الذهاب للراكب (Going to Passenger)
- عند قبول الطلب، تتغير الحالة إلى
Apply. - يتم عرض موقع الراكب على الخريطة ورسم المسار باستخدام
getRoute(يعتمد على OSRM أو Google Directions). - يمكن للسائق فتح خرائط جوجل الخارجية عبر
openGoogleMapFromDriverToPassenger.
ب. الوصول (Arrived)
- الزر:
I Arrive. - المنطق البرمجي: يتحقق الكود أولاً من المسافة بين السائق والراكب. إذا كانت أقل من 140 متر (
distance < 140)، يتم إرسال إشعارHi ,I Arrive your siteللراكب وتفعيل عداد الانتظار.
ج. بدء وإنهاء الرحلة
- البدء (
Begin): يطلب النظام تأكيداً "Is the Passenger in your Car?". عند الموافقة، يتم إرسالstatus: Beginللسيرفر ويبدأ عداد الرحلة الفعليrideIsBeginPassengerTimer. - الإنهاء (
Finish):- يتم حساب المسافة المقطوعة والوقت.
- يتم استدعاء
finishRideFromDriver1التي تقوم بإرسال طلبين متزامنين: تحديث حالة الرحلة وتنفيذ عملية الدفعprocess_ride_payments.php. - يتم تحويل السائق لصفحة تقييم الراكب
RatePassenger.
5. 💰 المحفظة والأرباح (Wallet & Earnings)
- المسار:
lib/controller/home/payment/captain_wallet_controller.dart.
أ. عرض الرصيد والديون
- يتم جلب البيانات المالية عبر
getCaptainWalletFromRide(للأرباح من الرحلات) وgetCaptainWalletFromBuyPoints(للنقاط المشتراة). - الحظر المالي: إذا انخفض رصيد النقاط عن حد معين (مثل -300)، يتم منع السائق من استقبال الطلبات ويظهر زر
Charge your Account.
ب. آلية الشحن
- يتم دعم بوابات دفع متعددة مثل Syriatel Cash و MTN Cash.
- عند الشحن، يتم إنشاء
Invoiceوانتظار الـ Callback أو التحقق الدوري (polling) من حالة الدفع.
6. ⚙️ الإعدادات والميزات الإضافية
- إعدادات السيارة: تدار عبر
DriverCarControllerوCarsInsertingPage، حيث يمكن إضافة سيارات جديدة ورفع وثائقها. - اللغة:
LocaleControllerيدير التبديل بين العربية والإنجليزية ويحفظ التفضيل فيGetStorage. - التقييم: يتم جلب تقييم السائق عبر
getDriverRateوعرضه في القائمة الجانبية أو الرأسية.