/**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $userId = $reservationSeries->UserId();
     $resourceId = $reservationSeries->ResourceId();
     $isOk = !empty($userId) && !empty($resourceId);
     return new ReservationRuleResult($isOk, Resources::GetInstance()->GetString('InvalidReservationData'));
 }
 /**
  * @param Reservation $instance
  * @param ReservationSeries $series
  * @param IReservedItemView $existingItem
  * @param BookableResource[] $keyedResources
  * @return bool
  */
 protected function IsInConflict(Reservation $instance, ReservationSeries $series, IReservedItemView $existingItem, $keyedResources)
 {
     if ($existingItem->GetId() == $instance->ReservationId() || $series->IsMarkedForDelete($existingItem->GetId()) || $series->IsMarkedForUpdate($existingItem->GetId())) {
         return false;
     }
     return parent::IsInConflict($instance, $series, $existingItem, $keyedResources);
 }
 /**
  * @param ReservationSeries $reservation
  * @return void
  */
 public function Notify($reservation)
 {
     $owner = $this->_userRepo->LoadById($reservation->UserId());
     if ($this->ShouldSend($owner)) {
         $message = $this->GetMessage($owner, $reservation, $this->_attributeRepo);
         ServiceLocator::GetEmailService()->Send($message);
     } else {
         Log::Debug('Owner does not want these types of email notifications. Email=%s, ReferenceNumber=%s', $owner->EmailAddress(), $reservation->CurrentInstance()->ReferenceNumber());
     }
 }
 /**
  * @param ReservationSeries $reservationSeries
  */
 function Notify($reservationSeries)
 {
     $instance = $reservationSeries->CurrentInstance();
     $owner = $this->userRepository->LoadById($reservationSeries->UserId());
     foreach ($instance->UnchangedParticipants() as $userId) {
         $participant = $this->userRepository->LoadById($userId);
         $message = new ParticipantUpdatedEmail($owner, $participant, $reservationSeries, $this->attributeRepository);
         ServiceLocator::GetEmailService()->Send($message);
     }
 }
 /**
  * @param ReservationSeries $reservation
  * @return ReservationRuleResult
  */
 public function Validate($reservation)
 {
     $reservation->UserId();
     $permissionService = $this->permissionServiceFactory->GetPermissionService();
     $resourceIds = $reservation->AllResourceIds();
     foreach ($resourceIds as $resourceId) {
         if (!$permissionService->CanAccessResource(new ReservationResource($resourceId), $reservation->BookedBy())) {
             return new ReservationRuleResult(false, Resources::GetInstance()->GetString('NoResourcePermission'));
         }
     }
     return new ReservationRuleResult(true);
 }
Example #6
0
 /**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $quotas = $this->quotaRepository->LoadAll();
     $user = $this->userRepository->LoadById($reservationSeries->UserId());
     $schedule = $this->scheduleRepository->LoadById($reservationSeries->ScheduleId());
     foreach ($quotas as $quota) {
         if ($quota->ExceedsQuota($reservationSeries, $user, $schedule, $this->reservationViewRepository)) {
             Log::Debug('Quota exceeded. %s', $quota->ToString());
             return new ReservationRuleResult(false, Resources::GetInstance()->GetString('QuotaExceeded'));
         }
     }
     return new ReservationRuleResult();
 }
 /**
  * @param ReservationSeries $reservationSeries
  */
 function Notify($reservationSeries)
 {
     $owner = null;
     $instance = $reservationSeries->CurrentInstance();
     foreach ($instance->UnchangedInvitees() as $userId) {
         if ($owner == null) {
             $owner = $this->userRepository->LoadById($reservationSeries->UserId());
         }
         $invitee = $this->userRepository->LoadById($userId);
         $message = new InviteeAddedEmail($owner, $invitee, $reservationSeries, $this->attributeRepository);
         ServiceLocator::GetEmailService()->Send($message);
     }
 }
 /**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $resources = Resources::GetInstance();
     $errorMessage = new StringBuilder();
     $result = $this->attributeService->Validate(CustomAttributeCategory::RESERVATION, $reservationSeries->AttributeValues());
     $isValid = $result->IsValid();
     foreach ($result->Errors() as $error) {
         $errorMessage->AppendLine($error);
     }
     if (!$isValid) {
         $errorMessage->PrependLine($resources->GetString('CustomAttributeErrors'));
     }
     return new ReservationRuleResult($isValid, $errorMessage->ToString());
 }
 /**
  * @param ReservationSeries $series
  * @return bool
  */
 private function EvaluateCustomRule($series)
 {
     Log::Debug('Evaluating custom pre reservation rule');
     // make your custom checks here
     $configFile = Configuration::Instance()->File('PreReservationExample');
     $maxValue = $configFile->GetKey('custom.attribute.max.value');
     $customAttributeId = $configFile->GetKey('custom.attribute.id');
     $attributeValue = $series->GetAttributeValue($customAttributeId);
     $isValid = $attributeValue <= $maxValue;
     if ($isValid) {
         return new ReservationValidationResult();
     }
     return new ReservationValidationResult(false, "Value of custom attribute cannot be greater than {$maxValue}");
 }
