From bc13816cbfb0ead3e180b0422cbc48a4c1d0efce Mon Sep 17 00:00:00 2001 From: androidlover5842 Date: Wed, 4 Feb 2026 15:30:40 +0530 Subject: [PATCH] Add non-null vehicleNumbers to booking list response --- docs/API_REFERENCE.txt | 1 + .../controller/booking/BookingFlow.kt | 10 ++++++++++ .../controller/dto/booking/BookingDtos.kt | 1 + .../repo/guest/GuestVehicleRepo.kt | 16 ++++++++++++++++ 4 files changed, 28 insertions(+) diff --git a/docs/API_REFERENCE.txt b/docs/API_REFERENCE.txt index 45142f8..b8b8ab4 100644 --- a/docs/API_REFERENCE.txt +++ b/docs/API_REFERENCE.txt @@ -1574,6 +1574,7 @@ BOOKING APIS What it does: - Lists bookings with summary and computed pending amount. + - Each booking item includes `vehicleNumbers` (always non-null: empty list or values). Request body: 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 13da793..7469956 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/booking/BookingFlow.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/booking/BookingFlow.kt @@ -189,6 +189,7 @@ class BookingFlow( } @GetMapping + @Transactional(readOnly = true) fun listBookings( @PathVariable propertyId: UUID, @AuthenticationPrincipal principal: MyPrincipal?, @@ -238,6 +239,14 @@ class BookingFlow( chargeRepo.sumAmountByBookingIds(bookingIds) .associate { it.bookingId to it.total } } + val guestIds = bookings.mapNotNull { it.primaryGuest?.id }.distinct() + val vehicleNumbersByGuest = if (guestIds.isEmpty()) { + emptyMap() + } else { + guestVehicleRepo.findRowsByGuestIds(guestIds) + .groupBy { it.guestId } + .mapValues { (_, rows) -> rows.map { it.vehicleNumber }.distinct().sorted() } + } return bookings.map { booking -> val guest = booking.primaryGuest val stays = staysByBooking[booking.id].orEmpty() @@ -261,6 +270,7 @@ class BookingFlow( guestId = guest?.id, guestName = guest?.name, guestPhone = guest?.phoneE164, + vehicleNumbers = guest?.id?.let { vehicleNumbersByGuest[it] } ?: emptyList(), roomNumbers = roomNumbersByBooking[booking.id] ?: emptyList(), source = booking.source, billingMode = booking.billingMode.name, diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/dto/booking/BookingDtos.kt b/src/main/kotlin/com/android/trisolarisserver/controller/dto/booking/BookingDtos.kt index 9fcaa0f..4a51d86 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/dto/booking/BookingDtos.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/dto/booking/BookingDtos.kt @@ -56,6 +56,7 @@ data class BookingListItem( val guestId: UUID?, val guestName: String?, val guestPhone: String?, + val vehicleNumbers: List, val roomNumbers: List, val source: String?, val billingMode: String, diff --git a/src/main/kotlin/com/android/trisolarisserver/repo/guest/GuestVehicleRepo.kt b/src/main/kotlin/com/android/trisolarisserver/repo/guest/GuestVehicleRepo.kt index a762603..6d57ec6 100644 --- a/src/main/kotlin/com/android/trisolarisserver/repo/guest/GuestVehicleRepo.kt +++ b/src/main/kotlin/com/android/trisolarisserver/repo/guest/GuestVehicleRepo.kt @@ -2,6 +2,8 @@ package com.android.trisolarisserver.repo.guest import com.android.trisolarisserver.models.booking.GuestVehicle import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.data.jpa.repository.Query +import org.springframework.data.repository.query.Param import java.util.UUID interface GuestVehicleRepo : JpaRepository { @@ -9,4 +11,18 @@ interface GuestVehicleRepo : JpaRepository { fun findByGuestIdIn(guestIds: List): List fun existsByPropertyIdAndVehicleNumberIgnoreCase(propertyId: UUID, vehicleNumber: String): Boolean fun existsByGuestId(guestId: UUID): Boolean + + @Query( + """ + select gv.guest.id as guestId, gv.vehicleNumber as vehicleNumber + from GuestVehicle gv + where gv.guest.id in :guestIds + """ + ) + fun findRowsByGuestIds(@Param("guestIds") guestIds: List): List +} + +interface GuestVehicleRow { + val guestId: UUID + val vehicleNumber: String }