Update: 2026-06-19 01:47:48

This commit is contained in:
Hamza-Ayed
2026-06-19 01:47:48 +03:00
parent f13faa8c31
commit a003bf78c4
34 changed files with 6207 additions and 13499 deletions

View File

@@ -0,0 +1,317 @@
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/syria/driver/isPhoneVerified.php
// Query: phone_number
// Returns: success if is_verified = 1
print(' → GET /auth/syria/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/syria/uploadSyrianDocs.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/syria/driver/register_driver_and_car.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/syria/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/syria/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/syria/driver/isPhoneVerified.php');
print(' - /auth/document_syria/ai_document.php');
print(' - /auth/syria/uploadSyrianDocs.php');
print(' - /auth/syria/driver/register_driver_and_car.php');
print(' - /auth/syria/driver/drivers_pending_list.php');
print(' - /auth/syria/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('═══════════════════════════════════════════════════════');
}