Adjust booking create and link guest vehicles to booking
All checks were successful
build-and-deploy / build-deploy (push) Successful in 35s

This commit is contained in:
androidlover5842
2026-01-29 03:54:34 +05:30
parent ec3c7891a4
commit a5d166e184
5 changed files with 44 additions and 19 deletions

View File

@@ -65,13 +65,15 @@ class BookingFlow(
throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid date range") 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( val booking = com.android.trisolarisserver.models.booking.Booking(
property = property, property = property,
status = BookingStatus.OPEN, status = if (shouldCheckIn) BookingStatus.CHECKED_IN else BookingStatus.OPEN,
source = request.source?.trim().takeIf { !it.isNullOrBlank() } ?: "WALKIN", source = request.source?.trim().takeIf { !it.isNullOrBlank() } ?: "WALKIN",
expectedCheckinAt = expectedCheckInAt, checkinAt = if (shouldCheckIn) expectedCheckInAt else null,
expectedCheckoutAt = expectedCheckOutAt, expectedCheckinAt = if (shouldCheckIn) null else expectedCheckInAt,
expectedCheckoutAt = if (shouldCheckIn) null else expectedCheckOutAt,
transportMode = request.transportMode?.let { transportMode = request.transportMode?.let {
val mode = parseTransportMode(it) val mode = parseTransportMode(it)
if (!isTransportModeAllowed(property, mode)) { if (!isTransportModeAllowed(property, mode)) {
@@ -79,7 +81,6 @@ class BookingFlow(
} }
mode mode
}, },
transportVehicleNumber = request.transportVehicleNumber,
adultCount = request.adultCount, adultCount = request.adultCount,
totalGuestCount = request.totalGuestCount, totalGuestCount = request.totalGuestCount,
notes = request.notes, notes = request.notes,
@@ -91,8 +92,9 @@ class BookingFlow(
return BookingCreateResponse( return BookingCreateResponse(
id = saved.id!!, id = saved.id!!,
status = saved.status.name, status = saved.status.name,
expectedCheckInAt = expectedCheckInAt.toString(), checkInAt = saved.checkinAt?.toString(),
expectedCheckOutAt = expectedCheckOutAt.toString() expectedCheckInAt = saved.expectedCheckinAt?.toString(),
expectedCheckOutAt = saved.expectedCheckoutAt?.toString()
) )
} }

View File

@@ -5,6 +5,7 @@ import com.android.trisolarisserver.controller.dto.GuestResponse
import com.android.trisolarisserver.controller.dto.GuestVehicleRequest import com.android.trisolarisserver.controller.dto.GuestVehicleRequest
import com.android.trisolarisserver.models.booking.Guest import com.android.trisolarisserver.models.booking.Guest
import com.android.trisolarisserver.models.booking.GuestVehicle 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.GuestRepo
import com.android.trisolarisserver.db.repo.GuestRatingRepo import com.android.trisolarisserver.db.repo.GuestRatingRepo
import com.android.trisolarisserver.repo.GuestVehicleRepo import com.android.trisolarisserver.repo.GuestVehicleRepo
@@ -22,6 +23,7 @@ class Guests(
private val propertyAccess: PropertyAccess, private val propertyAccess: PropertyAccess,
private val propertyRepo: PropertyRepo, private val propertyRepo: PropertyRepo,
private val guestRepo: GuestRepo, private val guestRepo: GuestRepo,
private val bookingRepo: BookingRepo,
private val guestVehicleRepo: GuestVehicleRepo, private val guestVehicleRepo: GuestVehicleRepo,
private val guestRatingRepo: GuestRatingRepo private val guestRatingRepo: GuestRatingRepo
) { ) {
@@ -64,16 +66,32 @@ class Guests(
requireMember(propertyAccess, propertyId, principal) requireMember(propertyAccess, propertyId, principal)
val (property, guest) = requirePropertyGuest(propertyRepo, guestRepo, propertyId, guestId) val (property, guest) = requirePropertyGuest(propertyRepo, guestRepo, propertyId, guestId)
if (guestVehicleRepo.existsByPropertyIdAndVehicleNumberIgnoreCase(property.id!!, request.vehicleNumber)) { val booking = bookingRepo.findById(request.bookingId).orElseThrow {
throw ResponseStatusException(HttpStatus.CONFLICT, "Vehicle number already exists") 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( val existing = guestVehicleRepo.findByPropertyIdAndVehicleNumberIgnoreCase(property.id!!, request.vehicleNumber)
property = property, if (existing != null) {
guest = guest, if (existing.guest.id != guest.id) {
vehicleNumber = request.vehicleNumber.trim() throw ResponseStatusException(HttpStatus.CONFLICT, "Vehicle number already exists")
) }
guestVehicleRepo.save(vehicle) 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() return setOf(guest).toResponse(guestVehicleRepo, guestRatingRepo).first()
} }

View File

@@ -15,7 +15,6 @@ data class BookingCreateRequest(
val expectedCheckInAt: String, val expectedCheckInAt: String,
val expectedCheckOutAt: String, val expectedCheckOutAt: String,
val transportMode: String? = null, val transportMode: String? = null,
val transportVehicleNumber: String? = null,
val adultCount: Int? = null, val adultCount: Int? = null,
val totalGuestCount: Int? = null, val totalGuestCount: Int? = null,
val notes: String? = null val notes: String? = null
@@ -24,8 +23,9 @@ data class BookingCreateRequest(
data class BookingCreateResponse( data class BookingCreateResponse(
val id: UUID, val id: UUID,
val status: String, val status: String,
val expectedCheckInAt: String, val checkInAt: String?,
val expectedCheckOutAt: String val expectedCheckInAt: String?,
val expectedCheckOutAt: String?
) )
data class BookingCheckOutRequest( data class BookingCheckOutRequest(

View File

@@ -50,7 +50,8 @@ data class GuestResponse(
) )
data class GuestVehicleRequest( data class GuestVehicleRequest(
val vehicleNumber: String val vehicleNumber: String,
val bookingId: UUID
) )
data class TransportModeStatusResponse( data class TransportModeStatusResponse(

View File

@@ -24,6 +24,10 @@ class GuestVehicle(
@JoinColumn(name = "guest_id", nullable = false) @JoinColumn(name = "guest_id", nullable = false)
var guest: Guest, var guest: Guest,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "booking_id")
var booking: Booking? = null,
@Column(name = "vehicle_number", nullable = false) @Column(name = "vehicle_number", nullable = false)
var vehicleNumber: String, var vehicleNumber: String,