prepare( "SELECT id, org_id FROM transit_trips WHERE driver_id=? AND status='started' LIMIT 1" ); $stTrip->execute([$transit_driver_id]); $trip = $stTrip->fetch(); if (!$trip) { jsonError('لا توجد رحلة نشطة حالياً لتسجيل الصعود', 403); } $tripId = (int)$trip['id']; $orgId = (int)$trip['org_id']; // 2. تأكد من أن الراكب مشترك وفعال في هذه المؤسسة $stEnroll = $transit_con->prepare( "SELECT id, member_name FROM transit_enrollments WHERE org_id=? AND passenger_id=? AND status='active' LIMIT 1" ); $stEnroll->execute([$orgId, $passengerId]); $enroll = $stEnroll->fetch(); if (!$enroll) { jsonError('هذا الراكب غير مسجل أو اشتراكه غير فعال', 403); } $enrollId = (int)$enroll['id']; // 3. تأكد أنه لم يُسجل صعوده من قبل في هذه الرحلة $stCheck = $transit_con->prepare( "SELECT id FROM transit_boardings WHERE trip_id=? AND enrollment_id=? LIMIT 1" ); $stCheck->execute([$tripId, $enrollId]); if ($stCheck->fetch()) { jsonError('تم تسجيل صعود هذا الراكب مسبقاً في هذه الرحلة', 400); } // 4. تسجيل الصعود $stInsert = $transit_con->prepare( "INSERT INTO transit_boardings (trip_id, enrollment_id, stop_id, boarded_at, method) VALUES (?, ?, ?, NOW(), 'qr')" ); $stInsert->execute([$tripId, $enrollId, $stopId]); // 5. إرسال إشعار FCM لولي الأمر (إن وُجد) $stGuard = $transit_con->prepare( "SELECT guardian_passenger_id FROM transit_guardians WHERE enrollment_id=? AND notify_board=1" ); $stGuard->execute([$enrollId]); $guardians = $stGuard->fetchAll(PDO::FETCH_COLUMN); // إذا كان الطالب نفسه يملك التطبيق، أرسل له أيضاً (للتأكيد في محفظته) $guardians[] = $passengerId; if (!empty($guardians)) { $title = "صعود الحافلة 🚌"; $body = "لقد صعد " . ($enroll['member_name'] ?? 'الطالب') . " إلى الحافلة بنجاح."; // إرسال الإشعار باستخدام دالة الإشعارات الأساسية بالنظام (عبر passenger_id) foreach ($guardians as $gId) { // يمكنك هنا مناداة دالة sendFCMToPassenger الموجودة في functions.php الأساسية // للتبسيط، نكتفي بافتراض وجود دالة transitSendNotificationToPassenger أو نستخدم FCM_Engine transitSendNotificationToPassenger($gId, $title, $body); } } jsonSuccess(['boarded' => true]);