![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/rentpix.corals.io/Corals/modules/RentPix/Traits/ |
<?php namespace Corals\Modules\RentPix\Traits; use Carbon\Carbon; use Corals\Modules\RentPix\Models\Customer; use Corals\Modules\RentPix\Models\Driver; use Corals\Modules\RentPix\Models\Inspection; use Corals\Modules\RentPix\Models\RateCode; use Corals\Modules\RentPix\Models\Reservation; use Corals\Modules\RentPix\Models\Unit; use Corals\Modules\RentPix\Services\DriverService; use Corals\Modules\RentPix\Services\InspectionService; use Corals\Modules\RentPix\Services\ReservationService; use Corals\Modules\RentPix\Transformers\API\DriverPresenter; use Illuminate\Http\JsonResponse; use Illuminate\Support\Arr; use Illuminate\Support\Facades\Validator; use Spatie\MediaLibrary\MediaCollections\Models\Media; trait InspectionsTrait { public function submit($request, $inspection) { $inspectionService = new InspectionService(); $drivers = $request['drivers'] ?? []; foreach ($drivers as $driver) { $this->handelDriver($driver, $inspection); $images = data_get($driver, 'images', []); foreach ($images ?? [] as $image) { $this->handelImage($image, $inspection); } } $images = $request['images'] ?? []; foreach ($images ?? [] as $image) { $this->handelImage($image, $inspection); } return $inspectionService->submitInspection($inspection, $request['status']); } public function validateReservationData($reservationData) { if (filter_var(data_get($reservationData, 'customer.alt_email'), FILTER_VALIDATE_EMAIL) === false) { $reservationData['customer']['alt_email'] = null; } return Validator::make($reservationData, [ 'code' => 'required', 'starts_at' => 'required', 'ends_at' => 'required', 'unit' => 'required', 'unit.id' => 'required', 'unit.code' => 'required', 'customer' => 'required', 'customer.email' => 'sometimes|email', 'customer.alt_email' => 'nullable|email', ]); } public function fetchCreateInspection($reservationData, $integrationId, $type, $created_at = null, $user = null) { if (!$created_at) { $created_at = now(); } $unit = $this->createOrUpdateUnit($reservationData); if (!$email = data_get($reservationData, 'customer.email')) { if (!$phone = data_get($reservationData, 'customer.phone')) { $alt_email = data_get($reservationData, 'customer.alt_email'); $column = 'alt_email'; $uniqueValue = $alt_email; } else { $column = 'phone'; $uniqueValue = $phone; } } else { $column = 'email'; $uniqueValue = $email; } if (!empty($uniqueValue)) { $customer = Customer::query() ->updateOrCreate([$column => $uniqueValue], [ 'type' => data_get($reservationData, 'customer.type'), 'name' => data_get($reservationData, 'customer.name'), 'first_name' => data_get($reservationData, 'customer.first_name'), 'last_name' => data_get($reservationData, 'customer.last_name'), 'address' => data_get($reservationData, 'customer.address'), 'city' => data_get($reservationData, 'customer.city'), 'state' => data_get($reservationData, 'customer.state'), 'zip' => data_get($reservationData, 'customer.zip'), 'phone' => data_get($reservationData, 'customer.phone'), 'email' => data_get($reservationData, 'customer.email'), 'alt_email' => data_get($reservationData, 'customer.alt_email'), 'integration_id' => data_get($reservationData, 'customer.id'), ]); } $reservation = Reservation::query() ->updateOrCreate(['code' => data_get($reservationData, 'code')], [ 'type' => data_get($reservationData, 'type'), 'rental_status' => data_get($reservationData, 'rental_status'), 'start_location' => data_get($reservationData, 'start_location'), 'end_location' => data_get($reservationData, 'end_location'), 'integration_id' => data_get($reservationData, 'id') ?: data_get($reservationData, 'code'), 'starts_at' => data_get($reservationData, 'starts_at'), 'ends_at' => data_get($reservationData, 'ends_at'), 'unit_id' => $unit->id, 'customer_id' => isset($customer) ? $customer->id : null, 'properties' => ['dump' => $reservationData], ]); tap(new ReservationService(), function (ReservationService $reservationService) use ($reservation, $reservationData) { $reservationService->handleReservationNotes($reservation, $reservationData); }); $inspection = $this->createInspection($reservation, $type, $created_at); $drivers = data_get($reservationData, 'drivers', []); $this->formatDriversAndHandler($drivers, $inspection); return $inspection->fresh(['reservation', 'unit', 'user', 'drivers']); } /** * @param $reservation * @param $type * @param $created_at * @param $user * @return Inspection $inspection */ public function createInspection($reservation, $type, $created_at, $user = null) { $inspectionCodeAndType = Inspection::getInspectionCode($reservation, $type); $user = $user ?: user(); $inspection = Inspection::create([ 'code' => $inspectionCodeAndType['code'], 'type' => $inspectionCodeAndType['type'], 'status' => 'open', 'inspected_at' => now(), 'user_id' => $user->id, 'reservation_id' => $reservation->id, 'created_at' => $created_at, ]); event('notifications.rentpix.inspection_created', [ 'inspection' => $inspection, 'user' => $user, ]); return $inspection; } /** * @param $drivers * @param Inspection $inspection * @return void */ private function formatDriversAndHandler($drivers, Inspection $inspection): void { foreach ($drivers ?? [] as $index => $driver) { $driverData = [ "name" => sprintf("%s %s", data_get($driver, 'first_name'), data_get($driver, 'last_name')), "phone" => data_get($driver, 'phone'), "email" => data_get($driver, 'email'), "address" => data_get($driver, 'state'), "license" => data_get($driver, 'license'), "license_expiration_date" => data_get($driver, 'license_expiration_date'), "integration_id" => data_get($driver, 'id'), "properties" => ['dump' => $driver], ]; if ($index == 0) { $driverData['is_primary'] = 1; } $this->handelDriver($driverData, $inspection); } } /** * @param $driverData * @param Inspection $inspection * @return JsonResponse|mixed|null */ private function handelDriver($driverData, Inspection $inspection): mixed { try { $integration_id = data_get($driverData, 'integration_id'); $phone = data_get($driverData, 'phone'); if (!$integration_id && !$phone) { throw new \Exception('No integration id or phone number was found', 400); } if ($integration_id && $driver = Driver::query()->where('integration_id', '=', $integration_id)->first()) { $driver->update($driverData); } elseif ($phone) { $driver = Driver::query()->updateOrCreate(['phone' => $phone], $driverData); } else { $driver = Driver::query()->updateOrCreate(['integration_id' => $integration_id], $driverData); } $relationProperties = [ 'messages' => [], 'driver_data' => $driverData, ]; $reservation = $inspection->reservation; $dob = data_get($driverData, 'dob'); if ($dob) { $reservationStart = Carbon::parse($reservation->starts_at); if ($reservationStart->diffInYears($dob) < 25) { $relationProperties['messages'][] = [ 'level' => 'warning', 'text' => 'The driver under 25 and requires an HQ-approved MVR on file' ]; } } $license_expiration = Carbon::parse($driverData['license_expiration_date']); if ($license_expiration->between($reservation->starts_at, $reservation->ends_at)) { $relationProperties['messages'][] = [ 'level' => 'danger', 'text' => 'The license will expire in ' . format_date($driverData['license_expiration_date'], 'Y-m-d') ]; } $driver->inspections()->syncWithoutDetaching([ $inspection->id => [ 'is_primary' => data_get($driverData, 'is_primary') ?? 0, 'properties' => json_encode($relationProperties), ], ]); $driver->reservations()->syncWithoutDetaching([ $reservation->id => [ 'is_primary' => data_get($driverData, 'is_primary') ?? 0, 'properties' => json_encode(Arr::only($relationProperties, ['driver_data'])), ], ]); $driver->customers()->syncWithoutDetaching($reservation->customer->id); $driverService = new DriverService; $driverService->setPresenter(new DriverPresenter()); return $driverService->getModelDetails($driver); } catch (\Exception $exception) { return apiExceptionResponse($exception); } } /** * @param $image * @param Inspection $inspection * @return JsonResponse|void */ private function handelImage($image, Inspection $inspection) { try { $customProperties = [ 'description' => data_get($image, 'description'), 'key' => '', 'root' => data_get($image, 'root'), ]; if ($damageTag = data_get($image, 'damage_tags')) { $customProperties['tags'] = $damageTag; } $driver = null; if ($license = data_get($image, 'license')) { $driver = Driver::query()->where('license', $license)->first(); } /** * @var $media Media */ $inspection->media()->create([ 'uuid' => data_get($image, 'uuid'), 'collection_name' => data_get($image, 'collection'), 'driver_id' => $driver?->id, 'name' => data_get($image, 'file_name'), 'file_name' => data_get($image, 'file_name'), 'mime_type' => data_get($image, 'mime_type'), 'disk' => 's3', 'conversions_disk' => 's3', 'custom_properties' => $customProperties, ]); } catch (\Exception $exception) { return apiExceptionResponse($exception); } } public function validateOnlineInspection($request, $inspection) { if (!$inspection) { return Validator::make($request, ['inspection_id' => 'nullable|exists:pix_inspections,id']); } $rules = [ 'images' => 'sometimes|array', 'images.*.license' => 'sometimes', 'images.*.file_name' => 'required', 'images.*.root' => 'required', 'images.*.uuid' => 'required', 'images.*.mime_type' => 'required', 'images.*.collection' => 'required', ]; if ($inspection->is_driver_required) { $rules = array_merge($rules, [ 'drivers' => 'required|array', 'drivers.*.name' => 'required', 'drivers.*.email' => 'sometimes|email', 'drivers.*.dob' => 'sometimes|date|before:' . now()->subYears(21)->addDay()->toDateString(), 'drivers.*.phone' => 'required', 'drivers.*.address' => 'required', 'drivers.*.license' => 'required', 'drivers.*.license_expiration_date' => 'required|date', 'drivers.*.is_primary' => 'sometimes', ]); } return Validator::make($request, $rules); } public function validateOfflineInspection($data) { $rules = [ 'reservation_code' => 'required', 'unit_license' => 'required', 'customer' => 'required', 'timestamp' => 'required', 'type' => 'required', ]; return Validator::make($data, $rules); } public function createOrUpdateUnit($reservationData) { $unit_rate_code = data_get($reservationData, 'unit.rate_code'); RateCode::query()->firstOrCreate(['code' => $unit_rate_code], [ 'code' => $unit_rate_code, 'title' => $unit_rate_code, ]); return Unit::query() ->updateOrCreate(['integration_id' => data_get($reservationData, 'unit.id')], [ 'code' => data_get($reservationData, 'unit.code'), 'vin' => data_get($reservationData, 'unit.vin'), 'license' => data_get($reservationData, 'unit.license'), 'engine' => data_get($reservationData, 'unit.engine'), 'make' => data_get($reservationData, 'unit.make'), 'model' => data_get($reservationData, 'unit.model'), 'model_year' => data_get($reservationData, 'unit.model_year'), 'status' => data_get($reservationData, 'unit.status', 'active'), 'rate_code' => $unit_rate_code, ]); } }