/**
  * @param $invitationAction
  * @return string|null
  */
 private function HandleInvitationAction($invitationAction)
 {
     $referenceNumber = $this->page->GetInvitationReferenceNumber();
     $userId = $this->page->GetUserId();
     Log::Debug('Invitation action %s for user %s and reference number %s', $invitationAction, $userId, $referenceNumber);
     $series = $this->reservationRepository->LoadByReferenceNumber($referenceNumber);
     if ($invitationAction == InvitationAction::Accept) {
         $series->AcceptInvitation($userId);
         foreach ($series->AllResources() as $resource) {
             if (!$resource->HasMaxParticipants()) {
                 continue;
             }
             /** @var $instance Reservation */
             foreach ($series->Instances() as $instance) {
                 $numberOfParticipants = count($instance->Participants());
                 if ($numberOfParticipants > $resource->GetMaxParticipants()) {
                     return Resources::GetInstance()->GetString('MaxParticipantsError', array($resource->GetName(), $resource->GetMaxParticipants()));
                 }
             }
         }
     }
     if ($invitationAction == InvitationAction::Decline) {
         $series->DeclineInvitation($userId);
     }
     if ($invitationAction == InvitationAction::CancelInstance) {
         $series->CancelInstanceParticipation($userId);
     }
     if ($invitationAction == InvitationAction::CancelAll) {
         $series->CancelAllParticipation($userId);
     }
     $this->reservationRepository->Update($series);
     return null;
 }
 private function TryPageLoad($currentUser)
 {
     $fileId = $this->page->GetFileId();
     $referenceNumber = $this->page->GetReferenceNumber();
     Log::Debug('Trying to load reservation attachment. FileId: %s, ReferenceNumber %s', $fileId, $referenceNumber);
     $attachment = $this->reservationRepository->LoadReservationAttachment($fileId);
     if ($attachment == null) {
         Log::Error('Error loading resource attachment, attachment not found');
         return false;
     }
     $reservation = $this->reservationRepository->LoadByReferenceNumber($referenceNumber);
     if ($reservation == null) {
         Log::Error('Error loading resource attachment, reservation not found');
         return false;
     }
     if ($reservation->SeriesId() != $attachment->SeriesId()) {
         Log::Error('Error loading resource attachment, attachment not associated with reservation');
         return false;
     }
     if (!$this->permissionService->CanAccessResource(new ReservationResource($reservation->ResourceId()), $currentUser)) {
         Log::Error('Error loading resource attachment, insufficient permissions');
         return false;
     }
     return $attachment;
 }
 /**
  * @param $invitationAction
  * @return string|null
  */
 private function HandleInvitationAction($invitationAction)
 {
     $referenceNumber = $this->page->GetInvitationReferenceNumber();
     $userId = $this->page->GetUserId();
     Log::Debug('Invitation action %s for user %s and reference number %s', $invitationAction, $userId, $referenceNumber);
     $series = $this->reservationRepository->LoadByReferenceNumber($referenceNumber);
     if ($invitationAction == InvitationAction::Join || $invitationAction == InvitationAction::CancelInstance) {
         $rules = array(new ReservationStartTimeRule(new ScheduleRepository()), new ResourceMinimumNoticeCurrentInstanceRule(), new ResourceMaximumNoticeCurrentInstanceRule());
     } else {
         $rules = array(new ReservationStartTimeRule(new ScheduleRepository()), new ResourceMinimumNoticeRule(), new ResourceMaximumNoticeRule());
     }
     /** @var IReservationValidationRule $rule */
     foreach ($rules as $rule) {
         $ruleResult = $rule->Validate($series);
         if (!$ruleResult->IsValid()) {
             return $ruleResult->ErrorMessage();
             return Resources::GetInstance()->GetString('ParticipationNotAllowed');
         }
     }
     $error = null;
     if ($invitationAction == InvitationAction::Accept) {
         $series->AcceptInvitation($userId);
         $error = $this->CheckCapacityAndReturnAnyError($series);
     }
     if ($invitationAction == InvitationAction::Decline) {
         $series->DeclineInvitation($userId);
     }
     if ($invitationAction == InvitationAction::CancelInstance) {
         $series->CancelInstanceParticipation($userId);
     }
     if ($invitationAction == InvitationAction::CancelAll) {
         $series->CancelAllParticipation($userId);
     }
     if ($invitationAction == InvitationAction::Join) {
         if (!$series->GetAllowParticipation()) {
             $error = Resources::GetInstance()->GetString('ParticipationNotAllowed');
         } else {
             $series->JoinReservation($userId);
             $error = $this->CheckCapacityAndReturnAnyError($series);
         }
     }
     if ($invitationAction == InvitationAction::JoinAll) {
         if (!$series->GetAllowParticipation()) {
             $error = Resources::GetInstance()->GetString('ParticipationNotAllowed');
         } else {
             $series->JoinReservationSeries($userId);
             $error = $this->CheckCapacityAndReturnAnyError($series);
         }
     }
     $this->reservationRepository->Update($series);
     return $error;
 }
 public function LoadByReferenceNumber($referenceNumber)
 {
     return $this->_repository->LoadByReferenceNumber($referenceNumber);
 }
 /**
  * @param $invitationAction
  * @return string|null
  */
 private function HandleInvitationAction($invitationAction)
 {
     $referenceNumber = $this->page->GetInvitationReferenceNumber();
     $userId = $this->page->GetUserId();
     $userRepository = new UserRepository();
     $user = $userRepository->LoadById($userId);
     $userCredit = $user->GetAttributeValue(8);
     Log::Debug('Invitation action %s for user %s and reference number %s', $invitationAction, $userId, $referenceNumber);
     $series = $this->reservationRepository->LoadByReferenceNumber($referenceNumber);
     foreach ($this->rules as $rule) {
         $ruleResult = $rule->Validate($series);
         if (!$ruleResult->IsValid()) {
             return Resources::GetInstance()->GetString('ParticipationNotAllowed');
         }
     }
     $error = null;
     $reservationCredit = $series->GetAttributeValue(6);
     if ($invitationAction == InvitationAction::Accept) {
         $error = $this->CheckCapacityAndReturnAnyError($series);
         if (!$error && $userCredit >= $reservationCredit) {
             $userCredit -= $reservationCredit;
             $user->ChangeCustomAttribute(8, $userCredit);
             $userRepository->Update($user);
             $series->AcceptInvitation($userId);
         } else {
             $error = "Yeterli kredininiz bulunmamaktadır. Kredi almak için ödeme gerçekleştirebilirsiniz.";
         }
     }
     if ($invitationAction == InvitationAction::Decline) {
         $series->DeclineInvitation($userId);
     }
     if ($invitationAction == InvitationAction::CancelInstance) {
         $cancelCredit = $user->GetAttributeValue(12);
         //iptal hakkı
         if ($cancelCredit > 0) {
             $cancelCredit -= 1;
             $reservationCredit = $series->GetAttributeValue(6);
             $userCredit += $reservationCredit;
             $user->ChangeCustomAttribute(8, $userCredit);
             $user->ChangeCustomAttribute(12, $cancelCredit);
             /*   first training date optional logic
             				$firstTrainingDate= $user->GetAttributeValue(19);
             				$reservationDate= $series->CurrentInstance()->StartDate();
             				// One more logic should be added to cancel.
             
             				if(strcmp($firstTrainingDate,$reservationDate)==0 ) {
             
             					$user->ChangeCustomAttribute(19,null);
             				}
             */
             $userRepository->Update($user);
             $series->CancelInstanceParticipation($userId);
         } else {
             $error = "You dont have cancel right";
         }
     }
     if ($invitationAction == InvitationAction::CancelAll) {
         $series->CancelInstanceParticipation($userId);
         $series->CancelAllParticipation($userId);
     }
     if ($invitationAction == InvitationAction::Join) {
         if (!$series->GetAllowParticipation()) {
             $error = Resources::GetInstance()->GetString('ParticipationNotAllowed');
         } else {
             $error = $this->CheckCapacityAndReturnAnyError($series);
             $reservationCredit = $series->GetAttributeValue(6);
             if (!$error && $userCredit >= $reservationCredit) {
                 $userCredit -= $reservationCredit;
                 $user->ChangeCustomAttribute(8, $userCredit);
                 $firstTrainingDate = $user->GetAttributeValue(19);
                 $reservationDate = $series->CurrentInstance()->StartDate()->ToTimezone($user->Timezone());
                 // One more logic should be added to cancel.
                 if ($firstTrainingDate == null || $firstTrainingDate == 0) {
                     $firstTrainingDate = $reservationDate;
                     $user->ChangeCustomAttribute(19, $firstTrainingDate);
                 }
                 $userRepository->Update($user);
                 $series->JoinReservationSeries($userId);
             } else {
                 $series->JoinInviteeList($userId);
                 $error = "Eğitime katılmak için ödeme yapmanız gerekmektedir. Ödeme yaptıktan sonra eğitiminizi onaylayıp katılabilirsiniz.  ";
             }
         }
     }
     if ($invitationAction == InvitationAction::JoinAll) {
         if (!$series->GetAllowParticipation()) {
             $error = Resources::GetInstance()->GetString('ParticipationNotAllowed');
         } else {
             $reservationAmount = count($series->Instances());
             $reservationCredit = $reservationAmount * $series->GetAttributeValue(6);
             /**  Bugfix added by Deniz. prevention against participation to reservation in occurence of an error * */
             $error = $this->CheckCapacityAndReturnAnyError($series);
             if (!$error && $userCredit >= $reservationCredit) {
                 $userCredit -= $reservationCredit;
                 $user->ChangeCustomAttribute(8, $userCredit);
                 $firstTrainingDate = $user->GetAttributeValue(19);
                 $reservationDate = $series->CurrentInstance()->StartDate()->ToTimezone($user->Timezone());
                 // One more logic should be added to cancel.
                 if ($firstTrainingDate == null || $firstTrainingDate == 0) {
                     $user->ChangeCustomAttribute(19, $reservationDate);
                 }
                 $userRepository->Update($user);
                 //$series->CurrentInstance()->With
                 $series->JoinReservationSeries($userId);
             } else {
                 $series->JoinInviteeListSeries($userId);
                 $error = "Eğitime katılmak için ödeme yapmanız gerekmektedir. Ödeme yaptıktan sonra eğitiminizi onaylayıp katılabilirsiniz.";
             }
         }
     }
     $this->reservationRepository->Update($series);
     return $error;
 }