public function getSpeakerConfirmationLink()
 {
     $confirmation_page = SummitConfirmSpeakerPage::get()->filter('SummitID', Summit::get_active()->ID)->first();
     if (!$confirmation_page) {
         throw new Exception('Confirmation Speaker Page not set on current summit!');
     }
     $url = $confirmation_page->getAbsoluteLiveLink(false);
     $url = $url . 'confirm?h=' . $this->getSpeakerConfirmHash();
     return $url;
 }
 /**
  * Resets the confirmation request if exists and its not confirmed yet
  * otherwise exception
  * @param int $summit_id
  * @return string
  * @throws Exception
  * @throws ValidationException
  * @throws null
  */
 public function resetConfirmationLink($summit_id)
 {
     $confirmation_page = SummitConfirmSpeakerPage::get()->filter('SummitID', intval($summit_id))->first();
     if (!$confirmation_page) {
         throw new NotFoundEntityException('Confirmation Speaker Page not set on current summit!');
     }
     $url = $confirmation_page->getAbsoluteLiveLink(false);
     $request = PresentationSpeakerSummitAssistanceConfirmationRequest::get()->filter(['SummitID' => intval($summit_id), 'SpeakerID' => $this->ID])->first();
     if (is_null($request)) {
         throw new EntityValidationException('there is not valid request!');
     }
     if ($request->alreadyConfirmed()) {
         throw new EntityValidationException('request already confirmed!');
     }
     $token = null;
     $already_exists = false;
     do {
         $token = $request->generateConfirmationToken();
         $already_exists = intval(PresentationSpeakerSummitAssistanceConfirmationRequest::get()->filter(['SummitID' => intval($summit_id), 'SpeakerID:ExactMatch:not' => $this->ID, 'ConfirmationHash' => PresentationSpeakerSummitAssistanceConfirmationRequest::HashConfirmationToken($token)])->count()) > 1;
     } while ($already_exists);
     $request->write();
     return $url . 'confirm?t=' . base64_encode($token);
 }