Example #10
0
 /**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 function Validate($reservationSeries)
 {
     $status = ReservationStatus::Created;
     /** @var BookableResource $resource */
     foreach ($reservationSeries->AllResources() as $resource) {
         if ($resource->GetRequiresApproval()) {
             if (!$this->authorizationService->CanApproveForResource($reservationSeries->BookedBy(), $resource)) {
                 $status = ReservationStatus::Pending;
                 break;
             }
         }
     }
     $reservationSeries->SetStatusId($status);
     return new ReservationRuleResult();
 }
 public function ScheduleId()
 {
     if (!empty($this->_scheduleId)) {
         return $this->_scheduleId;
     }
     return parent::ScheduleId();
 }
 private function PopulateTemplate()
 {
     $this->Set('UserName', $this->reservationOwner->FullName());
     $currentInstance = $this->reservationSeries->CurrentInstance();
     $this->Set('StartDate', $currentInstance->StartDate()->ToTimezone($this->timezone));
     $this->Set('EndDate', $currentInstance->EndDate()->ToTimezone($this->timezone));
     $this->Set('ResourceName', $this->resource->GetName());
     $this->Set('Title', $this->reservationSeries->Title());
     $this->Set('Description', $this->reservationSeries->Description());
     $repeatDates = array();
     foreach ($this->reservationSeries->Instances() as $repeated) {
         $repeatDates[] = $repeated->StartDate()->ToTimezone($this->timezone);
     }
     $this->Set('RequiresApproval', $this->reservationSeries->RequiresApproval());
     $this->Set('RepeatDates', $repeatDates);
     $this->Set('ReservationUrl', Pages::RESERVATION . "?" . QueryStringKeys::REFERENCE_NUMBER . '=' . $currentInstance->ReferenceNumber());
     $resourceNames = array();
     foreach ($this->reservationSeries->AllResources() as $resource) {
         $resourceNames[] = $resource->GetName();
     }
     $this->Set('ResourceNames', $resourceNames);
     $this->Set('Accessories', $this->reservationSeries->Accessories());
     $attributes = $this->attributeRepository->GetByCategory(CustomAttributeCategory::RESERVATION);
     $attributeValues = array();
     foreach ($attributes as $attribute) {
         $attributeValues[] = new Attribute($attribute, $this->reservationSeries->GetAttributeValue($attribute->Id()));
     }
     $this->Set('Attributes', $attributeValues);
 }
 /**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $conflicts = array();
     $reservationAccessories = $reservationSeries->Accessories();
     if (count($reservationAccessories) == 0) {
         // no accessories to be reserved, no need to proceed
         return new ReservationRuleResult();
     }
     /** @var AccessoryToCheck[] $accessories  */
     $accessories = array();
     foreach ($reservationAccessories as $accessory) {
         $a = $this->accessoryRepository->LoadById($accessory->AccessoryId);
         if (!$a->HasUnlimitedQuantity()) {
             $accessories[$a->GetId()] = new AccessoryToCheck($a, $accessory);
         }
     }
     if (count($accessories) == 0) {
         // no accessories with limited quantity to be reserved, no need to proceed
         return new ReservationRuleResult();
     }
     $reservations = $reservationSeries->Instances();
     /** @var Reservation $reservation */
     foreach ($reservations as $reservation) {
         Log::Debug("Checking for accessory conflicts, reference number %s", $reservation->ReferenceNumber());
         $accessoryReservations = $this->reservationRepository->GetAccessoriesWithin($reservation->Duration());
         $aggregation = new AccessoryAggregation($accessories, $reservation->Duration());
         foreach ($accessoryReservations as $accessoryReservation) {
             if ($reservation->ReferenceNumber() != $accessoryReservation->GetReferenceNumber()) {
                 $aggregation->Add($accessoryReservation);
             }
         }
         foreach ($accessories as $accessory) {
             $alreadyReserved = $aggregation->GetQuantity($accessory->GetId());
             $requested = $accessory->QuantityReserved();
             if ($requested + $alreadyReserved > $accessory->QuantityAvailable()) {
                 Log::Debug("Accessory over limit. Reference Number %s, Date %s, Quantity already reserved %s, Quantity requested: %s", $reservation->ReferenceNumber(), $reservation->Duration(), $alreadyReserved, $requested);
                 array_push($conflicts, array('name' => $accessory->GetName(), 'date' => $reservation->StartDate()));
             }
         }
     }
     $thereAreConflicts = count($conflicts) > 0;
     if ($thereAreConflicts) {
         return new ReservationRuleResult(false, $this->GetErrorString($conflicts));
     }
     return new ReservationRuleResult();
 }
 /**
  * @see IReservationValidationRule::Validate()
  *
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $r = Resources::GetInstance();
     $resources = $reservationSeries->AllResources();
     foreach ($resources as $resource) {
         if ($resource->HasMinLength()) {
             $minDuration = $resource->GetMinLength()->Interval();
             $start = $reservationSeries->CurrentInstance()->StartDate();
             $end = $reservationSeries->CurrentInstance()->EndDate();
             $minEnd = $start->ApplyDifference($minDuration);
             if ($end->LessThan($minEnd)) {
                 return new ReservationRuleResult(false, $r->GetString("MinDurationError", $minDuration));
             }
         }
     }
     return new ReservationRuleResult();
 }
Example #15
0
 /**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $layout = $this->repository->GetLayout($reservationSeries->Resource()->GetScheduleId(), new ScheduleLayoutFactory($this->session->Timezone));
     $startDate = $reservationSeries->CurrentInstance()->StartDate();
     $startPeriod = $layout->GetPeriod($startDate);
     $endDate = $reservationSeries->CurrentInstance()->EndDate();
     $endPeriod = $layout->GetPeriod($endDate);
     $errors = new StringBuilder();
     if ($startPeriod == null || !$startPeriod->IsReservable() || !$startPeriod->BeginDate()->Equals($startDate)) {
         $errors->AppendLine(Resources::GetInstance()->GetString('InvalidStartSlot'));
     }
     if ($endPeriod == null || !$endPeriod->BeginDate()->Equals($endDate)) {
         $errors->AppendLine(Resources::GetInstance()->GetString('InvalidEndSlot'));
     }
     $errorMessage = $errors->ToString();
     return new ReservationRuleResult(strlen($errorMessage) == 0, $errorMessage);
 }
 /**
  * @see IReservationValidationRule::Validate()
  *
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $r = Resources::GetInstance();
     $resources = $reservationSeries->AllResources();
     foreach ($resources as $resource) {
         if ($resource->HasMinNotice()) {
             $minStartDate = Date::Now()->ApplyDifference($resource->GetMinNotice()->Interval());
             /* @var $instance Reservation */
             foreach ($reservationSeries->Instances() as $instance) {
                 if ($instance->StartDate()->LessThan($minStartDate)) {
                     return new ReservationRuleResult(false, $r->GetString("MinNoticeError", $minStartDate->Format($r->GeneralDateTimeFormat())));
                 }
             }
         }
     }
     return new ReservationRuleResult();
 }
 /**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $attachments = $reservationSeries->AddedAttachments();
     $allowedExtensionsConfig = Configuration::Instance()->GetSectionKey(ConfigSection::UPLOADS, ConfigKeys::UPLOAD_RESERVATION_EXTENSIONS);
     if (empty($allowedExtensionsConfig) || empty($attachments)) {
         return new ReservationRuleResult();
     }
     $allowedExtensions = str_replace('.', '', $allowedExtensionsConfig);
     $allowedExtensions = str_replace(' ', '', $allowedExtensions);
     $allowedExtensionList = explode(',', $allowedExtensions);
     foreach ($attachments as $attachment) {
         $isValid = in_array($attachment->FileExtension(), $allowedExtensionList);
         if (!$isValid) {
             return new ReservationRuleResult($isValid, Resources::GetInstance()->GetString('InvalidAttachmentExtension', $allowedExtensionsConfig));
         }
     }
     return new ReservationRuleResult();
 }
Example #18
0
 /**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $errorMessage = new StringBuilder();
     if ($reservationSeries->GetStartReminder()->Enabled()) {
         if (!$this->minutesValid($reservationSeries->GetStartReminder())) {
             $errorMessage->AppendLine(Resources::GetInstance()->GetString('InvalidStartReminderTime'));
         }
     }
     if ($reservationSeries->GetEndReminder()->Enabled()) {
         if (!$this->minutesValid($reservationSeries->GetEndReminder())) {
             $errorMessage->AppendLine(Resources::GetInstance()->GetString('InvalidEndReminderTime'));
         }
     }
     $message = $errorMessage->ToString();
     if (strlen($message) > 0) {
         return new ReservationRuleResult(false, $message);
     }
     return new ReservationRuleResult();
 }
Example #19
0
 public function testCanGetSpecificInstanceByDate()
 {
     $startDate = Date::Parse('2010-02-02 12:15', 'UTC');
     $endDate = $startDate->AddDays(1);
     $dateRange = new DateRange($startDate, $endDate);
     $repeatOptions = $this->getMock('IRepeatOptions');
     $series = ReservationSeries::Create(1, new FakeBookableResource(1), null, null, $dateRange, $repeatOptions, new FakeUserSession());
     $instance = $series->CurrentInstance();
     $this->assertEquals($startDate, $instance->StartDate());
     $this->assertEquals($endDate, $instance->EndDate());
 }
 protected function PopulateTemplate()
 {
     $currentInstance = $this->reservationSeries->CurrentInstance();
     $this->Set('UserName', $this->reservationOwner->FullName());
     $this->Set('StartDate', $currentInstance->StartDate()->ToTimezone($this->timezone));
     $this->Set('EndDate', $currentInstance->EndDate()->ToTimezone($this->timezone));
     $this->Set('ResourceName', $this->reservationSeries->Resource()->GetName());
     $img = $this->reservationSeries->Resource()->GetImage();
     if (!empty($img)) {
         $this->Set('ResourceImage', $this->GetFullImagePath($img));
     }
     $this->Set('Title', $this->reservationSeries->Title());
     $this->Set('Description', $this->reservationSeries->Description());
     $repeatDates = array();
     if ($this->reservationSeries->IsRecurring()) {
         foreach ($this->reservationSeries->Instances() as $repeated) {
             $repeatDates[] = $repeated->StartDate()->ToTimezone($this->timezone);
         }
     }
     $this->Set('RepeatDates', $repeatDates);
     $this->Set('RequiresApproval', $this->reservationSeries->RequiresApproval());
     $this->Set('ReservationUrl', sprintf("%s?%s=%s", Pages::RESERVATION, QueryStringKeys::REFERENCE_NUMBER, $currentInstance->ReferenceNumber()));
     $icalUrl = sprintf("export/%s?%s=%s", Pages::CALENDAR_EXPORT, QueryStringKeys::REFERENCE_NUMBER, $currentInstance->ReferenceNumber());
     $this->Set('ICalUrl', $icalUrl);
     $resourceNames = array();
     foreach ($this->reservationSeries->AllResources() as $resource) {
         $resourceNames[] = $resource->GetName();
     }
     $this->Set('ResourceNames', $resourceNames);
     $this->Set('Accessories', $this->reservationSeries->Accessories());
     $attributes = $this->attributeRepository->GetByCategory(CustomAttributeCategory::RESERVATION);
     $attributeValues = array();
     foreach ($attributes as $attribute) {
         $attributeValues[] = new Attribute($attribute, $this->reservationSeries->GetAttributeValue($attribute->Id()));
     }
     $this->Set('Attributes', $attributeValues);
     $bookedBy = $this->reservationSeries->BookedBy();
     if ($bookedBy != null && $bookedBy->UserId != $this->reservationOwner->Id()) {
         $this->Set('CreatedBy', new FullName($bookedBy->FirstName, $bookedBy->LastName));
     }
 }
 /**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $constraint = Configuration::Instance()->GetSectionKey(ConfigSection::RESERVATION, ConfigKeys::RESERVATION_START_TIME_CONSTRAINT);
     if (empty($constraint)) {
         $constraint = ReservationStartTimeConstraint::_DEFAULT;
     }
     if ($constraint == ReservationStartTimeConstraint::NONE) {
         return new ReservationRuleResult();
     }
     $currentInstance = $reservationSeries->CurrentInstance();
     $dateThatShouldBeLessThanNow = $currentInstance->StartDate();
     if ($constraint == ReservationStartTimeConstraint::CURRENT) {
         $timezone = $dateThatShouldBeLessThanNow->Timezone();
         /** @var $currentPeriod SchedulePeriod */
         $currentPeriod = $this->scheduleRepository->GetLayout($reservationSeries->ScheduleId(), new ScheduleLayoutFactory($timezone))->GetPeriod($currentInstance->EndDate());
         $dateThatShouldBeLessThanNow = $currentPeriod->BeginDate();
     }
     Log::Debug("Start Time Rule: Comparing %s to %s", $dateThatShouldBeLessThanNow, Date::Now());
     $startIsInFuture = $dateThatShouldBeLessThanNow->Compare(Date::Now()) >= 0;
     return new ReservationRuleResult($startIsInFuture, Resources::GetInstance()->GetString('StartIsInPast'));
 }
