/**
  * @param Member $member
  * @return void
  */
 public function ensureSpeakerProfile(Member $member)
 {
     $speaker = $member->getSpeakerProfile();
     if (!$speaker) {
         $speaker = PresentationSpeaker::create(array('MemberID' => Member::currentUserID(), 'FirstName' => Member::currentUser()->FirstName, 'LastName' => Member::currentUser()->Surname));
         $speaker->write();
     }
 }
 /**
  * Handles the form submission that creates a new speaker.
  * Checks for existence, and uses existing if found
  * 
  * @param   $data array
  * @param   $form Form
  * @return  SSViewer
  */
 public function doAddSpeaker($data, $form)
 {
     $me = $data['SpeakerType'] == 'Me';
     $email = $me ? Member::currentUser()->Email : $data['EmailAddress'];
     if (!$email) {
         $form->sessionMessage('Please specify an email addresss', 'bad');
         return $this->redirectBack();
     }
     $speaker = $this->getSpeaker($email);
     if (!$speaker) {
         $speaker = PresentationSpeaker::create(array('SummitID' => Summit::get_active()->ID));
         if ($me) {
             $member = Member::currentUser();
             $speaker->MemberID = $member->ID;
         } else {
             // look for the member..
             $member = Member::get()->filter('Email', $email)->first();
             if (!$member) {
                 $speaker->MemberID = 0;
                 $speaker->write();
                 $request = $this->getParent()->getSpeakerRegistrationRequestManager()->register($speaker, $email);
                 $speaker->RegistrationRequestID = $request->getIdentifier();
             } else {
                 $member->addToGroupByCode('speakers');
                 $speaker->MemberID = $member->ID;
                 $member->write();
             }
         }
     }
     $speaker->Presentations()->add($this->presentation->ID);
     $speaker->write();
     return $this->parent->redirect(Controller::join_links($this->Link(), 'speaker', $speaker->ID));
 }
 /**
  * Handles the form submission that creates a new speaker.
  * Checks for existence, and uses existing if found
  * @param   $data array
  * @param   $form Form
  * @return  SSViewer
  */
 public function doAddSpeaker($data, $form)
 {
     $me = $data['SpeakerType'] == 'Me';
     $email = $me ? Member::currentUser()->Email : $data['EmailAddress'];
     if (!$email) {
         $form->sessionMessage('Please specify an email address', 'bad');
         return $this->redirectBack();
     }
     $speaker = $this->getSpeaker($email);
     if (!$speaker) {
         $speaker = PresentationSpeaker::create();
         if ($me) {
             $member = Member::currentUser();
             $speaker->MemberID = $member->ID;
         } else {
             // look for the member..
             $member = Member::get()->filter('Email', $email)->first();
             if (!$member) {
                 $speaker->MemberID = 0;
                 $speaker->write();
                 $request = $this->getParent()->getSpeakerRegistrationRequestManager()->register($speaker, $email);
                 $speaker->RegistrationRequestID = $request->getIdentifier();
             } else {
                 $member->addToGroupByCode('speakers');
                 $speaker->MemberID = $member->ID;
                 $member->write();
             }
         }
     }
     // i am adding other speaker than me
     if (!$me && $speaker->hasReachPresentationLimitBy($this->Summit()->ID)) {
         $form->sessionMessage(sprintf("You reached the maximun allowed # of presentations (%s) for speaker %s (%s)", MAX_SUMMIT_ALLOWED_PER_USER, $speaker->getName(), $email), 'bad');
         return $this->redirectBack();
     }
     $speaker->Presentations()->add($this->presentation->ID);
     $speaker->write();
     return $this->parent->redirect(Controller::join_links($this->Link(), 'speaker', $speaker->ID));
 }
 /**
  * Attempt to add speakers to the presentation by fuzzy matching the FirstName / Surname
  * @param Presentation $p
  * @param VideoPresentation $v
  */
 private function addLegacySpeakers(Presentation $p, VideoPresentation $v)
 {
     $speakers = explode(',', $v->Speakers);
     $created = 0;
     $resolved = 0;
     $found = 0;
     foreach ($speakers as $speakerName) {
         $speakerName = trim($speakerName);
         $speakerName = preg_replace('/\\s\\s+/', ' ', $speakerName);
         $speaker = PresentationSpeaker::get()->where("CONCAT(FirstName, ' ', LastName) = '" . Convert::raw2sql($speakerName) . "'");
         if (!$speaker->exists()) {
             $names = explode(' ', $speakerName);
             $firstName = array_shift($names);
             $lastName = implode(' ', $names);
             $speaker = PresentationSpeaker::create(['FirstName' => $firstName, 'LastName' => $lastName, 'Notes' => '[LEGACY]']);
             $speaker->write();
             $p->Speakers()->add($speaker);
             echo "Created legacy speaker {$speaker->getName()} from {$speakerName}" . $this->br();
             $created++;
         } else {
             if ($speaker->count() > 1) {
                 echo "Found more than one speaker matching \"{$speakerName}\": " . implode(',', $speaker->column('ID')) . $this->br();
                 $bestCandidate = null;
                 $highScore = 0;
                 foreach ($speaker as $s) {
                     $numSpeakings = DB::query("SELECT COUNT(*) FROM `Presentation_Speakers` WHERE PresentationSpeakerID = {$s->ID}")->value();
                     $hasMember = (int) $s->Member()->exists();
                     $score = $numSpeakings + $hasMember;
                     if ($score > $highScore) {
                         $highScore = $score;
                         $bestCandidate = $s;
                     }
                 }
                 if ($bestCandidate) {
                     echo "Found best candidate #{$bestCandidate->ID} with a score of {$highScore}" . $this->br();
                     $p->Speakers()->add($bestCandidate);
                     $resolved++;
                 } else {
                     $this->addError("No speakings or MemberIDs for " . implode(',', $speaker->map('ID', 'Name')->toArray()) . " on \"{$p->Title}\"");
                 }
             } else {
                 $p->Speakers()->add($speaker->first());
                 echo "Added speaker " . $speaker->first()->getName() . $this->br();
                 $found++;
             }
         }
     }
     $this->stats['Speakers created'] += $created;
     $this->stats['Speakers resolved'] += $resolved;
     $this->stats['Speakers found'] += $found;
     return $p;
 }
 /**
  * Handles requests that update speakers attached to this presentation
  * and hands them off to a sub-sub controller
  * @param   $r SS_HTTPRequest
  * @return  RequestHandler
  */
 public function handleSpeaker(SS_HTTPRequest $r)
 {
     if ($r->param('SpeakerID') === 'new') {
         $speaker = PresentationSpeaker::create();
     } else {
         $speaker = PresentationSpeaker::get()->filter(array('ID' => $r->param('SpeakerID')))->first();
     }
     if (!$speaker) {
         return $this->httpError(404, 'Speaker not found');
     }
     if ($speaker->isInDB() && (!$speaker->Presentations()->byID($this->presentation->ID) && $this->presentation->ModeratorID != $speaker->ID)) {
         return $this->httpError(403, 'That speaker is not part of this presentation');
     }
     $request = PresentationPage_ManageSpeakerRequest::create($speaker, $this);
     return $request->handleRequest($r, DataModel::inst());
 }
 /**
  * @param ISummit $summit
  * @param array $speaker_data
  * @return IPresentationSpeaker
  */
 public function createSpeaker(ISummit $summit, array $speaker_data)
 {
     $speaker_repository = $this->speaker_repository;
     $member_repository = $this->member_repository;
     $speaker_registration_request_manager = $this->speaker_registration_request_manager;
     $speaker_creation_email_sender = new PresentationSpeakerCreationEmailMessageSender();
     return $this->tx_service->transaction(function () use($summit, $speaker_data, $speaker_repository, $member_repository, $speaker_registration_request_manager, $speaker_creation_email_sender) {
         $speaker = PresentationSpeaker::create();
         $member_id = 0;
         if (!isset($speaker_data['email']) && !isset($speaker_data['member_id'])) {
             throw new EntityValidationException("you must provide an email or a member_id in order to create a speaker!");
         }
         if (isset($speaker_data['member_id']) && intval($speaker_data['member_id']) > 0) {
             $member_id = intval($speaker_data['member_id']);
             $old_speaker = $speaker_repository->getByMemberID($member_id);
             if (!is_null($old_speaker)) {
                 throw new EntityValidationException(sprintf("Member %s already has assigned an speaker!", $member_id));
             }
         }
         $speaker->Title = trim($speaker_data['title']);
         $speaker->FirstName = trim($speaker_data['first_name']);
         $speaker->LastName = trim($speaker_data['last_name']);
         $speaker->IRCHandle = trim($speaker_data['twitter_name']);
         $speaker->TwitterName = trim($speaker_data['irc_name']);
         $speaker->MemberID = $member_id;
         $speaker->CreatedFromAPI = true;
         $speaker_repository->add($speaker);
         $speaker->write();
         if ($member_id === 0 && isset($speaker_data['email'])) {
             $email = trim($speaker_data['email']);
             $member = $member_repository->findByEmail($email);
             if (is_null($member)) {
                 // we need to create a registration request
                 $request = $speaker_registration_request_manager->register($speaker, $email);
                 $request->SpeakerID = $speaker->ID;
                 $request->write();
                 $speaker->RegistrationRequestID = $request->ID;
                 $speaker->write();
             } else {
                 $old_speaker = $speaker_repository->getByMemberID($member->getIdentifier());
                 if (!is_null($old_speaker)) {
                     throw new EntityValidationException(sprintf("Member %s already has assigned an speaker!", $member->getIdentifier()));
                 }
                 $speaker->MemberID = $member->getIdentifier();
                 $speaker->write();
             }
         }
         // send email to speaker so he can register as a member
         $speaker_creation_email_sender->send(['Speaker' => $speaker]);
         $onsite_phone = trim($speaker_data['onsite_phone']);
         if (!empty($onsite_phone)) {
             $summit_assistance = $speaker->createAssistanceFor($summit->getIdentifier());
             $summit_assistance->OnSitePhoneNumber = $onsite_phone;
             $summit_assistance->write();
         }
         return $speaker;
     });
 }
 /**
  * @param IPresentation $presentation
  * @param string $email
  * @param Member|null $member
  * @param IPresentationSpeaker|null $speaker
  * @return IPresentationSpeaker
  */
 public function addSpeakerByEmailTo(IPresentation $presentation, $email, Member $member = null, IPresentationSpeaker $speaker = null)
 {
     return $this->tx_manager->transaction(function () use($presentation, $email, $member, $speaker) {
         $speaker = !is_null($speaker) ? $speaker : $this->speaker_repository->getByEmail($email);
         if (is_null($speaker) && !is_null($member)) {
             $speaker = $member->getSpeakerProfile();
         }
         if (!is_null($speaker) && !is_null($member) && intval($member->ID) !== intval($speaker->MemberID)) {
             throw new EntityValidationException(sprintf('speaker does not belongs to selected member!'));
         }
         if (!$speaker) {
             // create it
             $speaker = PresentationSpeaker::create();
             $speaker->write();
             if (!is_null($member)) {
                 $speaker->MemberID = $member->ID;
                 $member->addToGroupByCode('speakers');
                 $member->write();
             } else {
                 $speaker->MemberID = 0;
                 $request = $this->speaker_registration_manager->register($speaker, $email);
                 $speaker->RegistrationRequestID = $request->getIdentifier();
             }
             $speaker->write();
         }
         // i am adding other speaker than me
         if (!is_null($member) && intval($member->ID) !== intval(Member::currentUserID()) && !$this->canAddSpeakerOnPresentation($speaker, $presentation)) {
             throw new EntityValidationException(sprintf("You reached the max. allowed # of presentations for speaker %s (%s)", $speaker->getName(), $email));
         }
         if ($speaker->Presentations()->filter('PresentationID', $presentation->ID)->count() > 0 || $presentation->ModeratorID == $speaker->ID) {
             throw new EntityValidationException('Speaker already assigned to this presentation!.');
         }
         // The first one is the moderator.
         if (!$presentation->maxModeratorsReached()) {
             $presentation->ModeratorID = $speaker->ID;
         } else {
             $speaker->Presentations()->add($presentation);
             $speaker->write();
         }
         return $speaker;
     });
 }