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/job-board.corals.io/Corals/modules/Reservation/Classes/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/job-board.corals.io/Corals/modules/Reservation/Classes/Reservation.php
<?php

namespace Corals\Modules\Reservation\Classes;

use Corals\Modules\Entity\Models\Entity;
use Corals\Modules\Entity\Models\Entry;
use Corals\Modules\Reservation\Models\LineItem;
use Corals\Modules\Reservation\Models\Reservation as ReservationModel;
use Corals\Modules\Reservation\Models\Service;
use Corals\Modules\Reservation\Scopes\ActiveReservationScope;
use Corals\Modules\Reservation\Scopes\OwnerScope;
use Corals\Modules\Utility\Models\Rating\Rating;
use Corals\User\Models\User;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Illuminate\Support\Arr;

class Reservation
{
    /**
     * Reservations constructor.
     */
    function __construct()
    {
    }

    /**
     * @param bool $isEntity
     * @param bool $pluck
     * @param bool $full
     * @return array
     */
    public function getReservationObjectModels($isEntity = false, $pluck = true, $full = false)
    {
        if (!$isEntity || $full) {
            $models = get_models('reservation.models.reservation.object_field_models');
        }


        if ($isEntity || $full) {
            $entities = Entity::query()->get();

            $morphAlias = getMorphAlias(Entry::class);

            foreach ($entities as $entity) {
                $models[$entity->id] = [
                    "label" => $entity->name_plural,
                    "model_class" => Entry::class,
                    "columns" => [],
                    "model_morph" => $morphAlias,
                    'where' => [['field' => 'entity_entries.entity_id', 'operation' => '=', 'value' => $entity->id]],
                    "scopes" => [],
                ];
            }
        }

        if ($pluck) {
            $models = \Arr::pluck($models ?? [], 'label', 'model_morph');
        }

        return $models ?? [];
    }

    public function getReservationObjectDetails($useEntity, $objectType, $selectedObjectId = null)
    {
        $modelTypeDetails = $this->getReservationObjectModels($useEntity, false)[$objectType] ?? [];

        return [
            'model' => $modelTypeDetails ? $modelTypeDetails['model_class'] : '',
            'columns' => $modelTypeDetails ? json_encode($modelTypeDetails['columns']) : '',
            'selected' => json_encode([$selectedObjectId]),
            'where' => $modelTypeDetails ? json_encode($modelTypeDetails['where']) : '',
            'scopes' => $modelTypeDetails ? json_encode($modelTypeDetails['scopes']) : '',
        ];
    }

    /**
     * @param $serviceId
     * @param null $reservation
     * @return array
     */
    public function getServiceObjectDetails($serviceId, $reservation = null)
    {
        $service = optional(Service::find($serviceId));

        $objectType = $service->getObjectType();

        $useEntity = (bool)$service->getProperty('use_entity_models', null, 'bool');

        $selectedObjectId = optional($reservation)->object_id;

        return $this->getReservationObjectDetails($useEntity, $objectType, $selectedObjectId);
    }

    /**
     * @param array $except
     * @param null $ownerId
     * @param null $ownerType
     * @return array
     */
    public function getLineItems($except = [], $ownerId = null, $ownerType = null)
    {
        $lineItems = LineItem::query();

        if ($except) {
            $lineItems->whereNotIn('id', Arr::wrap($except));
        }

        if ($ownerId && $ownerType) {
            $lineItems->withGlobalScope('owner_scope', new OwnerScope($ownerId, $ownerType));
        }

        return $lineItems
            ->pluck('name', 'id')
            ->toArray();
    }

    /**
     * @return \Illuminate\Support\Collection
     */
    public function getServices()
    {
        return Service::query()->pluck('name', 'id');
    }

    public function getEntitiesList()
    {
        return Entity::query()->pluck('name_plural', 'id');
    }

    public function getServiceObjectTypesList($useEntity)
    {
        if ($useEntity) {
            return $this->getEntitiesList();
        }

        return $this->getReservationObjectModels(false, true);
    }

