prepare( "SELECT id FROM transit_drivers WHERE main_driver_id=? AND status='active' LIMIT 1" ); $driverRow->execute([(string)$transit_user_id]); $driverRec = $driverRow->fetch(); if (!$driverRec) jsonError('Driver not found or not active', 403); $transit_driver_id = (int)$driverRec['id']; // 1. تحقق من رحلة السائق الحالية $stTrip = $transit_con->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. إرسال إشعار صعود — لولي الأمر (إن وُجد) وللطالب نفسه (تأكيد بمحفظته) $title = "صعود الحافلة 🚌"; $body = "لقد صعد " . ($enroll['member_name'] ?? 'الطالب') . " إلى الحافلة بنجاح."; transitNotifyGuardians($enrollId, 'board', $title, $body); transitSendNotificationToPassenger((string)$passengerId, $title, $body, ['type' => 'transit_boarded']); jsonSuccess(['boarded' => true]);