active = false; $this->email_verified = false; $this->feedback = new ArrayCollection(); $this->groups = new ArrayCollection(); $this->ccla_teams = new ArrayCollection(); $this->affiliations = new ArrayCollection(); $this->team_memberships = new ArrayCollection(); $this->favorites = new ArrayCollection(); $this->schedule = new ArrayCollection(); $this->rsvp = new ArrayCollection(); $this->calendars_sync = new ArrayCollection(); $this->schedule_sync_info = new ArrayCollection(); $this->reservations = new ArrayCollection(); $this->sponsor_memberships = new ArrayCollection(); $this->summit_registration_orders = new ArrayCollection(); $this->user_external_id = 0; $this->membership_type = self::MembershipTypeNone; $this->schedule_shareable_links = new ArrayCollection(); $this->summit_permission_groups = new ArrayCollection(); $this->summit_attendance_metrics = new ArrayCollection(); $this->legal_agreements = new ArrayCollection(); $this->track_chairs = new ArrayCollection(); } /** * @return Affiliation[] */ public function getAffiliations() { return $this->affiliations; } /** * @return ArrayCollection|LegalAgreement[] */ public function getLegalAgreements(){ return $this->legal_agreements; } /** * @return Affiliation[] */ public function getCurrentAffiliations() { $criteria = Criteria::create() ->where(Criteria::expr()->eq("is_current", true)) ->andWhere(Criteria::expr()->eq("end_date", null)) ->orderBy([ "start_date" => Criteria::ASC, ]); return $this->affiliations->matching($criteria); } /** * @param string $orgName * @return Affiliation|null */ public function getAffiliationByOrgName(string $orgName): ?Affiliation { $res = $this->affiliations->filter(function ($e) use ($orgName) { return $e->getOrganization()->getName() == trim($orgName) && $e->isCurrent(); })->first(); return $res ? $res : null; } /** * @return Affiliation[] */ public function getAllAffiliations() { $criteria = Criteria::create() ->orderBy([ "start_date" => Criteria::ASC, "end_date" => Criteria::ASC, ]); return $this->affiliations->matching($criteria); } /** * @return Group[] */ public function getGroups() { return $this->groups; } /** * @return ChatTeamMember[] */ public function getTeamMemberships() { return $this->team_memberships; } /** * @param ChatTeamMember[] $team_memberships */ public function setTeamMemberships($team_memberships) { $this->team_memberships = $team_memberships; } /** * @param mixed $groups */ public function setGroups($groups) { $this->groups = $groups; } /** * @return ArrayCollection|SummitMemberFavorite[] */ public function getFavoritesSummitEvents() { return $this->favorites; } /** * @param SummitMemberFavorite[] $favorites */ public function setFavoritesSummitEvents($favorites) { $this->favorites = $favorites; } /** * @return string */ public function getBio() { return $this->bio; } /** * @return string */ public function getLinkedInProfile() { return $this->linked_in_profile; } /** * @return string */ public function getIrcHandle() { return $this->irc_handle; } /** * @return string */ public function getTwitterHandle() { return $this->twitter_handle; } /** * @return string */ public function getState() { return $this->state; } /** * @param string $state */ public function setState($state) { $this->state = $state; } /** * @return string */ public function getCountry() { return $this->country; } /** * @param string $country */ public function setCountry($country) { $this->country = $country; } /** * @return string */ public function getSecondEmail() { return $this->second_email; } /** * @param string $second_email */ public function setSecondEmail($second_email) { $this->second_email = $second_email; } /** * @return string */ public function getThirdEmail() { return $this->third_email; } /** * @param string $third_email */ public function setThirdEmail($third_email) { $this->third_email = $third_email; } /** * @return string */ public function getEmail() { return $this->email; } /** * @param string $email */ public function setEmail($email) { $this->email = $email; } /** * @return string */ public function getGitHubUser() { return $this->github_user; } /** * @return bool */ public function isEmailVerified() { return $this->email_verified; } /** * @return bool */ public function getEmailVerified() { return $this->email_verified; } /** * @param bool $email_verified */ public function setEmailVerified($email_verified) { $this->email_verified = $email_verified; } /** * @return \DateTime */ public function getEmailVerifiedDate() { return $this->email_verified_date; } /** * @param \DateTime $email_verified_date */ public function setEmailVerifiedDate($email_verified_date) { $this->email_verified_date = $email_verified_date; } /** * @return bool */ public function isActive() { return $this->active; } /** * @return bool */ public function getActive() { return $this->active; } /** * @param bool $active */ public function setActive($active) { $this->active = $active; } /** * @return string */ public function getGender() { return $this->gender; } /** * @return string|null */ public function getLastName():?string { return $this->last_name; } /** * @return string|null */ public function getFirstName():?string { return $this->first_name; } /** * @return File */ public function getPhoto() { return $this->photo; } /** * @param File $photo */ public function setPhoto(File $photo) { $this->photo = $photo; } /** * @return SummitEventFeedback[] */ public function getFeedback() { return $this->feedback; } /** * @param Summit $summit * @return SummitEventFeedback[] */ public function getFeedbackBySummit(Summit $summit) { return $this->createQueryBuilder() ->select('distinct f') ->from('models\summit\SummitEventFeedback', 'f') ->join('f.event', 'e') ->join('f.owner', 'o') ->join('e.summit', 's') ->where('s.id = :summit_id and o.id = :owner_id and e.published = 1') ->setParameter('summit_id', $summit->getId()) ->setParameter('owner_id', $this->getId()) ->getQuery()->getResult(); } /** * @param SummitEvent $event * @return SummitEventFeedback|null */ public function getFeedbackByEvent(SummitEvent $event): ?SummitEventFeedback { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('event', $event)); $feedback = $this->feedback->matching($criteria)->first(); return $feedback === false ? null : $feedback; } /** * @param SummitEventFeedback $feedback */ public function addFeedback(SummitEventFeedback $feedback) { if ($this->feedback->contains($feedback)) return; $this->feedback->add($feedback); $feedback->setOwner($this); } /** * @param SummitEventFeedback $feedback */ public function removeFeedback(SummitEventFeedback $feedback) { if (!$this->feedback->contains($feedback)) return; $this->feedback->removeElement($feedback); $feedback->clearOwner(); } /** * @param bool $skip_external * @return bool */ public function isAdmin($skip_external = false): bool { // admin or super admin $superAdminGroup = $this->getGroupByCode(IGroup::SuperAdmins); if (!is_null($superAdminGroup)) { Log::debug(sprintf("Member::isAdmin has Super Admin Group On DB")); return true; } $adminGroup = $this->getGroupByCode(IGroup::Administrators); if (!is_null($adminGroup)) { Log::debug(sprintf("Member::isAdmin has Admin Group On DB")); return true; } if (!$skip_external) { Log::debug(sprintf("Member::isAdmin check on external")); if ($this->isOnExternalGroup(IGroup::SuperAdmins)) return true; if ($this->isOnExternalGroup(IGroup::Administrators)) return true; } return false; } public function isSummitAdmin(): bool { $summitAdminGroup = $this->getGroupByCode(IGroup::SummitAdministrators); if (!is_null($summitAdminGroup)) return true; if ($this->isOnExternalGroup(IGroup::SummitAdministrators)) return true; return false; } /** * @param string $code * @return bool */ public function isOnExternalGroup(string $code): bool { Log::debug(sprintf("Member::isOnExternalGroup id %s code %s", $this->id, $code)); $resource_server_ctx = App::make(IResourceServerContext::class); if ($resource_server_ctx instanceof IResourceServerContext) { foreach ($resource_server_ctx->getCurrentUserGroups() as $group) { Log::debug(sprintf("Member::isOnExternalGroup id %s code %s external group %s", $this->id, $code, $group['slug'])); if ( isset($group['slug']) && trim($group['slug']) == trim($code) ) return true; } } return false; } /** * @param $code * @param bool $skip_external * @return bool */ public function isOnGroup(string $code, $skip_external = false) { Log::debug(sprintf("Member::isOnGroup member %s group code %s", $this->id, $code)); if ($this->isAdmin($skip_external)) { Log::debug(sprintf("Member::isOnGroup member %s group code %s isAdmin true", $this->id, $code)); return true; } $group = $this->getGroupByCode($code); if (!is_null($group)) { Log::debug(sprintf("Member::isOnGroup member %s group code %s belongs to group", $this->id, $code)); return true; } if (!$skip_external) { Log::debug(sprintf("Member::isOnGroup member %s group code %s check external ones", $this->id, $code)); return $this->isOnExternalGroup($code); } return false; } /** * @param string $code * @return Group|null */ public function getGroupByCode(string $code): ?Group { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('code', trim($code))); $res = $this->groups->matching($criteria)->first(); return $res === false ? null : $res; } /** * @param string $code * @return bool */ public function belongsToGroup(string $code): bool { try { $sql = <<prepareRawSQL($sql); $stmt->execute( [ 'member_id' => $this->getId(), 'code' => trim($code), ] ); $res = $stmt->fetchAll(\PDO::FETCH_COLUMN); return intval($res[0]) > 0; } catch (\Exception $ex) { } return false; } /** * @return int[] */ public function getGroupsIds() { $ids = []; foreach ($this->getGroups() as $g) { $ids[] = intval($g->getId()); } return $ids; } public function getCCLATeamsIds() { $ids = []; foreach ($this->getCCLATeams() as $t) { $ids[] = intval($t->getId()); } return $ids; } /** * @return Team[] */ public function getCCLATeams() { return $this->ccla_teams->toArray(); } /** * @return string[] */ public function getGroupsCodes() { $codes = []; foreach ($this->getGroups() as $g) { $codes[] = $g->getCode(); } // from IDP $resource_server_ctx = App::make(IResourceServerContext::class); if ($resource_server_ctx instanceof IResourceServerContext) { foreach ($resource_server_ctx->getCurrentUserGroups() as $group) { if (isset($group['slug'])) $codes[] = trim($group['slug']); } } return $codes; } /** * @param SummitEvent $event * @throws ValidationException */ public function addFavoriteSummitEvent(SummitEvent $event) { if ($this->isOnFavorite($event)) throw new ValidationException ( sprintf('Event %s already belongs to member %s favorites.', $event->getId(), $this->getId()) ); if (!$event->isPublished()) throw new ValidationException ( sprintf('Event %s is not published', $event->getId()) ); $favorite = new SummitMemberFavorite(); $favorite->setMember($this); $favorite->setEvent($event); $this->favorites->add($favorite); } /** * @param SummitEvent $event * @return bool */ public function isOnFavorite(SummitEvent $event) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('event', $event)); return $this->favorites->matching($criteria)->count() > 0; } /** * @param SummitEvent $event * @throws ValidationException */ public function removeFavoriteSummitEvent(SummitEvent $event) { $favorite = $this->getFavoriteByEvent($event); if (is_null($favorite)) throw new ValidationException ( sprintf('Event %s does not belongs to member %s favorite.', $event->getId(), $this->getId()) ); $this->favorites->removeElement($favorite); $favorite->clearOwner(); } /** * @param Summit $summit * @return int[] */ public function getFavoritesEventsIds(Summit $summit) { $sql = <<prepareRawSQL($sql); $stmt->execute( [ 'member_id' => $this->getId(), 'summit_id' => $summit->getId(), ] ); return $stmt->fetchAll(\PDO::FETCH_COLUMN); } /** * @param SummitEvent $event * @throws ValidationException */ public function add2Schedule(SummitEvent $event) { if ($this->isOnSchedule($event)) throw new ValidationException ( sprintf('Event %s already belongs to member %s schedule.', $event->getId(), $this->getId()) ); if (!$event->isPublished()) throw new ValidationException ( sprintf('Event %s is not published', $event->getId()) ); $schedule = new SummitMemberSchedule(); $schedule->setMember($this); $schedule->setEvent($event); $this->schedule->add($schedule); } /** * @param ScheduleCalendarSyncInfo $sync_info */ public function add2ScheduleSyncInfo(ScheduleCalendarSyncInfo $sync_info) { $sync_info->setMember($this); $this->schedule_sync_info->add($sync_info); } public function removeFromSchedule(SummitEvent $event) { $schedule = $this->getScheduleByEvent($event); if (is_null($schedule)) throw new ValidationException ( sprintf('Event %s does not belongs to member %s schedule.', $event->getId(), $this->getId()) ); $this->schedule->removeElement($schedule); $schedule->clearOwner(); } public function removeFromScheduleSyncInfo(ScheduleCalendarSyncInfo $sync_info) { $this->schedule_sync_info->removeElement($sync_info); $sync_info->clearOwner(); } /** * @param CalendarSyncInfo $calendar_sync_info * @param int $event_id * @return bool */ public function isEventSynchronized(CalendarSyncInfo $calendar_sync_info, $event_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('summit_event_id', $event_id)); $criteria->andWhere(Criteria::expr()->eq('calendar_sync_info', $calendar_sync_info)); return $this->schedule_sync_info->matching($criteria)->count() > 0; } /** * @param SummitEvent $event * @return bool */ public function isOnSchedule(SummitEvent $event) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('event', $event)); return $this->schedule->matching($criteria)->count() > 0; } /** * @param SummitEvent $event * @return null| SummitMemberSchedule */ public function getScheduleByEvent(SummitEvent $event) { try { $query = $this->createQuery("SELECT s from models\main\SummitMemberSchedule s JOIN s.member a JOIN s.event e WHERE a.id = :member_id and e.id = :event_id "); return $query ->setParameter('member_id', $this->getIdentifier()) ->setParameter('event_id', $event->getIdentifier()) ->getSingleResult(); } catch (NoResultException $ex1) { return null; } catch (NonUniqueResultException $ex2) { // should never happen return null; } } /** * @param int $summit_event_id * @param CalendarSyncInfo $calendar_sync_info * @return ScheduleCalendarSyncInfo|null */ public function getScheduleSyncInfoByEvent($summit_event_id, CalendarSyncInfo $calendar_sync_info) { try { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('summit_event_id', $summit_event_id)); $criteria->andWhere(Criteria::expr()->eq('calendar_sync_info', $calendar_sync_info)); $res = $this->schedule_sync_info->matching($criteria)->first(); return $res === false ? null : $res; } catch (NoResultException $ex1) { return null; } catch (NonUniqueResultException $ex2) { // should never happen return null; } } /** * @param SummitEvent $event * @return SummitMemberFavorite|null */ public function getFavoriteByEvent(SummitEvent $event) { try { $query = $this->createQuery("SELECT f from models\main\SummitMemberFavorite f JOIN f.member a JOIN f.event e WHERE a.id = :member_id and e.id = :event_id "); return $query ->setParameter('member_id', $this->getIdentifier()) ->setParameter('event_id', $event->getIdentifier()) ->getSingleResult(); } catch (NoResultException $ex1) { return null; } catch (NonUniqueResultException $ex2) { // should never happen return null; } } /** * @param Summit $summit * @return int[] */ public function getScheduledEventsIds(Summit $summit) { $sql = <<prepareRawSQL($sql); $stmt->execute( [ 'member_id' => $this->getId(), 'summit_id' => $summit->getId(), ] ); return $stmt->fetchAll(\PDO::FETCH_COLUMN); } /** * @param int $event_id * @return null|RSVP */ public function getRsvpByEvent($event_id) { $builder = $this->createQueryBuilder(); $rsvp = $builder ->select('r') ->from('models\summit\RSVP', 'r') ->join('r.owner', 'o') ->join('r.event', 'e') ->where('o.id = :owner_id and e.id = :event_id') ->setParameter('owner_id', $this->getId()) ->setParameter('event_id', intval($event_id)) ->getQuery()->getResult(); return count($rsvp) > 0 ? $rsvp[0] : null; } /** * @param Summit $summit * @return null|RSVP[] */ public function getRsvpBySummit(Summit $summit) { $builder = $this->createQueryBuilder(); $res = $builder ->select('r') ->from('models\summit\RSVP', 'r') ->join('r.owner', 'o') ->join('r.event', 'e') ->join('e.summit', 's') ->where('o.id = :owner_id and s.id = :summit_id') ->setParameter('owner_id', $this->getId()) ->setParameter('summit_id', $summit->getId()) ->getQuery()->getResult(); return $res; } /** * @param Summit $summit * @return SummitMemberSchedule[] */ public function getScheduleBySummit(Summit $summit) { $query = $this->createQuery("SELECT s from models\main\SummitMemberSchedule s JOIN s.member m JOIN s.event e JOIN e.summit su WHERE su.id = :summit_id and m.id = :member_id "); return $query ->setParameter('member_id', $this->getId()) ->setParameter('summit_id', $summit->getId()) ->getResult(); } /** * @param Summit $summit * @return SummitMemberFavorite[] */ public function getFavoritesSummitEventsBySummit(Summit $summit) { $query = $this->createQuery("SELECT f from models\main\SummitMemberFavorite f JOIN f.member m JOIN f.event e JOIN e.summit su WHERE su.id = :summit_id and m.id = :member_id "); return $query ->setParameter('member_id', $this->getId()) ->setParameter('summit_id', $summit->getId()) ->getResult(); } /** * @param Summit $summit * @return CalendarSyncInfo[] */ public function getSyncInfoBy(Summit $summit) { try { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('summit', $summit)); $criteria->andWhere(Criteria::expr()->eq('revoked', 0)); $res = $this->calendars_sync->matching($criteria)->first(); return $res == false ? null : $res; } catch (NoResultException $ex1) { return null; } catch (NonUniqueResultException $ex2) { // should never happen return null; } } /** * @param Summit $summit * @return bool */ public function hasSyncInfoFor(Summit $summit) { return !is_null($this->getSyncInfoBy($summit)); } /** * @param CalendarSyncInfo $calendar_sync_info */ public function removeFromCalendarSyncInfo(CalendarSyncInfo $calendar_sync_info) { $this->calendars_sync->removeElement($calendar_sync_info); $calendar_sync_info->clearOwner(); } /** * @param int $affiliation_id * @return Affiliation|null */ public function getAffiliationById($affiliation_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($affiliation_id))); $affiliation = $this->affiliations->matching($criteria)->first(); return $affiliation ? $affiliation : null; } /** * @param Affiliation $affiliation * @return $this */ public function removeAffiliation(Affiliation $affiliation) { if ($this->affiliations->contains($affiliation)) { $this->affiliations->removeElement($affiliation); $affiliation->clearOwner(); } return $this; } /** * @param Affiliation $affiliation * @return $this */ public function addAffiliation(Affiliation $affiliation) { if (!$this->affiliations->contains($affiliation)) { $this->affiliations->add($affiliation); $affiliation->setOwner($this); } return $this; } /** * @param int $rsvp_id * @return RSVP|null */ public function getRsvpById($rsvp_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', $rsvp_id)); $rsvp = $this->rsvp->matching($criteria)->first(); return $rsvp ? $rsvp : null; } /** * @param RSVP $rsvp * @return $this */ public function removeRsvp(RSVP $rsvp) { $this->rsvp->removeElement($rsvp); return $this; } /** * @return string */ public function getFullName() { $fullname = $this->first_name; if (!empty($this->last_name)) { if (!empty($fullname)) $fullname .= ' '; $fullname .= $this->last_name; } return $fullname; } /** * @return bool */ public function hasPhoto() { return $this->getPhotoId() > 0; } /** * @return int */ public function getPhotoId() { try { if (is_null($this->photo)) return 0; return $this->photo->getId(); } catch (\Exception $ex) { return 0; } } /** * @return string|null */ public function getProfilePhotoUrl(): ?string { $photoUrl = null; if(!empty($this->external_pic)){ return $this->external_pic; } if ($this->hasPhoto() && $photo = $this->getPhoto()) { $photoUrl = $photo->getUrl(); } if (empty($photo_url) && !empty($this->getTwitterHandle())) { $twitterName = $this->getTwitterHandle(); $photoUrl = sprintf("https://avatars.io/twitter/%s", trim(trim($twitterName, '@'))); } if (empty($photoUrl)) { // get gravatar by default $photoUrl = $this->getGravatarUrl(); } return $photoUrl; } /** * Get either a Gravatar URL or complete image tag for a specified email address. */ private function getGravatarUrl(): string { $url = 'https://www.gravatar.com/avatar/'; $url .= md5(strtolower(trim($this->email))); return $url; } /** * @param SummitRoomReservation $reservation * @return $this */ public function addReservation(SummitRoomReservation $reservation) { if ($this->reservations->contains($reservation)) return $this; $this->reservations->add($reservation); $reservation->setOwner($this); return $this; } /** * @return ArrayCollection */ public function getReservations() { return $this->reservations; } /** * @param Summit $summit * @return int * @throws NoResultException * @throws NonUniqueResultException */ public function getReservationsCountBySummit(Summit $summit): int { $query = $this->createQuery("SELECT count(rv.id) from models\summit\SummitRoomReservation rv JOIN rv.owner o JOIN rv.room r JOIN r.venue v JOIN v.summit s WHERE s.id = :summit_id AND o.id = :owner_id and rv.status not in (:status)"); return $query ->setParameter('summit_id', $summit->getId()) ->setParameter('owner_id', $this->getId()) ->setParameter('status', [ SummitRoomReservation::RequestedRefundStatus, SummitRoomReservation::RefundedStatus, SummitRoomReservation::Canceled ]) ->getSingleScalarResult(); } /** * @param Summit $summit * @return SummitRoomReservation[] * @throws NoResultException * @throws NonUniqueResultException */ public function getReservationsBySummit(Summit $summit) { $query = $this->createQuery("SELECT rv from models\summit\SummitRoomReservation rv JOIN rv.owner o JOIN rv.room r JOIN r.venue v JOIN v.summit s WHERE s.id = :summit_id AND o.id = :owner_id"); return $query ->setParameter('summit_id', $summit->getId()) ->setParameter('owner_id', $this->getId()) ->getResult(); } /** * @param int $reservation_id * @return SummitRoomReservation */ public function getReservationById(int $reservation_id): ?SummitRoomReservation { $criteria = Criteria::create() ->where(Criteria::expr()->eq("id", $reservation_id)); return $this->reservations->matching($criteria)->first(); } /** * @param string|null $first_name */ public function setFirstName(?string $first_name): void { Log::debug(sprintf("Member::setFirstName %s (%s)", $first_name, $this->id)); $this->first_name = $first_name; } /** * @param string|null $bio */ public function setBio(?string $bio): void { $this->bio = $bio; } /** * @param string|null $last_name */ public function setLastName(?string $last_name): void { Log::debug(sprintf("Member::setLastName %s (%s)", $last_name, $this->id)); $this->last_name = $last_name; } /** * @return bool */ public function hasSpeaker() { return $this->getSpeakerId() > 0; } /** * @return PresentationSpeaker|null */ public function getSpeaker(): ?PresentationSpeaker { return $this->speaker; } /** * @return int */ public function getSpeakerId() { try { if (is_null($this->speaker)) return 0; return $this->speaker->getId(); } catch (\Exception $ex) { return 0; } } public function setSpeaker(PresentationSpeaker $speaker) { $this->speaker = $speaker; } public function clearSpeaker() { $this->speaker = null; } /** * @return int|null */ public function getUserExternalId(): ?int { return $this->user_external_id; } /** * @param int $user_external_id */ public function setUserExternalId(int $user_external_id): void { $this->user_external_id = $user_external_id; } /** * @return Sponsor[] */ public function getSponsorMemberships() { return $this->sponsor_memberships; } /** * @return ArrayCollection|SummitOrder[] */ public function getSummitRegistrationOrders() { return $this->summit_registration_orders; } /** * @param int $order_id * @return SummitOrder|null */ public function getSummitRegistrationOrderById(int $order_id): ?SummitOrder { $criteria = Criteria::create() ->where(Criteria::expr()->eq("id", $order_id)); $order = $this->summit_registration_orders->matching($criteria)->first(); return $order === false ? null : $order; } /** * @param SummitOrder $summit_order */ public function addSummitRegistrationOrder(SummitOrder $summit_order) { if ($this->summit_registration_orders->contains($summit_order)) return; $this->summit_registration_orders->add($summit_order); $summit_order->setOwner($this); } /** * @param Summit $summit * @return Sponsor|null */ public function getSponsorBySummit(Summit $summit): ?Sponsor { $sponsor = $this->sponsor_memberships->filter(function ($entity) use ($summit) { return $entity->getSummitId() == $summit->getId(); })->first(); return $sponsor === false ? null : $sponsor; } /** * @return string|null */ public function getMembershipType(): ?string { return $this->membership_type; } /** * @param Group $group */ public function add2Group(Group $group) { if ($this->groups->contains($group)) return; $this->groups->add($group); //$group->addMember($this); } public function removeFromGroup(Group $group) { if (!$this->groups->contains($group)) return; $this->groups->removeElement($group); //$group->removeMember($this); } /** * @param PersonalCalendarShareInfo $link */ public function addScheduleShareableLink(PersonalCalendarShareInfo $link) { if ($this->schedule_shareable_links->contains($link)) return; $this->schedule_shareable_links->add($link); $link->setOwner($this); } /** * @param PersonalCalendarShareInfo $link */ public function removeScheduleShareableLink(PersonalCalendarShareInfo $link) { if (!$this->schedule_shareable_links->contains($link)) return; $this->schedule_shareable_links->removeElement($link); $link->clearOwner(); } /** * @param Summit $summit * @return PersonalCalendarShareInfo|null */ public function getScheduleShareableLinkBy(Summit $summit): ?PersonalCalendarShareInfo { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('summit', $summit)); $criteria->andWhere(Criteria::expr()->eq('revoked', false)); $link = $this->schedule_shareable_links->matching($criteria)->first(); return $link === false ? null : $link; } /** * @param Summit $summit * @return PersonalCalendarShareInfo|null * @throws \Exception */ public function createScheduleShareableLink(Summit $summit): ?PersonalCalendarShareInfo { $former_link = $this->getScheduleShareableLinkBy($summit); if (!is_null($former_link)) { return $former_link; } $link = new PersonalCalendarShareInfo(); $summit->addScheduleShareableLink($link); $this->addScheduleShareableLink($link); $link->generateCid(); return $link; } /** * @param SummitAdministratorPermissionGroup $group */ public function add2SummitAdministratorPermissionGroup(SummitAdministratorPermissionGroup $group) { if ($this->summit_permission_groups->contains($group)) return; $this->summit_permission_groups->add($group); } public function removeFromSummitAdministratorPermissionGroup(SummitAdministratorPermissionGroup $group) { if (!$this->summit_permission_groups->contains($group)) return; $this->summit_permission_groups->removeElement($group); } public function getSummitAdministratorPermissionGroup() { return $this->summit_permission_groups; } /** * @return array */ public function getAllAllowedSummitsIds(): array { $sql = <<prepareRawSQL($sql); $stmt->execute( [ 'member_id' => $this->getId(), ] ); return $stmt->fetchAll(\PDO::FETCH_COLUMN); } /** * @return bool */ public function hasAllowedSummits():bool{ return count($this->getAllAllowedSummitsIds()) > 0; } /** * @param Summit $summit * @return bool */ public function hasPaidTicketOnSummit(Summit $summit): bool { return count($this->getPaidSummitTicketsIds($summit)) > 0; } /** * @param Summit $summit * @param string $groupSlug * @return bool */ public function hasPermissionForOnGroup(Summit $summit, string $groupSlug): bool { if(!SummitAdministratorPermissionGroup::isValidGroup($groupSlug)) return false; $sql = <<prepareRawSQL($sql); $stmt->execute( [ 'member_id' => $this->getId(), 'summit_id' => $summit->getId() ] ); $allowed_summits = $stmt->fetchAll(\PDO::FETCH_COLUMN); return count($allowed_summits) > 0 && $this->isOnGroup($groupSlug); } /** * @param Summit $summit * @return bool */ public function hasPermissionFor(Summit $summit): bool { $sql = <<prepareRawSQL($sql); $stmt->execute( [ 'member_id' => $this->getId(), 'summit_id' => $summit->getId() ] ); $allowed_summits = $stmt->fetchAll(\PDO::FETCH_COLUMN); return count($allowed_summits) > 0; } /** * @param Summit $summit * @return int[] */ public function getPaidSummitTicketsIds(Summit $summit) { $sql = <<prepareRawSQL($sql); $stmt->execute( [ 'member_id' => $this->getId(), 'member_email' => $this->email, 'ticket_status' => IOrderConstants::PaidStatus, 'summit_id' => $summit->getId(), ] ); return $stmt->fetchAll(\PDO::FETCH_COLUMN); } /** * @param Summit $summit * @return bool */ public function hasSummitAccess(Summit $summit):bool{ return count($this->getPaidSummitTicketsIds($summit)) > 0; } /** * @param Summit $summit * @return SummitAttendeeTicket[] */ public function getPaidSummitTickets(Summit $summit) { return $this->getPaidSummitTicketsBySummitId($summit->getId()); } /** * @param Summit $summit * @return SummitAttendeeTicket[] */ public function getPaidSummitTicketsBySummitId(int $summit_id) { $query = $this->createQuery("SELECT t from models\summit\SummitAttendeeTicket t JOIN t.owner o LEFT JOIN o.member m JOIN o.summit su WHERE su.id = :summit_id and ( m.id = :member_id or o.email = :member_email) and t.status = :ticket_status and t.is_active = :active"); return $query ->setParameter('member_id', $this->getId()) ->setParameter('member_email', $this->email) ->setParameter('ticket_status', IOrderConstants::PaidStatus) ->setParameter('summit_id', $summit_id) ->setParameter('active', true) ->getResult(); } /** * @return string */ public function getExternalPic(): ?string { return $this->external_pic; } /** * @param string $external_pic */ public function setExternalPic(string $external_pic): void { $this->external_pic = $external_pic; } public function resignFoundationMembership(){ // Remove member from Foundation group foreach ($this->groups as $g) { if ($g->getCode() === IGroup::FoundationMembers) { $this->removeFromGroup($g); break; } } // Remove Member's Legal Agreements $this->legal_agreements->clear(); $this->membership_type = self::MembershipTypeCommunity; $this->resign_date = new \DateTime('now', new \DateTimeZone(self::DefaultTimeZone)); } public function resignMembership(){ // Remove Member's Legal Agreements $this->legal_agreements->clear(); $this->affiliations->clear(); $this->groups->clear(); $this->membership_type = self::MembershipTypeNone; $this->resign_date = new \DateTime('now', new \DateTimeZone(self::DefaultTimeZone)); } public function signFoundationMembership(LegalDocument $document) { if (!$this->isFoundationMember()) { // Set up member with legal agreement for becoming an OpenStack Foundation Member $legalAgreement = new LegalAgreement(); $legalAgreement->setOwner($this); $legalAgreement->setDocument($document); $this->legal_agreements->add($legalAgreement); $this->membership_type = self::MembershipTypeFoundation; $this->resign_date = null; } } public function isFoundationMember() { return $this->belongsToGroup(IGroup::FoundationMembers) && $this->legal_agreements->count() > 0; } /** * @param SummitTrackChair $trackChair */ public function addTrackChair(SummitTrackChair $trackChair){ if($this->track_chairs->contains($trackChair)) return; $this->track_chairs->add($trackChair); $trackChair->setMember($this); } /** * @param SummitTrackChair $trackChair */ public function removeTrackChair(SummitTrackChair $trackChair){ if(!$this->track_chairs->contains($trackChair)) return; $this->track_chairs->removeElement($trackChair); $trackChair->clearMember(); } /** * @return ArrayCollection|SummitTrackChair[] */ public function getTrackChairs(){ return $this->track_chairs; } }