status !== BookingStatus::Confirmed) { throw DriverAssignmentNotAllowedException::notConfirmed($booking); } if ($booking->travel_date->lt(today())) { throw DriverAssignmentNotAllowedException::travelDateInPast($booking); } $isFirstAssignment = $booking->driver_name === null; $booking->update([ 'driver_name' => $data->driverName, 'driver_phone' => $data->driverPhone, 'car_plate_number' => $data->carPlateNumber, 'car_model' => $data->carModel, ]); // Guards against a double-submit of the same form resulting in two // identical SMS notifications to the passenger — a genuine // reassignment always changes at least one of these columns. if ($booking->wasChanged(['driver_name', 'driver_phone', 'car_plate_number', 'car_model'])) { DriverAssigned::dispatch($booking, $isFirstAssignment); } return $booking; } }