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); $driverId = (int)$driverRec['id']; $st = $transit_con->prepare( "SELECT t.id, t.route_id, t.status, r.name_ar AS route_name FROM transit_trips t JOIN transit_routes r ON r.id = t.route_id WHERE t.id=? AND t.driver_id=? LIMIT 1" ); $st->execute([$tripId, $driverId]); $trip = $st->fetch(); if (!$trip) jsonError('Trip not found', 404); if ($trip['status'] === 'started') jsonError('Trip already started', 409); if ($trip['status'] === 'completed') jsonError('Trip already completed', 409); if ($trip['status'] === 'cancelled') jsonError('Trip was cancelled', 409); $transit_con->prepare( "UPDATE transit_trips SET status='started', started_at=NOW(), current_stop_seq=1 WHERE id=?" )->execute([$tripId]); transitUpdateBusPosition($tripId, $lat, $lng); // تخزين ملكية الرحلة — يتحقق منها driver_socket قبل أي بثّ حي للراكبين // transit_user_id هو main_driver_id بالفعل (يُستخرج من JWT السائق) transitSetTripOwner($tripId, (string)$transit_user_id, (int)$trip['route_id']); global $redis; if ($redis) { $redis->set("transit:trip:{$tripId}:status", 'started'); $redis->expire("transit:trip:{$tripId}:status", 86400); } transitSendTopicNotification( transitRouteTopic((int)$trip['route_id']), 'الباص انطلق الآن', 'خط ' . $trip['route_name'] . ' بدأ رحلته', ['type' => 'transit_started', 'trip_id' => (string)$tripId] ); // إشعار أولياء أمور جميع الأعضاء المسجَّلين على هذا الخط بانطلاق الباص $stGuardEnroll = $transit_con->prepare( "SELECT id FROM transit_enrollments WHERE preferred_route_id=? AND status='active'" ); $stGuardEnroll->execute([(int)$trip['route_id']]); foreach ($stGuardEnroll->fetchAll(PDO::FETCH_COLUMN) as $enrollId) { transitNotifyGuardians( (int)$enrollId, 'depart', 'انطلق الباص 🚌', 'انطلق باص خط ' . $trip['route_name'] . ' الآن.' ); } jsonSuccess(['trip_id' => $tripId, 'status' => 'started', 'started_at' => date('Y-m-d H:i:s')], 'Trip started');