Skip to content

Commit 36ef3f1

Browse files
committed
feat: update SummitLocationService::addOfflineBookableRoomReservation to allow spec out the quantity of offline slots to allocate
1 parent a61af83 commit 36ef3f1

4 files changed

Lines changed: 67 additions & 13 deletions

File tree

app/Http/Controllers/Apis/Protected/Summit/Factories/SummitRoomReservationValidationRulesFactory.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,13 @@ public static function buildForAdd(array $payload = []):array{
4040
public static function buildForAddOffline(array $payload = []):array{
4141

4242
return [
43-
'currency' => 'required|string|currency_iso',
44-
'owner_id' => 'required|integer',
45-
'amount' => 'required|integer|min:0',
46-
'start_datetime' => 'required|date_format:U|epoch_seconds',
47-
'end_datetime' => 'required|date_format:U|epoch_seconds|after:start_datetime',
43+
'currency' => 'required|string|currency_iso',
44+
'owner_id' => 'required|integer',
45+
'amount' => 'required|integer|min:0',
46+
'start_datetime' => 'required|date_format:U|epoch_seconds',
47+
'end_datetime' => 'required|date_format:U|epoch_seconds|after:start_datetime',
48+
'quantity' => 'sometimes|integer|min:1',
49+
'supress_email' => 'sometimes|boolean',
4850
];
4951
}
5052

app/Models/Foundation/Summit/Factories/SummitRoomReservationFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public static function build(Summit $summit, array $data):SummitRoomReservation{
2929
}
3030

3131
public static function populate(SummitRoomReservation $reservation, Summit $summit, array $data):SummitRoomReservation{
32+
3233
if(isset($data['owner']))
3334
$reservation->setOwner($data['owner']);
3435
if(isset($data['currency']))

app/Models/Foundation/Summit/Locations/SummitBookableVenueRoom.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,17 @@ public function validateReservation(SummitRoomReservation $reservation):bool{
7272
$local_start_date = $summit->convertDateFromUTC2TimeZone(clone $start_date);
7373
$local_end_date = $summit->convertDateFromUTC2TimeZone(clone $end_date);
7474

75+
Log::debug
76+
(
77+
sprintf
78+
(
79+
"SummitBookableVenueRoom::validateReservation summit %s local_start_date %s local_end_date %s",
80+
$summit->getId(),
81+
$start_date->format('Y-m-d H:i:s'),
82+
$end_date->format('Y-m-d H:i:s')
83+
)
84+
);
85+
7586
if($summit->isBookingPeriodEnded()){
7687
throw new ValidationException
7788
(
@@ -102,8 +113,9 @@ public function validateReservation(SummitRoomReservation $reservation):bool{
102113
SummitRoomReservation::Canceled
103114
]));
104115

105-
if($this->reservations->matching($criteria)->count() > 0)
116+
if($this->reservations->matching($criteria)->count() > 0) {
106117
throw new ValidationException("Reservation overlaps an existent reservation(s).");
118+
}
107119

108120

109121
$criteria
@@ -115,11 +127,12 @@ public function validateReservation(SummitRoomReservation $reservation):bool{
115127
SummitRoomReservation::Canceled
116128
]));
117129

118-
if($this->reservations->matching($criteria)->count() > 0)
130+
if($this->reservations->matching($criteria)->count() > 0) {
119131
throw new ValidationException
120132
(
121133
"Reservation overlaps an existent reservation(s)."
122134
);
135+
}
123136

124137
$start_time = $summit->getMeetingRoomBookingStartTime();
125138
$end_time = $summit->getMeetingRoomBookingEndTime();

app/Services/Model/Imp/SummitLocationService.php

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1693,14 +1693,15 @@ public function addOfflineBookableRoomReservation(Summit $summit, int $room_id,
16931693
}
16941694

16951695
$owner_id = $payload["owner_id"];
1696+
$quantity = intval($payload["quantity"] ?? 1 );
16961697

16971698
$owner = $this->member_repository->getById($owner_id);
16981699

16991700
if (!$owner instanceof Member) {
17001701
throw new EntityNotFoundException('Member not found.');
17011702
}
17021703

1703-
if ($owner->getReservationsCountBySummit($summit) >= $summit->getMeetingRoomBookingMaxAllowed())
1704+
if ($quantity == 1 && $owner->getReservationsCountBySummit($summit) >= $summit->getMeetingRoomBookingMaxAllowed())
17041705
throw new ValidationException
17051706
(
17061707
sprintf
@@ -1744,14 +1745,51 @@ public function addOfflineBookableRoomReservation(Summit $summit, int $room_id,
17441745
}
17451746
}
17461747

1747-
$reservation = SummitRoomReservationFactory::build($summit, $payload);
1748-
$reservation->markAsOffline();
1749-
$room->addReservation($reservation);
1750-
$reservation->setPaid();
1748+
$booking_slot_len = $summit->getMeetingRoomBookingSlotLength();
1749+
$next_start_date = null;
1750+
$next_end_date = null;
1751+
1752+
Log::debug(sprintf("SummitLocationService::addOfflineBookableRoomReservation we are gonna create %s slots", $quantity));
1753+
for($i = 0 ; $i < $quantity ; $i++) {
1754+
$reservation = SummitRoomReservationFactory::build($summit, $payload);
1755+
1756+
if(!is_null($next_start_date)) {
1757+
Log::debug
1758+
(
1759+
sprintf
1760+
(
1761+
"SummitLocationService::addOfflineBookableRoomReservation setting next_start_date %s",
1762+
$next_start_date->format('Y-m-d H:i:s')
1763+
)
1764+
);
1765+
$reservation->setStartDatetime($next_start_date);
1766+
}
1767+
1768+
if(!is_null($next_end_date)) {
1769+
Log::debug
1770+
(
1771+
sprintf
1772+
(
1773+
"SummitLocationService::addOfflineBookableRoomReservation setting next_end_date %s",
1774+
$next_end_date->format('Y-m-d H:i:s')
1775+
)
1776+
);
1777+
$reservation->setEndDatetime($next_end_date);
1778+
}
1779+
$reservation->markAsOffline();
1780+
$room->addReservation($reservation);
1781+
$reservation->setPaid();
1782+
$next_start_date = clone $reservation->getEndDatetime();
1783+
$next_end_date = (clone $reservation->getEndDatetime())->add(new \DateInterval("PT" . $booking_slot_len . 'M'));
1784+
}
1785+
17511786
return $reservation;
17521787
});
17531788

1754-
Event::dispatch(new CreatedBookableRoomReservation($reservation->getId()));
1789+
$supress_email = boolval($payload["supress_email"] ?? false);
1790+
1791+
if(!$supress_email)
1792+
Event::dispatch(new CreatedBookableRoomReservation($reservation->getId()));
17551793

17561794
return $reservation;
17571795
}

0 commit comments

Comments
 (0)