    /**
     * @param array $parameters
     * @throws \Exception
     */
    public function checkAvailability(array $parameters)
    {
        $objectId = data_get($parameters, 'object_id');
        $objectType = data_get($parameters, 'object_type');

        $endsAt = data_get($parameters, 'ends_at');
        $startsAt = data_get($parameters, 'starts_at');
        $reservationId = data_get($parameters, 'reservation_id');
        $maxReservationsQuantity = data_get($parameters, 'max_reservations_quantity');
        $requestedQuantity = data_get($parameters, 'requested_quantity', 0);

        $reservation = ReservationModel::query()
            ->withGlobalScope('active_reservation_scope', new ActiveReservationScope)
            ->where(function ($query) use ($objectId, $objectType) {
                $query->where('res_reservations.object_id', $objectId)
                    ->where('res_reservations.object_type', $objectType);
            })->where(function ($query) use ($endsAt, $startsAt) {
                $query->where('res_reservations.starts_at', '<', $endsAt)
                    ->where('res_reservations.ends_at', '>', $startsAt);
            })->when($reservationId, function ($query, $reservationId) {
                $query->where('res_reservations.id', '<>', $reservationId);
            });



        if ($maxReservationsQuantity == 1 && ($res = $reservation->first())) {
            throw new \Exception(trans('Reservation::exceptions.reservation.reservation_overlap', [
                'code' => $res->code,
                'starts_at' => format_date_time($res->starts_at),
                'ends_at' => format_date_time($res->ends_at)
            ]));
        } elseif (($reservation->count() + $requestedQuantity) > $maxReservationsQuantity) {
            throw new \Exception(trans('Reservation::exceptions.reservation.reservation_quantity_exceeded'));
        }
    }

    /**
     * @param User $user
     * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|object|null
     */
    public function getUserService(User $user)
    {
        return Service::query()->where(function ($query) use ($user) {
            $query->where('owner_type', getMorphAlias($user))
                ->where('owner_id', $user->id);
        })->first();
    }

    /**
     * @return mixed
     */
    public function getServiceCategories()
    {
        return \Category::getCategoriesByParent(\Settings::get('reservation_service_categories_parent', config('reservation.models.service.category_parent')));
    }

    /**
     * @param $status
     * @return string
     */
    public function reservationStatusColoring($status)
    {
        switch ($status) {
            case 'active':
            case 'confirmed':
                $color = 'success';
                break;
            case 'cancelled':
                $color = 'danger';
                break;
            case 'completed':
                $color = 'info';
                break;
            case 'draft':
                $color = 'secondary';
                break;
            case 'pending':
                $color = 'warning';
                break;
            default:
                $color = 'secondary';
        }

        return sprintf('<span class="badge badge-%s label label-%s">%s</span>', $color, $color, ucfirst($status));
    }


    /**
     * @param User $doctor
     * @param null $status
     * @return MorphMany|mixed
     */
    public function serviceRatings(Service $service, $status = null)
    {
        return $service->morphMany(Rating::class, 'reviewrateable')
            ->when($status, function ($query, $status) {
                $query->where('utility_ratings.status', $status);
            })->latest();
    }

    /**
     * @param $service
     * @param null $status
     * @return mixed
     */
    public function getServiceRating($service, $status = null)
    {
        return $this->serviceRatings($service)->getResults();
    }


    /**
     * @param $service
     * @param null $round
     * @param bool $criteria
     * @return \Illuminate\Support\Collection
     */

    public function getServiceAverageRating($service, $round = null, $criteria = false)
    {
        return $this->serviceRatings($service, 'approved')
            ->when($criteria, function ($query, $criteria) {
                $query->where('criteria', $criteria);
            })->when($round, function ($query, $round) {
                $query->selectRaw('ROUND(AVG(rating), ' . $round . ') as averageReviewRateable');
            }, function ($query) {
                $query->selectRaw('AVG(rating) as averageReviewRateable');
            })->pluck('averageReviewRateable');
    }


    /**
     * @param $service
     * @param bool $criteria
     * @return \Illuminate\Support\Collection
     */
    public function getServiceCountRating(Service $service, $criteria = false)
    {
        return $this->serviceRatings($service, 'approved')
            ->when($criteria, function ($query, $criteria) {
                $query->where('criteria', $criteria);
            })->selectRaw('count(rating) as countReviewRateable')
            ->pluck('countReviewRateable');
    }
}

Spamworldpro Mini