refactor: إعادة تسمية التطبيقات الأربعة siro_* → intaleq_*
المجلدات وأسماء حزم dart واستيراداتها: siro_rider → intaleq_rider siro_driver → intaleq_driver siro_admin → intaleq_admin siro_service → intaleq_service شمل ذلك `name:` في كل pubspec وكل `package:siro_*` في الاستيرادات (115 ملفاً في rider وحده)، وإشارات أسماء المجلدات في docs/ وتعليق في backend/Admin/notifications/broadcast.php. لم تبقَ إشارة واحدة (تحقّقت). + ضُمّت حزم get و get_storage داخل intaleq_driver/packages/ وحُوّلت مساراتها الثلاثة من `../../Intaleq/packages/*` إلى `./packages/*`. كانت تُحل عرضاً إلى مجلد App/Intaleq القديم المجاور — تبعية خارج المستودع تنكسر بأول نقل. لم يبقَ في أي تطبيق تبعية مسار خارج الشجرة. ⚠️ لم تُمسّ بعد: هويات المتاجر (applicationId · PRODUCT_BUNDLE_IDENTIFIER · shorebird app_id) ولا الألوان ولا النصوص المرئية ولا النطاقات — كل منها كوميت منفصل، والهويات تحتاج قرار المالك. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@@ -28,7 +28,7 @@ $audience = filterRequest('audience');
|
|||||||
$title = filterRequest('title');
|
$title = filterRequest('title');
|
||||||
$body = filterRequest('body');
|
$body = filterRequest('body');
|
||||||
|
|
||||||
// المواضيع المسموح بها فقط — يشترك بها التطبيقان (siro_driver / siro_rider).
|
// المواضيع المسموح بها فقط — يشترك بها التطبيقان (intaleq_driver / intaleq_rider).
|
||||||
// قصرها على قائمة ثابتة يمنع استخدام النقطة لبثّ رسائل إلى مواضيع عشوائية
|
// قصرها على قائمة ثابتة يمنع استخدام النقطة لبثّ رسائل إلى مواضيع عشوائية
|
||||||
// أو إلى توكن جهاز بعينه.
|
// أو إلى توكن جهاز بعينه.
|
||||||
$ALLOWED_AUDIENCES = [
|
$ALLOWED_AUDIENCES = [
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
- **Maps**: Siro Maps (custom Flutter plugin) + Google Maps + Map SaaS + OSRM
|
- **Maps**: Siro Maps (custom Flutter plugin) + Google Maps + Map SaaS + OSRM
|
||||||
- **Domain**: siromove.com | **API**: api.intaleq.xyz/siro_v3 | **Ride**: rides.intaleq.xyz | **Location**: location.intaleq.xyz | **Payment**: walletintaleq.intaleq.xyz
|
- **Domain**: siromove.com | **API**: api.intaleq.xyz/siro_v3 | **Ride**: rides.intaleq.xyz | **Location**: location.intaleq.xyz | **Payment**: walletintaleq.intaleq.xyz
|
||||||
|
|
||||||
## Passenger Flow (siro_rider)
|
## Passenger Flow (intaleq_rider)
|
||||||
```
|
```
|
||||||
Splash → Auth check → MapScreen (permanent map controllers)
|
Splash → Auth check → MapScreen (permanent map controllers)
|
||||||
→ Enter destination → Price calc → Ride request (waitingRides)
|
→ Enter destination → Price calc → Ride request (waitingRides)
|
||||||
@@ -19,7 +19,7 @@ Splash → Auth check → MapScreen (permanent map controllers)
|
|||||||
- **Deviation Guard**: 50m threshold, re-routes if off path
|
- **Deviation Guard**: 50m threshold, re-routes if off path
|
||||||
- **Local ETA**: Route trimming by closest point, percentage-based time calculation
|
- **Local ETA**: Route trimming by closest point, percentage-based time calculation
|
||||||
|
|
||||||
## Driver Flow (siro_driver)
|
## Driver Flow (intaleq_driver)
|
||||||
```
|
```
|
||||||
Splash → Auth → MapScreen → Go Online (location streaming)
|
Splash → Auth → MapScreen → Go Online (location streaming)
|
||||||
→ Ride offer via FCM + Android native overlay (TripOverlayPlugin)
|
→ Ride offer via FCM + Android native overlay (TripOverlayPlugin)
|
||||||
@@ -161,7 +161,7 @@ Splash → Auth → MapScreen → Go Online (location streaming)
|
|||||||
|
|
||||||
## File Map (Key Files)
|
## File Map (Key Files)
|
||||||
```
|
```
|
||||||
siro_rider/
|
intaleq_rider/
|
||||||
lib/main.dart, app_bindings.dart, splash_screen_page.dart
|
lib/main.dart, app_bindings.dart, splash_screen_page.dart
|
||||||
lib/controller/home/map/ride_lifecycle_controller.dart (4600 lines)
|
lib/controller/home/map/ride_lifecycle_controller.dart (4600 lines)
|
||||||
lib/controller/home/map/ride_state.dart (8-state enum)
|
lib/controller/home/map/ride_state.dart (8-state enum)
|
||||||
@@ -171,7 +171,7 @@ siro_rider/
|
|||||||
lib/constant/links.dart (all API endpoints)
|
lib/constant/links.dart (all API endpoints)
|
||||||
lib/views/home/map_widget.dart/*.dart (20+ map UI widgets)
|
lib/views/home/map_widget.dart/*.dart (20+ map UI widgets)
|
||||||
|
|
||||||
siro_driver/
|
intaleq_driver/
|
||||||
lib/main.dart (550 lines, accept/reject logic)
|
lib/main.dart (550 lines, accept/reject logic)
|
||||||
lib/controller/functions/background_service.dart
|
lib/controller/functions/background_service.dart
|
||||||
lib/controller/home/captin/home_captain_controller.dart
|
lib/controller/home/captin/home_captain_controller.dart
|
||||||
@@ -186,10 +186,10 @@ backend/
|
|||||||
socket_intaleq/
|
socket_intaleq/
|
||||||
driver_socket.php, passenger_socket.php
|
driver_socket.php, passenger_socket.php
|
||||||
|
|
||||||
siro_admin/ (Flutter Web admin panel)
|
intaleq_admin/ (Flutter Web admin panel)
|
||||||
20+ controllers, 30+ views
|
20+ controllers, 30+ views
|
||||||
|
|
||||||
siro_service/ (Driver registration agent app)
|
intaleq_service/ (Driver registration agent app)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Key Business Rules
|
## Key Business Rules
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
┌─────────────────────────────────────────────────────────┐
|
┌─────────────────────────────────────────────────────────┐
|
||||||
│ التطبيقات (Flutter) │
|
│ التطبيقات (Flutter) │
|
||||||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||||||
│ │ siro_rider │ │ siro_driver │ │ siro_admin │ │
|
│ │ intaleq_rider │ │ intaleq_driver │ │ intaleq_admin │ │
|
||||||
│ │ (الراكب) │ │ (السائق) │ │ (الإدارة) │ │
|
│ │ (الراكب) │ │ (السائق) │ │ (الإدارة) │ │
|
||||||
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
||||||
└─────────────────────────────────────────────────────────┘
|
└─────────────────────────────────────────────────────────┘
|
||||||
@@ -128,7 +128,7 @@
|
|||||||
|
|
||||||
## الميزات الموجودة حالياً
|
## الميزات الموجودة حالياً
|
||||||
|
|
||||||
### 👤 ميزات الراكب (siro_rider)
|
### 👤 ميزات الراكب (intaleq_rider)
|
||||||
|
|
||||||
#### أنواع الرحلات (12 نوع):
|
#### أنواع الرحلات (12 نوع):
|
||||||
```
|
```
|
||||||
@@ -203,7 +203,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 🚕 ميزات السائق (siro_driver)
|
### 🚕 ميزات السائق (intaleq_driver)
|
||||||
|
|
||||||
#### إدارة الرحلات:
|
#### إدارة الرحلات:
|
||||||
```
|
```
|
||||||
@@ -281,7 +281,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 🖥️ ميزات لوحة الإدارة (siro_admin)
|
### 🖥️ ميزات لوحة الإدارة (intaleq_admin)
|
||||||
|
|
||||||
#### لوحة المعلومات:
|
#### لوحة المعلومات:
|
||||||
```
|
```
|
||||||
@@ -374,7 +374,7 @@
|
|||||||
|
|
||||||
## تطبيقات المستخدمين
|
## تطبيقات المستخدمين
|
||||||
|
|
||||||
### 📱 سيرو للراكب (siro_rider)
|
### 📱 سيرو للراكب (intaleq_rider)
|
||||||
```
|
```
|
||||||
منصة: iOS + Android
|
منصة: iOS + Android
|
||||||
حجم التطبيق: ~80 MB
|
حجم التطبيق: ~80 MB
|
||||||
@@ -382,7 +382,7 @@
|
|||||||
التحديثات: OTA (Shorebird)
|
التحديثات: OTA (Shorebird)
|
||||||
```
|
```
|
||||||
|
|
||||||
### 🚕 سيرو للسائق (siro_driver)
|
### 🚕 سيرو للسائق (intaleq_driver)
|
||||||
```
|
```
|
||||||
منصة: iOS + Android
|
منصة: iOS + Android
|
||||||
حجم التطبيق: ~100 MB
|
حجم التطبيق: ~100 MB
|
||||||
@@ -391,7 +391,7 @@
|
|||||||
التحديثات: OTA (Shorebird)
|
التحديثات: OTA (Shorebird)
|
||||||
```
|
```
|
||||||
|
|
||||||
### 🖥️ سيرو الإدارة (siro_admin)
|
### 🖥️ سيرو الإدارة (intaleq_admin)
|
||||||
```
|
```
|
||||||
منصة: Web (PWA) + Mobile (Flutter)
|
منصة: Web (PWA) + Mobile (Flutter)
|
||||||
الوصول: أي متصفح
|
الوصول: أي متصفح
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ Siro (Siro) is a multi-region ride-hailing platform connecting passengers with d
|
|||||||
1. Passenger requests ride → System searches nearby drivers → Driver accepts → Navigate to pickup → Ride begins → Ride completes → Payment processed → Rating submitted
|
1. Passenger requests ride → System searches nearby drivers → Driver accepts → Navigate to pickup → Ride begins → Ride completes → Payment processed → Rating submitted
|
||||||
|
|
||||||
### User Types
|
### User Types
|
||||||
- **Passenger** (Rider) — Requests rides via siro_rider app
|
- **Passenger** (Rider) — Requests rides via intaleq_rider app
|
||||||
- **Driver** (Captain) — Accepts rides via siro_driver app
|
- **Driver** (Captain) — Accepts rides via intaleq_driver app
|
||||||
- **Admin** — Manages system via siro_admin app (Flutter Web/PWA)
|
- **Admin** — Manages system via intaleq_admin app (Flutter Web/PWA)
|
||||||
- **Service Agent** — Manages driver registration via siro_service app
|
- **Service Agent** — Manages driver registration via intaleq_service app
|
||||||
- **Employee** — Staff managing drivers, passengers, complaints
|
- **Employee** — Staff managing drivers, passengers, complaints
|
||||||
|
|
||||||
### Driver Types
|
### Driver Types
|
||||||
@@ -63,22 +63,22 @@ Siro (Siro) is a multi-region ride-hailing platform connecting passengers with d
|
|||||||
|
|
||||||
| Module | Purpose | Dependencies | Main Files |
|
| Module | Purpose | Dependencies | Main Files |
|
||||||
|--------|---------|--------------|------------|
|
|--------|---------|--------------|------------|
|
||||||
| **Authentication** | Login, signup, OTP, JWT management, Google/Apple auth | Firebase, Twilio, WhatsApp | `siro_rider/lib/controller/auth/*.dart`, `backend/auth/*.php` |
|
| **Authentication** | Login, signup, OTP, JWT management, Google/Apple auth | Firebase, Twilio, WhatsApp | `intaleq_rider/lib/controller/auth/*.dart`, `backend/auth/*.php` |
|
||||||
| **Dispatching** | Ride request → driver matching → offer → accept | WebSocket, MySQL GIS | `socket_intaleq/*.php`, `backend/ride/*.php` |
|
| **Dispatching** | Ride request → driver matching → offer → accept | WebSocket, MySQL GIS | `socket_intaleq/*.php`, `backend/ride/*.php` |
|
||||||
| **Matching** | Nearby driver search via spatial queries | MySQL SPATIAL indexes | `backend/ride/location/*.php` |
|
| **Matching** | Nearby driver search via spatial queries | MySQL SPATIAL indexes | `backend/ride/location/*.php` |
|
||||||
| **Maps & GIS** | Map rendering, routing, geocoding, driver tracking | Google Maps, Map SaaS, OSRM | `siro_rider/lib/controller/home/map/*.dart` |
|
| **Maps & GIS** | Map rendering, routing, geocoding, driver tracking | Google Maps, Map SaaS, OSRM | `intaleq_rider/lib/controller/home/map/*.dart` |
|
||||||
| **Payments** | Ride payment, wallet, PayMob, MTN, Syriatel, E-Cash | PayMob, Stripe | `siro_rider/lib/controller/payment/*.dart`, `backend/ride/payment/*.php` |
|
| **Payments** | Ride payment, wallet, PayMob, MTN, Syriatel, E-Cash | PayMob, Stripe | `intaleq_rider/lib/controller/payment/*.dart`, `backend/ride/payment/*.php` |
|
||||||
| **Wallet** | Passenger & driver balance management | Payment server (walletintaleq.xyz) | `siro_rider/lib/controller/payment/passenger_wallet_history_controller.dart` |
|
| **Wallet** | Passenger & driver balance management | Payment server (walletintaleq.xyz) | `intaleq_rider/lib/controller/payment/passenger_wallet_history_controller.dart` |
|
||||||
| **Notifications** | Push (FCM), local, in-app notifications | Firebase | `siro_rider/lib/controller/firebase/*.dart` |
|
| **Notifications** | Push (FCM), local, in-app notifications | Firebase | `intaleq_rider/lib/controller/firebase/*.dart` |
|
||||||
| **Chat** | In-app messaging between driver & passenger | PHP API | `backend/ride/chat/send_message.php` |
|
| **Chat** | In-app messaging between driver & passenger | PHP API | `backend/ride/chat/send_message.php` |
|
||||||
| **Rating** | Post-ride driver & passenger ratings | MySQL | `siro_rider/lib/controller/rate/*.dart`, `backend/ride/rate/*.php` |
|
| **Rating** | Post-ride driver & passenger ratings | MySQL | `intaleq_rider/lib/controller/rate/*.dart`, `backend/ride/rate/*.php` |
|
||||||
| **Promotions** | Promo codes, referral rewards | MySQL | `siro_rider/lib/controller/home/profile/promos_controller.dart` |
|
| **Promotions** | Promo codes, referral rewards | MySQL | `intaleq_rider/lib/controller/home/profile/promos_controller.dart` |
|
||||||
| **AI Services** | OCR document scanning, data extraction | Azure OCR, OpenAI, Llama | `siro_rider/lib/controller/functions/crud.dart` (getLlama, getChatGPT, arabicTextExtractByVisionAndAI) |
|
| **AI Services** | OCR document scanning, data extraction | Azure OCR, OpenAI, Llama | `intaleq_rider/lib/controller/functions/crud.dart` (getLlama, getChatGPT, arabicTextExtractByVisionAndAI) |
|
||||||
| **Admin Functions** | Dashboard, driver/passenger management, analytics | All backend APIs | `siro_admin/lib/controller/admin/*.dart` |
|
| **Admin Functions** | Dashboard, driver/passenger management, analytics | All backend APIs | `intaleq_admin/lib/controller/admin/*.dart` |
|
||||||
| **Realtime Tracking** | WebSocket driver location streaming, passenger tracking | Socket.IO (PHP) | `socket_intaleq/*.php`, `siro_rider/lib/controller/home/map/map_socket_controller.dart` |
|
| **Realtime Tracking** | WebSocket driver location streaming, passenger tracking | Socket.IO (PHP) | `socket_intaleq/*.php`, `intaleq_rider/lib/controller/home/map/map_socket_controller.dart` |
|
||||||
| **Referral System** | Unified referral codes for drivers & passengers | MySQL | `backend/migration_referral_system.sql`, `backend/ride/invitor/*.php` |
|
| **Referral System** | Unified referral codes for drivers & passengers | MySQL | `backend/migration_referral_system.sql`, `backend/ride/invitor/*.php` |
|
||||||
| **Complaints** | Post-ride issue resolution | MySQL | `siro_rider/lib/controller/home/profile/complaint_controller.dart`, `backend/Admin/AdminRide/` |
|
| **Complaints** | Post-ride issue resolution | MySQL | `intaleq_rider/lib/controller/home/profile/complaint_controller.dart`, `backend/Admin/AdminRide/` |
|
||||||
| **Emergency** | SOS signals, safety features | Agora, WebRTC | `siro_rider/lib/services/emergency_signal_service.dart` |
|
| **Emergency** | SOS signals, safety features | Agora, WebRTC | `intaleq_rider/lib/services/emergency_signal_service.dart` |
|
||||||
|
|
||||||
## Architecture Overview
|
## Architecture Overview
|
||||||
|
|
||||||
@@ -86,7 +86,7 @@ Siro (Siro) is a multi-region ride-hailing platform connecting passengers with d
|
|||||||
┌─────────────────────────────────────────────────────┐
|
┌─────────────────────────────────────────────────────┐
|
||||||
│ Mobile Apps (Flutter) │
|
│ Mobile Apps (Flutter) │
|
||||||
│ ┌─────────────┐ ┌──────────────┐ ┌────────────┐ │
|
│ ┌─────────────┐ ┌──────────────┐ ┌────────────┐ │
|
||||||
│ │ siro_rider │ │ siro_driver │ │ siro_admin │ │
|
│ │ intaleq_rider │ │ intaleq_driver │ │ intaleq_admin │ │
|
||||||
│ │ (Passenger) │ │ (Captain) │ │ (Admin) │ │
|
│ │ (Passenger) │ │ (Captain) │ │ (Admin) │ │
|
||||||
│ └──────┬──────┘ └──────┬───────┘ └─────┬──────┘ │
|
│ └──────┬──────┘ └──────┬───────┘ └─────┬──────┘ │
|
||||||
└─────────┼─────────────────┼─────────────────┼────────┘
|
└─────────┼─────────────────┼─────────────────┼────────┘
|
||||||
|
|||||||
@@ -6,18 +6,18 @@
|
|||||||
┌────────────────────────────────────────────────────────────────────┐
|
┌────────────────────────────────────────────────────────────────────┐
|
||||||
│ UI LAYER (Flutter Widgets) │
|
│ UI LAYER (Flutter Widgets) │
|
||||||
│ │
|
│ │
|
||||||
│ siro_rider: │
|
│ intaleq_rider: │
|
||||||
│ Routes: /, /shareApp, /wallet, /profile, /contactSupport │
|
│ Routes: /, /shareApp, /wallet, /profile, /contactSupport │
|
||||||
│ Screens: SplashScreen, LoginPage, MapPagePassenger, Wallet, etc. │
|
│ Screens: SplashScreen, LoginPage, MapPagePassenger, Wallet, etc. │
|
||||||
│ │
|
│ │
|
||||||
│ siro_driver: │
|
│ intaleq_driver: │
|
||||||
│ Routes: /, /OrderRequestPage, /passenger-location-map │
|
│ Routes: /, /OrderRequestPage, /passenger-location-map │
|
||||||
│ Screens: SplashScreen, LoginPage, PassengerLocationMapPage, etc. │
|
│ Screens: SplashScreen, LoginPage, PassengerLocationMapPage, etc. │
|
||||||
│ │
|
│ │
|
||||||
│ siro_admin: │
|
│ intaleq_admin: │
|
||||||
│ Routes: /login, /admin/dashboard, /admin/captain, /admin/rides │
|
│ Routes: /login, /admin/dashboard, /admin/captain, /admin/rides │
|
||||||
│ │
|
│ │
|
||||||
│ siro_service: │
|
│ intaleq_service: │
|
||||||
│ Service agent app for driver registration & management │
|
│ Service agent app for driver registration & management │
|
||||||
└──────────────────────┬─────────────────────────────────────────────┘
|
└──────────────────────┬─────────────────────────────────────────────┘
|
||||||
│ GetX (Get.find, Get.put, Obx)
|
│ GetX (Get.find, Get.put, Obx)
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
┌──────────────────────┴─────────────────────────────────────────────┐
|
┌──────────────────────┴─────────────────────────────────────────────┐
|
||||||
│ REPOSITORY LAYER (CRUD + Services) │
|
│ REPOSITORY LAYER (CRUD + Services) │
|
||||||
│ │
|
│ │
|
||||||
│ CRUD class (siro_rider/lib/controller/functions/crud.dart) │
|
│ CRUD class (intaleq_rider/lib/controller/functions/crud.dart) │
|
||||||
│ - post() → Main API POST with JWT + Device-FP headers │
|
│ - post() → Main API POST with JWT + Device-FP headers │
|
||||||
│ - get() → API GET (POST method) with retry logic │
|
│ - get() → API GET (POST method) with retry logic │
|
||||||
│ - postWallet() → Payment server POST with JWT + HMAC + FP │
|
│ - postWallet() → Payment server POST with JWT + HMAC + FP │
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
## Dependency Graph
|
## Dependency Graph
|
||||||
|
|
||||||
```
|
```
|
||||||
Rider App (siro_rider) ───→ Main API ─────→ intaleqDB1
|
Rider App (intaleq_rider) ───→ Main API ─────→ intaleqDB1
|
||||||
├──→ Map SaaS ───────→ Custom Map Service
|
├──→ Map SaaS ───────→ Custom Map Service
|
||||||
├──→ OSRM ───────────→ OpenStreetMap
|
├──→ OSRM ───────────→ OpenStreetMap
|
||||||
├──→ Payment API ────→ Wallet DB
|
├──→ Payment API ────→ Wallet DB
|
||||||
@@ -104,14 +104,14 @@ Rider App (siro_rider) ───→ Main API ─────→ intaleqDB1
|
|||||||
├──→ WebSocket ──────→ Ride Socket Server
|
├──→ WebSocket ──────→ Ride Socket Server
|
||||||
└──→ Google Maps ────→ Google APIs
|
└──→ Google Maps ────→ Google APIs
|
||||||
|
|
||||||
Driver App (siro_driver) ───→ Main API ─────→ intaleqDB1
|
Driver App (intaleq_driver) ───→ Main API ─────→ intaleqDB1
|
||||||
├──→ Location API ───→ car_locations
|
├──→ Location API ───→ car_locations
|
||||||
├──→ Payment API ────→ Wallet DB
|
├──→ Payment API ────→ Wallet DB
|
||||||
├──→ WebSocket ──────→ Driver Socket Server
|
├──→ WebSocket ──────→ Driver Socket Server
|
||||||
├──→ Firebase ───────→ FCM
|
├──→ Firebase ───────→ FCM
|
||||||
└──→ Google Maps ────→ Google APIs
|
└──→ Google Maps ────→ Google APIs
|
||||||
|
|
||||||
Admin App (siro_admin) ────→ Main API ─────→ intaleqDB1
|
Admin App (intaleq_admin) ────→ Main API ─────→ intaleqDB1
|
||||||
├──→ Payment API
|
├──→ Payment API
|
||||||
├──→ Firebase
|
├──→ Firebase
|
||||||
└──→ Internal Services
|
└──→ Internal Services
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
### Screen
|
### Screen
|
||||||
- **Route**: `/` → `SplashScreen`
|
- **Route**: `/` → `SplashScreen`
|
||||||
- **File**: `siro_driver/lib/splash_screen_page.dart`
|
- **File**: `intaleq_driver/lib/splash_screen_page.dart`
|
||||||
- **Controllers**: `SplashScreenController`, `LocaleController`, `BackgroundServiceHelper`
|
- **Controllers**: `SplashScreenController`, `LocaleController`, `BackgroundServiceHelper`
|
||||||
|
|
||||||
### State Flow
|
### State Flow
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
## Stage 2: Go Online
|
## Stage 2: Go Online
|
||||||
|
|
||||||
### Screen
|
### Screen
|
||||||
- **File**: `siro_driver/lib/views/home/Captin/driver_map_page.dart` → `PassengerLocationMapPage`
|
- **File**: `intaleq_driver/lib/views/home/Captin/driver_map_page.dart` → `PassengerLocationMapPage`
|
||||||
- **Controller**: `HomeCaptainController`, `MapSocketController`
|
- **Controller**: `HomeCaptainController`, `MapSocketController`
|
||||||
|
|
||||||
### State Flow
|
### State Flow
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
4. WebSocket connects to receive ride offers
|
4. WebSocket connects to receive ride offers
|
||||||
|
|
||||||
### Background Service
|
### Background Service
|
||||||
- **File**: `siro_driver/lib/controller/functions/background_service.dart`
|
- **File**: `intaleq_driver/lib/controller/functions/background_service.dart`
|
||||||
- `BackgroundServiceHelper.initialize()` — starts Android foreground service
|
- `BackgroundServiceHelper.initialize()` — starts Android foreground service
|
||||||
- Location updates sent every few seconds to location server
|
- Location updates sent every few seconds to location server
|
||||||
|
|
||||||
@@ -113,7 +113,7 @@
|
|||||||
## Stage 4: Accept Ride
|
## Stage 4: Accept Ride
|
||||||
|
|
||||||
### Screen
|
### Screen
|
||||||
- **Function**: `_processAcceptOrder(List<dynamic> data)` in `siro_driver/lib/main.dart`
|
- **Function**: `_processAcceptOrder(List<dynamic> data)` in `intaleq_driver/lib/main.dart`
|
||||||
|
|
||||||
### State Flow
|
### State Flow
|
||||||
1. Overlay accept button → `TripOverlayPlugin.onTripAccepted` fires
|
1. Overlay accept button → `TripOverlayPlugin.onTripAccepted` fires
|
||||||
@@ -147,8 +147,8 @@ POST {$rideServerSide}/rides/acceptRide.php
|
|||||||
## Stage 5: Navigate to Pickup
|
## Stage 5: Navigate to Pickup
|
||||||
|
|
||||||
### Screen
|
### Screen
|
||||||
- **File**: `siro_driver/lib/views/home/Captin/driver_map_page.dart`
|
- **File**: `intaleq_driver/lib/views/home/Captin/driver_map_page.dart`
|
||||||
- **Navigation**: `siro_driver/lib/controller/home/navigation/navigation_controller.dart`
|
- **Navigation**: `intaleq_driver/lib/controller/home/navigation/navigation_controller.dart`
|
||||||
|
|
||||||
### State Flow
|
### State Flow
|
||||||
- `RideStatus: 'Apply'` → navigate to passenger
|
- `RideStatus: 'Apply'` → navigate to passenger
|
||||||
@@ -248,7 +248,7 @@ POST {$rideServerSide}/rides/acceptRide.php
|
|||||||
## Stage 11: Go Offline & Earnings
|
## Stage 11: Go Offline & Earnings
|
||||||
|
|
||||||
### Screen
|
### Screen
|
||||||
- **Wallet**: `siro_driver/lib/views/home/Captin/wallet_page.dart`
|
- **Wallet**: `intaleq_driver/lib/views/home/Captin/wallet_page.dart`
|
||||||
- **Earnings**: `earnings_page.dart`
|
- **Earnings**: `earnings_page.dart`
|
||||||
|
|
||||||
### APIs
|
### APIs
|
||||||
@@ -286,7 +286,7 @@ PassengerLocationMapPage
|
|||||||
|
|
||||||
```
|
```
|
||||||
┌──────────────────────────────────────────────────────┐
|
┌──────────────────────────────────────────────────────┐
|
||||||
│ Driver App (siro_driver) │
|
│ Driver App (intaleq_driver) │
|
||||||
│ │
|
│ │
|
||||||
│ ┌──────────────────────────────────────────────┐ │
|
│ ┌──────────────────────────────────────────────┐ │
|
||||||
│ │ Main Isolate (flutter) │ │
|
│ │ Main Isolate (flutter) │ │
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
### Screen
|
### Screen
|
||||||
- **Route**: `/` → SplashScreen
|
- **Route**: `/` → SplashScreen
|
||||||
- **File**: `siro_rider/lib/splash_screen_page.dart`
|
- **File**: `intaleq_rider/lib/splash_screen_page.dart`
|
||||||
- **Controller**: `SplashScreenController` (in `siro_rider/lib/controller/home/splash_screen_controlle.dart`)
|
- **Controller**: `SplashScreenController` (in `intaleq_rider/lib/controller/home/splash_screen_controlle.dart`)
|
||||||
|
|
||||||
### State Flow
|
### State Flow
|
||||||
- **Type**: GetX Controller (Custom Animation)
|
- **Type**: GetX Controller (Custom Animation)
|
||||||
@@ -48,10 +48,10 @@ SplashScreen
|
|||||||
### Screens
|
### Screens
|
||||||
| Screen | Route | File |
|
| Screen | Route | File |
|
||||||
|--------|-------|------|
|
|--------|-------|------|
|
||||||
| Onboarding | `/onboarding` | `siro_rider/lib/onbording_page.dart` |
|
| Onboarding | `/onboarding` | `intaleq_rider/lib/onbording_page.dart` |
|
||||||
| Login | `/login` | `siro_rider/lib/views/auth/login_page.dart` |
|
| Login | `/login` | `intaleq_rider/lib/views/auth/login_page.dart` |
|
||||||
| Register | `/register` | `siro_rider/lib/views/auth/register_page.dart` |
|
| Register | `/register` | `intaleq_rider/lib/views/auth/register_page.dart` |
|
||||||
| OTP | `/otp` | `siro_rider/lib/views/auth/otp_page.dart` |
|
| OTP | `/otp` | `intaleq_rider/lib/views/auth/otp_page.dart` |
|
||||||
|
|
||||||
### APIs
|
### APIs
|
||||||
| Endpoint | Method | Input | Output |
|
| Endpoint | Method | Input | Output |
|
||||||
@@ -70,7 +70,7 @@ SplashScreen
|
|||||||
## Stage 3: Map Screen — Ride Request
|
## Stage 3: Map Screen — Ride Request
|
||||||
|
|
||||||
### Screen
|
### Screen
|
||||||
- **File**: `siro_rider/lib/views/home/map_page_passenger.dart`
|
- **File**: `intaleq_rider/lib/views/home/map_page_passenger.dart`
|
||||||
- **Controllers** (all permanent in AppBindings):
|
- **Controllers** (all permanent in AppBindings):
|
||||||
- `MapEngineController` — map rendering
|
- `MapEngineController` — map rendering
|
||||||
- `MapSocketController` — WebSocket management
|
- `MapSocketController` — WebSocket management
|
||||||
@@ -219,7 +219,7 @@ SplashScreen
|
|||||||
## Stage 8: Ride Finished — Payment & Rating
|
## Stage 8: Ride Finished — Payment & Rating
|
||||||
|
|
||||||
### Screen
|
### Screen
|
||||||
- **Rating**: `siro_rider/lib/views/Rate/rate_captain.dart`, `rating_driver_bottom.dart`
|
- **Rating**: `intaleq_rider/lib/views/Rate/rate_captain.dart`, `rating_driver_bottom.dart`
|
||||||
- **Payment**: `payment_method.page.dart`, `cash_confirm_bottom_page.dart`
|
- **Payment**: `payment_method.page.dart`, `cash_confirm_bottom_page.dart`
|
||||||
|
|
||||||
### State Flow
|
### State Flow
|
||||||
|
|||||||
@@ -88,7 +88,7 @@
|
|||||||
|
|
||||||
| # | الخطوة | الشاشة | اللقطة المطلوبة |
|
| # | الخطوة | الشاشة | اللقطة المطلوبة |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 1 | تبويب مواصلاتي | `siro_rider` تبويب Transit | اختيار الجامعة |
|
| 1 | تبويب مواصلاتي | `intaleq_rider` تبويب Transit | اختيار الجامعة |
|
||||||
| 2 | تفعيل العضوية | — | إدخال الرقم الجامعي (تفعيل فوري إذا كان بالكشف) |
|
| 2 | تفعيل العضوية | — | إدخال الرقم الجامعي (تفعيل فوري إذا كان بالكشف) |
|
||||||
| 3 | استعراض الخطوط | — | قائمة الخطوط المعتمدة وجداولها |
|
| 3 | استعراض الخطوط | — | قائمة الخطوط المعتمدة وجداولها |
|
||||||
| 4 | التتبع الحي | خريطة الخط | الباص يتحرك على المسار + المحطات |
|
| 4 | التتبع الحي | خريطة الخط | الباص يتحرك على المسار + المحطات |
|
||||||
|
|||||||
@@ -6,13 +6,13 @@
|
|||||||
يتم التحكم في حالة اتصال السائق بالشبكة وتفعيل استقبال الطلبات في ملف التحكم
|
يتم التحكم في حالة اتصال السائق بالشبكة وتفعيل استقبال الطلبات في ملف التحكم
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[HomeCaptainController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart)
|
[HomeCaptainController](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/home_captain_controller.dart)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
من خلال الدالة
|
من خلال الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[onButtonSelected](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart#L278)
|
[onButtonSelected](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/home_captain_controller.dart#L278)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
والتي تقوم بإجراء الفحوصات المتتالية التالية قبل السماح للسائق بالدخول في حالة النشاط (`isActive = true`):
|
والتي تقوم بإجراء الفحوصات المتتالية التالية قبل السماح للسائق بالدخول في حالة النشاط (`isActive = true`):
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
تتحقق الدالة
|
تتحقق الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[checkAndShowBlockDialog](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart#L347)
|
[checkAndShowBlockDialog](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/home_captain_controller.dart#L347)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
من وجود تاريخ حظر نشط مخزن في الذاكرة المحلية تحت المفتاح `blockUntilDate`. إذا كان الوقت الحالي قبل وقت انتهاء الحظر، يتم إجبار السائق على وضع عدم الاتصال وعرض نافذة حوار مانعة تعرض عداداً تنازلياً لوقت فك الحظر. تفرض هذه العقوبة تلقائياً لمدة 4 ساعات عند إلغاء السائق لـ 3 رحلات في اليوم الواحد.
|
من وجود تاريخ حظر نشط مخزن في الذاكرة المحلية تحت المفتاح `blockUntilDate`. إذا كان الوقت الحالي قبل وقت انتهاء الحظر، يتم إجبار السائق على وضع عدم الاتصال وعرض نافذة حوار مانعة تعرض عداداً تنازلياً لوقت فك الحظر. تفرض هذه العقوبة تلقائياً لمدة 4 ساعات عند إلغاء السائق لـ 3 رحلات في اليوم الواحد.
|
||||||
@@ -34,13 +34,13 @@
|
|||||||
يقوم النظام بمراقبة ساعات القيادة المتواصلة للسائق لمنع الحوادث عبر الدالة
|
يقوم النظام بمراقبة ساعات القيادة المتواصلة للسائق لمنع الحوادث عبر الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[_checkFatigueBeforeOnline](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart#L222)
|
[_checkFatigueBeforeOnline](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/home_captain_controller.dart#L222)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
إذا بلغ مجموع ثواني النشاط المخزنة في `fatigue_total_seconds` ما يعادل 12 ساعة عمل، يتم استدعاء الدالة
|
إذا بلغ مجموع ثواني النشاط المخزنة في `fatigue_total_seconds` ما يعادل 12 ساعة عمل، يتم استدعاء الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[_forceOfflineDueToFatigue](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart#L242)
|
[_forceOfflineDueToFatigue](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/home_captain_controller.dart#L242)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
والتي تقطع الاتصال فوراً وتمنع السائق من العمل. لا يتم تصفير هذا العداد إلا إذا بقي السائق في وضع عدم الاتصال بشكل مستمر لمدة لا تقل عن 6 ساعات متواصلة (يتم تتبعها عبر قراءة تاريخ `fatigue_last_offline`).
|
والتي تقطع الاتصال فوراً وتمنع السائق من العمل. لا يتم تصفير هذا العداد إلا إذا بقي السائق في وضع عدم الاتصال بشكل مستمر لمدة لا تقل عن 6 ساعات متواصلة (يتم تتبعها عبر قراءة تاريخ `fatigue_last_offline`).
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
يتم استدعاء خاصية
|
يتم استدعاء خاصية
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[minPointsThreshold](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart#L267)
|
[minPointsThreshold](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/home_captain_controller.dart#L267)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
والتي تعتمد على الدولة الحالية المخزنة في إعدادات التطبيق. إذا كان الرصيد الحالي للنقاط أدنى من الحد المسموح به (والذي يساوي `-200` نقطة في سوريا ومصر، و `-3` نقاط في الأردن)، يتم منع السائق من استقبال الطلبات وإيقاف تحديثات الموقع فوراً.
|
والتي تعتمد على الدولة الحالية المخزنة في إعدادات التطبيق. إذا كان الرصيد الحالي للنقاط أدنى من الحد المسموح به (والذي يساوي `-200` نقطة في سوريا ومصر، و `-3` نقاط في الأردن)، يتم منع السائق من استقبال الطلبات وإيقاف تحديثات الموقع فوراً.
|
||||||
@@ -65,26 +65,26 @@
|
|||||||
لمعالجة مشاكل استنزاف البطارية وارتفاع حرارة الأجهزة الضعيفة، تم تطبيق استراتيجيات تحسين الأداء التالية في
|
لمعالجة مشاكل استنزاف البطارية وارتفاع حرارة الأجهزة الضعيفة، تم تطبيق استراتيجيات تحسين الأداء التالية في
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[MapDriverController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart)
|
[MapDriverController](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/map_driver_controller.dart)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
و
|
و
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[HomeCaptainController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart)
|
[HomeCaptainController](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/home_captain_controller.dart)
|
||||||
|
|
||||||
### أ. تجميع قنوات البث ومستمع الحركة الموحد (Centralized GPS Stream & 500ms Timer Polling)
|
### أ. تجميع قنوات البث ومستمع الحركة الموحد (Centralized GPS Stream & 500ms Timer Polling)
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
بدلاً من فتح قنوات بث (Streams) متعددة ومستقلة للـ GPS، تم تركيز البث في كلاس مركزي موحد هو
|
بدلاً من فتح قنوات بث (Streams) متعددة ومستقلة للـ GPS، تم تركيز البث في كلاس مركزي موحد هو
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[LocationController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/functions/location_controller.dart)
|
[LocationController](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/functions/location_controller.dart)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
حيث يقوم مستمع التوجيه والملاحة في الدالة
|
حيث يقوم مستمع التوجيه والملاحة في الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[startListeningStepNavigation](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L306)
|
[startListeningStepNavigation](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/map_driver_controller.dart#L306)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
بعمل استعلام دوري خفيف (Polling) كل 500 ملي ثانية لقراءة إحداثيات `locationController.myLocation` الجاهزة مسبقاً، مما يمنع استدعاء العتاد المادي لجهاز الاستقبال عدة مرات متزامنة.
|
بعمل استعلام دوري خفيف (Polling) كل 500 ملي ثانية لقراءة إحداثيات `locationController.myLocation` الجاهزة مسبقاً، مما يمنع استدعاء العتاد المادي لجهاز الاستقبال عدة مرات متزامنة.
|
||||||
@@ -138,13 +138,13 @@ _cameraFollowTimer = Timer.periodic(const Duration(seconds: 8), (timer) { ... })
|
|||||||
يقوم الكلاس
|
يقوم الكلاس
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[OrderRequestController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/order_request_controller.dart)
|
[OrderRequestController](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/order_request_controller.dart)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
بتحليل البيانات المستقبلة في الدالة
|
بتحليل البيانات المستقبلة في الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[_initializeData](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/order_request_controller.dart#L126)
|
[_initializeData](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/order_request_controller.dart#L126)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
حيث تدعم بشكل مرن استقبال البيانات سواء كانت على شكل قائمة مرتبة (List) قادمة من إشعارات Firebase، أو على شكل خريطة مفاتيح (Map) قادمة من سوكيت الويب.
|
حيث تدعم بشكل مرن استقبال البيانات سواء كانت على شكل قائمة مرتبة (List) قادمة من إشعارات Firebase، أو على شكل خريطة مفاتيح (Map) قادمة من سوكيت الويب.
|
||||||
@@ -155,7 +155,7 @@ _cameraFollowTimer = Timer.periodic(const Duration(seconds: 8), (timer) { ... })
|
|||||||
عند فتح شاشة الطلب، يتم تشغيل صوت تنبيه متكرر وتفعيل مؤقت تنازلي مدته 15 ثانية عبر الدالة
|
عند فتح شاشة الطلب، يتم تشغيل صوت تنبيه متكرر وتفعيل مؤقت تنازلي مدته 15 ثانية عبر الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[startTimer](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/order_request_controller.dart#L555)
|
[startTimer](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/order_request_controller.dart#L555)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
إذا انتهت الـ 15 ثانية دون استجابة السائق، يتم إيقاف الصوت وإغلاق الشاشة تلقائياً.
|
إذا انتهت الـ 15 ثانية دون استجابة السائق، يتم إيقاف الصوت وإغلاق الشاشة تلقائياً.
|
||||||
@@ -166,7 +166,7 @@ _cameraFollowTimer = Timer.periodic(const Duration(seconds: 8), (timer) { ... })
|
|||||||
لتفادي قبول طلب تم أخذه بالفعل من قبل كابتن آخر، يقوم الكنترولر في الدالة
|
لتفادي قبول طلب تم أخذه بالفعل من قبل كابتن آخر، يقوم الكنترولر في الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[_listenForRideTaken](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/order_request_controller.dart#L587)
|
[_listenForRideTaken](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/order_request_controller.dart#L587)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
بالاستماع لحدث السوكيت `ride_taken`. عند استقبال الحدث ومطابقة معرف الرحلة، يتم إلغاء إشعار النظام فوراً، وإغلاق شاشة الطلب وعرض تنبيه للسائق بأن "الطلب تم قبوله من قبل سائق آخر".
|
بالاستماع لحدث السوكيت `ride_taken`. عند استقبال الحدث ومطابقة معرف الرحلة، يتم إلغاء إشعار النظام فوراً، وإغلاق شاشة الطلب وعرض تنبيه للسائق بأن "الطلب تم قبوله من قبل سائق آخر".
|
||||||
@@ -185,13 +185,13 @@ _cameraFollowTimer = Timer.periodic(const Duration(seconds: 8), (timer) { ... })
|
|||||||
في شاشة استقبال الطلب
|
في شاشة استقبال الطلب
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[OrderRequestController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/order_request_controller.dart)
|
[OrderRequestController](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/order_request_controller.dart)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
يقوم التطبيق بالاستعلام ورسم مسارين جغرافيين في نفس الوقت عبر الدالة
|
يقوم التطبيق بالاستعلام ورسم مسارين جغرافيين في نفس الوقت عبر الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[_calculateFullJourney](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/order_request_controller.dart#L226)
|
[_calculateFullJourney](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/order_request_controller.dart#L226)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
حيث يستدعي:
|
حيث يستدعي:
|
||||||
@@ -201,13 +201,13 @@ _cameraFollowTimer = Timer.periodic(const Duration(seconds: 8), (timer) { ... })
|
|||||||
ولعرض تفاصيل المسافة والوقت كصندوق معلومات عائم (Info Window) مباشرة فوق الخريطة، يتم استدعاء الدالة
|
ولعرض تفاصيل المسافة والوقت كصندوق معلومات عائم (Info Window) مباشرة فوق الخريطة، يتم استدعاء الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[_updateMarkers](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/order_request_controller.dart#L468)
|
[_updateMarkers](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/order_request_controller.dart#L468)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
والتي تقوم بطلب مولد الماركرز
|
والتي تقوم بطلب مولد الماركرز
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[MarkerGenerator.createCustomMarkerBitmap](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/views/home/Captin/orderCaptin/marker_generator.dart)
|
[MarkerGenerator.createCustomMarkerBitmap](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/views/home/Captin/orderCaptin/marker_generator.dart)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
لتوليد صور ماركر مخصصة ديناميكياً تحتوي على الوقت والمسافة كصندوق معلومات يعلو الخريطة فوق نقطة الركوب (أقرب مسافة وزمن وصول للسائق) ونقطة الوصول (المسافة والزمن المقدرين للرحلة الكلية للراكب).
|
لتوليد صور ماركر مخصصة ديناميكياً تحتوي على الوقت والمسافة كصندوق معلومات يعلو الخريطة فوق نقطة الركوب (أقرب مسافة وزمن وصول للسائق) ونقطة الوصول (المسافة والزمن المقدرين للرحلة الكلية للراكب).
|
||||||
@@ -218,20 +218,20 @@ _cameraFollowTimer = Timer.periodic(const Duration(seconds: 8), (timer) { ... })
|
|||||||
تخضع مسارات الخريطة لعملية تحديث وحذف دورية أثناء الرحلة في الكنترولر
|
تخضع مسارات الخريطة لعملية تحديث وحذف دورية أثناء الرحلة في الكنترولر
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[MapDriverController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart)
|
[MapDriverController](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/map_driver_controller.dart)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
وفق التسلسل التالي:
|
وفق التسلسل التالي:
|
||||||
1. **عند قبول الطلب**: يتم مسح خط الوجهة، ورسم خط الملاحة الجاري باتجاه الراكب (باللون الأصفر) عبر استدعاء
|
1. **عند قبول الطلب**: يتم مسح خط الوجهة، ورسم خط الملاحة الجاري باتجاه الراكب (باللون الأصفر) عبر استدعاء
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[getRoute](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L1885)
|
[getRoute](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/map_driver_controller.dart#L1885)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
2. **عند وصول السائق لموقع الراكب**: بمجرد ضغط السائق على زر "وصلت" وتأكيده، يتم استدعاء الدالة
|
2. **عند وصول السائق لموقع الراكب**: بمجرد ضغط السائق على زر "وصلت" وتأكيده، يتم استدعاء الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[clearPolyline](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L422)
|
[clearPolyline](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/map_driver_controller.dart#L422)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
والتي تقوم بمسح وحذف المسار الجاري الأول (الخط الأصفر الموصل للراكب) بالكامل من الخريطة لتنظيف الشاشة.
|
والتي تقوم بمسح وحذف المسار الجاري الأول (الخط الأصفر الموصل للراكب) بالكامل من الخريطة لتنظيف الشاشة.
|
||||||
@@ -243,7 +243,7 @@ _cameraFollowTimer = Timer.periodic(const Duration(seconds: 8), (timer) { ... })
|
|||||||
عند تشغيل اختبارات الرحلة وكون موقع السائق والراكب متطابقين تماماً (مسافة أقل من 10 أمتار)، ينهار محرك الملاحة المكتوب بلغة C++ بسبب إحداثيات الصندوق المحيط (Bounds) ذات العرض الصفرى مطلقةً استثناء `std::domain_error`. لمنع ذلك، يقوم الكود بفحص المسافة، وفي حال كانت متطابقة يقوم بإظهار نافذة تنبيه
|
عند تشغيل اختبارات الرحلة وكون موقع السائق والراكب متطابقين تماماً (مسافة أقل من 10 أمتار)، ينهار محرك الملاحة المكتوب بلغة C++ بسبب إحداثيات الصندوق المحيط (Bounds) ذات العرض الصفرى مطلقةً استثناء `std::domain_error`. لمنع ذلك، يقوم الكود بفحص المسافة، وفي حال كانت متطابقة يقوم بإظهار نافذة تنبيه
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[_showSameDeviceWarning](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L2171)
|
[_showSameDeviceWarning](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/map_driver_controller.dart#L2171)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
ثم الانتقال قسرياً لتطبيق زوم تقريبي آمن بدلاً من احتواء الحدود الصفرية.
|
ثم الانتقال قسرياً لتطبيق زوم تقريبي آمن بدلاً من احتواء الحدود الصفرية.
|
||||||
@@ -254,7 +254,7 @@ _cameraFollowTimer = Timer.periodic(const Duration(seconds: 8), (timer) { ... })
|
|||||||
لمنع إعادة رسم كامل خط المسار (Polyline) عند كل إرسال للموقع، يتم استخدام نافذة بحث منزلقة ثنائية الاتجاه تتكون من 60 نقطة (30 للخلف و 30 للأمام) في الدالة
|
لمنع إعادة رسم كامل خط المسار (Polyline) عند كل إرسال للموقع، يتم استخدام نافذة بحث منزلقة ثنائية الاتجاه تتكون من 60 نقطة (30 للخلف و 30 للأمام) في الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[_updateTraveledPolylineSmart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L2743)
|
[_updateTraveledPolylineSmart](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/map_driver_controller.dart#L2743)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
تحدد الدالة أقرب نقطة لموقع السائق الحالي على المسار المخزن، وتقوم بقطع الـ Polyline إلى جزأين: مسار مقطوع بلون رمادي ومسار متبقي بلون أزرق/أصفر، وتحديث الخريطة فقط عند تجاوز إزاحة تزيد عن 50 متراً.
|
تحدد الدالة أقرب نقطة لموقع السائق الحالي على المسار المخزن، وتقوم بقطع الـ Polyline إلى جزأين: مسار مقطوع بلون رمادي ومسار متبقي بلون أزرق/أصفر، وتحديث الخريطة فقط عند تجاوز إزاحة تزيد عن 50 متراً.
|
||||||
@@ -265,7 +265,7 @@ _cameraFollowTimer = Timer.periodic(const Duration(seconds: 8), (timer) { ... })
|
|||||||
عندما يكون موقع الراكب الفعلي بعيداً عن أقرب طريق إسفلتي متاح للسيارات، يتم استدعاء الدالة
|
عندما يكون موقع الراكب الفعلي بعيداً عن أقرب طريق إسفلتي متاح للسيارات، يتم استدعاء الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[_updatePassengerWalkLine](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L2857)
|
[_updatePassengerWalkLine](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/map_driver_controller.dart#L2857)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
والتي تقوم برسم خط منقط بلون أزرق رمادي مميز يمتد من نهاية طريق السيارات الإسفلتي إلى موقع الراكب الحقيقي لتوجيه السائق سيراً على الأقدام إذا لزم الأمر.
|
والتي تقوم برسم خط منقط بلون أزرق رمادي مميز يمتد من نهاية طريق السيارات الإسفلتي إلى موقع الراكب الحقيقي لتوجيه السائق سيراً على الأقدام إذا لزم الأمر.
|
||||||
@@ -279,7 +279,7 @@ _cameraFollowTimer = Timer.periodic(const Duration(seconds: 8), (timer) { ... })
|
|||||||
أثناء سير الرحلة، يعمل مؤقت دوري كل ثانية لحساب السعر الفعلي بشكل لحظي وعرضه في واجهة السائق عبر الدالة
|
أثناء سير الرحلة، يعمل مؤقت دوري كل ثانية لحساب السعر الفعلي بشكل لحظي وعرضه في واجهة السائق عبر الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[rideIsBeginPassengerTimer](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L1570)
|
[rideIsBeginPassengerTimer](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/map_driver_controller.dart#L1570)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
ويعتمد الحساب على القواعد البرمجية التالية:
|
ويعتمد الحساب على القواعد البرمجية التالية:
|
||||||
@@ -323,7 +323,7 @@ Price = (Distance_KM * Per_KM_Rate) + (Duration_Minutes * Per_Minute_Rate)
|
|||||||
يتم استدعاء الدالة
|
يتم استدعاء الدالة
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[_validateTripDistance](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L1458)
|
[_validateTripDistance](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/map_driver_controller.dart#L1458)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
والتي تقوم بحساب المسافة المستقيمة الفاصلة بين موقع انطلاق الرحلة (موقع الراكب الأصلي) والموقع الجغرافي الحالي للسائق. يشترط النظام أن تتجاوز هذه المسافة قيمة **خُمس المسافة الإجمالية المخططة للرحلة** (`plannedDistance / 5`).
|
والتي تقوم بحساب المسافة المستقيمة الفاصلة بين موقع انطلاق الرحلة (موقع الراكب الأصلي) والموقع الجغرافي الحالي للسائق. يشترط النظام أن تتجاوز هذه المسافة قيمة **خُمس المسافة الإجمالية المخططة للرحلة** (`plannedDistance / 5`).
|
||||||
@@ -345,7 +345,7 @@ Price = (Distance_KM * Per_KM_Rate) + (Duration_Minutes * Per_Minute_Rate)
|
|||||||
عند اجتياز فحص المسافة بنجاح، يتم تفعيل دالة الإنهاء الفعلي
|
عند اجتياز فحص المسافة بنجاح، يتم تفعيل دالة الإنهاء الفعلي
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
[finishRideFromDriver1](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L1363)
|
[finishRideFromDriver1](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/home/captin/map_driver_controller.dart#L1363)
|
||||||
|
|
||||||
<div dir="rtl" align="right">
|
<div dir="rtl" align="right">
|
||||||
والتي تقوم بإرسال طلبات التحديث المالي وإغلاق الرحلة في آن واحد إلى سيرفر العمليات وسيرفر المحفظة المالي بالتوازي عبر استدعاء
|
والتي تقوم بإرسال طلبات التحديث المالي وإغلاق الرحلة في آن واحد إلى سيرفر العمليات وسيرفر المحفظة المالي بالتوازي عبر استدعاء
|
||||||
|
|||||||
@@ -473,7 +473,7 @@ $redis->ltrim("competitor:price_history:$app_name", 0, 49);
|
|||||||
<div class="step-num">1</div>
|
<div class="step-num">1</div>
|
||||||
<div class="step-desc">
|
<div class="step-desc">
|
||||||
<div class="title">المدير يضغط "إطلاق حملة استعادة ذكية فوراً"</div>
|
<div class="title">المدير يضغط "إطلاق حملة استعادة ذكية فوراً"</div>
|
||||||
<div class="detail">من <span class="highlight-blue">siro_admin → Marketing Page</span></div>
|
<div class="detail">من <span class="highlight-blue">intaleq_admin → Marketing Page</span></div>
|
||||||
<div class="code">
|
<div class="code">
|
||||||
// Flutter Controller: marketing_controller.dart
|
// Flutter Controller: marketing_controller.dart
|
||||||
Future<void> triggerAICampaign() async {
|
Future<void> triggerAICampaign() async {
|
||||||
@@ -679,7 +679,7 @@ $priceToken = $encryptionHelper->encryptData(json_encode([
|
|||||||
<div class="step-desc">
|
<div class="step-desc">
|
||||||
<div class="title">اتصال السائق بالـ Socket</div>
|
<div class="title">اتصال السائق بالـ Socket</div>
|
||||||
<div class="code">
|
<div class="code">
|
||||||
// siro_driver → background_service.dart → Socket.IO
|
// intaleq_driver → background_service.dart → Socket.IO
|
||||||
socket = IO.io(AppLink.locationSocketUrl, OptionBuilder()
|
socket = IO.io(AppLink.locationSocketUrl, OptionBuilder()
|
||||||
.setQuery({'driver_id': driverId, 'token': token}));
|
.setQuery({'driver_id': driverId, 'token': token}));
|
||||||
|
|
||||||
@@ -766,7 +766,7 @@ function forwardLocationToPassengerSocket(...) {
|
|||||||
<div class="flow-title">
|
<div class="flow-title">
|
||||||
<span class="icon">📍</span>
|
<span class="icon">📍</span>
|
||||||
<span>المرحلة الثامنة: تطبيق السائق — الوجهة المقترحة والخلفية</span>
|
<span>المرحلة الثامنة: تطبيق السائق — الوجهة المقترحة والخلفية</span>
|
||||||
<span class="tag tag-info">siro_driver/</span>
|
<span class="tag tag-info">intaleq_driver/</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid-2">
|
<div class="grid-2">
|
||||||
@@ -830,7 +830,7 @@ socket.on('new_ride_request', (data) async {
|
|||||||
<div class="flow-title">
|
<div class="flow-title">
|
||||||
<span class="icon">📱</span>
|
<span class="icon">📱</span>
|
||||||
<span>المرحلة التاسعة: Admin App — لوحة التسويق الذكي</span>
|
<span>المرحلة التاسعة: Admin App — لوحة التسويق الذكي</span>
|
||||||
<span class="tag tag-info">siro_admin/</span>
|
<span class="tag tag-info">intaleq_admin/</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="step">
|
<div class="step">
|
||||||
@@ -911,7 +911,7 @@ POST /Admin/marketing/what_if_simulator.php?speed_price=8500&country_code=SY
|
|||||||
<div class="flow-title">
|
<div class="flow-title">
|
||||||
<span class="icon">🗣️</span>
|
<span class="icon">🗣️</span>
|
||||||
<span>المرحلة العاشرة: تطبيق الراكب — الملاحة والـ TTS</span>
|
<span>المرحلة العاشرة: تطبيق الراكب — الملاحة والـ TTS</span>
|
||||||
<span class="tag tag-info">siro_rider/</span>
|
<span class="tag tag-info">intaleq_rider/</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="step">
|
<div class="step">
|
||||||
@@ -927,7 +927,7 @@ POST /Admin/marketing/what_if_simulator.php?speed_price=8500&country_code=SY
|
|||||||
<div class="title">TTS (Text-to-Speech) Controller</div>
|
<div class="title">TTS (Text-to-Speech) Controller</div>
|
||||||
<div class="detail">تحويل إرشادات الملاحة إلى صوت بالعربية — إعلانات صوتية للمنعطفات</div>
|
<div class="detail">تحويل إرشادات الملاحة إلى صوت بالعربية — إعلانات صوتية للمنعطفات</div>
|
||||||
<div class="code">
|
<div class="code">
|
||||||
// siro_rider/lib/controller/functions/tts.dart
|
// intaleq_rider/lib/controller/functions/tts.dart
|
||||||
class TextToSpeechController extends GetxController {
|
class TextToSpeechController extends GetxController {
|
||||||
Future<void> speakText(String text) async {
|
Future<void> speakText(String text) async {
|
||||||
await flutterTts.setLanguage("ar-SA");
|
await flutterTts.setLanguage("ar-SA");
|
||||||
@@ -980,7 +980,7 @@ class TextToSpeechController extends GetxController {
|
|||||||
</div>
|
</div>
|
||||||
<div class="grid-2">
|
<div class="grid-2">
|
||||||
<div>
|
<div>
|
||||||
<div style="font-weight:700; margin-bottom:0.5rem; color:#3b82f6;">📱 siro_driver/</div>
|
<div style="font-weight:700; margin-bottom:0.5rem; color:#3b82f6;">📱 intaleq_driver/</div>
|
||||||
<div style="font-size:0.8rem; color:#94a3b8; line-height:1.8;">
|
<div style="font-size:0.8rem; color:#94a3b8; line-height:1.8;">
|
||||||
├── lib/constant/links.dart<br>
|
├── lib/constant/links.dart<br>
|
||||||
├── lib/controller/functions/background_service.dart<br>
|
├── lib/controller/functions/background_service.dart<br>
|
||||||
|
|||||||
@@ -245,8 +245,8 @@ if (statusRide == 'Begin' || currentRideState.value == RideState.inProgress) {
|
|||||||
|
|
||||||
## 🗂️ الملفات المرجعية
|
## 🗂️ الملفات المرجعية
|
||||||
|
|
||||||
- [ride_lifecycle_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_rider/lib/controller/home/map/ride_lifecycle_controller.dart) — المنطق الرئيسي
|
- [ride_lifecycle_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_rider/lib/controller/home/map/ride_lifecycle_controller.dart) — المنطق الرئيسي
|
||||||
- [map_socket_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_rider/lib/controller/home/map/map_socket_controller.dart) — إدارة WebSocket
|
- [map_socket_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_rider/lib/controller/home/map/map_socket_controller.dart) — إدارة WebSocket
|
||||||
- [map_screen_binding.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_rider/lib/controller/home/map/map_screen_binding.dart) — تسجيل الـ Controllers
|
- [map_screen_binding.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_rider/lib/controller/home/map/map_screen_binding.dart) — تسجيل الـ Controllers
|
||||||
- [siro_ride_simulation.html](file:///Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/siro_ride_simulation.html) — ملف المحاكاة التفاعلية
|
- [siro_ride_simulation.html](file:///Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/siro_ride_simulation.html) — ملف المحاكاة التفاعلية
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
# تقرير نظام تسجيل السائق — سوريا 🇸🇾
|
# تقرير نظام تسجيل السائق — سوريا 🇸🇾
|
||||||
|
|
||||||
> **ملف المحاكاة التفاعلية:** [siro_driver_registration_simulation.html](file:///Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/siro_driver_registration_simulation.html)
|
> **ملف المحاكاة التفاعلية:** [intaleq_driver_registration_simulation.html](file:///Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/intaleq_driver_registration_simulation.html)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -341,9 +341,9 @@ CREATE TABLE `driver_documents` (
|
|||||||
|
|
||||||
| الملف | الدور |
|
| الملف | الدور |
|
||||||
|-------|-------|
|
|-------|-------|
|
||||||
| [registration_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/auth/syria/registration_controller.dart) | Controller رئيسي — رفع الوثائق + تقديم التسجيل |
|
| [registration_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/auth/syria/registration_controller.dart) | Controller رئيسي — رفع الوثائق + تقديم التسجيل |
|
||||||
| [register_captin_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/auth/captin/register_captin_controller.dart) | تسجيل مبدئي + OTP |
|
| [register_captin_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/auth/captin/register_captin_controller.dart) | تسجيل مبدئي + OTP |
|
||||||
| [opt_token_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/auth/captin/opt_token_controller.dart) | إدارة OTP (120 ثانية countdown) |
|
| [opt_token_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/intaleq_driver/lib/controller/auth/captin/opt_token_controller.dart) | إدارة OTP (120 ثانية countdown) |
|
||||||
| [register_driver_and_car.php](file:///Users/hamzaaleghwairyeen/development/App/Siro/backend/auth/syria/driver/register_driver_and_car.php) | Backend — Gemini AI + DB Transaction |
|
| [register_driver_and_car.php](file:///Users/hamzaaleghwairyeen/development/App/Siro/backend/auth/syria/driver/register_driver_and_car.php) | Backend — Gemini AI + DB Transaction |
|
||||||
| [uploadSyrianDocs.php](file:///Users/hamzaaleghwairyeen/development/App/Siro/backend/auth/syria/uploadSyrianDocs.php) | Backend — رفع الوثائق + Signed URL |
|
| [uploadSyrianDocs.php](file:///Users/hamzaaleghwairyeen/development/App/Siro/backend/auth/syria/uploadSyrianDocs.php) | Backend — رفع الوثائق + Signed URL |
|
||||||
| [request.php](file:///Users/hamzaaleghwairyeen/development/App/Siro/backend/auth/otp/request.php) | Backend — إرسال OTP حسب الدولة |
|
| [request.php](file:///Users/hamzaaleghwairyeen/development/App/Siro/backend/auth/otp/request.php) | Backend — إرسال OTP حسب الدولة |
|
||||||
|
|||||||
@@ -29,9 +29,9 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 1.1 siro_admin - الإصدار القديم (GetX)
|
### 1.1 intaleq_admin - الإصدار القديم (GetX)
|
||||||
|
|
||||||
**الملف:** `siro_admin/lib/views/widgets/snackbar.dart`
|
**الملف:** `intaleq_admin/lib/views/widgets/snackbar.dart`
|
||||||
|
|
||||||
- يستخدم `Get.snackbar()` حصريًا
|
- يستخدم `Get.snackbar()` حصريًا
|
||||||
- يوجد دالتان فقط: `mySnackeBarError()` و `mySnackbarSuccess()`
|
- يوجد دالتان فقط: `mySnackeBarError()` و `mySnackbarSuccess()`
|
||||||
@@ -42,9 +42,9 @@
|
|||||||
- النصوص بالإنكليزية: `'Error'.tr`, `'Success'.tr`
|
- النصوص بالإنكليزية: `'Error'.tr`, `'Success'.tr`
|
||||||
- 30+ استخدامًا في التطبيق
|
- 30+ استخدامًا في التطبيق
|
||||||
|
|
||||||
### 1.2 siro_service - الإصدار القديم (GetX)
|
### 1.2 intaleq_service - الإصدار القديم (GetX)
|
||||||
|
|
||||||
**الملف:** `siro_service/lib/views/widgets/mycircular.dart`
|
**الملف:** `intaleq_service/lib/views/widgets/mycircular.dart`
|
||||||
|
|
||||||
- يستخدم `Get.snackbar()` حصريًا
|
- يستخدم `Get.snackbar()` حصريًا
|
||||||
- يوجد 3 دوال: `mySnackbarError()` و `mySnackbarWarning()` و `mySnackbarSuccess()`
|
- يوجد 3 دوال: `mySnackbarError()` و `mySnackbarWarning()` و `mySnackbarSuccess()`
|
||||||
@@ -52,9 +52,9 @@
|
|||||||
- نفس `SnackbarConfig` للثوابت
|
- نفس `SnackbarConfig` للثوابت
|
||||||
- 70+ استخدامًا في التطبيق
|
- 70+ استخدامًا في التطبيق
|
||||||
|
|
||||||
### 1.3 siro_driver - الإصدار الحديث (Custom Widget)
|
### 1.3 intaleq_driver - الإصدار الحديث (Custom Widget)
|
||||||
|
|
||||||
**الملف:** `siro_driver/lib/views/widgets/error_snakbar.dart`
|
**الملف:** `intaleq_driver/lib/views/widgets/error_snakbar.dart`
|
||||||
|
|
||||||
- ويج محسّن مخصص مع `_SnackContent` و `AnimationController`
|
- ويج محسّن مخصص مع `_SnackContent` و `AnimationController`
|
||||||
- يوجد 4 دوال: `mySnackbarSuccess()` و `mySnackeBarError()` و `mySnackbarInfo()` و `mySnackbarWarning()`
|
- يوجد 4 دوال: `mySnackbarSuccess()` و `mySnackeBarError()` و `mySnackbarInfo()` و `mySnackbarWarning()`
|
||||||
@@ -67,11 +67,11 @@
|
|||||||
- **مشكلة:** يستخدم `Get.snackbar()` الذي يرمي `FlutterError` إذا لم يكن `Overlay` جاهزًا
|
- **مشكلة:** يستخدم `Get.snackbar()` الذي يرمي `FlutterError` إذا لم يكن `Overlay` جاهزًا
|
||||||
- 100+ استخدامًا في التطبيق
|
- 100+ استخدامًا في التطبيق
|
||||||
|
|
||||||
### 1.4 siro_rider - الإصدار الحديث المحسّن (ScaffoldMessenger)
|
### 1.4 intaleq_rider - الإصدار الحديث المحسّن (ScaffoldMessenger)
|
||||||
|
|
||||||
**الملف:** `siro_rider/lib/views/widgets/error_snakbar.dart`
|
**الملف:** `intaleq_rider/lib/views/widgets/error_snakbar.dart`
|
||||||
|
|
||||||
- نفس تصميم `siro_driver` مع تحسينات جوهرية
|
- نفس تصميم `intaleq_driver` مع تحسينات جوهرية
|
||||||
- **يستخدم فقط `ScaffoldMessenger`** بدلاً من `Get.snackbar()` (لتجنب أخطاء `Overlay`)
|
- **يستخدم فقط `ScaffoldMessenger`** بدلاً من `Get.snackbar()` (لتجنب أخطاء `Overlay`)
|
||||||
- يحتوي على آلية إعادة محاولة (retry) تصل إلى 3 مرات
|
- يحتوي على آلية إعادة محاولة (retry) تصل إلى 3 مرات
|
||||||
- `messenger.clearSnackBars()` قبل العرض (يمنع التراكم)
|
- `messenger.clearSnackBars()` قبل العرض (يمنع التراكم)
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
|
|
||||||
### 1.5 دوال Toast البسيطة
|
### 1.5 دوال Toast البسيطة
|
||||||
|
|
||||||
- **siro_driver** و **siro_rider** لديهما `lib/controller/functions/toast.dart`
|
- **intaleq_driver** و **intaleq_rider** لديهما `lib/controller/functions/toast.dart`
|
||||||
- `Toast.show(BuildContext context, String message, Color color)` - دالة بسيطة جدًا
|
- `Toast.show(BuildContext context, String message, Color color)` - دالة بسيطة جدًا
|
||||||
- تستخدم `ScaffoldMessenger.of(context).showSnackBar()` مع `SnackBar` مادة
|
- تستخدم `ScaffoldMessenger.of(context).showSnackBar()` مع `SnackBar` مادة
|
||||||
- 10+ استخدامات في كل تطبيق
|
- 10+ استخدامات في كل تطبيق
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
|
|
||||||
### الفروقات بين الإصدارين (القديم والحديث)
|
### الفروقات بين الإصدارين (القديم والحديث)
|
||||||
|
|
||||||
| الخاصية | siro_admin (قديم) | siro_driver (حديث) | siro_rider (حديث) | siro_service (قديم) |
|
| الخاصية | intaleq_admin (قديم) | intaleq_driver (حديث) | intaleq_rider (حديث) | intaleq_service (قديم) |
|
||||||
|---------|:-----------------:|:------------------:|:-----------------:|:-------------------:|
|
|---------|:-----------------:|:------------------:|:-----------------:|:-------------------:|
|
||||||
| عدد الدوال | 2 | 4 | 4 | 3 |
|
| عدد الدوال | 2 | 4 | 4 | 3 |
|
||||||
| `mySnackbarWarning` | ❌ | ✅ | ✅ | ✅ |
|
| `mySnackbarWarning` | ❌ | ✅ | ✅ | ✅ |
|
||||||
@@ -111,7 +111,7 @@
|
|||||||
|
|
||||||
**الخطوة 1:** إنشاء مجلد مشترك (shared package) في المسار:
|
**الخطوة 1:** إنشاء مجلد مشترك (shared package) في المسار:
|
||||||
```
|
```
|
||||||
siro_admin/lib/shared/widgets/snackbar/
|
intaleq_admin/lib/shared/widgets/snackbar/
|
||||||
```
|
```
|
||||||
|
|
||||||
**الخطوة 2:** توحيد الواجهة (API) لتصبح:
|
**الخطوة 2:** توحيد الواجهة (API) لتصبح:
|
||||||
@@ -124,7 +124,7 @@ void mySnackbarWarning(String message);
|
|||||||
void mySnackbarInfo(String message);
|
void mySnackbarInfo(String message);
|
||||||
```
|
```
|
||||||
|
|
||||||
**الخطوة 3:** الاعتماد على `ScaffoldMessenger` فقط (مثل siro_rider) لتجنب مشاكل `Overlay` في GetX.
|
**الخطوة 3:** الاعتماد على `ScaffoldMessenger` فقط (مثل intaleq_rider) لتجنب مشاكل `Overlay` في GetX.
|
||||||
|
|
||||||
**الخطوة 4:** توحيد الألوان والثوابت:
|
**الخطوة 4:** توحيد الألوان والثوابت:
|
||||||
|
|
||||||
@@ -135,7 +135,7 @@ void mySnackbarInfo(String message);
|
|||||||
| info | `#1A73E8` (أزرق) | `#F0F6FF` | `info_rounded` |
|
| info | `#1A73E8` (أزرق) | `#F0F6FF` | `info_rounded` |
|
||||||
| warning | `#F29900` (برتقالي) | `#FFF8E6` | `warning_amber_rounded` |
|
| warning | `#F29900` (برتقالي) | `#FFF8E6` | `warning_amber_rounded` |
|
||||||
|
|
||||||
**الخطوة 5:** تحويل ملفات `toast.dart` في `siro_driver` و `siro_rider` لاستخدام دالة واحدة موحدة بدلاً من التكرار.
|
**الخطوة 5:** تحويل ملفات `toast.dart` في `intaleq_driver` و `intaleq_rider` لاستخدام دالة واحدة موحدة بدلاً من التكرار.
|
||||||
|
|
||||||
**الخطوة 6:** إزالة دوال `Get.snackbar()` المباشرة من جميع ملفات التحكم (controllers) والاستعاضة عنها بالدوال الموحدة.
|
**الخطوة 6:** إزالة دوال `Get.snackbar()` المباشرة من جميع ملفات التحكم (controllers) والاستعاضة عنها بالدوال الموحدة.
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@ void mySnackbarInfo(String message);
|
|||||||
```
|
```
|
||||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||||
│ طبقة العرض (Admin Dashboard) │
|
│ طبقة العرض (Admin Dashboard) │
|
||||||
│ siro_admin → لوحة تحكم المدير → Flutter Web │
|
│ intaleq_admin → لوحة تحكم المدير → Flutter Web │
|
||||||
│ endpoints: Admin/marketing/*.php │
|
│ endpoints: Admin/marketing/*.php │
|
||||||
├─────────────────────────────────────────────────────────────────────────────┤
|
├─────────────────────────────────────────────────────────────────────────────┤
|
||||||
│ طبقة API (PHP Backend) │
|
│ طبقة API (PHP Backend) │
|
||||||
@@ -559,8 +559,8 @@ Android Bot (Scraper) ←→ worker.php (API)
|
|||||||
|
|
||||||
### 8.2 ملفات ترحيل البصمات - مفتاح مشفر مكشوف
|
### 8.2 ملفات ترحيل البصمات - مفتاح مشفر مكشوف
|
||||||
|
|
||||||
#### `siro_admin/lib/views/admin/enceypt/fingerprint_migration.dart`
|
#### `intaleq_admin/lib/views/admin/enceypt/fingerprint_migration.dart`
|
||||||
#### `siro_admin/lib/views/admin/enceypt/driver_fingerprint_migration.dart`
|
#### `intaleq_admin/lib/views/admin/enceypt/driver_fingerprint_migration.dart`
|
||||||
- **الوصف:** أدوات Flutter لترحيل البصمات
|
- **الوصف:** أدوات Flutter لترحيل البصمات
|
||||||
- **الخطر:** يحتويان على مفتاح المشرف (admin key) بشكل نصي صريح:
|
- **الخطر:** يحتويان على مفتاح المشرف (admin key) بشكل نصي صريح:
|
||||||
```
|
```
|
||||||
@@ -595,7 +595,7 @@ Android Bot (Scraper) ←→ worker.php (API)
|
|||||||
- **الخطر:** إذا كان الوصول إليه ممكنًا عبر الويب، فإنه يسرب كامل قاعدة الشفرة
|
- **الخطر:** إذا كان الوصول إليه ممكنًا عبر الويب، فإنه يسرب كامل قاعدة الشفرة
|
||||||
- **التصنيف:** ⚠️ متوسط - انقل خارج جذر الويب أو احذف
|
- **التصنيف:** ⚠️ متوسط - انقل خارج جذر الويب أو احذف
|
||||||
|
|
||||||
#### `siro_admin/lib/debug_jwt.dart`
|
#### `intaleq_admin/lib/debug_jwt.dart`
|
||||||
- **الوصف:** سكربت Flutter لاختبار JWT
|
- **الوصف:** سكربت Flutter لاختبار JWT
|
||||||
- **الخطر:** يكشف بنية JWT ومنهجية التشفير
|
- **الخطر:** يكشف بنية JWT ومنهجية التشفير
|
||||||
- **التصنيف:** ⚠️ منخفض - احذف من بنية الإنتاج
|
- **التصنيف:** ⚠️ منخفض - احذف من بنية الإنتاج
|
||||||
@@ -620,8 +620,8 @@ Android Bot (Scraper) ←→ worker.php (API)
|
|||||||
| `backend/Admin/Staff/setup.php` | إعادة تعيين الصلاحيات |
|
| `backend/Admin/Staff/setup.php` | إعادة تعيين الصلاحيات |
|
||||||
| `backend/auth/Tester/getTesterApp.php` | SQL Injection + لا مصادقة |
|
| `backend/auth/Tester/getTesterApp.php` | SQL Injection + لا مصادقة |
|
||||||
| `backend/auth/Tester/updateTesterApp.php` | SQL Injection + لا مصادقة |
|
| `backend/auth/Tester/updateTesterApp.php` | SQL Injection + لا مصادقة |
|
||||||
| `siro_admin/lib/views/admin/enceypt/fingerprint_migration.dart` | مفتاح مكشوف 🔥 |
|
| `intaleq_admin/lib/views/admin/enceypt/fingerprint_migration.dart` | مفتاح مكشوف 🔥 |
|
||||||
| `siro_admin/lib/views/admin/enceypt/driver_fingerprint_migration.dart` | مفتاح مكشوف 🔥 |
|
| `intaleq_admin/lib/views/admin/enceypt/driver_fingerprint_migration.dart` | مفتاح مكشوف 🔥 |
|
||||||
|
|
||||||
### أولوية متوسطة - أمان أو تنظيف 🟡
|
### أولوية متوسطة - أمان أو تنظيف 🟡
|
||||||
|
|
||||||
@@ -634,7 +634,7 @@ Android Bot (Scraper) ←→ worker.php (API)
|
|||||||
| `backend/migration/update_fingerprint_admin.php` | ترحيل بصمات - احذف بعد التأكد |
|
| `backend/migration/update_fingerprint_admin.php` | ترحيل بصمات - احذف بعد التأكد |
|
||||||
| `backend/migration/update_driver_fingerprint_admin.php` | ترحيل بصمات - احذف بعد التأكد |
|
| `backend/migration/update_driver_fingerprint_admin.php` | ترحيل بصمات - احذف بعد التأكد |
|
||||||
| `backend/Admin/auth/register.php` | مراجعة - هل ما زال مستخدمًا؟ |
|
| `backend/Admin/auth/register.php` | مراجعة - هل ما زال مستخدمًا؟ |
|
||||||
| `siro_admin/lib/debug_jwt.dart` | تصحيح JWT - احذف من الإنتاج |
|
| `intaleq_admin/lib/debug_jwt.dart` | تصحيح JWT - احذف من الإنتاج |
|
||||||
| `backend/intaleq_v1_secure_latest.md` (33k سطر) | كود مصدر كامل - انقل أو احذف |
|
| `backend/intaleq_v1_secure_latest.md` (33k سطر) | كود مصدر كامل - انقل أو احذف |
|
||||||
|
|
||||||
### أولوية منخفضة - تحسين أمني 🟢
|
### أولوية منخفضة - تحسين أمني 🟢
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ Timeout: 120 ثانية للرفع
|
|||||||
|
|
||||||
## 6. تصنيف فئات الأجهزة
|
## 6. تصنيف فئات الأجهزة
|
||||||
|
|
||||||
### 6.1 Device Tier (siro_rider/lib/controller/home/device_tier.dart)
|
### 6.1 Device Tier (intaleq_rider/lib/controller/home/device_tier.dart)
|
||||||
```
|
```
|
||||||
نظام تسجيل بناءً على:
|
نظام تسجيل بناءً على:
|
||||||
- Android SDK version (الأقدم = أعلى نقاط = أضعف)
|
- Android SDK version (الأقدم = أعلى نقاط = أضعف)
|
||||||
@@ -230,7 +230,7 @@ Timeout: 120 ثانية للرفع
|
|||||||
- Clobal (يحفظ لمدة 24 ساعة)
|
- Clobal (يحفظ لمدة 24 ساعة)
|
||||||
```
|
```
|
||||||
|
|
||||||
### 6.2 Device Performance (siro_rider/lib/controller/home/device_performance.dart)
|
### 6.2 Device Performance (intaleq_rider/lib/controller/home/device_performance.dart)
|
||||||
```
|
```
|
||||||
نظام White-List للأجهزة عالية الأداء:
|
نظام White-List للأجهزة عالية الأداء:
|
||||||
- Samsung: S21+ (SM-S), Fold/Flip (SM-F), Note 9+ (SM-N9), S10/S20 (SM-G9)
|
- Samsung: S21+ (SM-S), Fold/Flip (SM-F), Note 9+ (SM-N9), S10/S20 (SM-G9)
|
||||||
@@ -249,7 +249,7 @@ lowPerf = (sdk < 28) || (ram > 0 && ram < 3 * 1024 * 1024 * 1024);
|
|||||||
// يخفض زوم الخريطة من 15 إلى 14.5
|
// يخفض زوم الخريطة من 15 إلى 14.5
|
||||||
```
|
```
|
||||||
|
|
||||||
### 6.4 Device Analyzer (siro_driver/lib/controller/functions/device_analyzer.dart)
|
### 6.4 Device Analyzer (intaleq_driver/lib/controller/functions/device_analyzer.dart)
|
||||||
```
|
```
|
||||||
نظام تسجيل كامل (100 نقطة كحد أقصى):
|
نظام تسجيل كامل (100 نقطة كحد أقصى):
|
||||||
1. Android version (max 10pts)
|
1. Android version (max 10pts)
|
||||||
|
|||||||
@@ -51,7 +51,7 @@
|
|||||||
┌────────────────────────────────────────────────────────────────────┐
|
┌────────────────────────────────────────────────────────────────────┐
|
||||||
│ FLUTTER APPS │
|
│ FLUTTER APPS │
|
||||||
│ ┌──────────────┐ ┌──────────────┐ ┌────────────┐ ┌─────────┐ │
|
│ ┌──────────────┐ ┌──────────────┐ ┌────────────┐ ┌─────────┐ │
|
||||||
│ │ siro_rider │ │ siro_driver │ │ siro_admin │ │ service │ │
|
│ │ intaleq_rider │ │ intaleq_driver │ │ intaleq_admin │ │ service │ │
|
||||||
│ │ (Passenger) │ │ (Captain) │ │ (Web/PWA) │ │ (Agent) │ │
|
│ │ (Passenger) │ │ (Captain) │ │ (Web/PWA) │ │ (Agent) │ │
|
||||||
│ └───────┬──────┘ └──────┬───────┘ └─────┬──────┘ └────┬────┘ │
|
│ └───────┬──────┘ └──────┬───────┘ └─────┬──────┘ └────┬────┘ │
|
||||||
└──────────┼─────────────────┼─────────────────┼──────────────┼──────┘
|
└──────────┼─────────────────┼─────────────────┼──────────────┼──────┘
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
|
|
||||||
## 3. All Features Matrix
|
## 3. All Features Matrix
|
||||||
|
|
||||||
### Passenger Features (siro_rider)
|
### Passenger Features (intaleq_rider)
|
||||||
|
|
||||||
| Category | Feature | Status | Competitive Value |
|
| Category | Feature | Status | Competitive Value |
|
||||||
|----------|---------|--------|-------------------|
|
|----------|---------|--------|-------------------|
|
||||||
@@ -165,7 +165,7 @@
|
|||||||
| **Other** | App shortcuts (quick actions) | ✅ Live | ⭐⭐⭐ |
|
| **Other** | App shortcuts (quick actions) | ✅ Live | ⭐⭐⭐ |
|
||||||
| **Other** | Multiple themes | ✅ Live | ⭐⭐⭐ |
|
| **Other** | Multiple themes | ✅ Live | ⭐⭐⭐ |
|
||||||
|
|
||||||
### Driver/Captain Features (siro_driver)
|
### Driver/Captain Features (intaleq_driver)
|
||||||
|
|
||||||
| Category | Feature | Status | Competitive Value |
|
| Category | Feature | Status | Competitive Value |
|
||||||
|----------|---------|--------|-------------------|
|
|----------|---------|--------|-------------------|
|
||||||
@@ -230,7 +230,7 @@
|
|||||||
| **Profile** | Using app guide | ✅ Live | ⭐⭐⭐ |
|
| **Profile** | Using app guide | ✅ Live | ⭐⭐⭐ |
|
||||||
| **Profile** | Video tutorials | ✅ Live | ⭐⭐⭐ |
|
| **Profile** | Video tutorials | ✅ Live | ⭐⭐⭐ |
|
||||||
|
|
||||||
### Admin Features (siro_admin)
|
### Admin Features (intaleq_admin)
|
||||||
|
|
||||||
| Category | Feature | Status | Competitive Value |
|
| Category | Feature | Status | Competitive Value |
|
||||||
|----------|---------|--------|-------------------|
|
|----------|---------|--------|-------------------|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ANDROID AUTO (`siro_driver`)
|
## ANDROID AUTO (`intaleq_driver`)
|
||||||
|
|
||||||
### 1. AndroidManifest.xml
|
### 1. AndroidManifest.xml
|
||||||
| Requirement | Status | File | Notes |
|
| Requirement | Status | File | Notes |
|
||||||
@@ -85,7 +85,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## APPLE CARPLAY (`siro_driver`)
|
## APPLE CARPLAY (`intaleq_driver`)
|
||||||
|
|
||||||
### 1. Entitlements
|
### 1. Entitlements
|
||||||
| Requirement | Status | File | Notes |
|
| Requirement | Status | File | Notes |
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ANDROID AUTO (`siro_driver`)
|
## ANDROID AUTO (`intaleq_driver`)
|
||||||
|
|
||||||
### 1. AndroidManifest.xml
|
### 1. AndroidManifest.xml
|
||||||
| المتطلب | الحالة | الملف | ملاحظات |
|
| المتطلب | الحالة | الملف | ملاحظات |
|
||||||
@@ -85,7 +85,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## APPLE CARPLAY (`siro_driver`)
|
## APPLE CARPLAY (`intaleq_driver`)
|
||||||
|
|
||||||
### 1. الاستحقاقات (Entitlements)
|
### 1. الاستحقاقات (Entitlements)
|
||||||
| المتطلب | الحالة | الملف | ملاحظات |
|
| المتطلب | الحالة | الملف | ملاحظات |
|
||||||
@@ -279,7 +279,7 @@
|
|||||||
|
|
||||||
```dart
|
```dart
|
||||||
class CarPlatformBridge {
|
class CarPlatformBridge {
|
||||||
static const _channel = MethodChannel('com.siro.siro_driver/car_navigation');
|
static const _channel = MethodChannel('com.siro.intaleq_driver/car_navigation');
|
||||||
|
|
||||||
// تحديث حالة التنقل الكاملة (للبدء/التحديث)
|
// تحديث حالة التنقل الكاملة (للبدء/التحديث)
|
||||||
static Future<void> updateNavState({
|
static Future<void> updateNavState({
|
||||||
@@ -423,7 +423,7 @@ void clearRoute() {
|
|||||||
## ملاحظات للمطورين (Developer Notes)
|
## ملاحظات للمطورين (Developer Notes)
|
||||||
|
|
||||||
### لنقل الكود لتطبيق الراكب (Rider App) لاحقاً:
|
### لنقل الكود لتطبيق الراكب (Rider App) لاحقاً:
|
||||||
1. **Android Auto**: انسخ ملفات `MyCarAppService.kt`، `MyCarSession.kt`، `MyCarScreen.kt`، `MapPresentation.kt`، `CarNavigationData.kt`، وعدل `package` إلى `com.siro.siro_rider`
|
1. **Android Auto**: انسخ ملفات `MyCarAppService.kt`، `MyCarSession.kt`، `MyCarScreen.kt`، `MapPresentation.kt`، `CarNavigationData.kt`، وعدل `package` إلى `com.siro.intaleq_rider`
|
||||||
2. **iOS CarPlay**: انسخ `CarPlaySceneDelegate.swift`، عدّل `AppDelegate.swift` لإضافة جسر `car_navigation`، حدث `Info.plist` و `Runner.entitlements`
|
2. **iOS CarPlay**: انسخ `CarPlaySceneDelegate.swift`، عدّل `AppDelegate.swift` لإضافة جسر `car_navigation`، حدث `Info.plist` و `Runner.entitlements`
|
||||||
3. **Flutter**: `CarPlatformBridge.dart` مشترك، فقط تأكد من تهيئته في `main.dart` للراكب وربطه بـ `NavigationController` الخاص بالراكب
|
3. **Flutter**: `CarPlatformBridge.dart` مشترك، فقط تأكد من تهيئته في `main.dart` للراكب وربطه بـ `NavigationController` الخاص بالراكب
|
||||||
4. **الأذونات**: نفس أذونات الموقع والخلفية مطلوبة
|
4. **الأذونات**: نفس أذونات الموقع والخلفية مطلوبة
|
||||||
@@ -437,4 +437,4 @@ void clearRoute() {
|
|||||||
---
|
---
|
||||||
|
|
||||||
*تم إنشاء هذا التقرير بتاريخ: 2026-07-04*
|
*تم إنشاء هذا التقرير بتاريخ: 2026-07-04*
|
||||||
*استناداً إلى: `docs/auto_carplay_checklist.md` (النسخة الإنجليزية) ومراجعة الكود الكامل لتطبيق `siro_driver`*
|
*استناداً إلى: `docs/auto_carplay_checklist.md` (النسخة الإنجليزية) ومراجعة الكود الكامل لتطبيق `intaleq_driver`*
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# مراجعة شاملة لنظام مواصلاتي — 2026-07-12
|
# مراجعة شاملة لنظام مواصلاتي — 2026-07-12
|
||||||
|
|
||||||
دراسة كاملة للنظام عبر: الباك اند (`backend/transit/` + `backend/Admin/transit/`)، سيرفرات السوكيت (`loction_server/driver_socket.php` + `passenger_server/passenger_socket.php`)، والتطبيقات الثلاثة (siro_rider / siro_driver / siro_admin).
|
دراسة كاملة للنظام عبر: الباك اند (`backend/transit/` + `backend/Admin/transit/`)، سيرفرات السوكيت (`loction_server/driver_socket.php` + `passenger_server/passenger_socket.php`)، والتطبيقات الثلاثة (intaleq_rider / intaleq_driver / intaleq_admin).
|
||||||
|
|
||||||
كل مهمة في القسم الأخير مكتوبة كأمر مستقل جاهز للتنفيذ على نموذج آخر — تحتوي المسارات والسياق الكافي.
|
كل مهمة في القسم الأخير مكتوبة كأمر مستقل جاهز للتنفيذ على نموذج آخر — تحتوي المسارات والسياق الكافي.
|
||||||
|
|
||||||
@@ -85,18 +85,18 @@
|
|||||||
- لا إلغاء رحلة (enum فيه cancelled/no_show بلا endpoint)
|
- لا إلغاء رحلة (enum فيه cancelled/no_show بلا endpoint)
|
||||||
- لا قائمة كشوف مستوردة (rosters list) ولا سجل إعلانات (broadcasts list — موجود جزئياً في dashboard آخر 5)
|
- لا قائمة كشوف مستوردة (rosters list) ولا سجل إعلانات (broadcasts list — موجود جزئياً في dashboard آخر 5)
|
||||||
|
|
||||||
### فريق سيرو (siro_admin)
|
### فريق سيرو (intaleq_admin)
|
||||||
- اعتماد الخطوط (النقطة أعلاه) — endpoint + شاشة
|
- اعتماد الخطوط (النقطة أعلاه) — endpoint + شاشة
|
||||||
- إدارة حالة العقد (trial/active/suspended/terminated) — لا endpoint ولا UI
|
- إدارة حالة العقد (trial/active/suspended/terminated) — لا endpoint ولا UI
|
||||||
- تعديل بيانات مؤسسة قائمة
|
- تعديل بيانات مؤسسة قائمة
|
||||||
|
|
||||||
### الراكب (siro_rider)
|
### الراكب (intaleq_rider)
|
||||||
- **اشتراك FCM Topic فعلي غائب**: التطبيق لا يستدعي `subscribeToTopic('transit_route_{id}')` ولا `transit_org_{id}` — إشعارات الانطلاق/التأخير/الإعلانات لا تصل لأحد
|
- **اشتراك FCM Topic فعلي غائب**: التطبيق لا يستدعي `subscribeToTopic('transit_route_{id}')` ولا `transit_org_{id}` — إشعارات الانطلاق/التأخير/الإعلانات لا تصل لأحد
|
||||||
- إشعار الموافقة على العضوية يُرسل لموضوع `passenger_{id}` والتطبيق يشترك فقط بموضوع `"passengers"` العام — لا يصل. الحل: اشتراك التطبيق بموضوعه الشخصي عند تسجيل الدخول، أو تغيير آلية الإرسال
|
- إشعار الموافقة على العضوية يُرسل لموضوع `passenger_{id}` والتطبيق يشترك فقط بموضوع `"passengers"` العام — لا يصل. الحل: اشتراك التطبيق بموضوعه الشخصي عند تسجيل الدخول، أو تغيير آلية الإرسال
|
||||||
- الخريطة الحية لا ترسم polyline الخط (البيانات موجودة في `trip/live.php`؛ متوفر `PolylineUtils.decode` في intaleq_maps) ولا أيقونة باص مخصصة (ماركر hue فقط)
|
- الخريطة الحية لا ترسم polyline الخط (البيانات موجودة في `trip/live.php`؛ متوفر `PolylineUtils.decode` في intaleq_maps) ولا أيقونة باص مخصصة (ماركر hue فقط)
|
||||||
- زر "فاتك الباص؟ اطلب سيارة" — الميزة التسويقية الأساسية من الرؤية، غير مبنية
|
- زر "فاتك الباص؟ اطلب سيارة" — الميزة التسويقية الأساسية من الرؤية، غير مبنية
|
||||||
|
|
||||||
### السائق (siro_driver)
|
### السائق (intaleq_driver)
|
||||||
- **كشف الوصول للمحطات (geofence) غير مبني**: لا منطق يكتشف دخول نطاق محطة ويرسل `current_stop_seq` — تتبع تقدّم الباص على المحطات لا يعمل
|
- **كشف الوصول للمحطات (geofence) غير مبني**: لا منطق يكتشف دخول نطاق محطة ويرسل `current_stop_seq` — تتبع تقدّم الباص على المحطات لا يعمل
|
||||||
- خدمة الخلفية (`background_service.dart`) لها سوكيت مستقل غير واعٍ لوضع الباص — عند طيّ التطبيق أثناء رحلة باص قد يعود البث العادي (تلوث حوض الرحلات) ويتوقف بث الباص. تحتاج مراجعة وتمرير حالة وضع الباص
|
- خدمة الخلفية (`background_service.dart`) لها سوكيت مستقل غير واعٍ لوضع الباص — عند طيّ التطبيق أثناء رحلة باص قد يعود البث العادي (تلوث حوض الرحلات) ويتوقف بث الباص. تحتاج مراجعة وتمرير حالة وضع الباص
|
||||||
- لا معالج deep link لرابط الدعوة `siromove.com/driver/transit-activate?token=` (يُحل ضمن مسار التفعيل الجديد بالنقطة 3-ب)
|
- لا معالج deep link لرابط الدعوة `siromove.com/driver/transit-activate?token=` (يُحل ضمن مسار التفعيل الجديد بالنقطة 3-ب)
|
||||||
@@ -141,10 +141,10 @@ route/update + route/submit (طلب اعتماد) · schedule/delete · vehicle/
|
|||||||
كل بند أدناه Prompt مستقل. نفّذها بالترتيب؛ المهام 1–4 شرط لأي إطلاق تجريبي.
|
كل بند أدناه Prompt مستقل. نفّذها بالترتيب؛ المهام 1–4 شرط لأي إطلاق تجريبي.
|
||||||
|
|
||||||
### المهمة 1 — إغلاق IDOR وربط حساب السائق (حرجة، باك اند + فلاتر)
|
### المهمة 1 — إغلاق IDOR وربط حساب السائق (حرجة، باك اند + فلاتر)
|
||||||
> في مشروع Siro: أصلح ثغرة IDOR في `backend/transit/trip/today.php` و`start.php` و`end.php` و`delay.php` — جميعها تثق بـ `driver_transit_id` من العميل. المطلوب: (1) في كل ملف اشترط `$transit_user_role === 'driver'` ثم استخرج سجل السائق بـ `SELECT id, org_id FROM transit_drivers WHERE main_driver_id = ? AND status='active'` باستخدام `$transit_user_id` من `connect_app.php`، وتجاهل `driver_transit_id` القادم من العميل. (2) أنشئ `backend/transit/driver/activate_by_app.php` يعمل عبر `connect_app.php` بدور driver: يستقبل `invite_token` فقط، يطابقه في `transit_drivers`، يضبط `main_driver_id = $transit_user_id` و`status='active'` و`activated_at=NOW()` ويصفّر التوكن — هذا يحل مشكلة أن `main_driver_id` لا يُضبط أبداً حالياً. (3) في `siro_driver/lib/controller/transit/transit_driver_service.dart` أضف دالة `activateByInviteToken` وأنشئ شاشة إدخال رمز الدعوة تُعرض داخل `transit_driver_home_page.dart` عندما `is_bus_driver=false`، مع معالجة deep link للمسار `siromove.com/driver/transit-activate?token=`. (4) احذف `backend/transit/driver/activate.php` القديم (مساره ميت — لا مصدر OTP له) وحدّث نص رسالة الواتساب في `driver/invite.php` ليوجّه لفتح تطبيق السائق. اتبع أنماط النظام: `filterRequest`, `jsonSuccess/jsonError`, `appLog`. لينت PHP وDart بعد كل تعديل.
|
> في مشروع Siro: أصلح ثغرة IDOR في `backend/transit/trip/today.php` و`start.php` و`end.php` و`delay.php` — جميعها تثق بـ `driver_transit_id` من العميل. المطلوب: (1) في كل ملف اشترط `$transit_user_role === 'driver'` ثم استخرج سجل السائق بـ `SELECT id, org_id FROM transit_drivers WHERE main_driver_id = ? AND status='active'` باستخدام `$transit_user_id` من `connect_app.php`، وتجاهل `driver_transit_id` القادم من العميل. (2) أنشئ `backend/transit/driver/activate_by_app.php` يعمل عبر `connect_app.php` بدور driver: يستقبل `invite_token` فقط، يطابقه في `transit_drivers`، يضبط `main_driver_id = $transit_user_id` و`status='active'` و`activated_at=NOW()` ويصفّر التوكن — هذا يحل مشكلة أن `main_driver_id` لا يُضبط أبداً حالياً. (3) في `intaleq_driver/lib/controller/transit/transit_driver_service.dart` أضف دالة `activateByInviteToken` وأنشئ شاشة إدخال رمز الدعوة تُعرض داخل `transit_driver_home_page.dart` عندما `is_bus_driver=false`، مع معالجة deep link للمسار `siromove.com/driver/transit-activate?token=`. (4) احذف `backend/transit/driver/activate.php` القديم (مساره ميت — لا مصدر OTP له) وحدّث نص رسالة الواتساب في `driver/invite.php` ليوجّه لفتح تطبيق السائق. اتبع أنماط النظام: `filterRequest`, `jsonSuccess/jsonError`, `appLog`. لينت PHP وDart بعد كل تعديل.
|
||||||
|
|
||||||
### المهمة 2 — اعتماد الخطوط draft→active (حرجة، باك اند + سيرو آدمن)
|
### المهمة 2 — اعتماد الخطوط draft→active (حرجة، باك اند + سيرو آدمن)
|
||||||
> في مشروع Siro: لا يوجد أي مسار يحوّل خط مواصلاتي من draft إلى active، فالراكب لا يرى الخطوط أبداً. المطلوب: (1) أنشئ `backend/Admin/transit/route/approve.php` بنمط ملفات `backend/Admin/transit/org/` (فحص `$role` admin/super_admin، `Database::get('transit')`): يستقبل route_id و action (approve|suspend|reject)، يحدّث `transit_routes.status` و`approved_by` (من `$user_id` بالـ JWT) و`approved_at`. (2) أنشئ `backend/Admin/transit/route/pending.php` يرجع كل خطوط draft عبر المؤسسات مع اسم المؤسسة وعدد المحطات. (3) في siro_admin أضف شاشة "اعتماد الخطوط" (`lib/views/transit/route_approval_page.dart` بنفس ثيم `org_list_page.dart` الداكن) تعرض المسودات مع محطاتها على خريطة مصغرة إن أمكن وزرّي اعتماد/رفض، واربطها من `admin_home_page.dart` فئة مواصلاتي، ووسّع `transit_admin_service.dart` و`transit_admin_controller.dart`. لينت كل شيء.
|
> في مشروع Siro: لا يوجد أي مسار يحوّل خط مواصلاتي من draft إلى active، فالراكب لا يرى الخطوط أبداً. المطلوب: (1) أنشئ `backend/Admin/transit/route/approve.php` بنمط ملفات `backend/Admin/transit/org/` (فحص `$role` admin/super_admin، `Database::get('transit')`): يستقبل route_id و action (approve|suspend|reject)، يحدّث `transit_routes.status` و`approved_by` (من `$user_id` بالـ JWT) و`approved_at`. (2) أنشئ `backend/Admin/transit/route/pending.php` يرجع كل خطوط draft عبر المؤسسات مع اسم المؤسسة وعدد المحطات. (3) في intaleq_admin أضف شاشة "اعتماد الخطوط" (`lib/views/transit/route_approval_page.dart` بنفس ثيم `org_list_page.dart` الداكن) تعرض المسودات مع محطاتها على خريطة مصغرة إن أمكن وزرّي اعتماد/رفض، واربطها من `admin_home_page.dart` فئة مواصلاتي، ووسّع `transit_admin_service.dart` و`transit_admin_controller.dart`. لينت كل شيء.
|
||||||
|
|
||||||
### المهمة 3 — تحقق العضوية في اشتراك السوكيت (حرجة، باك اند + سوكيت)
|
### المهمة 3 — تحقق العضوية في اشتراك السوكيت (حرجة، باك اند + سوكيت)
|
||||||
> في مشروع Siro: `subscribe_transit_route` في `passenger_server/passenger_socket.php` يضم أي راكب لأي غرفة خط دون تحقق. المطلوب: (1) في `backend/transit/functions.php` أضف `transitCacheEnrollment(int $orgId, string $passengerId)` تكتب `SADD transit:org_members:{orgId}` على `$redisLocation` (بدون بادئة) مع TTL تجديدي 7 أيام، و`transitDropEnrollment` للحذف. استدعِ الإضافة عند تفعيل العضوية في `enrollment/activate.php` (الحالتان) وعند الموافقة في `enrollment/approve.php`، والحذف عند الرفض/التعليق. (2) أنشئ سكربت `backend/transit/cron_sync_members.php` يعيد بناء المجموعات من MySQL (للتشغيل اليدوي والكرون اليومي). (3) في `passenger_socket.php` عند `subscribe_transit_route` استعلم Redis المحلي: خذ org_id للخط من هاش جديد `transit:route_org:{routeId}` (اكتبه من `route/add.php` وapprove في المهمة 2) ثم `SISMEMBER transit:org_members:{orgId} passengerId` — ارفض الانضمام إن لم يكن عضواً وسجّل بالـ log. انتبه: سوكيت الراكب يتصل بـ Redis؟ إن لم يكن فيه اتصال Redis أضف واحداً بنمط `getRedis()` من `loction_server/driver_socket.php`. لينت PHP.
|
> في مشروع Siro: `subscribe_transit_route` في `passenger_server/passenger_socket.php` يضم أي راكب لأي غرفة خط دون تحقق. المطلوب: (1) في `backend/transit/functions.php` أضف `transitCacheEnrollment(int $orgId, string $passengerId)` تكتب `SADD transit:org_members:{orgId}` على `$redisLocation` (بدون بادئة) مع TTL تجديدي 7 أيام، و`transitDropEnrollment` للحذف. استدعِ الإضافة عند تفعيل العضوية في `enrollment/activate.php` (الحالتان) وعند الموافقة في `enrollment/approve.php`، والحذف عند الرفض/التعليق. (2) أنشئ سكربت `backend/transit/cron_sync_members.php` يعيد بناء المجموعات من MySQL (للتشغيل اليدوي والكرون اليومي). (3) في `passenger_socket.php` عند `subscribe_transit_route` استعلم Redis المحلي: خذ org_id للخط من هاش جديد `transit:route_org:{routeId}` (اكتبه من `route/add.php` وapprove في المهمة 2) ثم `SISMEMBER transit:org_members:{orgId} passengerId` — ارفض الانضمام إن لم يكن عضواً وسجّل بالـ log. انتبه: سوكيت الراكب يتصل بـ Redis؟ إن لم يكن فيه اتصال Redis أضف واحداً بنمط `getRedis()` من `loction_server/driver_socket.php`. لينت PHP.
|
||||||
@@ -153,22 +153,22 @@ route/update + route/submit (طلب اعتماد) · schedule/delete · vehicle/
|
|||||||
> في مشروع Siro: (1) أضف `RateLimiter($redis)->enforce(RateLimiter::identifier(), 'api')` (كما في `backend/transit/connect_app.php`) إلى: `backend/transit/admin/login_request.php`، `login_verify.php`، و`backend/transit/connect_admin.php`. (2) في `login_request.php` وحّد الرد: عند هاتف غير موجود أعد نفس رسالة النجاح دون إرسال OTP (منع تعداد المشرفين). (3) احذف `backend/transit/trip/update_position.php` نهائياً (fallback مهجور بلا مصادقة — المسار الفعلي عبر السوكيت). (4) أنشئ `backend/transit/admin/logout.php` يحذف الجلسة من Redis (`siro:transit:session:{hash}`) وMySQL. (5) أضف تنظيف `DELETE FROM transit_sessions WHERE expires_at < NOW()` إلى سكربت كرون التنظيف القائم في الباك اند (ابحث عن كرونات التنظيف الموجودة واتبع نمطها). لينت.
|
> في مشروع Siro: (1) أضف `RateLimiter($redis)->enforce(RateLimiter::identifier(), 'api')` (كما في `backend/transit/connect_app.php`) إلى: `backend/transit/admin/login_request.php`، `login_verify.php`، و`backend/transit/connect_admin.php`. (2) في `login_request.php` وحّد الرد: عند هاتف غير موجود أعد نفس رسالة النجاح دون إرسال OTP (منع تعداد المشرفين). (3) احذف `backend/transit/trip/update_position.php` نهائياً (fallback مهجور بلا مصادقة — المسار الفعلي عبر السوكيت). (4) أنشئ `backend/transit/admin/logout.php` يحذف الجلسة من Redis (`siro:transit:session:{hash}`) وMySQL. (5) أضف تنظيف `DELETE FROM transit_sessions WHERE expires_at < NOW()` إلى سكربت كرون التنظيف القائم في الباك اند (ابحث عن كرونات التنظيف الموجودة واتبع نمطها). لينت.
|
||||||
|
|
||||||
### المهمة 5 — إشعارات FCM فعلية (عالية، فلاتر رايدر + باك اند)
|
### المهمة 5 — إشعارات FCM فعلية (عالية، فلاتر رايدر + باك اند)
|
||||||
> في مشروع Siro: الإشعارات لا تصل لأن الاشتراك بالمواضيع غير مبني. المطلوب: (1) في `siro_rider/lib/controller/firebase/firbase_messge.dart` يوجد `subscribeToTopic("passengers")` — أضف بعده اشتراكاً بالموضوع الشخصي `passenger_{id}` من `box.read(BoxName.passengerID)`. (2) في `siro_rider/lib/controller/transit/transit_controller.dart`: عند نجاح `activateEnrollment` اشترك بـ `transit_org_{orgId}`، وفي `openLiveRoute`/زر جديد "تنبيهات الخط" اشترك بـ `transit_route_{routeId}` عبر `FirebaseMessaging.instance.subscribeToTopic` مع استدعاء `backend/transit/notification/subscribe.php` القائم لتسجيل المحطة المفضلة، ومع إلغاء الاشتراك المقابل. (3) تحقق أن معالج الرسائل الحالي يعرض إشعارات data type=transit_* عندما يكون التطبيق بالمقدمة. لينت Dart.
|
> في مشروع Siro: الإشعارات لا تصل لأن الاشتراك بالمواضيع غير مبني. المطلوب: (1) في `intaleq_rider/lib/controller/firebase/firbase_messge.dart` يوجد `subscribeToTopic("passengers")` — أضف بعده اشتراكاً بالموضوع الشخصي `passenger_{id}` من `box.read(BoxName.passengerID)`. (2) في `intaleq_rider/lib/controller/transit/transit_controller.dart`: عند نجاح `activateEnrollment` اشترك بـ `transit_org_{orgId}`، وفي `openLiveRoute`/زر جديد "تنبيهات الخط" اشترك بـ `transit_route_{routeId}` عبر `FirebaseMessaging.instance.subscribeToTopic` مع استدعاء `backend/transit/notification/subscribe.php` القائم لتسجيل المحطة المفضلة، ومع إلغاء الاشتراك المقابل. (3) تحقق أن معالج الرسائل الحالي يعرض إشعارات data type=transit_* عندما يكون التطبيق بالمقدمة. لينت Dart.
|
||||||
|
|
||||||
### المهمة 6 — لوحة مشرف المؤسسة الويب (كبيرة — قسّمها على جلسات)
|
### المهمة 6 — لوحة مشرف المؤسسة الويب (كبيرة — قسّمها على جلسات)
|
||||||
> في مشروع Siro: ابنِ لوحة ويب لمشرف المؤسسة حسب المواصفات في `docs/mawasalati_full_system_review.md` قسم 5. أنشئها في مجلد جديد `transit_dashboard/` بجذر المشروع (Vue 3 أو React + Vite، عربي RTL أساسي مع تبديل فاتح/داكن). الدخول: `POST {SERVER}/transit/admin/login_request.php` ثم `login_verify.php`، التوكن في `Authorization: Bearer`. ابدأ بجلسة أولى: هيكل المشروع + الدخول + Dashboard اليوم + قائمة المركبات والسائقين. الجلسة الثانية: منشئ الخطوط بالخريطة (MapLibre + نقر لإضافة محطات + حفظ route/add) والجداول (days_mask bitmask: bit0=أحد…bit6=سبت). الجلسة الثالثة: الطلاب (قائمة/كشف CSV/موافقات) والإعلانات. أضف أثناء ذلك endpoints الناقصة الموثقة نهاية قسم 5 بنفس أنماط `backend/transit/` (connect_admin, filterRequest, jsonSuccess).
|
> في مشروع Siro: ابنِ لوحة ويب لمشرف المؤسسة حسب المواصفات في `docs/mawasalati_full_system_review.md` قسم 5. أنشئها في مجلد جديد `transit_dashboard/` بجذر المشروع (Vue 3 أو React + Vite، عربي RTL أساسي مع تبديل فاتح/داكن). الدخول: `POST {SERVER}/transit/admin/login_request.php` ثم `login_verify.php`، التوكن في `Authorization: Bearer`. ابدأ بجلسة أولى: هيكل المشروع + الدخول + Dashboard اليوم + قائمة المركبات والسائقين. الجلسة الثانية: منشئ الخطوط بالخريطة (MapLibre + نقر لإضافة محطات + حفظ route/add) والجداول (days_mask bitmask: bit0=أحد…bit6=سبت). الجلسة الثالثة: الطلاب (قائمة/كشف CSV/موافقات) والإعلانات. أضف أثناء ذلك endpoints الناقصة الموثقة نهاية قسم 5 بنفس أنماط `backend/transit/` (connect_admin, filterRequest, jsonSuccess).
|
||||||
|
|
||||||
### المهمة 7 — جيوفينس المحطات في تطبيق السائق (متوسطة)
|
### المهمة 7 — جيوفينس المحطات في تطبيق السائق (متوسطة)
|
||||||
> في مشروع Siro: سائق الباص لا يكتشف وصوله للمحطات. في `siro_driver/lib/controller/transit/transit_driver_controller.dart` أضف منطقاً أثناء الرحلة النشطة: قارن موقع `LocationController.myLocation` (استمع عبر نفس تدفق التحديث) مع محطات `activeTrip.stops` — عند دخول نطاق `geofence_radius` لمحطة تسلسلها أعلى من الحالي، مرّر `currentStopSeq` الجديد إلى `emitBusLocationToSocket` (المعامل موجود جاهز في `location_controller.dart`) وحدّث الواجهة بشريط تقدم المحطات في `transit_driver_home_page.dart`. استخدم `geo.Geolocator.distanceBetween` الموجود. لا تستدعِ REST — السوكيت يخزّن التسلسل في Redis ويبثه.
|
> في مشروع Siro: سائق الباص لا يكتشف وصوله للمحطات. في `intaleq_driver/lib/controller/transit/transit_driver_controller.dart` أضف منطقاً أثناء الرحلة النشطة: قارن موقع `LocationController.myLocation` (استمع عبر نفس تدفق التحديث) مع محطات `activeTrip.stops` — عند دخول نطاق `geofence_radius` لمحطة تسلسلها أعلى من الحالي، مرّر `currentStopSeq` الجديد إلى `emitBusLocationToSocket` (المعامل موجود جاهز في `location_controller.dart`) وحدّث الواجهة بشريط تقدم المحطات في `transit_driver_home_page.dart`. استخدم `geo.Geolocator.distanceBetween` الموجود. لا تستدعِ REST — السوكيت يخزّن التسلسل في Redis ويبثه.
|
||||||
|
|
||||||
### المهمة 8 — مراجعة خدمة الخلفية لوضع الباص (متوسطة، سائق)
|
### المهمة 8 — مراجعة خدمة الخلفية لوضع الباص (متوسطة، سائق)
|
||||||
> في مشروع Siro: افحص `siro_driver/lib/controller/functions/background_service.dart` بالكامل: هل ينشئ سوكيتاً خاصاً ويبث `update_location` عندما يكون التطبيق بالخلفية؟ إن كان كذلك فعند وضع الباص (`LocationController.isBusMode`) سيلوث حوض الرحلات ويوقف بث الباص. مرّر حالة وضع الباص وبيانات الرحلة (trip_id/route_id — خزّنها في GetStorage box عند `setBusMode`) إلى الخدمة الخلفية وبدّل الحدث إلى `update_bus_location` بنفس الحمولة المستخدمة في `emitBusLocationToSocket`. اختبر السيناريو: بدء رحلة باص → طي التطبيق → التأكد من استمرار البث الصحيح.
|
> في مشروع Siro: افحص `intaleq_driver/lib/controller/functions/background_service.dart` بالكامل: هل ينشئ سوكيتاً خاصاً ويبث `update_location` عندما يكون التطبيق بالخلفية؟ إن كان كذلك فعند وضع الباص (`LocationController.isBusMode`) سيلوث حوض الرحلات ويوقف بث الباص. مرّر حالة وضع الباص وبيانات الرحلة (trip_id/route_id — خزّنها في GetStorage box عند `setBusMode`) إلى الخدمة الخلفية وبدّل الحدث إلى `update_bus_location` بنفس الحمولة المستخدمة في `emitBusLocationToSocket`. اختبر السيناريو: بدء رحلة باص → طي التطبيق → التأكد من استمرار البث الصحيح.
|
||||||
|
|
||||||
### المهمة 9 — تحسينات خريطة الراكب (منخفضة)
|
### المهمة 9 — تحسينات خريطة الراكب (منخفضة)
|
||||||
> في مشروع Siro، ملف `siro_rider/lib/views/transit/transit_live_map_page.dart`: (1) ارسم polyline الخط — الحقل `polyline` يأتي ضمن `trip/live.php`؟ تحقق؛ إن لم يكن أضفه للاستعلام في `backend/transit/trip/live.php` (من `transit_routes.polyline`)، ثم فكّه بـ `PolylineUtils.decode` من حزمة intaleq_maps وأضف `Polyline` للخريطة بلون `AppColor.accentColor`. (2) استخدم أيقونة باص مخصصة للماركر عبر `InlqBitmap.fromAsset` (أضف أصل `assets/images/bus.png` — انظر pubspec). (3) أضف بطاقة سفلية بمعلومات الرحلة (السائق، الانطلاق، المحطة الحالية باسمها بدل الرقم). (4) زر "فاتك الباص؟ اطلب سيارة الآن" يوجّه لطلب رحلة عادية من موقع المستخدم — نقطة التحويل التجارية الأساسية.
|
> في مشروع Siro، ملف `intaleq_rider/lib/views/transit/transit_live_map_page.dart`: (1) ارسم polyline الخط — الحقل `polyline` يأتي ضمن `trip/live.php`؟ تحقق؛ إن لم يكن أضفه للاستعلام في `backend/transit/trip/live.php` (من `transit_routes.polyline`)، ثم فكّه بـ `PolylineUtils.decode` من حزمة intaleq_maps وأضف `Polyline` للخريطة بلون `AppColor.accentColor`. (2) استخدم أيقونة باص مخصصة للماركر عبر `InlqBitmap.fromAsset` (أضف أصل `assets/images/bus.png` — انظر pubspec). (3) أضف بطاقة سفلية بمعلومات الرحلة (السائق، الانطلاق، المحطة الحالية باسمها بدل الرقم). (4) زر "فاتك الباص؟ اطلب سيارة الآن" يوجّه لطلب رحلة عادية من موقع المستخدم — نقطة التحويل التجارية الأساسية.
|
||||||
|
|
||||||
### المهمة 10 — إدارة العقود وتعديل المؤسسات (منخفضة، سيرو آدمن)
|
### المهمة 10 — إدارة العقود وتعديل المؤسسات (منخفضة، سيرو آدمن)
|
||||||
> في مشروع Siro: أنشئ `backend/Admin/transit/org/update.php` (تعديل بيانات مؤسسة + `contract_status` مع تحقق enum) بنمط `org/create.php`، وعند suspended/terminated أبطل كل جلسات مشرفي المؤسسة (انظر منطق `org/admin_toggle.php`). في siro_admin أضف للشاشة `org_details_page.dart` قائمة إجراءات (تعليق/تفعيل/إنهاء عقد + تعديل الحقول) عبر `transit_admin_service.dart`. لينت.
|
> في مشروع Siro: أنشئ `backend/Admin/transit/org/update.php` (تعديل بيانات مؤسسة + `contract_status` مع تحقق enum) بنمط `org/create.php`، وعند suspended/terminated أبطل كل جلسات مشرفي المؤسسة (انظر منطق `org/admin_toggle.php`). في intaleq_admin أضف للشاشة `org_details_page.dart` قائمة إجراءات (تعليق/تفعيل/إنهاء عقد + تعديل الحقول) عبر `transit_admin_service.dart`. لينت.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
- **واجهة الويب للمؤسسات (B2B Admin Dashboard):** واجهة ويب تتيح لمدير الحركة في الجامعة إضافة المسارات، الباصات، وتتبع الأسطول.
|
- **واجهة الويب للمؤسسات (B2B Admin Dashboard):** واجهة ويب تتيح لمدير الحركة في الجامعة إضافة المسارات، الباصات، وتتبع الأسطول.
|
||||||
- **استيراد كشف الركاب:** واجهة لرفع ملفات CSV (`import_roster.php`) لتعريف طلاب الجامعة المسموح لهم بالركوب.
|
- **استيراد كشف الركاب:** واجهة لرفع ملفات CSV (`import_roster.php`) لتعريف طلاب الجامعة المسموح لهم بالركوب.
|
||||||
- **التنبيهات الجغرافية (Geofence Push Notifications):** تفعيل إشعارات FCM ("الباص على بُعد 5 دقائق من محطتك").
|
- **التنبيهات الجغرافية (Geofence Push Notifications):** تفعيل إشعارات FCM ("الباص على بُعد 5 دقائق من محطتك").
|
||||||
- **إدارة العقود:** زر في تطبيق `siro_admin` لتفعيل/تعليق عقود المؤسسات (`contract_status`).
|
- **إدارة العقود:** زر في تطبيق `intaleq_admin` لتفعيل/تعليق عقود المؤسسات (`contract_status`).
|
||||||
|
|
||||||
---
|
---
|
||||||
سيتم الرجوع لهذه الخطة واستئناف العمل عليها في المرحلة القادمة بعد الانتهاء من الأولويات الحالية للنظام.
|
سيتم الرجوع لهذه الخطة واستئناف العمل عليها في المرحلة القادمة بعد الانتهاء من الأولويات الحالية للنظام.
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
مشرف النقل في الجامعة يدير الأسطول عبر لوحة تحكم ويب مستقلة `transit_dashboard`:
|
مشرف النقل في الجامعة يدير الأسطول عبر لوحة تحكم ويب مستقلة `transit_dashboard`:
|
||||||
1. **تسجيل الدخول:** باستخدام رقم الهاتف ورمز تحقق (OTP) عبر الواتساب.
|
1. **تسجيل الدخول:** باستخدام رقم الهاتف ورمز تحقق (OTP) عبر الواتساب.
|
||||||
2. **إدارة الأسطول:** إدخال بيانات الباصات (رقم اللوحة، السعة، الموديل).
|
2. **إدارة الأسطول:** إدخال بيانات الباصات (رقم اللوحة، السعة، الموديل).
|
||||||
3. **إدارة السائقين:** إضافة سائقي الباصات (الاسم، رقم الهاتف). النظام يرسل رسالة دعوة (Invite) للسائق مع رابط لتحميل تطبيق `siro_driver`. السائق هنا منفصل تماماً عن كابتن المشاوير ولا يتلقى طلبات عادية.
|
3. **إدارة السائقين:** إضافة سائقي الباصات (الاسم، رقم الهاتف). النظام يرسل رسالة دعوة (Invite) للسائق مع رابط لتحميل تطبيق `intaleq_driver`. السائق هنا منفصل تماماً عن كابتن المشاوير ولا يتلقى طلبات عادية.
|
||||||
4. **رسم الخطوط والمحطات:**
|
4. **رسم الخطوط والمحطات:**
|
||||||
- يقوم المشرف برسم مسار الباص على خريطة تفاعلية (Leaflet/MapLibre).
|
- يقوم المشرف برسم مسار الباص على خريطة تفاعلية (Leaflet/MapLibre).
|
||||||
- يحدد نقاط التوقف (Stops) ومحيط كل نقطة (Geofence Radius - افتراضياً 150 متراً).
|
- يحدد نقاط التوقف (Stops) ومحيط كل نقطة (Geofence Radius - افتراضياً 150 متراً).
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
5. **جداول الرحلات (Schedules):** بعد اعتماد الخط، يقوم المشرف بتحديد أوقات الانطلاق وأيام العمل (مثلاً: من الأحد للخميس، الساعة 7:30 صباحاً).
|
5. **جداول الرحلات (Schedules):** بعد اعتماد الخط، يقوم المشرف بتحديد أوقات الانطلاق وأيام العمل (مثلاً: من الأحد للخميس، الساعة 7:30 صباحاً).
|
||||||
6. **إدارة الطلاب:** يرفع المشرف كشفاً بأسماء الطلاب وأرقامهم الجامعية عبر ملف CSV (Import Roster)، مما يتيح للطلاب تفعيل عضوياتهم فوراً في التطبيق.
|
6. **إدارة الطلاب:** يرفع المشرف كشفاً بأسماء الطلاب وأرقامهم الجامعية عبر ملف CSV (Import Roster)، مما يتيح للطلاب تفعيل عضوياتهم فوراً في التطبيق.
|
||||||
|
|
||||||
### ج. السائق (تطبيق `siro_driver`)
|
### ج. السائق (تطبيق `intaleq_driver`)
|
||||||
تجربة السائق مصممة لتكون في غاية البساطة ولا تتطلب أي تشتت:
|
تجربة السائق مصممة لتكون في غاية البساطة ولا تتطلب أي تشتت:
|
||||||
1. **التفعيل:** يتلقى رابط الدعوة، يفتح التطبيق، ويدخل رمز التفعيل أو الـ OTP.
|
1. **التفعيل:** يتلقى رابط الدعوة، يفتح التطبيق، ويدخل رمز التفعيل أو الـ OTP.
|
||||||
2. **وضع الباص (Bus Mode):** يتعرف التطبيق عليه كسائق باص، ويخفي واجهة طلبات المشاوير العادية.
|
2. **وضع الباص (Bus Mode):** يتعرف التطبيق عليه كسائق باص، ويخفي واجهة طلبات المشاوير العادية.
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
- يتوفر زر "تأخير" في حالة الزحام لإشعار المشتركين.
|
- يتوفر زر "تأخير" في حالة الزحام لإشعار المشتركين.
|
||||||
5. **إنهاء الرحلة:** عند الوصول للمحطة النهائية، يضغط "أنهِ الرحلة".
|
5. **إنهاء الرحلة:** عند الوصول للمحطة النهائية، يضغط "أنهِ الرحلة".
|
||||||
|
|
||||||
### د. الطالب / الراكب (تطبيق `siro_rider`)
|
### د. الطالب / الراكب (تطبيق `intaleq_rider`)
|
||||||
1. **تفعيل العضوية:** يدخل تبويب "مواصلاتي"، يختار جامعته، ويدخل رقمه الجامعي. إذا كان الرقم مطابقاً للكشف المرفوع (وبنفس رقم الهاتف)، يتم تفعيله فوراً (بدون OTP إضافي لتوفير التكلفة).
|
1. **تفعيل العضوية:** يدخل تبويب "مواصلاتي"، يختار جامعته، ويدخل رقمه الجامعي. إذا كان الرقم مطابقاً للكشف المرفوع (وبنفس رقم الهاتف)، يتم تفعيله فوراً (بدون OTP إضافي لتوفير التكلفة).
|
||||||
2. **استعراض الخطوط:** يرى الخطوط المعتمدة وجداولها ويشترك بخطه المعتاد.
|
2. **استعراض الخطوط:** يرى الخطوط المعتمدة وجداولها ويشترك بخطه المعتاد.
|
||||||
3. **التتبع الحي (Live Tracking):** يفتح خريطة الخط ليرى مسار الباص (Polyline) وموقع الباص الحي يتحرك أمامه (يستقبل الإحداثيات من الـ Passenger Socket).
|
3. **التتبع الحي (Live Tracking):** يفتح خريطة الخط ليرى مسار الباص (Polyline) وموقع الباص الحي يتحرك أمامه (يستقبل الإحداثيات من الـ Passenger Socket).
|
||||||
|
|||||||
@@ -337,7 +337,7 @@
|
|||||||
## 6. نظام المكافآت والتلعيب والاحتفاظ بالسائقين
|
## 6. نظام المكافآت والتلعيب والاحتفاظ بالسائقين
|
||||||
|
|
||||||
### 6.1 نظام الكازان (Kazan System)
|
### 6.1 نظام الكازان (Kazan System)
|
||||||
> `backend/Admin/dashbord.php` + `siro_admin/lib/controller/admin/kazan_controller.dart`
|
> `backend/Admin/dashbord.php` + `intaleq_admin/lib/controller/admin/kazan_controller.dart`
|
||||||
|
|
||||||
نظام عمولة ديناميكي يعمل بالنسبة المئوية:
|
نظام عمولة ديناميكي يعمل بالنسبة المئوية:
|
||||||
|
|
||||||
@@ -385,7 +385,7 @@
|
|||||||
- تتبع كامل للإحالات عبر قاعدة البيانات
|
- تتبع كامل للإحالات عبر قاعدة البيانات
|
||||||
|
|
||||||
### 6.4 نظام العروض الترويجية (Promotions)
|
### 6.4 نظام العروض الترويجية (Promotions)
|
||||||
> `siro_admin/lib/controller/admin/promo_controller.dart`
|
> `intaleq_admin/lib/controller/admin/promo_controller.dart`
|
||||||
|
|
||||||
- كوبونات خصم مئوية وثابتة
|
- كوبونات خصم مئوية وثابتة
|
||||||
- عروض محدودة الوقت
|
- عروض محدودة الوقت
|
||||||
|
|||||||
@@ -115,7 +115,7 @@
|
|||||||
|
|
||||||
### 2.3 اتصال WebSocket من جهة العميل (الراكب)
|
### 2.3 اتصال WebSocket من جهة العميل (الراكب)
|
||||||
|
|
||||||
**الملف:** `siro_rider/lib/controller/home/map/map_socket_controller.dart`
|
**الملف:** `intaleq_rider/lib/controller/home/map/map_socket_controller.dart`
|
||||||
|
|
||||||
**تحليل:**
|
**تحليل:**
|
||||||
1. **الاتصال:** يتم تهيئة WebSocket عند بدء البحث عن سائق.
|
1. **الاتصال:** يتم تهيئة WebSocket عند بدء البحث عن سائق.
|
||||||
@@ -141,7 +141,7 @@
|
|||||||
|
|
||||||
### 3.1 متحكم دورة حياة الرحلة — `RideLifecycleController`
|
### 3.1 متحكم دورة حياة الرحلة — `RideLifecycleController`
|
||||||
|
|
||||||
**الملف:** `siro_rider/lib/controller/home/map/ride_lifecycle_controller.dart` (4359 سطر)
|
**الملف:** `intaleq_rider/lib/controller/home/map/ride_lifecycle_controller.dart` (4359 سطر)
|
||||||
|
|
||||||
**تحليل الأداء:**
|
**تحليل الأداء:**
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# siro_admin
|
# intaleq_admin
|
||||||
|
|
||||||
A new Flutter project.
|
A new Flutter project.
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
Analyzing siro_admin...
|
Analyzing intaleq_admin...
|
||||||
|
|
||||||
warning - lib/controller/admin/quality_controller.dart:1:8 - Unused import: 'package:flutter/material.dart'. Try removing the import directive. - unused_import
|
warning - lib/controller/admin/quality_controller.dart:1:8 - Unused import: 'package:flutter/material.dart'. Try removing the import directive. - unused_import
|
||||||
warning - lib/controller/admin/register_captain_controller.dart:2:8 - Unused import: 'dart:ffi'. Try removing the import directive. - unused_import
|
warning - lib/controller/admin/register_captain_controller.dart:2:8 - Unused import: 'dart:ffi'. Try removing the import directive. - unused_import
|
||||||
@@ -41,10 +41,10 @@ warning - lib/views/admin/enceypt/encrypt.dart:16:16 - The value of the field 'a
|
|||||||
warning - lib/views/admin/enceypt/encrypt.dart:19:16 - The value of the field 'accentDecryptDim' isn't used. Try removing the field, or using it. - unused_field
|
warning - lib/views/admin/enceypt/encrypt.dart:19:16 - The value of the field 'accentDecryptDim' isn't used. Try removing the field, or using it. - unused_field
|
||||||
warning - lib/views/admin/enceypt/fingerprint_migration.dart:20:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import
|
warning - lib/views/admin/enceypt/fingerprint_migration.dart:20:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import
|
||||||
warning - lib/views/admin/enceypt/fingerprint_migration.dart:22:8 - Unused import: 'package:http/http.dart'. Try removing the import directive. - unused_import
|
warning - lib/views/admin/enceypt/fingerprint_migration.dart:22:8 - Unused import: 'package:http/http.dart'. Try removing the import directive. - unused_import
|
||||||
warning - lib/views/admin/enceypt/fingerprint_migration.dart:23:8 - Unused import: 'package:siro_admin/controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import
|
warning - lib/views/admin/enceypt/fingerprint_migration.dart:23:8 - Unused import: 'package:intaleq_admin/controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import
|
||||||
warning - lib/views/admin/enceypt/fingerprint_migration.dart:25:8 - Unused import: '../../../constant/char_map.dart'. Try removing the import directive. - unused_import
|
warning - lib/views/admin/enceypt/fingerprint_migration.dart:25:8 - Unused import: '../../../constant/char_map.dart'. Try removing the import directive. - unused_import
|
||||||
warning - lib/views/admin/error/error/error_page.dart:2:8 - Unused import: 'package:siro_admin/constant/colors.dart'. Try removing the import directive. - unused_import
|
warning - lib/views/admin/error/error/error_page.dart:2:8 - Unused import: 'package:intaleq_admin/constant/colors.dart'. Try removing the import directive. - unused_import
|
||||||
warning - lib/views/admin/packages.dart:6:8 - Unused import: 'package:siro_admin/views/widgets/my_textField.dart'. Try removing the import directive. - unused_import
|
warning - lib/views/admin/packages.dart:6:8 - Unused import: 'package:intaleq_admin/views/widgets/my_textField.dart'. Try removing the import directive. - unused_import
|
||||||
warning - lib/views/admin/passenger/passenger_details_page.dart:14:8 - Unused import: 'form_passenger.dart'. Try removing the import directive. - unused_import
|
warning - lib/views/admin/passenger/passenger_details_page.dart:14:8 - Unused import: 'form_passenger.dart'. Try removing the import directive. - unused_import
|
||||||
warning - lib/views/admin/rides/ride_lookup_page.dart:1150:12 - The value of the local variable 'displayPhone' isn't used. Try removing the variable or using it. - unused_local_variable
|
warning - lib/views/admin/rides/ride_lookup_page.dart:1150:12 - The value of the local variable 'displayPhone' isn't used. Try removing the variable or using it. - unused_local_variable
|
||||||
warning - lib/views/admin/rides/rides.dart:10:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: Rides.rideAdminController - must_be_immutable
|
warning - lib/views/admin/rides/rides.dart:10:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: Rides.rideAdminController - must_be_immutable
|
||||||
@@ -54,7 +54,7 @@ warning - lib/views/admin/static/advanced_analytics_page.dart:6:8 - Unused impor
|
|||||||
warning - lib/views/admin/static/notes_driver_page.dart:3:8 - Unused import: 'package:intl/intl.dart'. Try removing the import directive. - unused_import
|
warning - lib/views/admin/static/notes_driver_page.dart:3:8 - Unused import: 'package:intl/intl.dart'. Try removing the import directive. - unused_import
|
||||||
warning - lib/views/admin/static/static.dart:29:11 - The value of the local variable 'controller' isn't used. Try removing the variable or using it. - unused_local_variable
|
warning - lib/views/admin/static/static.dart:29:11 - The value of the local variable 'controller' isn't used. Try removing the variable or using it. - unused_local_variable
|
||||||
warning - lib/views/admin/wallet/wallet.dart:10:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: Wallet.walletAdminController - must_be_immutable
|
warning - lib/views/admin/wallet/wallet.dart:10:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: Wallet.walletAdminController - must_be_immutable
|
||||||
warning - lib/views/auth/login_page.dart:3:8 - Unused import: 'package:siro_admin/env/env.dart'. Try removing the import directive. - unused_import
|
warning - lib/views/auth/login_page.dart:3:8 - Unused import: 'package:intaleq_admin/env/env.dart'. Try removing the import directive. - unused_import
|
||||||
warning - lib/views/auth/login_page.dart:5:8 - Unused import: '../../controller/auth/login_controller.dart'. Try removing the import directive. - unused_import
|
warning - lib/views/auth/login_page.dart:5:8 - Unused import: '../../controller/auth/login_controller.dart'. Try removing the import directive. - unused_import
|
||||||
warning - lib/views/auth/login_page.dart:7:8 - Unused import: '../../controller/functions/crud.dart'. Try removing the import directive. - unused_import
|
warning - lib/views/auth/login_page.dart:7:8 - Unused import: '../../controller/functions/crud.dart'. Try removing the import directive. - unused_import
|
||||||
warning - lib/views/auth/login_page.dart:8:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import
|
warning - lib/views/auth/login_page.dart:8:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import
|
||||||
@@ -14,7 +14,7 @@ if (keystorePropertiesFile.exists()) {
|
|||||||
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||||
}
|
}
|
||||||
android {
|
android {
|
||||||
namespace = "com.siro.siro_admin"
|
namespace = "com.siro.intaleq_admin"
|
||||||
compileSdk = flutter.compileSdkVersion
|
compileSdk = flutter.compileSdkVersion
|
||||||
ndkVersion = "27.0.12077973"
|
ndkVersion = "27.0.12077973"
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ android {
|
|||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||||
applicationId = "com.siro.siro_admin"
|
applicationId = "com.siro.intaleq_admin"
|
||||||
// You can update the following values to match your application needs.
|
// You can update the following values to match your application needs.
|
||||||
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
||||||
minSdk = 30
|
minSdk = 30
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.10.2) # 3.10.2 is fine, but no need to go as high as 3.31.5
|
cmake_minimum_required(VERSION 3.10.2) # 3.10.2 is fine, but no need to go as high as 3.31.5
|
||||||
project(siro_driver) # Good
|
project(intaleq_admin) # Good
|
||||||
|
|
||||||
# Add your C++ source file(s) to create a SHARED library.
|
# Add your C++ source file(s) to create a SHARED library.
|
||||||
add_library(native-lib SHARED native-lib.cpp)
|
add_library(native-lib SHARED native-lib.cpp)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.siro.siro_admin
|
package com.siro.intaleq_admin
|
||||||
|
|
||||||
import android.app.AlertDialog
|
import android.app.AlertDialog
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
@@ -17,8 +17,8 @@ import java.util.Timer
|
|||||||
import kotlin.concurrent.schedule
|
import kotlin.concurrent.schedule
|
||||||
|
|
||||||
class MainActivity : FlutterFragmentActivity() {
|
class MainActivity : FlutterFragmentActivity() {
|
||||||
private val SECURITY_CHANNEL = "com.siro.siro_admin/security"
|
private val SECURITY_CHANNEL = "com.siro.intaleq_admin/security"
|
||||||
private val APP_CONTROL_CHANNEL = "com.siro.siro_admin/app_control"
|
private val APP_CONTROL_CHANNEL = "com.siro.intaleq_admin/app_control"
|
||||||
|
|
||||||
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
|
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
|
||||||
super.configureFlutterEngine(flutterEngine)
|
super.configureFlutterEngine(flutterEngine)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.siro.siro_admin
|
package com.siro.intaleq_admin
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
@@ -24,7 +24,7 @@ class MyApplication : Application() {
|
|||||||
|
|
||||||
MethodChannel(
|
MethodChannel(
|
||||||
flutterEngine.dartExecutor.binaryMessenger,
|
flutterEngine.dartExecutor.binaryMessenger,
|
||||||
"com.siro.siro_admin/app_lifecycle"
|
"com.siro.intaleq_admin/app_lifecycle"
|
||||||
)
|
)
|
||||||
.setMethodCallHandler { call, result ->
|
.setMethodCallHandler { call, result ->
|
||||||
if (call.method == "bringAppToForeground") {
|
if (call.method == "bringAppToForeground") {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.siro.siro_admin
|
package com.siro.intaleq_admin
|
||||||
|
|
||||||
object RootDetection {
|
object RootDetection {
|
||||||
init {
|
init {
|
||||||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 288 KiB After Width: | Height: | Size: 288 KiB |
|
Before Width: | Height: | Size: 311 KiB After Width: | Height: | Size: 311 KiB |
|
Before Width: | Height: | Size: 669 B After Width: | Height: | Size: 669 B |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |