Allow guest document delete when reused guest has active booking
All checks were successful
build-and-deploy / build-deploy (push) Successful in 36s
All checks were successful
build-and-deploy / build-deploy (push) Successful in 36s
This commit is contained in:
@@ -2539,6 +2539,7 @@ GUEST + DOCUMENT + RATING APIS
|
|||||||
|
|
||||||
- Deletes document row + file.
|
- Deletes document row + file.
|
||||||
- Allowed only when booking is OPEN or CHECKED_IN.
|
- Allowed only when booking is OPEN or CHECKED_IN.
|
||||||
|
- Reused guest flow: if the document's linked booking is closed but the same guest has another OPEN/CHECKED_IN booking in that property, delete is allowed.
|
||||||
|
|
||||||
Request body:
|
Request body:
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import com.android.trisolarisserver.component.auth.PropertyAccess
|
|||||||
import com.android.trisolarisserver.repo.booking.BookingRepo
|
import com.android.trisolarisserver.repo.booking.BookingRepo
|
||||||
import com.android.trisolarisserver.repo.guest.GuestDocumentRepo
|
import com.android.trisolarisserver.repo.guest.GuestDocumentRepo
|
||||||
import com.android.trisolarisserver.repo.guest.GuestRepo
|
import com.android.trisolarisserver.repo.guest.GuestRepo
|
||||||
|
import com.android.trisolarisserver.models.booking.BookingStatus
|
||||||
import com.android.trisolarisserver.models.booking.GuestDocument
|
import com.android.trisolarisserver.models.booking.GuestDocument
|
||||||
import com.android.trisolarisserver.models.property.Role
|
import com.android.trisolarisserver.models.property.Role
|
||||||
import com.android.trisolarisserver.repo.property.AppUserRepo
|
import com.android.trisolarisserver.repo.property.AppUserRepo
|
||||||
@@ -192,9 +193,13 @@ class GuestDocuments(
|
|||||||
val document = guestDocumentRepo.findByIdAndPropertyIdAndGuestId(documentId, propertyId, guestId)
|
val document = guestDocumentRepo.findByIdAndPropertyIdAndGuestId(documentId, propertyId, guestId)
|
||||||
?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Document not found")
|
?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Document not found")
|
||||||
val status = document.booking.status
|
val status = document.booking.status
|
||||||
if (status != com.android.trisolarisserver.models.booking.BookingStatus.OPEN &&
|
val linkedBookingOpenOrCheckedIn = status == BookingStatus.OPEN || status == BookingStatus.CHECKED_IN
|
||||||
status != com.android.trisolarisserver.models.booking.BookingStatus.CHECKED_IN
|
val guestHasOpenOrCheckedInBooking = bookingRepo.existsByPropertyIdAndPrimaryGuestIdAndStatusIn(
|
||||||
) {
|
propertyId = propertyId,
|
||||||
|
primaryGuestId = guestId,
|
||||||
|
status = listOf(BookingStatus.OPEN, BookingStatus.CHECKED_IN)
|
||||||
|
)
|
||||||
|
if (!linkedBookingOpenOrCheckedIn && !guestHasOpenOrCheckedInBooking) {
|
||||||
throw ResponseStatusException(
|
throw ResponseStatusException(
|
||||||
HttpStatus.BAD_REQUEST,
|
HttpStatus.BAD_REQUEST,
|
||||||
"Documents can only be deleted for OPEN or CHECKED_IN bookings"
|
"Documents can only be deleted for OPEN or CHECKED_IN bookings"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.android.trisolarisserver.repo.booking
|
package com.android.trisolarisserver.repo.booking
|
||||||
|
|
||||||
import com.android.trisolarisserver.models.booking.Booking
|
import com.android.trisolarisserver.models.booking.Booking
|
||||||
|
import com.android.trisolarisserver.models.booking.BookingStatus
|
||||||
import org.springframework.data.jpa.repository.JpaRepository
|
import org.springframework.data.jpa.repository.JpaRepository
|
||||||
import org.springframework.data.jpa.repository.EntityGraph
|
import org.springframework.data.jpa.repository.EntityGraph
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
@@ -16,4 +17,10 @@ interface BookingRepo : JpaRepository<Booking, UUID> {
|
|||||||
|
|
||||||
@EntityGraph(attributePaths = ["property", "primaryGuest", "createdBy"])
|
@EntityGraph(attributePaths = ["property", "primaryGuest", "createdBy"])
|
||||||
fun findDetailedById(id: UUID): java.util.Optional<Booking>
|
fun findDetailedById(id: UUID): java.util.Optional<Booking>
|
||||||
|
|
||||||
|
fun existsByPropertyIdAndPrimaryGuestIdAndStatusIn(
|
||||||
|
propertyId: UUID,
|
||||||
|
primaryGuestId: UUID,
|
||||||
|
status: Collection<BookingStatus>
|
||||||
|
): Boolean
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user