Files
tripz-llc/apps/driver/lib/controller/auth/syria/registration_simulation.dart
T
Hamza-AyedandClaude Opus 5 4d8414c96b feat: استيراد كود سيرو إلى تريبز (سيرو @ecfe7568) — بلا تعديل
قرار المالك 2026-07-27: باك إند سيرو PHP هو المعتمد، وتطبيقاته المجرّبة
ميدانياً تحل محل إعادة البناء المؤرشفة. سيرو نفسه لم يُمسّ.

الخريطة:
  backend · payment_server · loction_server · ride_server ·
  passenger_server · docker · dashboard · stress_test  → الجذر
  siro_rider  → apps/rider          siro_driver  → apps/driver
  siro_admin  → dashboards/admin    siro_service → dashboards/service
  android_bot → apps/android_bot    socialBot    → apps/socialBot

نُسخ المتعقَّب في git سيرو فقط عبر `git archive` (3,198 ملفاً / ~169 م.ب)
لا `cp -r` — فاستُثنيت مخلفات البناء تلقائياً. بلا أي تعديل محتوى عمداً:
كل ما يلي يصير فرقاً مقروءاً مقابل المصدر.

لم يُستورد وسببه: siromove.com (الموقع التسويقي يبقى marketing/ في تريبز،
سيرو فيه 8 ملفات) · docs و planning (تريبز له docs/ الخاص) · deploy.sh
(ليس نشراً على سيرفر بل `git add . && git push origin --all` — فخّ في
مستودع آخر) · transit_dashboard (بانتظار قرار مصير backend-transit و
dashboards/transit-web).

⚠️ لا يبني بعد — ثلاثة نواقص متوقعة ومقصودة:
1. `.env` و `lib/env/env.g.dart` غير متعقَّبين في سيرو (أسرار لكل مستأجر):
   كل تطبيق فلاتر يحتاج .env خاصاً ثم توليد env.g.dart بـ build_runner.
2. إعدادات Firebase (9 ملفات google-services.json و GoogleService-Info.plist)
   يستبعدها .gitignore تريبز — ولكل مستأجر مشروع Firebase خاص أصلاً.
3. apps/driver في سيرو يشير إلى `../../Intaleq/packages/get` خارج المستودع →
   يجب ضمّ الحزم داخله أسوة بـ apps/rider.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 05:14:13 +03:00

