public function testDoesNotConflictIfBeingDeletedOrUpdated() { $now = Date::Now(); $currentDate = new DateRange($now->AddDays(10), $now->AddDays(15)); $resourceId = 18; $id1 = 100; $id2 = 101; $currentId = 99; $deleted = new TestReservation('ref2', new TestDateRange()); $deleted->SetReservationId($id1); $updated = new TestReservation('ref3', new TestDateRange()); $updated->SetReservationId($id2); $current = new TestReservation('ref', $currentDate); $current->SetReservationId($currentId); $series = new ExistingReservationSeries(); $series->WithPrimaryResource(new FakeBookableResource($resourceId)); $series->WithCurrentInstance($current); $series->WithInstance($deleted); $series->WithInstance($updated); $series->RemoveInstance($deleted); $series->UpdateInstance($updated, new DateRange($now->AddDays(20), $now->AddDays(21))); $reservations = array(new TestReservationItemView($id1, Date::Now(), Date::Now(), $resourceId), new TestReservationItemView($id2, Date::Now(), Date::Now(), $resourceId)); $this->strategy->expects($this->exactly(2))->method('GetItemsBetween')->with($this->anything(), $this->anything())->will($this->returnValue($reservations)); $rule = new ExistingResourceAvailabilityRule($this->strategy, $this->timezone); $ruleResult = $rule->Validate($series); $this->assertTrue($ruleResult->IsValid()); }
/** * @return ExistingReservationSeries */ public function Build() { $this->series->WithId($this->id); $this->series->WithCurrentInstance($this->currentInstance); $this->series->WithRepeatOptions($this->repeatOptions); foreach ($this->instances as $reservation) { $this->series->WithInstance($reservation); } foreach ($this->events as $event) { $this->series->AddEvent($event); } $this->series->WithPrimaryResource($this->resource); $this->series->Update(1, $this->resource, 'title', 'description', $this->bookedBy); return $this->series; }
private function PopulateInstances(ExistingReservationSeries $series) { // get all series instances $getInstancesCommand = new GetReservationSeriesInstances($series->SeriesId()); $reader = ServiceLocator::GetDatabase()->Query($getInstancesCommand); while ($row = $reader->GetRow()) { $start = Date::FromDatabase($row[ColumnNames::RESERVATION_START]); $end = Date::FromDatabase($row[ColumnNames::RESERVATION_END]); $reservation = new Reservation($series, new DateRange($start, $end), $row[ColumnNames::RESERVATION_INSTANCE_ID], $row[ColumnNames::REFERENCE_NUMBER]); $series->WithInstance($reservation); } $reader->Free(); }
public function testLoadByIdFullyHydratesReservationSeriesObject() { $seriesId = 10; $reservationId = 1; $referenceNumber = 'currentInstanceRefNum'; $ownerId = 10; $resourceId = 100; $scheduleId = 1000; $title = 'title'; $description = 'description'; $resourceId1 = 99; $resourceId2 = 999; $begin = '2010-01-05 12:30:00'; $end = '2010-01-05 18:30:00'; $duration = DateRange::Create($begin, $end, 'UTC'); $interval = 3; $repeatType = RepeatType::Daily; $terminationDateString = '2010-01-20 12:30:00'; $terminationDate = Date::FromDatabase($terminationDateString); $repeatOptions = new RepeatDaily($interval, $terminationDate); $instance1Invitees = array(1, 2, 3); $instance1Participants = array(4, 5); $instance2Invitees = array(6); $instance2Participants = array(7, 8, 9); $resourceName = 'primary resource'; $location = 'l'; $contact = 'c'; $notes = 'notes'; $minLength = '3:00'; $maxLength = null; $autoAssign = true; $requiresApproval = false; $allowMultiDay = true; $maxParticipants = 100; $minNotice = '2:10'; $maxNotice = null; $statusId = ReservationStatus::Pending; $accessoryId1 = 8111; $accessoryId2 = 8222; $quantity1 = 11; $quantity2 = 22; $attributeId1 = 908; $attributeValue1 = 'custom1'; $attributeId2 = 999; $attributeValue2 = 'custom2'; $fileId = 100; $startReminderMinutes = 25; $endReminderMinutes = 120; $allowParticipation = true; $expected = new ExistingReservationSeries(); $expected->WithId($seriesId); $expected->WithOwner($ownerId); $expected->WithPrimaryResource(new BookableResource($resourceId, $resourceName, $location, $contact, $notes, $minLength, $maxLength, $autoAssign, $requiresApproval, $allowMultiDay, $maxParticipants, $minNotice, $maxNotice, null, $scheduleId)); $expected->WithTitle($title); $expected->WithDescription($description); $expected->WithResource(new BookableResource($resourceId1, $resourceName, $location, $contact, $notes, $minLength, $maxLength, $autoAssign, $requiresApproval, $allowMultiDay, $maxParticipants, $minNotice, $maxNotice, null, $scheduleId)); $expected->WithResource(new BookableResource($resourceId2, $resourceName, $location, $contact, $notes, $minLength, $maxLength, $autoAssign, $requiresApproval, $allowMultiDay, $maxParticipants, $minNotice, $maxNotice, null, $scheduleId)); $expected->WithRepeatOptions($repeatOptions); $expected->WithStatus($statusId); $expected->WithAccessory(new ReservationAccessory($accessoryId1, $quantity1)); $expected->WithAccessory(new ReservationAccessory($accessoryId2, $quantity2)); $expected->WithAttribute(new AttributeValue($attributeId1, $attributeValue1)); $expected->WithAttribute(new AttributeValue($attributeId2, $attributeValue2)); $expected->WithAttachment($fileId, 'doc'); $expected->AllowParticipation($allowParticipation); $instance1 = new Reservation($expected, $duration->AddDays(10)); $instance1->SetReferenceNumber('instance1'); $instance1->SetReservationId(909); $instance1->WithInvitees($instance1Invitees); $instance1->WithParticipants($instance1Participants); $instance2 = new Reservation($expected, $duration->AddDays(20)); $instance2->SetReferenceNumber('instance2'); $instance2->SetReservationId(1909); $instance2->WithInvitees($instance2Invitees); $instance2->WithParticipants($instance2Participants); $expected->WithInstance($instance1); $expected->WithInstance($instance2); $expectedInstance = new Reservation($expected, $duration); $expectedInstance->SetReferenceNumber($referenceNumber); $expectedInstance->SetReservationId($reservationId); $expected->WithCurrentInstance($expectedInstance); $expected->WithStartReminder(new ReservationReminder($startReminderMinutes, ReservationReminderInterval::Minutes)); $expected->WithEndReminder(new ReservationReminder($endReminderMinutes / 60, ReservationReminderInterval::Hours)); $reservationRow = new ReservationRow($reservationId, $begin, $end, $title, $description, $repeatType, $repeatOptions->ConfigurationString(), $referenceNumber, $seriesId, $ownerId, $statusId, $allowParticipation); $reservationInstanceRow = new ReservationInstanceRow($seriesId); $reservationInstanceRow->WithInstance($instance1->ReservationId(), $instance1->ReferenceNumber(), $instance1->Duration())->WithInstance($instance2->ReservationId(), $instance2->ReferenceNumber(), $instance2->Duration())->WithInstance($reservationId, $expectedInstance->ReferenceNumber(), $expectedInstance->Duration()); $reservationResourceRow = new ReservationResourceRow($reservationId, $resourceName, $location, $contact, $notes, $minLength, $maxLength, $autoAssign, $requiresApproval, $allowMultiDay, $maxParticipants, $minNotice, $maxNotice, $scheduleId); $reservationResourceRow->WithPrimary($resourceId)->WithAdditional($resourceId1)->WithAdditional($resourceId2); $reservationUserRow = new ReservationUserRow(); $reservationUserRow->WithParticipants($instance1, $instance1Participants)->WithParticipants($instance2, $instance2Participants)->WithInvitees($instance1, $instance1Invitees)->WithInvitees($instance2, $instance2Invitees); $reservationAccessoryRow = new ReservationAccessoryRow(); $reservationAccessoryRow->WithAccessory($accessoryId1, $quantity1)->WithAccessory($accessoryId2, $quantity2); $attributeValueRow = new CustomAttributeValueRow(); $attributeValueRow->With($attributeId1, $attributeValue1)->With($attributeId2, $attributeValue2); $attachmentRow = new ReservationAttachmentItemRow(); $attachmentRow->With($fileId, $seriesId, null, 'doc'); $reminderRow = new ReservationReminderRow(); $reminderRow->With(1, $seriesId, $startReminderMinutes, ReservationReminderType::Start)->With(2, $seriesId, $endReminderMinutes, ReservationReminderType::End); $this->db->SetRow(0, $reservationRow->Rows()); $this->db->SetRow(1, $reservationInstanceRow->Rows()); $this->db->SetRow(2, $reservationResourceRow->Rows()); $this->db->SetRow(3, $reservationUserRow->Rows()); $this->db->SetRow(4, $reservationAccessoryRow->Rows()); $this->db->SetRow(5, $attributeValueRow->Rows()); $this->db->SetRow(6, $attachmentRow->Rows()); $this->db->SetRow(7, $reminderRow->Rows()); $actualReservation = $this->repository->LoadById($reservationId); $this->assertEquals($expected, $actualReservation); $getReservation = new GetReservationByIdCommand($reservationId); $getInstances = new GetReservationSeriesInstances($seriesId); $getResources = new GetReservationResourcesCommand($seriesId); $getParticipants = new GetReservationSeriesParticipantsCommand($seriesId); $getAccessories = new GetReservationAccessoriesCommand($seriesId); $getAttributeValues = new GetAttributeValuesCommand($seriesId, CustomAttributeCategory::RESERVATION); $getAttachments = new GetReservationAttachmentsCommand($seriesId); $getReminders = new GetReservationReminders($seriesId); $this->assertTrue($this->db->ContainsCommand($getReservation)); $this->assertTrue($this->db->ContainsCommand($getInstances)); $this->assertTrue($this->db->ContainsCommand($getResources)); $this->assertTrue($this->db->ContainsCommand($getParticipants)); $this->assertTrue($this->db->ContainsCommand($getAccessories)); $this->assertTrue($this->db->ContainsCommand($getAttributeValues)); $this->assertTrue($this->db->ContainsCommand($getAttachments)); $this->assertTrue($this->db->ContainsCommand($getReminders)); }
public function testUpdateSingleInstanceToAnEarlierTime() { $now = Date::Now(); $newStart = Date::Parse('2010-01-01 04:00:00', 'UTC'); $start = Date::Parse('2010-01-01 05:00:00', 'UTC'); $end = Date::Parse('2010-01-01 07:00:00', 'UTC'); $future1 = new TestReservation('1', new DateRange($now->AddDays(5), $now->AddDays(5))); $future2 = new TestReservation('2', new DateRange($now->AddDays(6), $now->AddDays(6))); $current = new TestReservation('3', new DateRange($start, $end)); $existing = new ExistingReservationSeries(); $existing->WithInstance($future1); $existing->WithInstance($future2); $existing->WithCurrentInstance($current); $existing->ApplyChangesTo(SeriesUpdateScope::ThisInstance); $existing->UpdateDuration(new DateRange($newStart, $end)); $newCurrent = $existing->CurrentInstance(); $this->assertTrue($newCurrent->StartDate()->Equals($newStart)); $this->assertTrue($newCurrent->EndDate()->Equals($end)); }