Example #22
0
 /**
  * @param ReservationSeries $reservationSeries
  * @return void
  */
 public function Notify($reservationSeries)
 {
     $resourceAdmins = array();
     $applicationAdmins = array();
     $groupAdmins = array();
     if ($this->SendForResourceAdmins()) {
         $resourceAdmins = $this->userViewRepo->GetResourceAdmins($reservationSeries->ResourceId());
     }
     if ($this->SendForApplicationAdmins()) {
         $applicationAdmins = $this->userViewRepo->GetApplicationAdmins();
     }
     if ($this->SendForGroupAdmins()) {
         $groupAdmins = $this->userViewRepo->GetGroupAdmins($reservationSeries->UserId());
     }
     $admins = array_merge($resourceAdmins, $applicationAdmins, $groupAdmins);
     if (count($admins) == 0) {
         // skip if there is nobody to send to
         return;
     }
     $owner = $this->userRepo->LoadById($reservationSeries->UserId());
     $resource = $reservationSeries->Resource();
     $adminIds = array();
     /** @var $admin UserDto */
     foreach ($admins as $admin) {
         $id = $admin->Id();
         if (array_key_exists($id, $adminIds) || $id == $owner->Id()) {
             // only send to each person once
             continue;
         }
         $adminIds[$id] = true;
         $message = $this->GetMessage($admin, $owner, $reservationSeries, $resource);
         ServiceLocator::GetEmailService()->Send($message);
     }
 }
 /**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $errorMessage = new StringBuilder();
     foreach ($reservationSeries->AllResources() as $resource) {
         if (!$resource->HasMaxParticipants()) {
             continue;
         }
         foreach ($reservationSeries->Instances() as $instance) {
             $numberOfParticipants = count($instance->Participants());
             Log::Debug('ResourceParticipationRule Resource=%s,InstanceId=%s,MaxParticipants=%s,CurrentParticipants=%s', $resource->GetName(), $instance->ReservationId(), $resource->GetMaxParticipants(), $numberOfParticipants);
             if ($numberOfParticipants > $resource->GetMaxParticipants()) {
                 $errorMessage->AppendLine(Resources::GetInstance()->GetString('MaxParticipantsError', array($resource->GetName(), $resource->GetMaxParticipants())));
                 continue;
             }
         }
     }
     $message = $errorMessage->ToString();
     if (strlen($message) > 0) {
         return new ReservationRuleResult(false, $message);
     }
     return new ReservationRuleResult();
 }
 public function BuildReservation()
 {
     $userId = $this->_page->GetUserId();
     $primaryResourceId = $this->_page->GetResourceId();
     $resource = $this->_resourceRepository->LoadById($primaryResourceId);
     $title = $this->_page->GetTitle();
     $description = $this->_page->GetDescription();
     $roFactory = new RepeatOptionsFactory();
     $repeatOptions = $roFactory->CreateFromComposite($this->_page, $this->userSession->Timezone);
     $duration = $this->GetReservationDuration();
     /*EXPERIMENT*/
     $experiment = $this->_page->getExperiment();
     $reservationSeries = ReservationSeries::Create($userId, $resource, $title, $description, $duration, $repeatOptions, $this->userSession, $experiment);
     $resourceIds = $this->_page->GetResources();
     foreach ($resourceIds as $resourceId) {
         if ($primaryResourceId != $resourceId) {
             $reservationSeries->AddResource($this->_resourceRepository->LoadById($resourceId));
         }
     }
     $accessories = $this->_page->GetAccessories();
     foreach ($accessories as $accessory) {
         $reservationSeries->AddAccessory(new ReservationAccessory($accessory->Id, $accessory->Quantity, $accessory->Name));
     }
     $attributes = $this->_page->GetAttributes();
     foreach ($attributes as $attribute) {
         $reservationSeries->AddAttributeValue(new AttributeValue($attribute->Id, $attribute->Value));
     }
     $participantIds = $this->_page->GetParticipants();
     $reservationSeries->ChangeParticipants($participantIds);
     $inviteeIds = $this->_page->GetInvitees();
     $reservationSeries->ChangeInvitees($inviteeIds);
     $reservationSeries->AllowParticipation($this->_page->GetAllowParticipation());
     $attachments = $this->_page->GetAttachments();
     foreach ($attachments as $attachment) {
         if ($attachment != null) {
             if ($attachment->IsError()) {
                 Log::Error('Error attaching file %s. %s', $attachment->OriginalName(), $attachment->Error());
             } else {
                 $att = ReservationAttachment::Create($attachment->OriginalName(), $attachment->MimeType(), $attachment->Size(), $attachment->Contents(), $attachment->Extension(), 0);
                 $reservationSeries->AddAttachment($att);
             }
         }
     }
     if ($this->_page->HasStartReminder()) {
         $reservationSeries->AddStartReminder(new ReservationReminder($this->_page->GetStartReminderValue(), $this->_page->GetStartReminderInterval()));
     }
     if ($this->_page->HasEndReminder()) {
         $reservationSeries->AddEndReminder(new ReservationReminder($this->_page->GetEndReminderValue(), $this->_page->GetEndReminderInterval()));
     }
     return $reservationSeries;
 }
 public function testSucceedsWhenStartAndEndTimeMatchPeriods()
 {
     $date = Date::Now();
     $dates = new DateRange($date, $date);
     $scheduleId = 1232;
     $resource = new FakeBookableResource(1);
     $resource->SetScheduleId($scheduleId);
     $series = ReservationSeries::Create(1, $resource, null, null, $dates, new RepeatNone(), $this->fakeUser);
     $this->scheduleRepository->expects($this->once())->method('GetLayout')->with($this->equalTo($scheduleId), $this->equalTo(new ScheduleLayoutFactory($this->fakeUser->Timezone)))->will($this->returnValue($this->layout));
     $period = new SchedulePeriod($date, $date);
     $this->layout->expects($this->at(0))->method('GetPeriod')->with($this->equalTo($series->CurrentInstance()->StartDate()))->will($this->returnValue($period));
     $this->layout->expects($this->at(1))->method('GetPeriod')->with($this->equalTo($series->CurrentInstance()->EndDate()))->will($this->returnValue($period));
     $result = $this->rule->Validate($series);
     $this->assertTrue($result->IsValid());
 }
 /**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $conflicts = array();
     $reservations = $reservationSeries->Instances();
     $bufferTime = $reservationSeries->MaxBufferTime();
     $keyedResources = array();
     foreach ($reservationSeries->AllResources() as $resource) {
         $keyedResources[$resource->GetId()] = $resource;
     }
     /** @var Reservation $reservation */
     foreach ($reservations as $reservation) {
         Log::Debug("Checking for reservation conflicts, reference number %s", $reservation->ReferenceNumber());
         $startDate = $reservation->StartDate();
         $endDate = $reservation->EndDate();
         if ($bufferTime != null && !$reservationSeries->BookedBy()->IsAdmin) {
             $startDate = $startDate->SubtractInterval($bufferTime);
             $endDate = $endDate->AddInterval($bufferTime);
         }
         $existingItems = $this->strategy->GetItemsBetween($startDate, $endDate);
         /** @var IReservedItemView $existingItem */
         foreach ($existingItems as $existingItem) {
             if (($bufferTime == null || $reservationSeries->BookedBy()->IsAdmin) && ($existingItem->GetStartDate()->Equals($reservation->EndDate()) || $existingItem->GetEndDate()->Equals($reservation->StartDate()))) {
                 continue;
             }
             if ($this->IsInConflict($reservation, $reservationSeries, $existingItem, $keyedResources)) {
                 Log::Debug("Reference number %s conflicts with existing %s with id %s", $reservation->ReferenceNumber(), get_class($existingItem), $existingItem->GetId());
                 array_push($conflicts, $existingItem);
             }
         }
     }
     $thereAreConflicts = count($conflicts) > 0;
     if ($thereAreConflicts) {
         return new ReservationRuleResult(false, $this->GetErrorString($conflicts));
     }
     return new ReservationRuleResult();
 }
