diff --git a/docs/API_REFERENCE.txt b/docs/API_REFERENCE.txt index 83d8a7b..6b726f0 100644 --- a/docs/API_REFERENCE.txt +++ b/docs/API_REFERENCE.txt @@ -1361,7 +1361,6 @@ ROOM STAYS + CARDS APIS What it does: - Returns active stays with booking and guest details. - - expectedCheckoutAt is resolved per active stay (room_stay.planned_checkout_at), with booking expected checkout as fallback. - Includes per-stay nightlyRate (nullable when rate was not set on room stay). - AGENT-only users are blocked. @@ -1823,11 +1822,7 @@ BOOKING APIS What it does: - Updates planned dates on booking (expectedCheckInAt, expectedCheckOutAt), not actual checkout. - - Updates booking-level expected dates. - - After validation, auto-syncs linked active room stays (checked-out stays are not modified): - - OPEN booking: active stay fromAt is synced to expectedCheckInAt (when provided). - - OPEN/CHECKED_IN booking: active stay planned checkout is synced to expectedCheckOutAt (when provided). - - Does not auto-close room stays and does not overwrite actual room_stay.to_at timestamps. + - Updates booking-level expected dates only; does not auto-change room_stay checkout timestamps. - For OPEN bookings: can update both expected check-in and expected check-out. - For OPEN bookings with linked room stays: each stay start/end must remain inside expected booking window. - For CHECKED_IN: can update only expectedCheckOutAt (check-in change is blocked). diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/booking/BookingFlow.kt b/src/main/kotlin/com/android/trisolarisserver/controller/booking/BookingFlow.kt index 01b233d..e2b349e 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/booking/BookingFlow.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/booking/BookingFlow.kt @@ -511,7 +511,6 @@ class BookingFlow( room = room, fromAt = checkInAt, toAt = null, - plannedCheckoutAt = booking.expectedCheckoutAt, rateSource = parseRateSource(stay.rateSource), nightlyRate = stay.nightlyRate, ratePlanCode = stay.ratePlanCode, @@ -580,7 +579,6 @@ class BookingFlow( throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid date range") } validateRoomStayBoundsForExpectedDatesUpdate(booking, expectedIn, expectedOut) - syncActiveRoomStaysWithBookingExpectedDates(booking, expectedIn, expectedOut) booking.updatedAt = OffsetDateTime.now() bookingRepo.save(booking) @@ -639,32 +637,6 @@ class BookingFlow( } } - private fun syncActiveRoomStaysWithBookingExpectedDates( - booking: com.android.trisolarisserver.models.booking.Booking, - expectedIn: OffsetDateTime?, - expectedOut: OffsetDateTime? - ) { - val bookingId = booking.id ?: return - if (expectedIn == null && expectedOut == null) return - val activeStays = roomStayRepo.findActiveByBookingId(bookingId) - if (activeStays.isEmpty()) return - - var changed = false - activeStays.forEach { stay -> - if (booking.status == BookingStatus.OPEN && expectedIn != null && stay.fromAt != expectedIn) { - stay.fromAt = expectedIn - changed = true - } - if (expectedOut != null && stay.plannedCheckoutAt != expectedOut) { - stay.plannedCheckoutAt = expectedOut - changed = true - } - } - if (changed) { - roomStayRepo.saveAll(activeStays) - } - } - @PostMapping("/{bookingId}/billing-policy") @ResponseStatus(HttpStatus.NO_CONTENT) @Transactional diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/room/RoomStays.kt b/src/main/kotlin/com/android/trisolarisserver/controller/room/RoomStays.kt index 378f447..89a3f9a 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/room/RoomStays.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/room/RoomStays.kt @@ -69,7 +69,7 @@ class RoomStays( roomTypeName = roomType.name, fromAt = stay.fromAt.toString(), checkinAt = booking.checkinAt?.toString(), - expectedCheckoutAt = (stay.plannedCheckoutAt ?: booking.expectedCheckoutAt)?.toString(), + expectedCheckoutAt = booking.expectedCheckoutAt?.toString(), nightlyRate = stay.nightlyRate ) } diff --git a/src/main/kotlin/com/android/trisolarisserver/models/room/RoomStay.kt b/src/main/kotlin/com/android/trisolarisserver/models/room/RoomStay.kt index 2e6da9c..fa47a7e 100644 --- a/src/main/kotlin/com/android/trisolarisserver/models/room/RoomStay.kt +++ b/src/main/kotlin/com/android/trisolarisserver/models/room/RoomStay.kt @@ -33,9 +33,6 @@ class RoomStay( @Column(name = "to_at", columnDefinition = "timestamptz") var toAt: OffsetDateTime? = null, // null = active - @Column(name = "planned_checkout_at", columnDefinition = "timestamptz") - var plannedCheckoutAt: OffsetDateTime? = null, - @Column(name = "is_voided", nullable = false) var isVoided: Boolean = false, diff --git a/src/main/kotlin/com/android/trisolarisserver/repo/room/RoomStayRepo.kt b/src/main/kotlin/com/android/trisolarisserver/repo/room/RoomStayRepo.kt index bf12566..103e433 100644 --- a/src/main/kotlin/com/android/trisolarisserver/repo/room/RoomStayRepo.kt +++ b/src/main/kotlin/com/android/trisolarisserver/repo/room/RoomStayRepo.kt @@ -48,7 +48,7 @@ interface RoomStayRepo : JpaRepository { @Query(""" select rs.room.id as roomId, rs.fromAt as fromAt, - coalesce(rs.plannedCheckoutAt, b.expectedCheckoutAt) as expectedCheckoutAt + b.expectedCheckoutAt as expectedCheckoutAt from RoomStay rs join rs.booking b where rs.property.id = :propertyId