![]() 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\Reservation\Models\Service; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\DB; class ServiceEvents { /** * */ const ALL_DAY_REGEX = '/^\d{4}-\d\d-\d\d$/'; // matches strings like "2013-12-29" /** * @var mixed */ public $title; /** * @var bool */ public $allDay; /** * @var Carbon */ public $start; /** * @var Carbon|null */ public $end; /** * @var array */ public $properties = []; /** * ServiceEvents constructor. * @param $array * @param null $timeZone */ public function __construct($array, $timeZone = null) { $this->title = $array['title']; if (isset($array['allDay'])) { // allDay has been explicitly specified $this->allDay = (bool)$array['allDay']; } else { // Guess allDay based off of ISO8601 date strings $this->allDay = preg_match(self::ALL_DAY_REGEX, $array['start']) && (!isset($array['end']) || preg_match(self::ALL_DAY_REGEX, $array['end'])); } if ($this->allDay) { $timeZone = null; } // Parse dates $this->start = Carbon::parse($array['start'], $timeZone); $this->end = isset($array['end']) ? Carbon::parse($array['end'], $timeZone) : null; // Record misc properties foreach ($array as $name => $value) { if (!in_array($name, array('title', 'allDay', 'start', 'end'))) { $this->properties[$name] = $value; } } } /** * @param $rangeStart * @param $rangeEnd * @return bool */ public function isWithinDayRange($rangeStart, $rangeEnd): bool { $eventStart = $this->start->format('Y-m-d'); if (isset($this->end)) { $eventEnd = $this->end->format('Y-m-d'); } else { $eventEnd = $eventStart; } return $eventStart < $rangeEnd && $eventEnd >= $rangeStart; } /** * @return array */ public function toArray() { $array = $this->properties; $array['title'] = $this->title; if ($this->allDay) { $format = 'Y-m-d'; } else { $format = 'c'; } $array['start'] = $this->start->format($format); if (isset($this->end)) { $array['end'] = $this->end->format($format); } return $array; } /** * @param $service * @return array */ public static function getEvents($service): array { $rangeStart = Carbon::parse(request('start')); $rangeEnd = Carbon::parse(request('end')); if ($timeZone = request('timeZone')) { $timeZone = new \DateTimeZone($timeZone); } $titleRawSelect = 'CONCAT(res_reservations.code," [", JSON_UNQUOTE(json_extract(res_reservations.properties,\'$.contact_details.first_name\') ) ," ", JSON_UNQUOTE(json_extract(res_reservations.properties,\'$.contact_details.last_name\') ), "]") as title'; Service::query()->join('res_reservations', 'res_services.id', 'res_reservations.service_id') ->select( 'res_reservations.starts_at as start', 'res_reservations.ends_at as end' )->addSelect(DB::raw($titleRawSelect)) ->where('res_reservations.service_id', $service->id) ->where(function ($query) use ($rangeStart, $rangeEnd) { $query->where('res_reservations.starts_at', '<', $rangeEnd) ->where('res_reservations.ends_at', '>', $rangeStart); })->get() ->each(function ($event) use ($timeZone, $rangeStart, $rangeEnd, &$events) { tap(new static($event, $timeZone), function (ServiceEvents $event) use ($rangeStart, $rangeEnd, &$events) { if ($event->isWithinDayRange($rangeStart, $rangeEnd)) { $events[] = $event->toArray(); } }); }); return $events ?? []; } }