diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/BookingFlow.kt b/src/main/kotlin/com/android/trisolarisserver/controller/BookingFlow.kt index 12e2fae..15942a2 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/BookingFlow.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/BookingFlow.kt @@ -159,6 +159,14 @@ class BookingFlow( } else { bookingRepo.findByPropertyIdAndStatusInOrderByCreatedAtDesc(propertyId, statuses) } + val bookingIds = bookings.mapNotNull { it.id } + val roomNumbersByBooking = if (bookingIds.isEmpty()) { + emptyMap() + } else { + roomStayRepo.findActiveRoomNumbersByBookingIds(bookingIds) + .groupBy { it.bookingId } + .mapValues { (_, rows) -> rows.map { it.roomNumber }.distinct().sorted() } + } return bookings.map { booking -> val guest = booking.primaryGuest BookingListItem( @@ -167,6 +175,7 @@ class BookingFlow( guestId = guest?.id, guestName = guest?.name, guestPhone = guest?.phoneE164, + roomNumbers = roomNumbersByBooking[booking.id] ?: emptyList(), source = booking.source, expectedCheckInAt = booking.expectedCheckinAt?.toString(), expectedCheckOutAt = booking.expectedCheckoutAt?.toString(), diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/dto/BookingDtos.kt b/src/main/kotlin/com/android/trisolarisserver/controller/dto/BookingDtos.kt index 3c7aed8..708723a 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/dto/BookingDtos.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/dto/BookingDtos.kt @@ -60,6 +60,7 @@ data class BookingListItem( val guestId: UUID?, val guestName: String?, val guestPhone: String?, + val roomNumbers: List, val source: String?, val expectedCheckInAt: String?, val expectedCheckOutAt: String?, diff --git a/src/main/kotlin/com/android/trisolarisserver/repo/RoomStayRepo.kt b/src/main/kotlin/com/android/trisolarisserver/repo/RoomStayRepo.kt index 3061803..71f423b 100644 --- a/src/main/kotlin/com/android/trisolarisserver/repo/RoomStayRepo.kt +++ b/src/main/kotlin/com/android/trisolarisserver/repo/RoomStayRepo.kt @@ -89,4 +89,20 @@ interface RoomStayRepo : JpaRepository { where rs.room.id = :roomId """) fun existsByRoomId(@Param("roomId") roomId: UUID): Boolean + + @Query(""" + select rs.booking.id as bookingId, r.roomNumber as roomNumber + from RoomStay rs + join rs.room r + where rs.booking.id in :bookingIds + and rs.toAt is null + """) + fun findActiveRoomNumbersByBookingIds( + @Param("bookingIds") bookingIds: List + ): List +} + +interface BookingRoomNumberRow { + val bookingId: UUID + val roomNumber: Int }