![]() 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/ |
<?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'); } }