generated from bisco/codex-bootstrap
feat(admin): add manual reservation operations
This commit is contained in:
@@ -75,6 +75,29 @@ def confirm_check_in_from_token(raw_token, *, staff_user, source=CheckIn.Source.
|
||||
return CheckInResult(check_in=check_in, preview=_build_preview(reservation))
|
||||
|
||||
|
||||
def confirm_check_in_for_reservation(*, reservation_id, staff_user, source=CheckIn.Source.MANUAL):
|
||||
_validate_staff_user(staff_user)
|
||||
|
||||
with transaction.atomic():
|
||||
reservation = (
|
||||
Reservation.objects.select_for_update()
|
||||
.select_related("performance__show", "performance__venue")
|
||||
.get(pk=reservation_id)
|
||||
)
|
||||
_validate_reservation_for_check_in(reservation)
|
||||
|
||||
try:
|
||||
check_in = CheckIn.objects.create(
|
||||
reservation=reservation,
|
||||
checked_in_by=staff_user,
|
||||
source=source,
|
||||
)
|
||||
except IntegrityError as exc:
|
||||
raise AlreadyCheckedIn("Reservation has already been checked in.") from exc
|
||||
|
||||
return CheckInResult(check_in=check_in, preview=_build_preview(reservation))
|
||||
|
||||
|
||||
def _validate_staff_user(staff_user):
|
||||
if staff_user is None:
|
||||
raise MissingStaffUser("A staff user is required for check-in.")
|
||||
|
||||
@@ -11,6 +11,7 @@ from checkins.services import (
|
||||
InvalidToken,
|
||||
MissingStaffUser,
|
||||
ReservationNotConfirmed,
|
||||
confirm_check_in_for_reservation,
|
||||
confirm_check_in_from_token,
|
||||
preview_check_in_token,
|
||||
)
|
||||
@@ -125,6 +126,27 @@ class CheckInServiceTests(TestCase):
|
||||
with self.assertRaises(MissingStaffUser):
|
||||
confirm_check_in_from_token(raw_token, staff_user=None)
|
||||
|
||||
def test_manual_check_in_by_reservation_id_succeeds_for_confirmed_reservation(self):
|
||||
reservation = self.create_reservation()
|
||||
|
||||
result = confirm_check_in_for_reservation(
|
||||
reservation_id=reservation.id,
|
||||
staff_user=self.staff_user,
|
||||
)
|
||||
|
||||
self.assertEqual(result.check_in.reservation, reservation)
|
||||
self.assertEqual(result.check_in.checked_in_by, self.staff_user)
|
||||
self.assertEqual(result.check_in.source, CheckIn.Source.MANUAL)
|
||||
|
||||
def test_manual_check_in_by_reservation_id_rejects_pending_reservation(self):
|
||||
reservation = self.create_reservation(status=Reservation.Status.PENDING, confirmed_at=None)
|
||||
|
||||
with self.assertRaises(ReservationNotConfirmed):
|
||||
confirm_check_in_for_reservation(
|
||||
reservation_id=reservation.id,
|
||||
staff_user=self.staff_user,
|
||||
)
|
||||
|
||||
def test_check_in_rejects_confirmation_token_even_for_confirmed_reservation(self):
|
||||
reservation = self.create_reservation()
|
||||
_, raw_token = ReservationToken.create_token(
|
||||
|
||||
Reference in New Issue
Block a user