<?php /* * Copyright (c) 2022 LatePoint LLC. All rights reserved. * * This class is used to create booking requests, they are useful for getting availability information on the calendar * and checking if a timeslot is available. */ namespace LatePoint\Misc; class BookingRequest{ public ?string $start_date; public ?string $end_date; public ?int $start_time = 0; public ?int $end_time = 0; public ?int $duration = 0; public ?int $buffer_before = 0; public ?int $buffer_after = 0; public ?int $total_attendees = 1; public $service_id = 0; public $agent_id = 0; public $location_id = 0; function __construct($args = []){ $allowed_props = self::allowed_props(); foreach($args as $key => $arg){ if(in_array($key, $allowed_props)) $this->$key = $arg; } } public static function create_from_booking_model(\OsBookingModel $booking): BookingRequest{ $booking_request = new BookingRequest([ 'start_date' => $booking->start_date, 'end_date' => $booking->end_date ? $booking->end_date : $booking->start_date, 'start_time' => (int) $booking->start_time, 'end_time' => (int) $booking->end_time, 'duration' => (int) $booking->get_total_duration(), 'buffer_before' => (int) $booking->buffer_before, 'buffer_after' => (int) $booking->buffer_after, 'total_attendees' => (int) $booking->total_attendees, 'agent_id' => ($booking->agent_id == LATEPOINT_ANY_AGENT) ? 0 : $booking->agent_id, 'service_id' => $booking->service_id, 'location_id' => ($booking->location_id == LATEPOINT_ANY_LOCATION) ? 0 : $booking->location_id]); return apply_filters('latepoint_create_booking_request_from_booking_model', $booking_request, $booking); } public function get_start_time_with_buffer(): int{ return $this->start_time - $this->buffer_before; } public function get_end_time_with_buffer(): int{ return $this->end_time + $this->buffer_after; } public function get_start_datetime( string $set_timezone = '') : \OsWpDateTime{ try{ // start_time and start_date is legacy stored in wordpress timezone $dateTime = new \OsWpDateTime( $this->start_date . ' 00:00:00', \OsTimeHelper::get_wp_timezone() ); if($this->start_time > 0){ $dateTime->modify( '+' . $this->start_time . ' minutes' ); } if(!empty($set_timezone)) $dateTime->setTimezone( new \DateTimeZone( $set_timezone ) ); return $dateTime; }catch(\Exception $e){ return new \OsWpDateTime('now'); } } public function get_end_datetime( string $set_timezone = '') : \OsWpDateTime{ try{ // start_time and start_date is legacy stored in wordpress timezone $dateTime = new \OsWpDateTime( $this->end_date . ' 00:00:00', \OsTimeHelper::get_wp_timezone() ); if($this->end_time > 0){ $dateTime->modify( '+' . $this->end_time . ' minutes' ); } if(!empty($set_timezone)) $dateTime->setTimezone( new \DateTimeZone( $set_timezone ) ); return $dateTime; }catch(\Exception $e){ return new \OsWpDateTime('now'); } } public static function allowed_props(): array{ return ['start_date', 'end_date', 'start_time', 'end_time', 'duration', 'buffer_before', 'buffer_after', 'total_attendees', 'agent_id', 'service_id', 'location_id']; } }