Files
tripz-llc/backend/ride/location/getDriverTimeOnline.php
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

131 lines
5.2 KiB
PHP

<?php
// getDriverTimeOnline.php
// الغرض: توليد تقرير نشاط السائقين لآخر 10 أيام بناءً على الملخص اليومي
require_once __DIR__ . '/../../get_connect.php';
header('Content-Type: application/json; charset=utf-8');
// إعدادات التقرير
$daysToLookBack = 10; // عدد الأيام في الماضي
$jsonFileName = 'active_drivers_cache.json';
$savePath = __DIR__ . '/' . $jsonFileName;
try {
// =================================================================
// 1. جلب البيانات من جدول الملخصات (سيرفر اللوكيشن) ⚡
// =================================================================
// نجمع الثواني لكل سائق خلال الفترة المحددة
$sql_summary = "
SELECT
driver_id,
SUM(total_seconds) as grand_total_seconds,
COUNT(DISTINCT date) as days_worked -- (اختياري) معرفة عدد أيام العمل الفعلية
FROM driver_daily_summary
WHERE date >= DATE_SUB(CURDATE(), INTERVAL ? DAY)
GROUP BY driver_id
HAVING grand_total_seconds > 60 -- (اختياري) تجاهل من عمل أقل من دقيقة
ORDER BY grand_total_seconds DESC
";
$stmt = $con_tracking->prepare($sql_summary);
$stmt->execute([$daysToLookBack]);
$summary_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($summary_data)) {
// حفظ ملف فارغ وإنهاء
saveJsonFile($savePath, ["last_updated" => date('Y-m-d H:i:s'), "data" => []]);
printSuccess("No active drivers found in summary.", $savePath);
exit;
}
// =================================================================
// 2. جلب تفاصيل السائقين (الأسماء) من السيرفر الرئيسي 📝
// =================================================================
// استخراج الـ IDs
$driver_ids = array_column($summary_data, 'driver_id');
// تجهيز الـ Placeholders (?,?,?)
$placeholders = implode(',', array_fill(0, count($driver_ids), '?'));
$sql_drivers = "SELECT id, name_arabic, phone, created_at FROM driver WHERE id IN ($placeholders)";
$stmt_d = $con->prepare($sql_drivers);
$stmt_d->execute($driver_ids);
$drivers_raw = $stmt_d->fetchAll(PDO::FETCH_ASSOC);
// تحويل البيانات لـ Map لسرعة الدمج: [id => data]
$drivers_map = [];
foreach ($drivers_raw as $d) {
$drivers_map[$d['id']] = $d;
}
// =================================================================
// 3. دمج البيانات وفك التشفير وتنسيق الوقت 🔄
// =================================================================
$final_report = [];
$fieldsToDecrypt = ['phone', 'name_arabic']; // الحقول المشفرة
foreach ($summary_data as $row) {
$did = $row['driver_id'];
$seconds = $row['grand_total_seconds'];
// البيانات الشخصية
$personalData = isset($drivers_map[$did]) ? $drivers_map[$did] : ['name_arabic' => 'Unknown', 'phone' => ''];
// فك التشفير
foreach ($fieldsToDecrypt as $field) {
if (!empty($personalData[$field])) {
try {
$personalData[$field] = $encryptionHelper->decryptData($personalData[$field]);
} catch (Exception $e) {
// ابقها مشفرة أو ضع قيمة افتراضية عند الفشل
}
}
}
// تنسيق الوقت (مقروء للبشر)
$hours = floor($seconds / 3600);
$minutes = floor(($seconds % 3600) / 60);
$human_time = sprintf("%d ساعة و %d دقيقة", $hours, $minutes);
// بناء الصف النهائي
$final_report[] = [
'driver_id' => $did,
'name' => $personalData['name_arabic'],
'phone' => $personalData['phone'],
'join_date' => $personalData['created_at'], // تاريخ انضمام السائق
'total_seconds' => $seconds,
'active_time' => $human_time,
'days_active' => $row['days_worked'] // عدد الأيام التي عمل فيها خلال الـ 10 أيام
];
}
// =================================================================
// 4. الحفظ والنشر 💾
// =================================================================
$output = [
"last_updated" => date('Y-m-d H:i:s'),
"period_days" => $daysToLookBack,
"total_drivers" => count($final_report),
"data" => $final_report
];
saveJsonFile($savePath, $output);
printSuccess("Report generated based on Daily Summary.", $savePath);
} catch (Exception $e) {
error_log("[getDriverTimeOnline.php] " . $e->getMessage());
jsonError("An internal error occurred. Please try again later.");
}
// --- دوال مساعدة ---
function saveJsonFile($path, $data) {
$json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
file_put_contents($path, $json);
}
?>