diff --git a/app/Models/Foundation/Main/Member.php b/app/Models/Foundation/Main/Member.php index a03425a0a..9fcfb8b0a 100644 --- a/app/Models/Foundation/Main/Member.php +++ b/app/Models/Foundation/Main/Member.php @@ -1834,18 +1834,35 @@ public function getLastNSponsorMemberships($last_n = 2) public function getActiveSummitsSponsorMemberships() { // Step 1 — use native SQL (needed for JSON_CONTAINS) to collect IDs only. + // Also includes sponsors from the last finished summit where this member had + // sponsor permissions, so access is retained immediately after a summit ends. $idSql = <<= :now + AND ( + s.SummitEndDate >= :now + OR s.ID = ( + SELECT s2.ID + FROM Summit s2 + INNER JOIN Sponsor sp2 ON sp2.SummitID = s2.ID + INNER JOIN Sponsor_Users su2 ON su2.SponsorID = sp2.ID + WHERE su2.MemberID = :member_id + AND s2.SummitEndDate < :now + AND ( + JSON_CONTAINS(COALESCE(su2.Permissions, '[]'), JSON_QUOTE(:slug_sponsors)) + OR JSON_CONTAINS(COALESCE(su2.Permissions, '[]'), JSON_QUOTE(:slug_external)) + ) + ORDER BY s2.SummitEndDate DESC + LIMIT 1 + ) + ) AND ( JSON_CONTAINS(COALESCE(su.Permissions, '[]'), JSON_QUOTE(:slug_sponsors)) OR JSON_CONTAINS(COALESCE(su.Permissions, '[]'), JSON_QUOTE(:slug_external)) ) -ORDER BY s.SummitBeginDate ASC SQL; $stmt = $this->prepareRawSQL($idSql, [