dates_label; } /** * @param string $dates_label */ public function setDatesLabel($dates_label) { $this->dates_label = $dates_label; } /** * @return mixed */ public function getName() { return $this->name; } /** * @param string $name */ public function setName($name) { $this->name = $name; } /** * @return mixed */ public function getWifiConnections() { return $this->wifi_connections; } /** * @param mixed $wifi_connections */ public function setWifiConnections($wifi_connections) { $this->wifi_connections = $wifi_connections; } /** * @return string */ public function getExternalSummitId() { return $this->external_summit_id; } /** * @param string $external_summit_id */ public function setExternalSummitId($external_summit_id) { $this->external_summit_id = $external_summit_id; } /** * @return \DateTime */ public function getScheduleDefaultStartDate() { return $this->schedule_default_start_date; } /** * @param \DateTime $schedule_default_start_date */ public function setScheduleDefaultStartDate($schedule_default_start_date) { $this->schedule_default_start_date = $this->convertDateFromTimeZone2UTC($schedule_default_start_date); } public function clearScheduleDefaultStartDate(){ $this->schedule_default_start_date = null; } /** * @return mixed */ public function getBeginDate() { return $this->begin_date; } /** * @param \DateTime $begin_date */ public function setBeginDate($begin_date) { $this->begin_date = $this->convertDateFromTimeZone2UTC($begin_date); } /** * @return $this */ public function clearBeginEndDates(){ $this->begin_date = $this->end_date = null; return $this; } /** * @return \DateTime */ public function getEndDate() { return $this->end_date; } /** * @param \DateTime $end_date */ public function setEndDate($end_date) { $this->end_date = $this->convertDateFromTimeZone2UTC($end_date); } /** * @return bool */ public function getActive() { return $this->active; } /** * @param bool $active */ public function setActive($active) { $this->active = $active; } /** * @return \DateTime */ public function getStartShowingVenuesDate() { return $this->start_showing_venues_date; } /** * @param \DateTime $start_showing_venues_date */ public function setStartShowingVenuesDate($start_showing_venues_date) { $this->start_showing_venues_date = $this->convertDateFromTimeZone2UTC($start_showing_venues_date); } public function clearStartShowingVenuesDate(){ $this->start_showing_venues_date = null; } /** * @return boolean */ public function isAvailableOnApi() { return $this->available_on_api; } /** * @param boolean $available_on_api */ public function setAvailableOnApi($available_on_api) { $this->available_on_api = $available_on_api; } /** * @return SummitType */ public function getType() { try { return $this->type; } catch (\Exception $ex) { return null; } } /** * @param SummitType $type */ public function setType($type) { $this->type = $type; } /** * @return int */ public function getTypeId() { try { return !is_null($this->type) ? $this->type->getId() : 0; } catch (\Exception $ex) { return 0; } } /** * @return bool */ public function hasType() { return $this->getTypeId() > 0; } /** * @return string */ public function getSummitExternalId() { return $this->external_summit_id; } /** * @return bool */ public function isActive() { return $this->active; } const DefaultMaxSubmissionAllowedPerUser = 3; /** * Summit constructor. */ public function __construct() { parent::__construct(); // default values $this->active = false; $this->available_on_api = false; $this->max_submission_allowed_per_user = self::DefaultMaxSubmissionAllowedPerUser; $this->locations = new ArrayCollection; $this->events = new ArrayCollection; $this->event_types = new ArrayCollection; $this->ticket_types = new ArrayCollection; $this->presentation_categories = new ArrayCollection; $this->category_groups = new ArrayCollection; $this->attendees = new ArrayCollection; $this->entity_events = new ArrayCollection; $this->wifi_connections = new ArrayCollection; $this->promo_codes = new ArrayCollection; $this->speaker_assistances = new ArrayCollection; $this->excluded_categories_for_accepted_presentations = new ArrayCollection; $this->excluded_categories_for_alternate_presentations = new ArrayCollection; $this->excluded_categories_for_rejected_presentations = new ArrayCollection; $this->excluded_categories_for_upload_slide_decks = new ArrayCollection; $this->rsvp_templates = new ArrayCollection; $this->track_tag_groups = new ArrayCollection; $this->notifications = new ArrayCollection; $this->selection_plans = new ArrayCollection; } /** * @param int $assistance_id * @return PresentationSpeakerSummitAssistanceConfirmationRequest|null */ public function getSpeakerAssistanceById($assistance_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($assistance_id))); $speaker_assistance = $this->speaker_assistances->matching($criteria)->first(); return $speaker_assistance === false ? null : $speaker_assistance; } /** * @return DateTime */ public function getLocalBeginDate() { return $this->convertDateFromUTC2TimeZone($this->begin_date); } /** * @return DateTime */ public function getLocalEndDate() { return $this->convertDateFromUTC2TimeZone($this->end_date); } /** * @param SummitAbstractLocation $location * @return $this */ public function addLocation(SummitAbstractLocation $location) { $this->locations->add($location); $location->setSummit($this); $location->setOrder($this->getLocationMaxOrder() + 1); return $this; } /** * @return int */ private function getLocationMaxOrder(){ $criteria = Criteria::create(); $criteria->orderBy(['order' => 'DESC']); $location = $this->locations->matching($criteria)->first(); return $location === false ? 0 : $location->getOrder(); } /** * @return ArrayCollection */ public function getLocations() { return $this->locations; } /** * @return SummitVenue[] */ public function getVenues() { return $this->locations->filter(function ($e) { return $e instanceof SummitVenue; }); } /** * @param string $name * @return SummitAbstractLocation|null */ public function getLocationByName($name){ $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('name', trim($name))); $location = $this->locations->matching($criteria)->first(); return $location === false ? null : $location; } /** * @return SummitHotel[] */ public function getHotels() { return $this->locations->filter(function ($e) { return $e instanceof SummitHotel; }); } /** * @return SummitAirport[] */ public function getAirports() { return $this->locations->filter(function ($e) { return $e instanceof SummitAirport; }); } /** * @return SummitExternalLocation[] */ public function getExternalLocations() { return $this->locations->filter(function ($e) { return $e->getClassName() == 'SummitExternalLocation'; }); } /** * @return ArrayCollection */ public function getEvents() { return $this->events; } /** * @param SummitEvent $event */ public function addEvent(SummitEvent $event) { $this->events->add($event); $event->setSummit($this); } /** * @return File */ public function getLogo() { return $this->logo; } /** * @return bool */ public function hasLogo() { return $this->getLogoId() > 0; } /** * @return int */ public function getLogoId() { try { return !is_null($this->logo) ? $this->logo->getId() : 0; } catch (\Exception $ex) { return 0; } } /** * @param int $location_id * @return SummitAbstractLocation */ public function getLocation($location_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($location_id))); $location = $this->locations->matching($criteria)->first(); return $location === false ? null : $location; } /** * @param SummitAbstractLocation $location * @return bool */ static public function isPrimaryLocation(SummitAbstractLocation $location){ return ($location instanceof SummitVenue || $location instanceof SummitHotel || $location instanceof SummitAirport || $location instanceof SummitExternalLocation); } /** * @return SummitEventType[] */ public function getEventTypes() { return $this->event_types; } /** * @param int $event_type_id * @return SummitEventType|null */ public function getEventType($event_type_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($event_type_id))); $event_type = $this->event_types->matching($criteria)->first(); return $event_type === false ? null : $event_type; } /** * @param string $type * @return bool */ public function hasEventType($type) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('type', $type)); return $this->event_types->matching($criteria)->count() > 0; } /** * @param string $type * @return SummitEventType|null */ public function getEventTypeByType($type) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('type', $type)); $event_type = $this->event_types->matching($criteria)->first(); return $event_type === false ? null : $event_type; } /** * @param int $wifi_connection_id * @return SummitWIFIConnection|null */ public function getWifiConnection($wifi_connection_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($wifi_connection_id))); $wifi_conn = $this->wifi_connections->matching($criteria)->first(); return $wifi_conn === false ? null : $wifi_conn; } /** * @return SummitTicketType[] */ public function getTicketTypes() { return $this->ticket_types; } /** * @param string $ticket_type_external_id * @return SummitTicketType|null */ public function getTicketTypeByExternalId($ticket_type_external_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('external_id', $ticket_type_external_id)); $ticket_type = $this->ticket_types->matching($criteria)->first(); return $ticket_type === false ? null : $ticket_type; } /** * @param int $event_id * @return null|SummitEvent */ public function getScheduleEvent($event_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('published', 1)); $criteria->andWhere(Criteria::expr()->eq('id', intval($event_id))); $event = $this->events->matching($criteria)->first(); return $event === false ? null : $event; } /** * @param int $event_id * @return bool */ public function isEventOnSchedule($event_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('published', 1)); $criteria->andWhere(Criteria::expr()->eq('id', intval($event_id))); return $this->events->matching($criteria)->count() > 0; } public function getScheduleEvents() { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('published', 1)); $criteria->orderBy(["start_date" => Criteria::ASC, "end_date" => Criteria::ASC]); return $this->events->matching($criteria); } public function getPresentations() { $query = $this->createQuery("SELECT p from models\summit\Presentation p JOIN p.summit s WHERE s.id = :summit_id"); return $query->setParameter('summit_id', $this->getIdentifier())->getResult(); } /** * @param PresentationSpeaker $speaker * @param SelectionPlan $selectionPlan * @return array */ public function getModeratedPresentationsBy(PresentationSpeaker $speaker, SelectionPlan $selectionPlan){ $query = $this->createQuery("SELECT p from models\summit\Presentation p JOIN p.summit s JOIN p.moderator m JOIN p.selection_plan sp WHERE s.id = :summit_id and m.id = :moderator_id and sp.id = :selection_plan_id"); return $query ->setParameter('summit_id', $this->getIdentifier()) ->setParameter('moderator_id', $speaker->getIdentifier()) ->setParameter('selection_plan_id', $selectionPlan->getIdentifier()) ->getResult(); } /** * @param PresentationSpeaker $speaker * @param SelectionPlan $selectionPlan * @return array */ public function getCreatedPresentations(PresentationSpeaker $speaker, SelectionPlan $selectionPlan){ $query = $this->createQuery("SELECT p from models\summit\Presentation p JOIN p.summit s JOIN p.creator c JOIN p.selection_plan sp WHERE s.id = :summit_id and c.id = :creator_id and sp.id = :selection_plan_id"); return $query ->setParameter('summit_id', $this->getIdentifier()) ->setParameter('creator_id', $speaker->getMemberId()) ->setParameter('selection_plan_id', $selectionPlan->getIdentifier()) ->getResult(); } /** * @param int $event_id * @return null|SummitEvent */ public function getEvent($event_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($event_id))); $event = $this->events->matching($criteria)->first(); return $event === false ? null : $event; } /** * @return PresentationCategory[] */ public function getPresentationCategories() { return $this->presentation_categories; } /** * @param PresentationCategory $track * @return $this */ public function addPresentationCategory(PresentationCategory $track) { $this->presentation_categories->add($track); $track->setSummit($this); return $this; } /** * @param int $category_id * @return PresentationCategory */ public function getPresentationCategory($category_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($category_id))); $category = $this->presentation_categories->matching($criteria)->first(); return $category === false ? null : $category; } /** * @param string $category_title * @return PresentationCategory */ public function getPresentationCategoryByTitle($category_title) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('title', trim($category_title))); $category = $this->presentation_categories->matching($criteria)->first(); return $category === false ? null : $category; } /** * @param string $category_code * @return PresentationCategory */ public function getPresentationCategoryByCode($category_code) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('code', trim($category_code))); $category = $this->presentation_categories->matching($criteria)->first(); return $category === false ? null : $category; } /** * @return PresentationCategoryGroup[] */ public function getCategoryGroups() { return $this->category_groups; } /** * @param int $group_id * @return null|PresentationCategoryGroup */ public function getCategoryGroupById($group_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($group_id))); $group = $this->category_groups->matching($criteria)->first(); return $group === false ? null : $group; } /** * @param string $name * @return null|PresentationCategoryGroup */ public function getCategoryGroupByName($name) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('name', trim($name))); $group = $this->category_groups->matching($criteria)->first(); return $group === false ? null : $group; } /** * @param PresentationCategoryGroup $track_group */ public function addCategoryGroup(PresentationCategoryGroup $track_group){ if($this->category_groups->contains($track_group)) return; $this->category_groups->add($track_group); $track_group->setSummit($this); } /** * @param PresentationCategoryGroup $track_group */ public function removeCategoryGroup(PresentationCategoryGroup $track_group){ if(!$this->category_groups->contains($track_group)) return; $this->category_groups->removeElement($track_group); $track_group->clearSummit(); } /** * @param int $member_id * @return SummitAttendee */ public function getAttendeeByMemberId($member_id) { $builder = $this->createQueryBuilder(); $members = $builder ->select('a') ->from('models\summit\SummitAttendee', 'a') ->join('a.member', 'm') ->join('a.summit', 's') ->where('s.id = :summit_id and m.id = :member_id') ->setParameter('summit_id', $this->getId()) ->setParameter('member_id', intval($member_id)) ->getQuery()->getResult(); return count($members) > 0 ? $members[0] : null; } /** * @param Member $member * @return SummitAttendee|null */ public function getAttendeeByMember(Member $member) { return $this->getAttendeeByMemberId($member->getId()); } /** * @param int $attendee_id * @return SummitAttendee */ public function getAttendeeById($attendee_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($attendee_id))); $attendee = $this->attendees->matching($criteria)->first(); return $attendee === false ? null : $attendee; } /** * @ORM\OneToMany(targetEntity="models\summit\SummitEntityEvent", mappedBy="summit", cascade={"persist"}, orphanRemoval=true) * @var SummitEntityEvent[] */ private $entity_events; /** * @ORM\OneToMany(targetEntity="models\summit\SummitPushNotification", mappedBy="summit", cascade={"persist"}, orphanRemoval=true) * @var SummitPushNotification[] */ private $notifications; /** * @param SummitEvent $summit_event * @return bool */ public function isEventInsideSummitDuration(SummitEvent $summit_event) { return $this->isTimeFrameInsideSummitDuration($summit_event->getLocalStartDate(), $summit_event->getLocalEndDate()); } /** * @param DateTime $start_date * @param DateTime $end_date * @return bool */ public function isTimeFrameInsideSummitDuration(DateTime $start_date, DateTime $end_date ) { $summit_start_date = $this->getLocalBeginDate(); $summit_end_date = $this->getLocalEndDate(); return $start_date >= $summit_start_date && $start_date <= $summit_end_date && $end_date <= $summit_end_date && $end_date >= $start_date; } /** * @param bool $filter_published_events * @return \Doctrine\ORM\QueryBuilder */ private function buildModeratorsQuery($filter_published_events = true) { $query = $this->createQueryBuilder() ->select('distinct ps') ->from('models\summit\PresentationSpeaker', 'ps') ->join('ps.moderated_presentations', 'p') ->join('p.summit', 's') ->where("s.id = :summit_id"); if ($filter_published_events) $query = $query->andWhere("p.published = 1"); return $query->setParameter('summit_id', $this->getId()); } /** * @param bool $filter_published_events * @return \Doctrine\ORM\QueryBuilder */ private function buildSpeakersQuery($filter_published_events = true) { $query = $this->createQueryBuilder() ->select('distinct ps') ->from('models\summit\PresentationSpeaker', 'ps') ->join('ps.presentations', 'p') ->join('p.summit', 's') ->where("s.id = :summit_id"); if ($filter_published_events) $query = $query->andWhere("p.published = 1"); return $query->setParameter('summit_id', $this->getId()); } /** * @return \Doctrine\ORM\QueryBuilder */ private function buildSpeakerSummitAttendanceQuery() { return $this->createQueryBuilder() ->select('distinct ps') ->from('models\summit\PresentationSpeaker', 'ps') ->join('ps.summit_assistances', 'a') ->join('a.summit', 's') ->where("s.id = :summit_id") ->setParameter('summit_id', $this->getId()); } /** * @return PresentationSpeaker[] */ public function getSpeakers() { // moderators $moderators = $this->buildModeratorsQuery()->getQuery()->getResult(); // get moderators ids to exclude from speakers $moderators_ids = array(); foreach ($moderators as $m) { $moderators_ids[] = $m->getId(); } // speakers $sbuilder = $this->buildSpeakersQuery(); if (count($moderators_ids) > 0) { $moderators_ids = implode(', ', $moderators_ids); $sbuilder = $sbuilder->andWhere("ps.id not in ({$moderators_ids})"); } $speakers = $sbuilder->getQuery()->getResult(); return array_merge($speakers, $moderators); } /** * @param Member $member * @return PresentationSpeaker|null */ public function getSpeakerByMember(Member $member) { return $this->getSpeakerByMemberId($member->getId()); } /**` * @param int $member_id * @param bool $filter_published_events * @return PresentationSpeaker|null */ public function getSpeakerByMemberId($member_id, $filter_published_events = true) { // moderators $moderator = $this->buildModeratorsQuery($filter_published_events) ->join('ps.member', 'mb') ->andWhere('mb.id = :member_id') ->setParameter('member_id', $member_id) ->getQuery()->getOneOrNullResult(); if (!is_null($moderator)) return $moderator; // speakers $speaker = $this->buildSpeakersQuery($filter_published_events) ->join('ps.member', 'mb') ->andWhere('mb.id = :member_id') ->setParameter('member_id', $member_id) ->getQuery()->getOneOrNullResult(); if (!is_null($speaker)) return $speaker; // assistance $speaker = $this->buildSpeakerSummitAttendanceQuery() ->join('ps.member', 'mb') ->andWhere('mb.id = :member_id') ->setParameter('member_id', $member_id) ->getQuery()->getOneOrNullResult(); if (!is_null($speaker)) return $speaker; return null; } /** * @param int $speaker_id * @param bool $filter_published_events * @return PresentationSpeaker|null */ public function getSpeaker($speaker_id, $filter_published_events = true) { // moderators $moderator = $this->buildModeratorsQuery($filter_published_events) ->andWhere('ps.id = :speaker_id') ->setParameter('speaker_id', $speaker_id) ->getQuery()->getOneOrNullResult(); if (!is_null($moderator)) return $moderator; // speakers $speaker = $this->buildSpeakersQuery($filter_published_events) ->andWhere('ps.id = :speaker_id') ->setParameter('speaker_id', $speaker_id) ->getQuery()->getOneOrNullResult(); if (!is_null($speaker)) return $speaker; // attendance $speaker = $this->buildSpeakerSummitAttendanceQuery() ->andWhere('ps.id = :speaker_id') ->setParameter('speaker_id', $speaker_id) ->getQuery()->getOneOrNullResult(); if (!is_null($speaker)) return $speaker; return null; } /** * @return Company[] */ public function getSponsors() { $builder = $this->createQueryBuilder(); return $builder ->select('distinct c') ->from('models\main\Company', 'c') ->join('c.sponsorships', 'sp') ->join('sp.summit', 's') ->where('s.id = :summit_id and sp.published = 1') ->setParameter('summit_id', $this->getId())->getQuery()->getResult(); } /** * @return string */ public function getMainPage() { try { $sql = <<prepareRawSQL($sql); $stmt->execute(['summit_id' => $this->id]); $res = $stmt->fetchAll(\PDO::FETCH_COLUMN); return count($res) > 0 ? $res[0] : ''; } catch (\Exception $ex) { } return ''; } /** * @return string */ public function getSchedulePage() { try { $sql = <<prepareRawSQL($sql); $stmt->execute(['summit_id' => $this->id]); $res = $stmt->fetchAll(\PDO::FETCH_COLUMN); return count($res) > 0 ? $res[0] : ''; } catch (\Exception $ex) { } return ''; } /** * @param SummitEvent $summit_event * @param Member|null $member * @return bool * @throws ValidationException */ static public function allowToSee(SummitEvent $summit_event, Member $member = null) { $event_type = $summit_event->getType(); if (is_null($event_type)) throw new ValidationException(sprintf("event type is null for event id %s", $summit_event->getId())); if (!$event_type->isPrivate()) return true; if (is_null($member)) return false; if ($member->isAdmin()) return true; // i am logged, check if i have permissions if ($summit_event instanceof SummitGroupEvent) { $member_groups_code = []; $event_groups_code = []; foreach ($member->getGroups() as $member_group) { $member_groups_code[] = $member_group->getCode(); } foreach ($summit_event->getGroups() as $event_group) { $event_groups_code[] = $event_group->getCode(); } return count(array_intersect($event_groups_code, $member_groups_code)) > 0; } return true; } /** * @param Member $member * @return SummitGroupEvent[] */ public function getGroupEventsFor(Member $member) { $builder = $this->createQueryBuilder() ->select('distinct eg') ->from('models\summit\SummitGroupEvent', 'eg') ->join('eg.groups', 'g') ->join('eg.summit', 's') ->where("s.id = :summit_id and eg.published = 1") ->setParameter('summit_id', $this->getId()); if (!$member->isAdmin()) { $groups_ids = $member->getGroupsIds(); if (count($groups_ids) == 0) return []; $groups_ids = implode(",", $groups_ids); $builder->andWhere("g.id in ({$groups_ids})"); } return $builder->getQuery()->getResult(); } /** * @return string */ public function getSlug() { $res = "openstack-" . $this->name . '-'; $res .= $this->begin_date->format('Y') . '-summit'; $res = strtolower(preg_replace('/[^a-zA-Z0-9\-]/', '', $res)); return $res; } /** * @return int */ public function getPresentationVotesCount() { try { $sql = <<prepareRawSQL($sql); $stmt->execute(['summit_id' => $this->id]); $res = $stmt->fetchAll(\PDO::FETCH_COLUMN); return count($res) > 0 ? $res[0] : 0; } catch (\Exception $ex) { } return 0; } /** * @return int */ public function getPresentationVotersCount() { try { $sql = <<prepareRawSQL($sql); $stmt->execute(['summit_id' => $this->id]); $res = $stmt->fetchAll(\PDO::FETCH_COLUMN); return count($res) > 0 ? $res[0] : 0; } catch (\Exception $ex) { } return 0; } /** * @return int */ public function getAttendeesCount() { return $this->attendees->count(); } /** * @return int */ public function getSpeakersCount() { return count($this->getSpeakers()); } /** * @return int */ public function getPresentationsSubmittedCount() { try { $sql = <<prepareRawSQL($sql); $stmt->execute(['summit_id' => $this->id, 'status' => Presentation::STATUS_RECEIVED]); $res = $stmt->fetchAll(\PDO::FETCH_COLUMN); return count($res) > 0 ? $res[0] : 0; } catch (\Exception $ex) { } return 0; } /** * @return int */ public function getPublishedEventsCount() { try { $sql = <<prepareRawSQL($sql); $stmt->execute(['summit_id' => $this->id]); $res = $stmt->fetchAll(\PDO::FETCH_COLUMN); return count($res) > 0 ? $res[0] : 0; } catch (\Exception $ex) { } return 0; } // speakers emails info /** * @param strign $type * @return int */ public function getSpeakerAnnouncementEmailCount($type) { try { $sql = <<prepareRawSQL($sql); $stmt->execute(['summit_id' => $this->id, 'type' => $type]); $res = $stmt->fetchAll(\PDO::FETCH_COLUMN); return count($res) > 0 ? $res[0] : 0; } catch (\Exception $ex) { } return 0; } /** * @return int */ public function getSpeakerAnnouncementEmailAcceptedCount() { return $this->getSpeakerAnnouncementEmailCount('ACCEPTED'); } /** * @return int */ public function getSpeakerAnnouncementEmailRejectedCount() { return $this->getSpeakerAnnouncementEmailCount('REJECTED'); } /** * @return int */ public function getSpeakerAnnouncementEmailAlternateCount() { return $this->getSpeakerAnnouncementEmailCount('ALTERNATE'); } /** * @return int */ public function getSpeakerAnnouncementEmailAcceptedAlternateCount() { return $this->getSpeakerAnnouncementEmailCount('ACCEPTED_ALTERNATE'); } /** * @return int */ public function getSpeakerAnnouncementEmailAcceptedRejectedCount() { return $this->getSpeakerAnnouncementEmailCount('ACCEPTED_REJECTED'); } /** * @return int */ public function getSpeakerAnnouncementEmailAlternateRejectedCount() { return $this->getSpeakerAnnouncementEmailCount('ALTERNATE_REJECTED'); } /** * @param SummitRegistrationPromoCode $promo_code */ public function addPromoCode(SummitRegistrationPromoCode $promo_code) { $this->promo_codes->add($promo_code); $promo_code->setSummit($this); } /** * @param string $code * @return SummitRegistrationPromoCode|null */ public function getPromoCodeByCode($code) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('code', trim($code))); $promo_code = $this->promo_codes->matching($criteria)->first(); return $promo_code === false ? null : $promo_code; } /** * @param int $promo_code_id * @return SummitRegistrationPromoCode|null */ public function getPromoCodeById($promo_code_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', $promo_code_id)); $promo_code = $this->promo_codes->matching($criteria)->first(); return $promo_code === false ? null : $promo_code; } /** * @param SummitRegistrationPromoCode $promo_code * @return $this */ public function removePromoCode(SummitRegistrationPromoCode $promo_code) { $this->promo_codes->removeElement($promo_code); $promo_code->clearSummit(); return $this; } /** * @param SummitEventType $event_type * @return $this */ public function removeEventType(SummitEventType $event_type) { $this->event_types->removeElement($event_type); $event_type->clearSummit(); return $this; } /** * @return PresentationCategory[] */ public function getExcludedCategoriesForAcceptedPresentations() { return $this->excluded_categories_for_accepted_presentations->toArray(); } /** * @return PresentationCategory[] */ public function getExcludedCategoriesForAlternatePresentations() { return $this->excluded_categories_for_alternate_presentations->toArray(); } /** * @return PresentationCategory[] */ public function getExcludedCategoriesForRejectedPresentations() { return $this->excluded_categories_for_rejected_presentations->toArray(); } /** * @return PresentationCategory[] */ public function getExcludedCategoriesForUploadSlideDecks() { return $this->excluded_categories_for_upload_slide_decks->toArray(); } /** * @param SummitEventType $event_type * @return $this */ public function addEventType(SummitEventType $event_type) { $this->event_types->add($event_type); $event_type->setSummit($this); return $this; } /** * @param SummitTicketType $ticket_type * @return $this */ public function addTicketType(SummitTicketType $ticket_type) { $this->ticket_types->add($ticket_type); $ticket_type->setSummit($this); return $this; } /** * @param SummitTicketType $ticket_type * @return $this */ public function removeTicketType(SummitTicketType $ticket_type) { $this->ticket_types->removeElement($ticket_type); $ticket_type->clearSummit(); return $this; } /** * @param string $name * @return SummitTicketType|null */ public function getTicketTypeByName($name){ $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('name', trim($name))); $res = $this->ticket_types->matching($criteria)->first(); return $res === false ? null : $res; } /** * @param int $id * @return SummitTicketType|null */ public function getTicketTypeById($id){ $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($id))); $res = $this->ticket_types->matching($criteria)->first(); return $res === false ? null : $res; } /** * @param int $rsvp_template_id * @return RSVPTemplate|null */ public function getRSVPTemplateById($rsvp_template_id){ $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($rsvp_template_id))); $rsvp_template = $this->rsvp_templates->matching($criteria)->first(); return $rsvp_template === false ? null : $rsvp_template; } /** * @param string $rsvp_template_title * @return RSVPTemplate|null */ public function getRSVPTemplateByTitle($rsvp_template_title){ $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('title', trim($rsvp_template_title))); $rsvp_template = $this->rsvp_templates->matching($criteria)->first(); return $rsvp_template === false ? null : $rsvp_template; } /** * @param RSVPTemplate $template * @return $this */ public function addRSVPTemplate(RSVPTemplate $template){ if($this->rsvp_templates->contains($template)) return; $this->rsvp_templates->add($template); $template->setSummit($this); return $this; } /** * @param RSVPTemplate $template * @return $this */ public function removeRSVPTemplate(RSVPTemplate $template){ if(!$this->rsvp_templates->contains($template)) return; $this->rsvp_templates->removeElement($template); $template->clearSummit(); return $this; } use OrderableChilds; /** * @param SummitAbstractLocation $location * @param int $new_order * @throws ValidationException */ public function recalculateLocationOrder(SummitAbstractLocation $location, $new_order){ $criteria = Criteria::create(); $criteria->orderBy(['order'=> 'ASC']); $filtered_locations = []; foreach($this->locations->matching($criteria)->toArray() as $l){ if(Summit::isPrimaryLocation($l)) $filtered_locations[] = $l; } self::recalculateOrderForCollection($filtered_locations, $location, $new_order); } /** * @param SummitAbstractLocation $location * @return int[] */ public function getScheduleEventsIdsPerLocation(SummitAbstractLocation $location){ $query = <<getEM()->createQuery($query); $native_query->setParameter("summit", $this); $native_query->setParameter("location", $location); $res = $native_query->getResult(); return $res; } /** * @param SummitAbstractLocation $location * @return $this */ public function removeLocation(SummitAbstractLocation $location){ $this->locations->removeElement($location); $location->setSummit(null); return $this; } /** * @param string $calendar_sync_name */ public function setCalendarSyncName($calendar_sync_name) { $this->calendar_sync_name = $calendar_sync_name; } /** * @param string $calendar_sync_desc */ public function setCalendarSyncDesc($calendar_sync_desc) { $this->calendar_sync_desc = $calendar_sync_desc; } /** * @return string */ public function getLink() { return $this->link; } /** * @param string $link */ public function setLink($link) { $this->link = $link; } /** * @return string */ public function getRegistrationLink() { return $this->registration_link; } /** * @param string $registration_link */ public function setRegistrationLink($registration_link) { $this->registration_link = $registration_link; } /** * @return int */ public function getMaxSubmissionAllowedPerUser() { return $this->max_submission_allowed_per_user; } /** * @param int $max_submission_allowed_per_user */ public function setMaxSubmissionAllowedPerUser($max_submission_allowed_per_user) { $this->max_submission_allowed_per_user = $max_submission_allowed_per_user; } /** * @param SummitPushNotification $notification * @return $this */ public function addNotification(SummitPushNotification $notification){ $this->notifications->add($notification); $notification->setSummit($this); return $this; } /** * @return string */ public function getTimeZoneId() { return $this->time_zone_id; } /** * @param string $time_zone_id */ public function setTimeZoneId($time_zone_id) { $this->time_zone_id = $time_zone_id; } /** * @return string */ public function getSecondaryRegistrationLink() { return $this->secondary_registration_link; } /** * @param string $secondary_registration_link */ public function setSecondaryRegistrationLink($secondary_registration_link) { $this->secondary_registration_link = $secondary_registration_link; } /** * @return string */ public function getSecondaryRegistrationLabel() { return $this->secondary_registration_label; } /** * @param string $secondary_registration_label */ public function setSecondaryRegistrationLabel($secondary_registration_label) { $this->secondary_registration_label = $secondary_registration_label; } /** * @param int $notification_id * @return SummitPushNotification|null */ public function getNotificationById($notification_id){ $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($notification_id))); $notification = $this->notifications->matching($criteria)->first(); return $notification === false ? null : $notification; } /** * @param SummitPushNotification $notification * @return $this */ public function removeNotification(SummitPushNotification $notification){ $this->notifications->removeElement($notification); $notification->clearSummit(); return $this; } /** * @return string */ public function getCalendarSyncName() { return $this->calendar_sync_name; } /** * @return string */ public function getCalendarSyncDesc() { return $this->calendar_sync_desc; } /** * @return DateTime */ public function getRegistrationBeginDate() { return $this->registration_begin_date; } /** * @param DateTime $registration_begin_date */ public function setRegistrationBeginDate(DateTime $registration_begin_date){ $this->registration_begin_date = $this->convertDateFromTimeZone2UTC($registration_begin_date); } /** * @return $this */ public function clearRegistrationDates(){ $this->registration_begin_date = $this->registration_end_date = null; return $this; } /** * @return DateTime */ public function getRegistrationEndDate() { return $this->registration_end_date; } /** * @param DateTime $registration_end_date */ public function setRegistrationEndDate(DateTime $registration_end_date){ $this->registration_end_date = $this->convertDateFromTimeZone2UTC($registration_end_date); } /** * @return SelectionPlan[] */ public function getSelectionPlans() { return $this->selection_plans; } /** * @param SelectionPlan $selection_plan * @throws ValidationException * @return bool */ public function checkSelectionPlanConflicts(SelectionPlan $selection_plan){ foreach ($this->selection_plans as $sp){ if($sp->getId() == $selection_plan->getId()) continue; $start1 = $selection_plan->getSelectionBeginDate(); $end1 = $selection_plan->getSelectionEndDate(); $start2 = $sp->getSelectionBeginDate(); $end2 = $sp->getSelectionEndDate(); if(!is_null($start1) && !is_null($end1) && !is_null($start2) && !is_null($end2) && DateUtils::checkTimeFramesOverlap ( $start1, $end1, $start2, $end2 ) ) throw new ValidationException(trans( 'validation_errors.Summit.checkSelectionPlanConflicts.conflictOnSelectionWorkflow', [ 'selection_plan_id' => $sp->getId(), 'summit_id' => $this->getId() ] )); $start1 = $selection_plan->getSubmissionBeginDate(); $end1 = $selection_plan->getSubmissionEndDate(); $start2 = $sp->getSubmissionBeginDate(); $end2 = $sp->getSubmissionEndDate(); if(!is_null($start1) && !is_null($end1) && !is_null($start2) && !is_null($end2) && DateUtils::checkTimeFramesOverlap ( $start1, $end1, $start2, $end2 ) ) throw new ValidationException(trans( 'validation_errors.Summit.checkSelectionPlanConflicts.conflictOnSubmissionWorkflow', [ 'selection_plan_id' => $sp->getId(), 'summit_id' => $this->getId() ] )); $start1 = $selection_plan->getVotingBeginDate(); $end1 = $selection_plan->getVotingEndDate(); $start2 = $sp->getVotingBeginDate(); $end2 = $sp->getVotingEndDate(); if(!is_null($start1) && !is_null($end1) && !is_null($start2) && !is_null($end2) && DateUtils::checkTimeFramesOverlap ( $start1, $end1, $start2, $end2 ) ) throw new ValidationException(trans( 'validation_errors.Summit.checkSelectionPlanConflicts.conflictOnVotingWorkflow', [ 'selection_plan_id' => $sp->getId(), 'summit_id' => $this->getId() ] )); } return true; } /** * @param string $name * @return null|SelectionPlan */ public function getSelectionPlanByName($name){ $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('name', trim($name))); $selection_plan = $this->selection_plans->matching($criteria)->first(); return $selection_plan === false ? null : $selection_plan; } /** * @param string $status * @return null|SelectionPlan */ public function getCurrentSelectionPlanByStatus($status){ $now_utc = new \DateTime('now', new \DateTimeZone('UTC')); $criteria = Criteria::create(); switch (strtoupper($status)){ case SelectionPlan::STATUS_SUBMISSION:{ $criteria->where(Criteria::expr()->lte('submission_begin_date', $now_utc))->andWhere(Criteria::expr()->gte('submission_end_date', $now_utc)); } break; case SelectionPlan::STATUS_VOTING:{ $criteria->where(Criteria::expr()->lte('voting_begin_date', $now_utc))->andWhere(Criteria::expr()->gte('voting_end_date', $now_utc)); } break; case SelectionPlan::STATUS_SELECTION:{ $criteria->where(Criteria::expr()->lte('selection_begin_date', $now_utc))->andWhere(Criteria::expr()->gte('selection_end_date', $now_utc)); } break; } $selection_plan = $this->selection_plans->matching($criteria)->first(); return $selection_plan === false ? null : $selection_plan; } /** * @param int $id * @return null|SelectionPlan */ public function getSelectionPlanById($id){ $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($id))); $selection_plan = $this->selection_plans->matching($criteria)->first(); return $selection_plan === false ? null : $selection_plan; } /** * @param SelectionPlan $selection_plan * @return $this */ public function addSelectionPlan(SelectionPlan $selection_plan){ $this->selection_plans->add($selection_plan); $selection_plan->setSummit($this); return $this; } /** * @param SelectionPlan $selection_plan * @return $this */ public function removeSelectionSelectionPlan(SelectionPlan $selection_plan){ $this->selection_plans->removeElement($selection_plan); $selection_plan->clearSummit(); return $this; } /** * @return SelectionPlan[] */ public function getActiveSelectionPlans() { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('is_enabled', 1)); return $this->selection_plans->matching($criteria)->toArray(); } /** * @return bool */ public function isSubmissionOpen() { foreach ($this->getActiveSelectionPlans() as $plan) { if ($plan->isSubmissionOpen()) return true; } return false; } /** * @return bool */ public function isPresentationEditionAllowed() { return $this->isSubmissionOpen() || $this->isVotingOpen(); } /** * @return bool */ public function isVotingOpen() { foreach ($this->getActiveSelectionPlans() as $plan) { if ($plan->isVotingOpen()) { return true; } } return false; } const STAGE_UNSTARTED = -1; const STAGE_OPEN = 0; const STAGE_FINISHED = 1; /** * @param Tag $tag * @return TrackTagGroup|null */ public function getTrackTagGroupForTag(Tag $tag){ $query = <<getEM()->createQuery($query); $native_query->setParameter("summit", $this); $native_query->setParameter("tag", $tag); $res = $native_query->getResult(); return count($res) > 0 ? $res[0] : null; } /** * @param string $tag_value * @return bool * @throws \Doctrine\ORM\NoResultException * @throws \Doctrine\ORM\NonUniqueResultException */ public function isTagValueAllowedOnTrackTagGroups($tag_value){ $query = <<getEM()->createQuery($query); $native_query->setParameter("summit", $this); $native_query->setParameter("tag_value", $tag_value); $res = $native_query->getSingleScalarResult(); return $res > 0; } /** * @param string $tag_value * @return null|TrackTagGroupAllowedTag */ public function getAllowedTagOnTagTrackGroup($tag_value){ $query = <<getEM()->createQuery($query); $native_query->setParameter("summit", $this); $native_query->setParameter("tag_value", $tag_value); $res = $native_query->getResult(); return count($res) > 0 ? $res[0] : null; } /** * @param int $tag_id * @return TrackTagGroup|null */ public function getTrackTagGroupForTagId($tag_id){ $query = <<getEM()->createQuery($query); $native_query->setParameter("summit", $this); $native_query->setParameter("tag_id", $tag_id); $res = $native_query->getResult(); return count($res) > 0 ? $res[0] : null; } /** * @param string $name * @return null|TrackTagGroup */ public function getTrackTagGroupByName($name){ $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('name', $name)); $track_tag_group = $this->track_tag_groups->matching($criteria)->first(); return !$track_tag_group ? null : $track_tag_group; } /** * @return TrackTagGroup[]|ArrayCollection */ public function getTrackTagGroups(){ return $this->track_tag_groups; } /** * @param string $label * @return null|TrackTagGroup */ public function getTrackTagGroupByLabel($label){ $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('label', $label)); $track_tag_group = $this->track_tag_groups->matching($criteria)->first(); return !$track_tag_group ? null : $track_tag_group; } /** * @param TrackTagGroup $track_tag_group * @return $this */ public function addTrackTagGroup(TrackTagGroup $track_tag_group) { if($this->track_tag_groups->contains($track_tag_group)) return $this; $this->track_tag_groups->add($track_tag_group); $track_tag_group->setSummit($this); $track_tag_group->setOrder($this->getTrackTagGroupMaxOrder() + 1); return $this; } /** * @param TrackTagGroup $track_tag_group * @return $this */ public function removeTrackTagGroup(TrackTagGroup $track_tag_group){ if(!$this->track_tag_groups->contains($track_tag_group)) return $this; $this->track_tag_groups->removeElement($track_tag_group); return $this; } /** * @return int */ private function getTrackTagGroupMaxOrder(){ $criteria = Criteria::create(); $criteria->orderBy(['order' => 'DESC']); $group = $this->track_tag_groups->matching($criteria)->first(); return $group === false ? 0 : $group->getOrder(); } /** * @param TrackTagGroup $track_tag_group * @param int $new_order * @throws ValidationException */ public function recalculateTrackTagGroupOrder(TrackTagGroup $track_tag_group, $new_order){ self::recalculateOrderForSelectable($this->track_tag_groups, $track_tag_group, $new_order); } /** * @param int $track_tag_group_id * @return TrackTagGroup|null */ public function getTrackTagGroup($track_tag_group_id) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('id', intval($track_tag_group_id))); $track_tag_group = $this->track_tag_groups->matching($criteria)->first(); return $track_tag_group === false ? null : $track_tag_group; } }