PluginProbe
Booktics – Appointment Booking Calendar for Service Businesses / 1.0.27
Booktics – Appointment Booking Calendar for Service Businesses v1.0.27
1.0.29 1.0.28 1.0.27 1.0.26 1.0.25 1.0.24 1.0.23 1.0.22 1.0.21 1.0.20 1.0.19 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.2 1.0.3 All 31 releases
booktics / base / services / schedule-record.php

schedule-record.php in Booktics – Appointment Booking Calendar for Service Businesses 1.0.27, at base/services/schedule-record.php

126 lines 3.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Booktics\Services;
4
5 use Booktics\Abstracts\Booktics_Database;
6
7 /**
8 * Class Schedule_Record
9 * Handles schedule record operations and data formatting.
10 */
11 class Schedule_Record {
12 /**
13 * Formats time string to 12-hour format with AM/PM.
14 *
15 * @param string $time
16 *
17 * @return string
18 */
19 private function format_time( $time ) {
20 return date_i18n( 'h:i A', strtotime( get_date_from_gmt( $time ) ) );
21 }
22
23 /**
24 * Retrieves and formats schedules for a team member or service.
25 *
26 * @param int $id
27 * @param string $type
28 *
29 * @return array
30 */
31 public function get_schedules( $id, $type = 'team_member' ) {
32 $database = new Booktics_Database();
33 if ( 'default' === $type ) {
34 $where = array(
35 'team_member_id' => 0,
36 'service_id' => 0,
37 );
38 } elseif ( 'team_member' === $type ) {
39 $where = array( 'team_member_id' => $id );
40 } else {
41 $where = array( 'service_id' => $id );
42 }
43
44 $schedules = $database->select( booktics_get_table_name( 'booktics_schedules' ), $where );
45
46 $formatted = array(
47 'schedule' => array(),
48 'custom' => array(),
49 'holiday' => array(),
50 );
51
52 if ( ! is_array( $schedules ) ) {
53 return $formatted;
54 }
55
56 foreach ( $schedules as $schedule ) {
57 if ( '0' == $schedule->custom_date ) {
58 $day = strtolower( array_search( $schedule->week_day, Schedule_Manager::$day_map ) );
59 if ( '0' == $schedule->start_time && '0' == $schedule->end_time ) {
60 continue;
61 }
62 $formatted['schedule'][ $day ][] = array(
63 'start_time' => $this->format_time( $schedule->start_time ),
64 'end_time' => $this->format_time( $schedule->end_time ),
65 );
66 } elseif ( '0' == $schedule->start_time && '0' == $schedule->end_time ) {
67 $formatted['holiday'][] = $schedule->custom_date;
68 } else {
69 $formatted['custom'][] = array(
70 $schedule->custom_date,
71 $schedule->custom_date,
72 array(
73 'start_time' => $schedule->start_time,
74 'end_time' => $schedule->end_time,
75 ),
76 );
77 }
78 }
79
80 $formatted['holiday'] = $this->to_ranges( $formatted['holiday'] );
81
82 return $formatted;
83 }
84
85 /**
86 * Convert single dates into date ranges
87 *
88 * @param array $dates Array of individual dates
89 *
90 * @return array Array of date ranges [['start_date', 'end_date']]
91 */
92 public function to_ranges( $dates ) {
93 if ( empty( $dates ) ) {
94 return array();
95 }
96
97 // Remove duplicates and sort dates
98 $dates = array_unique( $dates );
99 sort( $dates );
100
101 $ranges = array();
102 $start = $dates[0];
103 $prev = $dates[0];
104 $dates_count = count( $dates );
105
106 for ( $i = 1; $i <= $dates_count; $i++ ) {
107 $current = $dates[ $i ] ?? null;
108
109 // If we've reached the end or found a gap in dates
110 if ( null === $current || strtotime( $current ) > strtotime( '+1 day', strtotime( $prev ) ) ) {
111 // Add the range only if start and end are different or it's the last single date
112 $ranges[] = array( $start, $prev );
113 if ( null !== $current ) {
114 $start = $current;
115 }
116 }
117
118 if ( null !== $current ) {
119 $prev = $current;
120 }
121 }
122
123 return $ranges;
124 }
125 }
126