Example #27
0
 private function GetHourLongReservation($startDate, $endDate, $resourceId1 = null, $resourceId2 = null, $scheduleId = null)
 {
     $userId = 12;
     $resource1 = empty($resourceId1) ? 13 : $resourceId1;
     $resource2 = empty($resourceId2) ? 14 : $resourceId2;
     $schedule = empty($scheduleId) ? 1 : $scheduleId;
     $hourLongReservation = new DateRange($startDate, $endDate, $this->tz);
     $resource = new FakeBookableResource($resource1);
     $resource->SetScheduleId($schedule);
     $series = ReservationSeries::Create($userId, $resource, null, null, $hourLongReservation, new RepeatNone(), new FakeUserSession());
     $series->AddResource(new FakeBookableResource($resource2));
     return $series;
 }
Example #28
0
 /**
  * @param ReservationSeries $reservationSeries
  * @return int newly created series_id
  */
 private function InsertSeries(ReservationSeries $reservationSeries)
 {
     $database = ServiceLocator::GetDatabase();
     $insertReservationSeries = new AddReservationSeriesCommand(Date::Now(), $reservationSeries->Title(), $reservationSeries->Description(), $reservationSeries->RepeatOptions()->RepeatType(), $reservationSeries->RepeatOptions()->ConfigurationString(), ReservationTypes::Reservation, $reservationSeries->StatusId(), $reservationSeries->UserId(), $reservationSeries->GetAllowParticipation());
     $reservationSeriesId = $database->ExecuteInsert($insertReservationSeries);
     $reservationSeries->WithSeriesId($reservationSeriesId);
     $insertReservationResource = new AddReservationResourceCommand($reservationSeriesId, $reservationSeries->ResourceId(), ResourceLevel::Primary);
     $database->Execute($insertReservationResource);
     foreach ($reservationSeries->AdditionalResources() as $resource) {
         $insertReservationResource = new AddReservationResourceCommand($reservationSeriesId, $resource->GetResourceId(), ResourceLevel::Additional);
         $database->Execute($insertReservationResource);
     }
     foreach ($reservationSeries->Accessories() as $accessory) {
         $insertAccessory = new AddReservationAccessoryCommand($accessory->AccessoryId, $accessory->QuantityReserved, $reservationSeriesId);
         $database->Execute($insertAccessory);
     }
     foreach ($reservationSeries->AttributeValues() as $attribute) {
         $insertAttributeValue = new AddAttributeValueCommand($attribute->AttributeId, $attribute->Value, $reservationSeriesId, CustomAttributeCategory::RESERVATION);
         $database->Execute($insertAttributeValue);
     }
     foreach ($reservationSeries->AddedAttachments() as $attachment) {
         $this->AddReservationAttachment($attachment);
     }
     if ($reservationSeries->GetStartReminder()->Enabled()) {
         $reminder = $reservationSeries->GetStartReminder();
         $insertAccessory = new AddReservationReminderCommand($reservationSeriesId, $reminder->MinutesPrior(), ReservationReminderType::Start);
         $database->Execute($insertAccessory);
     }
     if ($reservationSeries->GetEndReminder()->Enabled()) {
         $reminder = $reservationSeries->GetEndReminder();
         $insertAccessory = new AddReservationReminderCommand($reservationSeriesId, $reminder->MinutesPrior(), ReservationReminderType::End);
         $database->Execute($insertAccessory);
     }
     return $reservationSeriesId;
 }
Example #29
0
 /**
  * @param ReservationSeries $series
  * @param IRepeatOptions $targetRepeatOptions
  * @return bool
  */
 public function CanChangeRepeatTo($series, $targetRepeatOptions)
 {
     $this->hasSameConfiguration = $targetRepeatOptions->HasSameConfigurationAs($series->RepeatOptions());
     return parent::CanChangeRepeatTo($series, $targetRepeatOptions);
 }
 /**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $currentInstance = $reservationSeries->CurrentInstance();
     $startIsBeforeEnd = $currentInstance->StartDate()->LessThan($currentInstance->EndDate());
     return new ReservationRuleResult($startIsBeforeEnd, Resources::GetInstance()->GetString('StartDateBeforeEndDateRule'));
 }