M33: enforce booking readiness workflow
This commit is contained in:
@@ -20,6 +20,7 @@ from app.schemas import (
|
||||
CancelBookingRequest,
|
||||
CheckoutBookingRequest,
|
||||
CheckoutBookingResult,
|
||||
CompleteBookingRequirementsRequest,
|
||||
CreateBookingRequest,
|
||||
CurrentUser,
|
||||
NextBookingRisk,
|
||||
@@ -342,6 +343,42 @@ def get_booking(
|
||||
return _to_out(booking, customer, vehicle)
|
||||
|
||||
|
||||
@router.post("/{public_ref}/complete-requirements", response_model=BookingOut)
|
||||
def complete_booking_requirements(
|
||||
public_ref: str,
|
||||
body: CompleteBookingRequirementsRequest,
|
||||
db: Session = Depends(get_db),
|
||||
user: CurrentUser = Depends(get_current_user),
|
||||
) -> BookingOut:
|
||||
booking = db.scalar(select(Booking).where(Booking.public_ref == public_ref).with_for_update())
|
||||
if booking is None:
|
||||
raise HTTPException(status_code=404, detail="Booking not found")
|
||||
if booking.status != "reserved":
|
||||
raise HTTPException(
|
||||
status_code=409,
|
||||
detail="Requirements can only be confirmed for a reserved booking",
|
||||
)
|
||||
customer = db.get(Customer, booking.customer_id)
|
||||
vehicle = db.get(Vehicle, booking.vehicle_id)
|
||||
if customer is None or vehicle is None:
|
||||
raise HTTPException(status_code=500, detail="Booking references a missing record")
|
||||
if not booking.requirements_complete:
|
||||
booking.requirements_complete = True
|
||||
record_audit_event(
|
||||
db,
|
||||
actor_type="user",
|
||||
actor_label=user.display_name,
|
||||
action="booking_requirements_completed",
|
||||
entity_type="booking",
|
||||
entity_id=booking.id,
|
||||
before={"requirements_complete": False},
|
||||
after={"requirements_complete": True},
|
||||
metadata={"confirmation": body.confirmation.strip()},
|
||||
)
|
||||
db.commit()
|
||||
return _to_out(booking, customer, vehicle)
|
||||
|
||||
|
||||
@router.post("/{public_ref}/cancel", response_model=BookingOut)
|
||||
def cancel_booking(
|
||||
public_ref: str,
|
||||
|
||||
Reference in New Issue
Block a user