Update: 2026-07-12 05:40:28

This commit is contained in:
Hamza-Ayed
2026-07-12 05:40:28 +03:00
parent 1fa517acc9
commit 24fb56f08f
75 changed files with 5051 additions and 9 deletions
+41
View File
@@ -0,0 +1,41 @@
<?php
// transit/driver/activate.php — السائق يفعّل حسابه (بدون JWT — قبل الدخول)
// POST: invite_token, phone, otp
require_once __DIR__ . '/../../core/bootstrap.php';
require_once __DIR__ . '/../functions.php';
require_once __DIR__ . '/../../core/Services/OtpService.php';
try { $transit_con = Database::get('transit'); }
catch (Exception $e) { jsonError('Transit service unavailable', 503); }
requireTransitFields(['invite_token','phone','otp']);
$inviteToken = filterRequest('invite_token');
$phone = normalizePhone(filterRequest('phone'));
$otp = preg_replace('/\D/', '', filterRequest('otp'));
if (!transitVerifyAdminOtp($phone, $otp)) jsonError('Invalid or expired OTP', 401);
$phoneEnc = $encryptionHelper->encryptData($phone);
$st = $transit_con->prepare(
"SELECT id, org_id, name, status FROM transit_drivers
WHERE invite_token=? AND phone=? LIMIT 1"
);
$st->execute([$inviteToken, $phoneEnc]);
$driver = $st->fetch();
if (!$driver) jsonError('Invalid invite token or phone mismatch', 404);
if ($driver['status'] === 'active') jsonError('Driver already activated', 409);
if ($driver['status'] === 'suspended') jsonError('Account suspended', 403);
$transit_con->prepare(
"UPDATE transit_drivers SET status='active', activated_at=NOW(), invite_token=NULL WHERE id=?"
)->execute([$driver['id']]);
jsonSuccess([
'driver_id' => (int)$driver['id'],
'org_id' => (int)$driver['org_id'],
'name' => $driver['name'],
'mode' => 'bus',
], 'Driver activated. Welcome to مواصلاتي!');
+35
View File
@@ -0,0 +1,35 @@
<?php
// transit/driver/invite.php — المشرف يضيف سائق جديد
require_once __DIR__ . '/../../transit/connect_admin.php';
requireTransitFields(['name', 'phone']);
$name = filterRequest('name');
$phone = normalizePhone(filterRequest('phone'));
$license = filterRequest('license_number');
// تشفير الهاتف مثل باقي أرقام الهواتف
$phoneEnc = $encryptionHelper->encryptData($phone);
$chk = $transit_con->prepare(
"SELECT id FROM transit_drivers WHERE phone=? AND org_id=? LIMIT 1"
);
$chk->execute([$phoneEnc, $transit_org_id]);
if ($chk->fetch()) jsonError('Driver phone already registered in this organization', 409);
$inviteToken = bin2hex(random_bytes(24));
$mainDriverId = filterRequest('main_driver_id');
$transit_con->prepare(
"INSERT INTO transit_drivers
(org_id,name,phone,license_number,main_driver_id,invite_token,invite_sent_at,status)
VALUES (?,?,?,?,?,?,NOW(),'invited')"
)->execute([$transit_org_id, $name, $phoneEnc, $license, $mainDriverId, $inviteToken]);
$driverId = (int)$transit_con->lastInsertId();
$appLink = getenv('APP_DEEP_LINK_BASE') ?: 'https://siromove.com/driver/transit-activate';
$message = "مرحباً {$name}، تمت إضافتك كسائق في منصة مواصلاتي.\nفعّل حسابك: {$appLink}?token={$inviteToken}";
sendWhatsAppFromServer($phone, $message);
jsonSuccess(['driver_id' => $driverId, 'invite_token' => $inviteToken], 'Driver invited successfully');
+27
View File
@@ -0,0 +1,27 @@
<?php
// transit/driver/list.php
require_once __DIR__ . '/../../transit/connect_admin.php';
$status = filterRequest('status') ?: 'active';
$allowed = ['all','invited','active','suspended'];
if (!in_array($status, $allowed)) $status = 'active';
$sql = "SELECT id, name, status, activated_at, created_at FROM transit_drivers WHERE org_id=?";
$params = [$transit_org_id];
if ($status !== 'all') { $sql .= " AND status=?"; $params[] = $status; }
$sql .= " ORDER BY name ASC";
$st = $transit_con->prepare($sql);
$st->execute($params);
$drivers = $st->fetchAll();
// فك تشفير هواتف السائقين للعرض
foreach ($drivers as &$d) {
if (!empty($d['phone'])) {
$d['phone'] = $encryptionHelper->decryptData($d['phone']) ?: '***';
}
}
unset($d);
jsonSuccess(['drivers' => $drivers]);
+30
View File
@@ -0,0 +1,30 @@
<?php
// transit/driver/me.php — السائق يتحقق هل هو سائق باص، ويحصل على معرّفه في مواصلاتي
// المصادقة: JWT السائق الرئيسي (نفس main_driver_id)
require_once __DIR__ . '/../../transit/connect_app.php';
if ($transit_user_role !== 'driver') jsonError('Only drivers can access this endpoint', 403);
$st = $transit_con->prepare(
"SELECT d.id, d.org_id, d.name, d.status,
o.name_ar AS org_name, o.type AS org_type
FROM transit_drivers d
JOIN transit_orgs o ON o.id = d.org_id
WHERE d.main_driver_id = ? LIMIT 1"
);
$st->execute([(string)$transit_user_id]);
$driver = $st->fetch();
if (!$driver) {
jsonSuccess(['is_bus_driver' => false]);
}
jsonSuccess([
'is_bus_driver' => true,
'driver_transit_id' => (int)$driver['id'],
'org_id' => (int)$driver['org_id'],
'org_name' => $driver['org_name'],
'org_type' => $driver['org_type'],
'status' => $driver['status'],
]);