From 83c7b45e8934540cd7ef08d395efba92744e0f3e Mon Sep 17 00:00:00 2001 From: androidlover5842 Date: Sun, 8 Feb 2026 18:56:13 +0530 Subject: [PATCH] Allow guest document delete when reused guest has active booking --- docs/API_REFERENCE.txt | 1 + .../controller/guest/GuestDocuments.kt | 11 ++++++++--- .../trisolarisserver/repo/booking/BookingRepo.kt | 7 +++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/docs/API_REFERENCE.txt b/docs/API_REFERENCE.txt index 6b726f0..c41f82f 100644 --- a/docs/API_REFERENCE.txt +++ b/docs/API_REFERENCE.txt @@ -2539,6 +2539,7 @@ GUEST + DOCUMENT + RATING APIS - Deletes document row + file. - 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: diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/guest/GuestDocuments.kt b/src/main/kotlin/com/android/trisolarisserver/controller/guest/GuestDocuments.kt index 931fefe..811818d 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/guest/GuestDocuments.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/guest/GuestDocuments.kt @@ -14,6 +14,7 @@ import com.android.trisolarisserver.component.auth.PropertyAccess import com.android.trisolarisserver.repo.booking.BookingRepo import com.android.trisolarisserver.repo.guest.GuestDocumentRepo 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.property.Role import com.android.trisolarisserver.repo.property.AppUserRepo @@ -192,9 +193,13 @@ class GuestDocuments( val document = guestDocumentRepo.findByIdAndPropertyIdAndGuestId(documentId, propertyId, guestId) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Document not found") val status = document.booking.status - if (status != com.android.trisolarisserver.models.booking.BookingStatus.OPEN && - status != com.android.trisolarisserver.models.booking.BookingStatus.CHECKED_IN - ) { + val linkedBookingOpenOrCheckedIn = status == BookingStatus.OPEN || status == BookingStatus.CHECKED_IN + val guestHasOpenOrCheckedInBooking = bookingRepo.existsByPropertyIdAndPrimaryGuestIdAndStatusIn( + propertyId = propertyId, + primaryGuestId = guestId, + status = listOf(BookingStatus.OPEN, BookingStatus.CHECKED_IN) + ) + if (!linkedBookingOpenOrCheckedIn && !guestHasOpenOrCheckedInBooking) { throw ResponseStatusException( HttpStatus.BAD_REQUEST, "Documents can only be deleted for OPEN or CHECKED_IN bookings" diff --git a/src/main/kotlin/com/android/trisolarisserver/repo/booking/BookingRepo.kt b/src/main/kotlin/com/android/trisolarisserver/repo/booking/BookingRepo.kt index 9cbc8cf..cab1413 100644 --- a/src/main/kotlin/com/android/trisolarisserver/repo/booking/BookingRepo.kt +++ b/src/main/kotlin/com/android/trisolarisserver/repo/booking/BookingRepo.kt @@ -1,6 +1,7 @@ package com.android.trisolarisserver.repo.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.EntityGraph import java.util.UUID @@ -16,4 +17,10 @@ interface BookingRepo : JpaRepository { @EntityGraph(attributePaths = ["property", "primaryGuest", "createdBy"]) fun findDetailedById(id: UUID): java.util.Optional + + fun existsByPropertyIdAndPrimaryGuestIdAndStatusIn( + propertyId: UUID, + primaryGuestId: UUID, + status: Collection + ): Boolean }