prepare("SELECT id, status FROM transit_routes WHERE id=? AND org_id=? LIMIT 1"); $chk->execute([$routeId, $transit_org_id]); $route = $chk->fetch(); if (!$route) jsonError('Route not found or access denied', 404); // إن كان معتمداً أو موقوفاً، التعديل يعيده لمسودة بانتظار اعتماد جديد $newStatus = in_array($route['status'], ['active', 'suspended']) ? 'draft' : $route['status']; $transit_con->beginTransaction(); try { $transit_con->prepare( "UPDATE transit_routes SET name_ar=?, name_en=?, direction=?, polyline=?, distance_km=?, duration_min=?, status=?, approved_by=NULL, approved_at=NULL, updated_at=NOW() WHERE id=?" )->execute([ $nameAr, filterRequest('name_en'), $direction, filterRequest('polyline'), filterRequest('distance_km', 'float'), filterRequest('duration_min', 'int'), $newStatus, $routeId, ]); // استبدال كامل لمحطات الخط $transit_con->prepare("DELETE FROM transit_stops WHERE route_id=?")->execute([$routeId]); $insertStop = $transit_con->prepare( "INSERT INTO transit_stops (route_id,org_id,sequence,name_ar,name_en,latitude,longitude,geofence_radius,eta_offset_min,is_major) VALUES (?,?,?,?,?,?,?,?,?,?)" ); foreach ($stops as $i => $s) { if (empty($s['lat']) || empty($s['lng']) || empty($s['name_ar'])) continue; $insertStop->execute([ $routeId, $transit_org_id, $i + 1, $s['name_ar'], $s['name_en'] ?? null, (float)$s['lat'], (float)$s['lng'], (int)($s['radius'] ?? 150), isset($s['eta_offset_min']) ? (int)$s['eta_offset_min'] : null, (int)($s['is_major'] ?? 0), ]); } $transit_con->commit(); } catch (Throwable $e) { $transit_con->rollBack(); appLog('[TRANSIT][ROUTE][update] ' . $e->getMessage(), 'ERROR'); jsonError('Failed to update route', 500); } appLog("[TRANSIT][ROUTE][update] route #{$routeId} org#{$transit_org_id} updated, status={$newStatus}"); jsonSuccess([ 'route_id' => $routeId, 'status' => $newStatus, 'stops_count'=> count($stops), ], $newStatus === 'draft' ? 'Route updated — pending re-approval' : 'Route updated');