diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/BookingFlow.kt b/src/main/kotlin/com/android/trisolarisserver/controller/BookingFlow.kt index 9d2f3b4..43f1918 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/BookingFlow.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/BookingFlow.kt @@ -157,6 +157,9 @@ class BookingFlow( Role.HOUSEKEEPING, Role.FINANCE ) + val property = propertyRepo.findById(propertyId).orElseThrow { + ResponseStatusException(HttpStatus.NOT_FOUND, "Property not found") + } val statuses = parseStatuses(status) val bookings = if (statuses.isEmpty()) { bookingRepo.findByPropertyIdOrderByCreatedAtDesc(propertyId) @@ -171,8 +174,27 @@ class BookingFlow( .groupBy { it.bookingId } .mapValues { (_, rows) -> rows.map { it.roomNumber }.distinct().sorted() } } + val staysByBooking = if (bookingIds.isEmpty()) { + emptyMap() + } else { + roomStayRepo.findByBookingIdIn(bookingIds).groupBy { it.booking.id!! } + } + val paymentsByBooking = if (bookingIds.isEmpty()) { + emptyMap() + } else { + paymentRepo.sumAmountByBookingIds(bookingIds) + .associate { it.bookingId to it.total } + } return bookings.map { booking -> val guest = booking.primaryGuest + val stays = staysByBooking[booking.id].orEmpty() + val expectedPay = if (stays.isEmpty()) { + null + } else { + computeExpectedPay(stays, property.timezone) + } + val collected = paymentsByBooking[booking.id] ?: 0L + val pending = expectedPay?.let { it - collected } BookingListItem( id = booking.id!!, status = booking.status.name, @@ -191,7 +213,8 @@ class BookingFlow( femaleCount = booking.femaleCount, totalGuestCount = booking.totalGuestCount, expectedGuestCount = booking.expectedGuestCount, - notes = booking.notes + notes = booking.notes, + pending = pending ) } } 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 ee18494..eb37d48 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/dto/BookingDtos.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/dto/BookingDtos.kt @@ -72,7 +72,8 @@ data class BookingListItem( val femaleCount: Int?, val totalGuestCount: Int?, val expectedGuestCount: Int?, - val notes: String? + val notes: String?, + val pending: Long? = null ) data class BookingDetailResponse( diff --git a/src/main/kotlin/com/android/trisolarisserver/repo/PaymentRepo.kt b/src/main/kotlin/com/android/trisolarisserver/repo/PaymentRepo.kt index 3f47c7d..bd1caf0 100644 --- a/src/main/kotlin/com/android/trisolarisserver/repo/PaymentRepo.kt +++ b/src/main/kotlin/com/android/trisolarisserver/repo/PaymentRepo.kt @@ -17,4 +17,19 @@ interface PaymentRepo : JpaRepository { """ ) fun sumAmountByBookingId(@Param("bookingId") bookingId: UUID): Long + + @Query( + """ + select p.booking.id as bookingId, coalesce(sum(p.amount), 0) as total + from Payment p + where p.booking.id in :bookingIds + group by p.booking.id + """ + ) + fun sumAmountByBookingIds(@Param("bookingIds") bookingIds: List): List +} + +interface BookingPaymentSumRow { + val bookingId: UUID + val total: Long } diff --git a/src/main/kotlin/com/android/trisolarisserver/repo/RoomStayRepo.kt b/src/main/kotlin/com/android/trisolarisserver/repo/RoomStayRepo.kt index 71f423b..fe35186 100644 --- a/src/main/kotlin/com/android/trisolarisserver/repo/RoomStayRepo.kt +++ b/src/main/kotlin/com/android/trisolarisserver/repo/RoomStayRepo.kt @@ -43,6 +43,13 @@ interface RoomStayRepo : JpaRepository { """) fun findByBookingId(@Param("bookingId") bookingId: UUID): List + @Query(""" + select rs + from RoomStay rs + where rs.booking.id in :bookingIds + """) + fun findByBookingIdIn(@Param("bookingIds") bookingIds: List): List + @Query(""" select rs.room.id from RoomStay rs