From a5d166e1846cdc621ea24276dda292f012293503 Mon Sep 17 00:00:00 2001 From: androidlover5842 Date: Thu, 29 Jan 2026 03:54:34 +0530 Subject: [PATCH] Adjust booking create and link guest vehicles to booking --- .../controller/BookingFlow.kt | 16 +++++---- .../trisolarisserver/controller/Guests.kt | 34 ++++++++++++++----- .../controller/dto/BookingDtos.kt | 6 ++-- .../controller/dto/OrgPropertyDtos.kt | 3 +- .../models/booking/GuestVehicle.kt | 4 +++ 5 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/BookingFlow.kt b/src/main/kotlin/com/android/trisolarisserver/controller/BookingFlow.kt index 4b9e351..e4b7c3e 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/BookingFlow.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/BookingFlow.kt @@ -65,13 +65,15 @@ class BookingFlow( throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid date range") } - val now = OffsetDateTime.now() + val now = nowForProperty(property.timezone) + val shouldCheckIn = !expectedCheckInAt.isBefore(now) val booking = com.android.trisolarisserver.models.booking.Booking( property = property, - status = BookingStatus.OPEN, + status = if (shouldCheckIn) BookingStatus.CHECKED_IN else BookingStatus.OPEN, source = request.source?.trim().takeIf { !it.isNullOrBlank() } ?: "WALKIN", - expectedCheckinAt = expectedCheckInAt, - expectedCheckoutAt = expectedCheckOutAt, + checkinAt = if (shouldCheckIn) expectedCheckInAt else null, + expectedCheckinAt = if (shouldCheckIn) null else expectedCheckInAt, + expectedCheckoutAt = if (shouldCheckIn) null else expectedCheckOutAt, transportMode = request.transportMode?.let { val mode = parseTransportMode(it) if (!isTransportModeAllowed(property, mode)) { @@ -79,7 +81,6 @@ class BookingFlow( } mode }, - transportVehicleNumber = request.transportVehicleNumber, adultCount = request.adultCount, totalGuestCount = request.totalGuestCount, notes = request.notes, @@ -91,8 +92,9 @@ class BookingFlow( return BookingCreateResponse( id = saved.id!!, status = saved.status.name, - expectedCheckInAt = expectedCheckInAt.toString(), - expectedCheckOutAt = expectedCheckOutAt.toString() + checkInAt = saved.checkinAt?.toString(), + expectedCheckInAt = saved.expectedCheckinAt?.toString(), + expectedCheckOutAt = saved.expectedCheckoutAt?.toString() ) } diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/Guests.kt b/src/main/kotlin/com/android/trisolarisserver/controller/Guests.kt index b9f6089..854c6e1 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/Guests.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/Guests.kt @@ -5,6 +5,7 @@ import com.android.trisolarisserver.controller.dto.GuestResponse import com.android.trisolarisserver.controller.dto.GuestVehicleRequest import com.android.trisolarisserver.models.booking.Guest import com.android.trisolarisserver.models.booking.GuestVehicle +import com.android.trisolarisserver.db.repo.BookingRepo import com.android.trisolarisserver.db.repo.GuestRepo import com.android.trisolarisserver.db.repo.GuestRatingRepo import com.android.trisolarisserver.repo.GuestVehicleRepo @@ -22,6 +23,7 @@ class Guests( private val propertyAccess: PropertyAccess, private val propertyRepo: PropertyRepo, private val guestRepo: GuestRepo, + private val bookingRepo: BookingRepo, private val guestVehicleRepo: GuestVehicleRepo, private val guestRatingRepo: GuestRatingRepo ) { @@ -64,16 +66,32 @@ class Guests( requireMember(propertyAccess, propertyId, principal) val (property, guest) = requirePropertyGuest(propertyRepo, guestRepo, propertyId, guestId) - if (guestVehicleRepo.existsByPropertyIdAndVehicleNumberIgnoreCase(property.id!!, request.vehicleNumber)) { - throw ResponseStatusException(HttpStatus.CONFLICT, "Vehicle number already exists") + val booking = bookingRepo.findById(request.bookingId).orElseThrow { + ResponseStatusException(HttpStatus.NOT_FOUND, "Booking not found") + } + if (booking.property.id != property.id) { + throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Booking not in property") + } + if (booking.primaryGuest != null && booking.primaryGuest?.id != guest.id) { + throw ResponseStatusException(HttpStatus.CONFLICT, "Booking linked to different guest") } - val vehicle = GuestVehicle( - property = property, - guest = guest, - vehicleNumber = request.vehicleNumber.trim() - ) - guestVehicleRepo.save(vehicle) + val existing = guestVehicleRepo.findByPropertyIdAndVehicleNumberIgnoreCase(property.id!!, request.vehicleNumber) + if (existing != null) { + if (existing.guest.id != guest.id) { + throw ResponseStatusException(HttpStatus.CONFLICT, "Vehicle number already exists") + } + existing.booking = booking + guestVehicleRepo.save(existing) + } else { + val vehicle = GuestVehicle( + property = property, + guest = guest, + booking = booking, + vehicleNumber = request.vehicleNumber.trim() + ) + guestVehicleRepo.save(vehicle) + } return setOf(guest).toResponse(guestVehicleRepo, guestRatingRepo).first() } 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 72b15e2..1470845 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/dto/BookingDtos.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/dto/BookingDtos.kt @@ -15,7 +15,6 @@ data class BookingCreateRequest( val expectedCheckInAt: String, val expectedCheckOutAt: String, val transportMode: String? = null, - val transportVehicleNumber: String? = null, val adultCount: Int? = null, val totalGuestCount: Int? = null, val notes: String? = null @@ -24,8 +23,9 @@ data class BookingCreateRequest( data class BookingCreateResponse( val id: UUID, val status: String, - val expectedCheckInAt: String, - val expectedCheckOutAt: String + val checkInAt: String?, + val expectedCheckInAt: String?, + val expectedCheckOutAt: String? ) data class BookingCheckOutRequest( diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/dto/OrgPropertyDtos.kt b/src/main/kotlin/com/android/trisolarisserver/controller/dto/OrgPropertyDtos.kt index 6323caf..5d33b99 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/dto/OrgPropertyDtos.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/dto/OrgPropertyDtos.kt @@ -50,7 +50,8 @@ data class GuestResponse( ) data class GuestVehicleRequest( - val vehicleNumber: String + val vehicleNumber: String, + val bookingId: UUID ) data class TransportModeStatusResponse( diff --git a/src/main/kotlin/com/android/trisolarisserver/models/booking/GuestVehicle.kt b/src/main/kotlin/com/android/trisolarisserver/models/booking/GuestVehicle.kt index 83e0884..6815f32 100644 --- a/src/main/kotlin/com/android/trisolarisserver/models/booking/GuestVehicle.kt +++ b/src/main/kotlin/com/android/trisolarisserver/models/booking/GuestVehicle.kt @@ -24,6 +24,10 @@ class GuestVehicle( @JoinColumn(name = "guest_id", nullable = false) var guest: Guest, + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "booking_id") + var booking: Booking? = null, + @Column(name = "vehicle_number", nullable = false) var vehicleNumber: String,