Spamworldpro Mini Shell
Spamworldpro


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/rentpix.corals.io/Corals/modules/RentPix/Traits/InspectionsTrait.php
<?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,
            ]);
    }
}

Spamworldpro Mini