// SYSTEM PANEL //
[ROOT]
/
mnt
/
pleskStorage
/
vhosts
/
kodsolutions.net
/
subdomains
/
go-rent.kodsolutions.net
/
app
/
Services
/
Booking
[ PARENT ]
EDIT :: StoreBookingService.php
<?php namespace App\Services\Booking; use App\Models\User; use DateTime; use App\Models\Car\Car; use Illuminate\Support\Facades\DB; use App\Interfaces\CRUDRepositoryInterface; use Illuminate\Support\Facades\Auth; class StoreBookingService { private $model = 'App\Models\Booking\Order'; private CRUDRepositoryInterface $itemRepository; private BookingCalculationService $calculation; private CarAvailabilityService $carAvailability; public function __construct( CRUDRepositoryInterface $itemRepository, BookingCalculationService $calculation, CarAvailabilityService $carAvailability ) { $this->itemRepository = $itemRepository; $this->calculation = $calculation; $this->carAvailability = $carAvailability; } private function getUserData(User $user): array { return [ 'user_id' => $user->id, 'first_name' => $user->first_name ?? null, 'last_name' => $user->last_name ?? null, 'name' => $user->name ?? null, 'phone' => $user->phone ?? null, 'full_phone' => $user->full_phone ?? null, 'phone_code' => $user->phone_code ?? null, 'email' => $user->email, 'id_card_number' => $user->id_card_number ?? null, 'driving_license_number' => $user->driving_license_number ?? null, 'passport_number' => $user->passport_number ?? null, 'international_license_number' => $user->international_license_number ?? null, 'visa_copy_url' => $user->visa_copy_url ?? null, ]; } private function getCarData(Car $car): array { return [ 'car_id' => $car->id, 'title' => $car->title ?? null, 'sub_title' => $car->sub_title ?? null, 'description' => $car->description ?? null, 'daily_price' => $car->daily_price, 'weekly_price' => $car->weekly_price, 'monthly_price' => $car->monthly_price, 'daily_mileage_limit' => $car->daily_mileage_limit ?? null, 'excess_mileage_fee' => $car->excess_mileage_fee ?? null, 'car_code' => $car->car_code ?? null, 'price' => $car->price ?? null, 'special_price' => $car->special_price ?? null, 'office_id' => $car->office_id, ]; } private function getBookingData(array $request, array $calculate, User $user, Car $car): array { return array_merge($request, [ 'code' => uniqid('ORD_'), 'number_of_days' => $calculate['number_of_days'], 'total_price' => $calculate['total_price'], ...$this->getUserData($user), ...$this->getCarData($car), ]); } public function store(array $request): void { $authUser = Auth::user(); $user = User::findOrFail($authUser->id); $car = Car::findOrFail($request['car_id']); try { DB::beginTransaction(); $this->carAvailability->checkCarAvailability($car, $request['pickup_date'], $request['dropoff_date']); $calculate = $this->calculation->calculate($request['pickup_date'], $request['dropoff_date'], $car); $data = $this->getBookingData($request, $calculate, $user, $car); $this->itemRepository->createItem($this->model, $data); DB::commit(); } catch (\Throwable $e) { DB::rollBack(); throw $e; } } }
SAVE
CANCEL