prepare("SELECT id, contract_status FROM transit_orgs WHERE id=? LIMIT 1"); $st->execute([$orgId]); $org = $st->fetch(); if (!$org) jsonError('Organization not found', 404); $updates = []; $params = []; // حقول يمكن تحديثها if (($v = filterRequest('city')) !== null) { $updates[] = 'city=?'; $params[] = $v; } if (($v = filterRequest('contact_email')) !== null) { $updates[] = 'contact_email=?'; $params[] = $v; } if (($v = filterRequest('website')) !== null) { $updates[] = 'website=?'; $params[] = $v; } if (($v = filterRequest('trial_ends_at')) !== null) { $updates[] = 'trial_ends_at=?'; $params[] = $v; } $newStatus = null; if (($v = filterRequest('contract_status')) !== null) { $allowed = ['active', 'trial', 'suspended', 'terminated']; if (!in_array($v, $allowed)) { jsonError('Invalid contract_status. Allowed: ' . implode(', ', $allowed), 400); } $newStatus = $v; $updates[] = 'contract_status=?'; $params[] = $v; } if (empty($updates)) jsonError('No fields to update', 400); $updates[] = 'updated_at=NOW()'; $params[] = $orgId; $transit_con->prepare( "UPDATE transit_orgs SET " . implode(', ', $updates) . " WHERE id=?" )->execute($params); // إبطال جلسات المشرفين عند التعليق أو الإنهاء if ($newStatus && in_array($newStatus, ['suspended', 'terminated'])) { $admins = $transit_con->prepare("SELECT id FROM transit_org_admins WHERE org_id=?"); $admins->execute([$orgId]); foreach ($admins->fetchAll(PDO::FETCH_COLUMN) as $adminId) { $sessions = $transit_con->prepare("SELECT token_hash FROM transit_sessions WHERE admin_id=?"); $sessions->execute([$adminId]); foreach ($sessions->fetchAll(PDO::FETCH_COLUMN) as $hash) { if ($redis) $redis->del("transit:session:{$hash}"); } $transit_con->prepare("DELETE FROM transit_sessions WHERE admin_id=?")->execute([$adminId]); } appLog("[ADMIN][TRANSIT][ORG][update] org={$orgId} contract_status={$newStatus} — all admin sessions invalidated"); } else { appLog("[ADMIN][TRANSIT][ORG][update] org={$orgId} updated=" . implode(',', $updates)); } jsonSuccess(['org_id' => $orgId, 'contract_status' => $newStatus ?? $org['contract_status']]);