Add pending amount to booking list
All checks were successful
build-and-deploy / build-deploy (push) Successful in 39s

This commit is contained in:
androidlover5842
2026-01-29 22:17:00 +05:30
parent b765f041f7
commit 0464c804cc
4 changed files with 48 additions and 2 deletions

View File

@@ -157,6 +157,9 @@ class BookingFlow(
Role.HOUSEKEEPING, Role.HOUSEKEEPING,
Role.FINANCE Role.FINANCE
) )
val property = propertyRepo.findById(propertyId).orElseThrow {
ResponseStatusException(HttpStatus.NOT_FOUND, "Property not found")
}
val statuses = parseStatuses(status) val statuses = parseStatuses(status)
val bookings = if (statuses.isEmpty()) { val bookings = if (statuses.isEmpty()) {
bookingRepo.findByPropertyIdOrderByCreatedAtDesc(propertyId) bookingRepo.findByPropertyIdOrderByCreatedAtDesc(propertyId)
@@ -171,8 +174,27 @@ class BookingFlow(
.groupBy { it.bookingId } .groupBy { it.bookingId }
.mapValues { (_, rows) -> rows.map { it.roomNumber }.distinct().sorted() } .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 -> return bookings.map { booking ->
val guest = booking.primaryGuest 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( BookingListItem(
id = booking.id!!, id = booking.id!!,
status = booking.status.name, status = booking.status.name,
@@ -191,7 +213,8 @@ class BookingFlow(
femaleCount = booking.femaleCount, femaleCount = booking.femaleCount,
totalGuestCount = booking.totalGuestCount, totalGuestCount = booking.totalGuestCount,
expectedGuestCount = booking.expectedGuestCount, expectedGuestCount = booking.expectedGuestCount,
notes = booking.notes notes = booking.notes,
pending = pending
) )
} }
} }

View File

@@ -72,7 +72,8 @@ data class BookingListItem(
val femaleCount: Int?, val femaleCount: Int?,
val totalGuestCount: Int?, val totalGuestCount: Int?,
val expectedGuestCount: Int?, val expectedGuestCount: Int?,
val notes: String? val notes: String?,
val pending: Long? = null
) )
data class BookingDetailResponse( data class BookingDetailResponse(

View File

@@ -17,4 +17,19 @@ interface PaymentRepo : JpaRepository<Payment, UUID> {
""" """
) )
fun sumAmountByBookingId(@Param("bookingId") bookingId: UUID): Long 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<UUID>): List<BookingPaymentSumRow>
}
interface BookingPaymentSumRow {
val bookingId: UUID
val total: Long
} }

View File

@@ -43,6 +43,13 @@ interface RoomStayRepo : JpaRepository<RoomStay, UUID> {
""") """)
fun findByBookingId(@Param("bookingId") bookingId: UUID): List<RoomStay> fun findByBookingId(@Param("bookingId") bookingId: UUID): List<RoomStay>
@Query("""
select rs
from RoomStay rs
where rs.booking.id in :bookingIds
""")
fun findByBookingIdIn(@Param("bookingIds") bookingIds: List<UUID>): List<RoomStay>
@Query(""" @Query("""
select rs.room.id select rs.room.id
from RoomStay rs from RoomStay rs