318 lines
15 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'dart:convert';
import 'dart:io';
/// Syria Driver Registration Simulation
///
/// Traces the complete flow:
/// 1. Phone OTP Verification
/// 2. Personal + Car Info Input
/// 3. Document Image Capture (license, ID, car docs)
/// 4. AI/OCR Processing (per-document via ai_document.php)
/// 5. Document Upload (uploadSyrianDocs.php → signed URL)
/// 6. Final Submission (register_driver_and_car.php → Gemini bulk AI → DB insert → FCM)
/// 7. Admin Review & Activation
///
/// Run: `dart run siro_driver/lib/controller/auth/syria/registration_simulation.dart`
void main() async {
print('═══════════════════════════════════════════════════════');
print(' SYRIA DRIVER REGISTRATION SIMULATION');
print('═══════════════════════════════════════════════════════');
const host = 'api-syria.siromove.com';
const protocol = 'https';
const driverId = 'DRV2026061912345678';
// ================================================================
// STEP 1: Initial Phone OTP Verification
// ================================================================
print('\n─── STEP 1: Phone OTP Verification ───');
const phone = '+963992952235';
print(' Phone: $phone');
// Backend: POST /auth/otp/request.php
// Payload: { phone_number, purpose: "driver_registration" }
// Checks: last_request < 120s → cooldown
// Inserts/updates: phone_verification(phone_number, code, is_verified=0, last_request)
// Sends SMS with code
print(' → POST /auth/otp/request.php');
print(' Request: { phone_number: "$phone", purpose: "driver_registration" }');
print(' ✅ OTP sent (cooldown 120s applied)');
// Backend: POST /auth/otp/verify.php
// Payload: { phone_number, code, device_token }
// Validates: code match, within TTL
// Sets: phone_verification.is_verified = 1
// Returns: driver_id (new or existing)
print(' → POST /auth/otp/verify.php');
print(' Request: { phone_number: "$phone", code: "123456", device_token: "fp_abc123" }');
print(' ✅ Phone verified, driver_id returned');
// Check: GET /auth/driver/isPhoneVerified.php
// Query: phone_number
// Returns: success if is_verified = 1
print(' → GET /auth/driver/isPhoneVerified.php?phone_number=$phone');
print(' ✅ Phone is verified, proceeding to registration');
// ================================================================
// STEP 2: Personal Information Input (Flutter UI)
// ================================================================
print('\n─── STEP 2: Personal Information ───');
final driverInfo = {
'first_name': 'أحمد',
'last_name': 'الأسد',
'national_number': '04020123456',
'birthdate': '1990-05-15',
'phone': phone,
'driver_license_expiry': '2028-06-01',
};
print(' Driver info collected:');
driverInfo.forEach((k, v) => print(' $k: $v'));
// ================================================================
// STEP 3: Car Information Input (Flutter UI)
// ================================================================
print('\n─── STEP 3: Car Information ───');
final carInfo = {
'car_plate': '155186 درعا',
'make': 'Hyundai',
'model': 'H1',
'year': '2019',
'color': 'White',
'color_hex': '#FFFFFF',
'vehicle_category_id': 1, // 1=Car, 2=Motorcycle, 3=Van/Bus
'fuel_type_id': 1, // 1=Petrol, 2=Diesel, 3=Electric, 4=Hybrid
'owner': 'أحمد الأسد',
'vin': 'KMHSH81XSBU123456',
};
print(' Car info collected:');
carInfo.forEach((k, v) => print(' $k: $v'));
// ================================================================
// STEP 4: Document Image Capture & Per-Document AI/OCR
// ================================================================
print('\n─── STEP 4: Document Image Capture + AI/OCR ───');
final documents = [
'id_front_sy',
'id_back_sy',
'driving_license_sy_front',
'driving_license_sy_back',
'vehicle_license_sy_front',
'vehicle_license_sy_back',
'profile_picture',
'criminal_record',
];
for (final docType in documents) {
print(' 📷 Capturing: $docType');
print(' → ImagePicker.camera → ImageCropper → FlutterImageCompress');
print(' → POST /auth/document_syria/ai_document.php');
print(' Fields: driver_id, type=$docType, image (multipart)');
print(' AI model: gemini-flash-lite-latest (per-document OCR)');
// Each document type has a unique Gemini prompt
String expectedExtraction;
switch (docType) {
case 'id_front_sy':
expectedExtraction = '{ "full_name": "أحمد الأسد", "national_number": "04020123456", "dob": "1990-05-15", "address": "دمشق" }';
break;
case 'id_back_sy':
expectedExtraction = '{ "governorate": "دمشق", "address": "المزة", "gender": "Male", "issue_date": "2010-03-01" }';
break;
case 'driving_license_sy_front':
expectedExtraction = '{ "name_arabic": "أحمد الأسد", "birth_place": "دمشق", "birth_year": "1990", "national_number": "04020123456", "civil_registry": "دمشق 3", "blood_type": "A+" }';
break;
case 'driving_license_sy_back':
expectedExtraction = '{ "issue_date": "2018-06-15", "expiry_date": "2028-06-15", "license_number": "987654", "license_category": "D1" }';
break;
case 'vehicle_license_sy_front':
expectedExtraction = '{ "car_plate": "155186 درعا", "owner": "أحمد الأسد", "vin": "KMHSH81XSBU123456", "color": "White", "color_hex": "#FFFFFF", "issue_date": "2019-03-10", "inspection_date": "2025-03-10" }';
break;
case 'vehicle_license_sy_back':
expectedExtraction = '{ "make": "Hyundai", "model": "H1", "year": "2019", "fuel": "Petrol", "chassis": "KMHSH81XSBU123456" }';
break;
default:
expectedExtraction = '{ "status": "success" }';
}
print(' ✅ AI extraction: $expectedExtraction');
print(' ✅ Image URL: $protocol://$host/siro/auth/uploads/documents/driver_${docType}_$driverId.jpg');
}
// ================================================================
// STEP 5: Document Upload to Secure Storage
// ================================================================
print('\n─── STEP 5: Document Upload (Secure Signed URLs) ───');
final docUrls = <String, String>{};
const uploadDocTypes = [
'driver_license_front',
'driver_license_back',
'car_license_front',
'car_license_back',
];
for (final docType in uploadDocTypes) {
print(' 📤 Uploading: $docType');
print(' → POST /auth/driver/uploadDriverDocs.php');
print(' Fields: driver_id=$driverId, doc_type=$docType, file (multipart)');
print(' File stored: private_uploads/<hash>/<driverId>__${docType}.jpg');
print(' MIME validation: image/jpeg, image/png, image/webp');
print(' Max size: 5 MB');
final signedUrl = '$protocol://$host/siro/secure_image.php'
'?driver_id=$driverId'
'&doc_type=$docType'
'&ext=jpg'
'&expires=1780000000'
'&signature=abc123def456';
docUrls[docType] = signedUrl;
print(' ✅ Signed URL: $signedUrl');
print(' TTL: 2 days (172800s)');
}
// ================================================================
// STEP 6: Final Registration Submission
// ================================================================
print('\n─── STEP 6: Final Registration (register_driver_and_car.php) ───');
print(' → POST /auth/driver/register.php');
print(' This is the MAIN orchestrator. It does:');
print(' 1. Phone number normalization (Syria/Jordan/Egypt logic)');
print(' 2. Encrypt sensitive fields (phone, email, name, address, etc.)');
print(' 3. HMAC-based password derivation from id|phone|national_number');
print(' 4. Check for duplicate phone/email');
print(' 5. Insert into `driver` table with status="yet"');
print(' 6. Insert into `CarRegistration` with vehicle_category_id + fuel_type_id');
print(' 7. Insert document links into `driver_documents` table');
print(' 8. Store profile_picture into `imageProfileCaptain`');
print(' 9. AI BULK ANALYSIS via Gemini Flash Lite (all docs together)');
print(' 10. Send FCM notification → topic: new_driver_registration');
print(' 11. Return { status: "success", driverID, carRegID, documents }');
// Show the full payload
print('\n 📦 Request payload (multipart):');
print(' Driver fields:');
for (final f in ['id', 'first_name', 'last_name', 'phone', 'national_number', 'birthdate', 'status', 'gender', 'email']) {
print(' $f: ${f == 'id' ? driverId : driverInfo[f] ?? carInfo[f] ?? '—'}');
}
print(' Car fields:');
for (final f in ['vin', 'car_plate', 'make', 'model', 'year', 'color', 'color_hex', 'owner', 'vehicle_category_id', 'fuel_type_id']) {
print(' $f: ${carInfo[f] ?? '—'}');
}
print(' Document URLs:');
docUrls.forEach((k, v) => print(' $k: ${v.substring(0, 60)}...'));
// Simulate the transaction
print('\n 🔄 Transaction: BEGIN');
print(' 🔍 Check duplicate: SELECT id FROM driver WHERE phone = :p OR email = :e');
print(' ✅ No duplicates found');
print(' 📝 INSERT INTO driver (...) VALUES (...)');
print(' → driverID: $driverId');
print(' 📝 INSERT INTO CarRegistration (...) VALUES (...)');
print(' → carRegID: 1');
print(' 📝 INSERT INTO driver_documents (8 rows)');
print(' 📝 INSERT INTO imageProfileCaptain (1 row)');
print(' 🔄 Transaction: COMMIT');
print(' ✅ Registration committed');
// AI Bulk Analysis
print('\n 🤖 AI Bulk Analysis (Gemini Flash Lite):');
print(' → Prompt includes all 8 document images + schema instructions');
print(' → SSRF protection: only ALLOWED_UPLOAD_HOST URLs fetched');
print(' → Extracted fields override user input:');
print(' - full_name → first_name / last_name');
print(' - national_number, dob, address, governorate → site');
print(' - gender, license dates, car details');
print(' ↳ If AI status="failure" → registration ABORTED with error message');
print(' ✅ AI verification passed');
// FCM Notification
print('\n 📲 FCM Notification:');
print(' → POST /ride/firebase/send_fcm.php');
print(' → Topic: new_driver_registration');
print(' → Title: "تسجيل سائق جديد"');
print(' → Body: "سائق جديد (أحمد الأسد) سجل برقم ID: $driverId وهو بانتظار المراجعة والتفعيل."');
print(' ✅ Admin notified');
// Response
print('\n 📤 Response:');
print(' {');
print(' "status": "success",');
print(' "driverID": "$driverId",');
print(' "carRegID": 1,');
print(' "documents": {');
docUrls.forEach((k, v) => print(' "$k": "$v",'));
print(' }');
print(' }');
// ================================================================
// STEP 7: Admin Review & Activation
// ================================================================
print('\n─── STEP 7: Admin Review & Activation ───');
// Admin fetches pending drivers
print(' 🔍 Admin fetches pending drivers:');
print(' → GET /auth/driver/drivers_pending_list.php');
print(' Decrypts: phone, first_name, last_name');
print(' Returns: [{ id: "$driverId", first_name: "أحمد", last_name: "الأسد", phone: "$phone" }]');
print(' ✅ Driver appears in pending list (status != "active")');
// Admin views details
print('\n 📋 Admin views driver details:');
print(' → GET /auth/driver/driver_details.php?driver_id=$driverId');
print(' Returns: driver row + car registration + document links');
print(' ✅ Admin reviews all documents');
// Admin activates driver
print('\n ✅ Admin approves & activates:');
print(' → POST /Admin/Staff/activate.php');
print(' Auth: JWT (role=super_admin or admin)');
print(' Payload: { user_id: "$driverId", type: "admin" }');
print(' SQL: UPDATE driver SET status = "active" WHERE id = "$driverId"');
// Check driver_assurance table (references in migration schema)
print('\n ℹ️ driver_assurance table (optional):');
print(' May store health_insurance_provider + assured status');
print(' Linked via driver_id (encrypted columns)');
// Final driver state
print('\n 📊 Final driver state in DB:');
print(' driver.phone = <encrypted>$phone');
print(' driver.status = "active"');
print(' driver.is_verified = 1 (via phone_verification)');
print(' CarRegistration.status = "yet"');
print(' driver_documents: 8 rows linked to driverID');
// ================================================================
// SUMMARY
// ================================================================
print('\n═══════════════════════════════════════════════════════');
print(' REGISTRATION FLOW COMPLETE');
print('═══════════════════════════════════════════════════════');
print(' Files involved:');
print(' App (Flutter):');
print(' - registration_controller.dart (multi-step UI)');
print(' - register_captin_controller.dart (basic signup)');
print(' - opt_token_controller.dart (OTP send/verify)');
print(' - ml_google_doc.dart (phone OCR scanner)');
print(' Backend (PHP):');
print(' - /auth/otp/request.php + verify.php');
print(' - /auth/driver/isPhoneVerified.php');
print(' - /auth/document_syria/ai_document.php');
print(' - /auth/driver/uploadDriverDocs.php');
print(' - /auth/driver/register.php');
print(' - /auth/driver/drivers_pending_list.php');
print(' - /auth/driver/driver_details.php');
print(' - /serviceapp/getDriversWaitingActive.php');
print(' - /Admin/Staff/activate.php');
print(' Schema:');
print(' - schema_primary.sql (driver, CarRegistration, driver_documents,');
print(' phone_verification, imageProfileCaptain,');
print(' driver_gifts, driver_assurance)');
print('═══════════════════════════════════════════════════════');
}