PluginProbe
Booking Calendar / 11.0
Booking Calendar v11.0
11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 10.11 10.11.2 10.11.3 All 202 releases
booking / core / wpbc-dates.php

wpbc-dates.php in Booking Calendar 11.0, at core/wpbc-dates.php

1,013 lines 35.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @version 1.0
4 * @package Booking Calendar
5 * @subpackage Dates Functions
6 * @category Functions
7 *
8 * @author wpdevelop
9 * @link https://wpbookingcalendar.com/
10 * @email info@wpbookingcalendar.com
11 *
12 * @modified 29.09.2015
13 */
14
15 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
16
17
18 /**
19 * Get the dates in different formats
20 *
21 * @param type $str_dates__dd_mm_yyyy
22 * @param type $booking_type
23 * @param type $booking_form_data
24 * @return
25 array(
26 'string' => "30.02.2014, 31.02.2014, 01.03.2014"
27 , 'array' => array("2014-02-30", "2014-02-31", ....
28 , 'start_time' => array('00','00','00');
29 , 'end_time' => array('00','00','00');
30 );
31 */
32 function wpbc_get_dates_in_diff_formats( $str_dates__dd_mm_yyyy, $booking_type, $booking_form_data ){
33
34 $str_dates__dd_mm_yyyy = str_replace( '|', ',', $str_dates__dd_mm_yyyy); // Check this for some old versions of plugin
35
36 if ( strpos($str_dates__dd_mm_yyyy,' - ') !== false ) { // Recheck for any type of Range Days Formats
37 $arr_check_in_out_dates = explode(' - ', $str_dates__dd_mm_yyyy );
38 $str_dates__dd_mm_yyyy = wpbc_get_comma_seprated_dates_from_to_day( $arr_check_in_out_dates[0], $arr_check_in_out_dates[1] );
39 }
40
41
42 $days_array = explode( ',', $str_dates__dd_mm_yyyy ); // Create dates Array
43 $only_days = array();
44
45 foreach ($days_array as $new_day) {
46
47 if ( ! empty($new_day) ) {
48
49 $new_day = trim( $new_day );
50
51 $new_day = str_replace( '-', '.', $new_day);
52
53 $new_day = explode( '.', $new_day);
54
55 $only_days[] = sprintf( "%04d-%02d-%02d", intval( $new_day[2] ), intval( $new_day[1] ), intval( $new_day[0] ) );
56 }
57 }
58 sort($only_days); // Sort Dates
59
60
61 // Get Times from booking form if these fields exist
62 $start_end_time = wpbc_get_times_in_form( $booking_form_data, $booking_type );
63
64 if ( $start_end_time !== false ) {
65 $start_time = $start_end_time[0]; // array('00','00','01');
66 $end_time = $start_end_time[1]; // array('00','00','01');
67
68 if ( ( '00' == $start_time[0] ) && ( '00' == $start_time[1] ) ) { // FixIn: 8.7.8.8.
69 $start_time = array( '00', '00', '00' );
70 $end_time = array( '00', '00', '00' );
71 } else {
72 if ( count( $only_days ) == 1 ) { // add end date if selected 1 day only and times is exist
73 $only_days[] = $only_days[0];
74 }
75 }
76 } else {
77 $start_time = array( '00', '00', '00' );
78 $end_time = array( '00', '00', '00' );
79 }
80
81
82 return array(
83 'string' => $str_dates__dd_mm_yyyy // dd_mm_yyyy
84 , 'array' => $only_days
85 , 'start_time' => $start_time
86 , 'end_time' => $end_time
87 );
88 }
89
90
91 /**
92 * Check for minimum and maximum available times, and restrict value to these limits.
93 *
94 * @param string $time 24:00
95 * @param string $min_time 00:01
96 * @param string $max_time 23:59
97 *
98 * @return string 23:59
99 */
100 function wpbc_check_min_max_available_times( $time = '00:00', $min_time = '00:00', $max_time = '23:59' ) {
101
102 // Time in minutes
103 $time_m = explode( ':', trim( $time ) );
104 $time_m = intval( $time_m[0] ) * 60 + intval( $time_m[1] );
105
106 // Min time in minutes
107 $min_time_m = explode( ':', trim( $min_time ) );
108 $min_time_m = intval( $min_time_m[0] ) * 60 + intval( $min_time_m[1] );
109
110 // Max time in minutes
111 $max_time_m = explode( ':', trim( $max_time ) );
112 $max_time_m = intval( $max_time_m[0] ) * 60 + intval( $max_time_m[1] );
113
114
115 if ( $time_m < $min_time_m ) {
116 $time_m = $min_time_m;
117 }
118
119 if ( $time_m > $max_time_m ) {
120 $time_m = $max_time_m;
121 }
122
123 // Convert time in minutes back to string HH:MM
124 $time_m_h = floor( $time_m / 60 );
125 $time_m_m = $time_m - $time_m_h * 60;
126
127 // Check leading 0
128 if ( $time_m_h < 10 ) {
129 $time_m_h = '0' . $time_m_h;
130 }
131 if ( $time_m_m < 10 ) {
132 $time_m_m = '0' . $time_m_m;
133 }
134
135 return $time_m_h . ':' . $time_m_m;
136 }
137
138
139 /**
140 * Get Times from booking Form, if these times fields exist
141 *
142 * @param type $booking_form_data
143 * @param type $booking_type
144 * @return mixed
145 array ( array('00','00','01'), array('00','00','01') )
146 ||
147 false
148 */
149 function wpbc_get_times_in_form( $booking_form_data, $booking_type ){
150
151 $is_time_exist = false;
152
153 $start_time = $end_time = '00:00:00';
154
155 if ( strpos( $booking_form_data, 'rangetime' . $booking_type ) !== false ) {
156
157 // ~checkbox^mymultiple4^~checkbox^rangetime4^ ~checkbox^rangetime4^12:00 - 13:00~ checkbox^rangetime4^~checkbox^rangetime4^~text^name4^Jonny~
158
159 // Types of the conditions
160 $f_type = '[^\^]*';
161 $f_name = 'rangetime[\d]*[\[\]]{0,2}';
162 $f_value = '[\s]*([0-9:]*)[\s]*\-[\s]*([0-9:]*)[\s]*[^~]*';
163
164 $pattern_to_search='%[~]?'.$f_type.'\^'.$f_name.'\^'.$f_value.'[~]?%';
165
166 preg_match_all($pattern_to_search, $booking_form_data, $matches, PREG_SET_ORDER);
167
168 /**
169 * Example of $matches: [ [ [0] => '~checkbox^rangetime4^13:00 - 14:00~'
170 [1] => '13:00'
171 [2] => '14:00'
172 ] ]
173 */
174
175 if (count($matches)>0){
176
177 $start_time = wpbc_get_time_in_24_hours_format( trim( $matches[0][1] ) );
178 $start_time[2] = '01';
179
180 $end_time = wpbc_get_time_in_24_hours_format( trim( $matches[0][2] ) );
181 $end_time[2] = '02';
182
183 $is_time_exist = true;
184
185 } else {
186 $start_time = array('00','00','01');
187 $end_time = array('00','00','02');
188 }
189
190 } else {
191
192 if ( strpos( $booking_form_data, 'starttime' . $booking_type ) !== false ) { // Get START TIME From form request
193 $pos1 = strpos( $booking_form_data, 'starttime' . $booking_type ); // Find start time pos
194 $pos1 = strpos( $booking_form_data, '^', $pos1 ) + 1; // Find TIME pos
195 $pos2 = strpos( $booking_form_data, '~', $pos1 ); // Find TIME length
196 if ( $pos2 === false ) {
197 $pos2 = strlen( $booking_form_data );
198 }
199 $pos2 = $pos2 - $pos1;
200 $start_time = substr( $booking_form_data, $pos1, $pos2 );
201 if ( $start_time == '' ) {
202 $start_time = '00:00';
203 }
204
205 $start_time = wpbc_check_min_max_available_times( $start_time, '00:01', '23:59' ); // FixIn: 8.7.11.1.
206
207 $start_time = explode( ':', $start_time );
208
209 $start_time[2] = '01';
210 } else {
211 $start_time = explode( ':', $start_time );
212 }
213
214 if ( strpos( $booking_form_data, 'endtime' . $booking_type ) !== false ) { // Get END TIME From form request
215 $pos1 = strpos( $booking_form_data, 'endtime' . $booking_type ); // Find start time pos
216 $pos1 = strpos( $booking_form_data, '^', $pos1 ) + 1; // Find TIME pos
217 $pos2 = strpos( $booking_form_data, '~', $pos1 ); // Find TIME length
218 if ( $pos2 === false ) {
219 $pos2 = strlen( $booking_form_data );
220 }
221 $pos2 = $pos2 - $pos1;
222 $end_time = substr( $booking_form_data, $pos1, $pos2 );
223 if ( $end_time == '' ) {
224 $end_time = '00:00';
225 }
226
227 $end_time = wpbc_check_min_max_available_times( $end_time, '00:01', '23:59' ); // FixIn: 8.7.11.1.
228
229 $is_time_exist = true;
230
231 $end_time = explode( ':', $end_time );
232 $end_time[2] = '02';
233 } else {
234 $end_time = explode( ':', $end_time );
235 }
236
237 if ( strpos( $booking_form_data, 'durationtime' . $booking_type ) !== false ) { // Get END TIME From form request
238 $pos1 = strpos( $booking_form_data, 'durationtime' . $booking_type ); // Find start time pos
239 $pos1 = strpos( $booking_form_data, '^', $pos1 ) + 1; // Find TIME pos
240 $pos2 = strpos( $booking_form_data, '~', $pos1 ); // Find TIME length
241 if ( $pos2 === false ) {
242 $pos2 = strlen( $booking_form_data );
243 }
244 $pos2 = $pos2 - $pos1;
245 $end_time = substr( $booking_form_data, $pos1, $pos2 );
246
247 $is_time_exist = true;
248
249 $end_time = explode( ':', $end_time );
250
251 // Here we are get start time and add duration for end time
252 $new_end_time = mktime( intval( $start_time[0] ), intval( $start_time[1] ) );
253 $new_end_time = $new_end_time + $end_time[0] * 60 * 60 + $end_time[1] * 60;
254 $end_time = gmdate( 'H:i', $new_end_time );
255
256 if ( $end_time == '00:00' ) {
257 $end_time = '23:59';
258 }
259 $end_time = explode( ':', $end_time );
260 $end_time[2] = '02';
261 }
262
263 }
264
265 if ( $is_time_exist ) {
266 return array( $start_time, $end_time );
267 } else {
268 return false;
269 }
270 }
271
272
273 //FixIn: TimeFreeGenerator
274 /**
275 * Convert timeslot "10:00 - 12:00" to specfic timeformat, like "10:00 AM - 12:00 PM"
276 * @param string $timeslot - "10:00 - 12:00"
277 * @param string $time_format = "g:i A"
278 */
279 function wpbc_time_slot_in_format( $timeslot, $time_format = false ){
280
281 // FixIn: 8.9.3.1.
282 if ( ( empty( $timeslot ) ) ) {
283 return '';
284 }
285 $value_times = explode( '-', $timeslot );
286 $value_times[0] = trim( $value_times[0] );
287 $value_times[1] = trim( $value_times[1] );
288
289 $s_tm = wpbc_time_localized( $value_times[0] , $time_format);
290 $e_tm = wpbc_time_localized( $value_times[1] , $time_format);
291
292 $t_delimeter = ' - ';
293
294 return $s_tm . $t_delimeter . $e_tm ;
295 }
296
297
298 //FixIn: 8.4.2.11 Deprecated, use this: wpbc_time_localized
299 /**
300 * Convert timeslot "10:00" to specfic timeformat, like "10:00 AM"
301 * @param string $timeslot - "10:00"
302 * @param string $time_format = "g:i A"
303 */
304 function wpbc_time_in_format( $timeslot, $time_format = false ){
305
306 $s_tm = wpbc_time_localized( $timeslot, $time_format );
307 return $s_tm;
308 }
309
310
311 /**
312 * Get dates from DB of specific booking -> '2023-10-09 12:00:01, 2023-10-09 20:00:02'
313 *
314 * @global type $wpdb
315 * @param type $booking_id_str - booking ID
316 * @return string - comma separated dates in SQL format -> '2023-10-09 12:00:01, 2023-10-09 20:00:02'
317 */
318 function wpbc_db__get_sql_dates__in_booking__as_str( $booking_id_str ) {
319
320 global $wpdb;
321
322 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
323 $dates_result = $wpdb->get_results( "SELECT DISTINCT booking_date FROM {$wpdb->prefix}bookingdates WHERE booking_id IN ({$booking_id_str}) ORDER BY booking_date" );
324
325 $dates_str = array();
326
327 foreach ( $dates_result as $my_date ) {
328
329 $dates_str[] = $my_date->booking_date;
330 }
331 $dates_str = implode( ', ', $dates_str );
332
333
334 return $dates_str;
335 }
336
337
338 /**
339 * Get Only Dates array from Dates Dimes string with comma seperated values
340 *
341 * @param $dates_ymd_his_csv -> '2023-10-09 12:00:01, 2023-10-09 20:00:02'
342 *
343 * @return array|string[] -> '2023-10-09, 2023-10-09'
344 *
345 *
346 * Usually it called like in this Example:
347 * $dates_ymd_his_csv = wpbc_db__get_sql_dates__in_booking__as_str( $booking_id_str ); // '100' | '10,7' - booking ID
348 * $dates_only_arr = wpbc_get_only_dates__from_dates_ymd_his_csv__as_arr( $dates_ymd_his_csv ); // -> '2023-10-09, 2023-10-09'
349 */
350 function wpbc_get_only_dates__from_dates_ymd_his_csv__as_arr( $dates_ymd_his_csv ){
351
352
353 // FixIn: 10.1.5.6.
354 $dates_only_arr = wpbc_get_dates_arr__from_dates_comma_separated( array(
355 'dates_separator' => ', ', // ', '
356 'dates' => $dates_ymd_his_csv, // '2023-04-04 12:03:00, 2023-04-07 2024-06-30:00'
357 ) );
358 // Get Only Dates
359 $dates_only_arr = array_map( function ( $date_sql_ymd_his ) {
360 $date_sql_ymd_his = trim( $date_sql_ymd_his );
361 $date_sql_ymd_his = substr( $date_sql_ymd_his, 0, 10 );
362 return $date_sql_ymd_his;
363 }
364 , $dates_only_arr
365 );
366 $dates_only_arr = array_unique( $dates_only_arr );
367 return $dates_only_arr;
368 }
369
370 /**
371 * Get Time in 24 hours (military) format, from possible AM/PM format
372 *
373 * @param string $time_str - '01:20 PM'
374 * @return string - '13:20'
375 */
376 function wpbc_get_time_in_24_hours_format( $time_str ) {
377
378 $time_str = trim( $time_str );
379 $time_str_plus = 0;
380
381 if ( strpos( strtolower( $time_str) ,'am' ) !== false ) {
382 $time_str = str_replace('am', '', $time_str );
383 $time_str = str_replace('AM', '', $time_str );
384 }
385
386 if ( strpos( strtolower( $time_str) ,'pm' ) !== false ) {
387 $time_str = str_replace('pm', '', $time_str );
388 $time_str = str_replace('PM', '', $time_str );
389 $time_str_plus = 12;
390 }
391
392 $time_str = explode( ':', trim( $time_str ) );
393 // FixIn: 9.9.0.4.
394 $time_str[0] = intval( $time_str[0] ) + $time_str_plus;
395 $time_str[1] = intval( $time_str[1] );
396
397 if ($time_str[0] < 10 ) $time_str[0] = '0' . $time_str[0];
398 if ($time_str[1] < 10 ) $time_str[1] = '0' . $time_str[1];
399
400 return $time_str;
401 }
402
403
404 /**
405 * Get number of days between 2 dates (dates in mySQL format)
406 *
407 * @param string $day1 - Day in MySQL format
408 * @param string $day2 - Day in MySQL format
409 *
410 * @return int - number of days
411 */
412 function wpbc_get_difference_in_days( $day1, $day2 ) {
413 return floor( ( strtotime( $day1 ) - strtotime( $day2 ) ) / 86400 ); // FixIn: 8.2.1.11.
414 }
415
416
417 /**
418 * Get sorted sql dates array, like: [ '2023-10-18 00:00:00', '2023-10-19 00:00:00', '2023-10-20 00:00:00' ]
419 *
420 * @param string $booking_days '19.10.2023,18.10.2023,20.10.2023' - comma separated dates:
421 * @return array - [ '2023-10-18 00:00:00', '2023-10-19 00:00:00', '2023-10-20 00:00:00' ] - sorted dates array
422 */
423 function wpbc_get_sorted_days_array( $booking_days ) {
424
425 if ( strpos($booking_days,' - ') !== false ) {
426 $booking_days = explode(' - ', $booking_days );
427 $booking_days = wpbc_get_comma_seprated_dates_from_to_day($booking_days[0],$booking_days[1]);
428 }
429
430 $days_array = explode(',', $booking_days);
431 $only_days = array();
432
433 foreach ($days_array as $new_day) {
434 if ( ! empty( $new_day ) ) {
435 $new_day = trim( $new_day );
436 if ( strpos( $new_day, '.' ) !== false ) $new_day = explode('.',$new_day);
437 else $new_day = explode('-',$new_day);
438 $only_days[] = $new_day[2] .'-' . $new_day[1] .'-' . $new_day[0] . ' 00:00:00';
439 }
440 }
441
442 if ( ! empty( $only_days ) ) {
443 sort($only_days);
444 }
445
446 return $only_days;
447 }
448
449
450 /**
451 * Get Dates in Comma seperated format, based on start and end dates.
452 *
453 * @param string $date_str_from - start date: 06.04.2015
454 * @param string $date_str_to - end date: 08.04.2015
455 * @return string - comma seperated dates: 06.04.2015, 07.04.2015, 08.04.2015
456 */
457 function wpbc_get_comma_seprated_dates_from_to_day( $date_str_from, $date_str_to ) {
458
459 $date_str_from = explode('.', $date_str_from);
460 $date_str_to = explode('.', $date_str_to);
461 $iDateFrom = mktime( 1, 0, 0, ( intval( $date_str_from[1] ) ), ( intval( $date_str_from[0] ) ), ( intval( $date_str_from[2] ) ) );
462 $iDateTo = mktime( 1, 0, 0, ( intval( $date_str_to[1] ) ), ( intval( $date_str_to[0] ) ), ( intval( $date_str_to[2] ) ) );
463
464 $aryRange=array();
465
466 if ( $iDateTo >= $iDateFrom ) {
467 array_push( $aryRange, gmdate( 'd.m.Y', $iDateFrom ) ); // first entry
468
469 while ($iDateFrom<$iDateTo) {
470 $iDateFrom+=86400; // add 24 hours
471 array_push( $aryRange, gmdate( 'd.m.Y', $iDateFrom ) );
472 }
473 }
474
475 $aryRange = implode(', ', $aryRange);
476
477 return $aryRange;
478 }
479
480
481 /**
482 * Get dates array based on start and end dates.
483 *
484 * @param string $sStartDate - start date: 2015-04-06
485 * @param string $sEndDate - end date: 2015-04-08
486 * @return array - array( 2015-04-06, 2015-04-07, 2015-04-08 )
487 */
488 function wpbc_get_dates_array_from_start_end_days( $sStartDate, $sEndDate ){
489 // Firstly, format the provided dates.
490 // This function works best with YYYY-MM-DD
491 // but other date formats will work thanks
492 // to strtotime().
493 $sStartDate = gmdate("Y-m-d", strtotime($sStartDate));
494 $sEndDate = gmdate("Y-m-d", strtotime($sEndDate));
495
496 // Start the variable off with the start date
497 $aDays[] = $sStartDate;
498
499 // Set a 'temp' variable, sCurrentDate, with
500 // the start date - before beginning the loop
501 $sCurrentDate = $sStartDate;
502
503 // While the current date is less than the end date
504 while($sCurrentDate < $sEndDate){
505 // Add a day to the current date
506 $sCurrentDate = gmdate("Y-m-d", strtotime("+1 day", strtotime($sCurrentDate)));
507
508 // Add this new day to the aDays array
509 $aDays[] = $sCurrentDate;
510 }
511 // Once the loop has finished, return the
512 // array of days.
513 return $aDays;
514 }
515
516
517 /**
518 * Get dates array, from range days selection
519 *
520 * @param $params = array(
521 * 'dates_separator' => ' ~ ', // Dates separator
522 * 'dates' => '2023-04-04 ~ 2023-04-07' // Dates in 'Y-m-d' format: '2023-01-31'
523 * )
524 *
525 * @return array = array(
526 * [0] => 2023-04-04
527 * [1] => 2023-04-05
528 * [2] => 2023-04-06
529 * [3] => 2023-04-07
530 * )
531 *
532 * Example #1: wpbc_get_dates_arr__from_dates_range( array( 'dates_separator' => ' ~ ', 'dates' => '2023-04-04 ~ 2023-04-07' ) );
533 * Example #2: wpbc_get_dates_arr__from_dates_range( array( 'dates_separator' => ' - ', 'dates' => '2023-04-04 - 2023-04-07' ) );
534 */
535 function wpbc_get_dates_arr__from_dates_range( $params ){
536
537 $defaults = array(
538 'dates_separator' => ' ~ ', // ' ~ '
539 'dates' => '', // '2023-04-04 ~ 2023-04-07'
540 );
541 $params = wp_parse_args( $params, $defaults );
542
543 $dates_arr = array();
544
545 if ( ! empty( $params['dates'] ) ) {
546
547 list( $check_in_date_ymd, $check_out_date_ymd ) = explode( $params['dates_separator'], $params['dates'] );
548
549 if ( ( ! empty( $check_in_date_ymd ) ) && ( ! empty( $check_out_date_ymd ) ) ) {
550
551 $dates_arr = wpbc_get_dates_array_from_start_end_days( $check_in_date_ymd, $check_out_date_ymd );
552 }
553 }
554 return $dates_arr;
555 }
556
557 /**
558 * Get dates array, from comma separated dates
559 *
560 * @param $params = array(
561 * 'dates_separator' => ', ', // Dates separator
562 * 'dates' => '2023-04-04, 2023-04-07, 2023-04-05' // Dates in 'Y-m-d' format: '2023-01-31'
563 * )
564 *
565 * @return array = array(
566 * [0] => 2023-04-04
567 * [1] => 2023-04-05
568 * [2] => 2023-04-06
569 * [3] => 2023-04-07
570 * )
571 *
572 * Example #1: wpbc_get_dates_arr__from_dates_comma_separated( array( 'dates_separator' => ', ', 'dates' => '2023-04-04, 2023-04-07, 2023-04-05' ) );
573 */
574 function wpbc_get_dates_arr__from_dates_comma_separated( $params ){
575
576 $defaults = array(
577 'dates_separator' => ', ', // ' ~ '
578 'dates' => '', // ''2023-04-04, 2023-04-07, 2023-04-05'
579 );
580 $params = wp_parse_args( $params, $defaults );
581
582 $dates_arr = array();
583
584 if ( ! empty( $params['dates'] ) ) {
585
586 $dates_arr = explode( $params['dates_separator'], $params['dates'] );
587
588 sort( $dates_arr );
589 }
590 return $dates_arr;
591 }
592
593
594 /**
595 * Get tommorow day from input value
596 *
597 * @param string $nowday : 2015-02-29
598 * @return int : Unix timestamp for a date like this 2015-02-30
599 */
600 function wpbc_get_tommorow_day( $nowday ){
601
602 $nowday_d = gmdate( 'm.d.Y', mysql2date( 'U', $nowday ) );
603 $previos_array = explode( '.', $nowday_d );
604 $tommorow_day = mktime( 0, 0, 0, intval($previos_array[0]), ( intval($previos_array[1]) + 1 ), intval($previos_array[2]) ) ;
605 return $tommorow_day;
606 }
607
608
609 /**
610 * Check if this date is today day
611 *
612 * @param string $some_day : '2015-05-29'
613 * @return boolean : true | false
614 */
615 function wpbc_is_today_date( $some_day ) {
616
617 $some_day_d = gmdate( 'm.d.Y', mysql2date( 'U', $some_day ) );
618 $today_day = gmdate( 'm.d.Y' );
619
620 if ( $today_day == $some_day_d ) {
621 return true;
622 } else {
623 return false;
624 }
625 }
626
627
628 /**
629 * Check if this date is Tomorrow day
630 *
631 * @param string $some_day : '2024-08-18'
632 * @return boolean : true | false
633 */
634 function wpbc_is_tomorrow_date( $some_day ) {
635
636 $some_day_d = gmdate( 'Y-m-d 00:00:00', mysql2date( 'U', $some_day ) );
637 $today_day = gmdate( 'Y-m-d 00:00:00' );
638 $tomorrow_day = gmdate( 'Y-m-d 00:00:00', strtotime( '+1 day', strtotime( $today_day ) ) );
639
640 if ( $tomorrow_day == $some_day_d ) {
641 return true;
642 } else {
643 return false;
644 }
645 }
646
647
648 // FixIn: 8.8.1.2.
649 /**
650 * Check if this date in past
651 *
652 * @param string $some_day : '2015-05-29'
653 * @return boolean : true | false
654 */
655 function wpbc_is_date_in_past( $some_day ) {
656
657 $some_day_d = gmdate( 'm.d.Y', mysql2date( 'U', $some_day ) );
658 $some_array = explode( '.', $some_day_d );
659 $some_day = mktime( 0, 0, 0, intval($some_array[0]), ( intval($some_array[1]) + 1 ), intval($some_array[2]) );
660
661 $today_day = time();
662
663 if ( $today_day > $some_day ) {
664 return true;
665 } else {
666 return false;
667 }
668 }
669
670
671 /**
672 * Check if the booking was made without calendar ( no booking date submited.)
673 *
674 * @param $is_no_date
675 * @param $date
676 *
677 * @return mixed|true
678 */
679 function wpbc_maybe_no_booking_date( $is_no_date, $date_ymd ) {
680
681 if ( ( ! empty( $date_ymd ) ) && ( is_array( $date_ymd ) ) ) {
682 $date_ymd = $date_ymd[0];
683 }
684 // FixIn: 2981-01-13 13 Jan 2981.
685 if ( '2981-01-13' === gmdate( 'Y-m-d', mysql2date( 'U', $date_ymd ) ) ) {
686 $is_no_date = true;
687 }
688
689 return $is_no_date;
690 }
691 add_filter( 'wpbc_maybe_no_booking_date', 'wpbc_maybe_no_booking_date', 10, 2 );
692
693
694 //TODO: refactor it, by replacig date_i18n to wp_loc_date... (check depndencies of this function in other usage functions...)
695 /**
696 * Change date / time format
697 *
698 * @param string $dt - MySQL Date - '2015-11-21 00:00:00'
699 * @param type $date_format - Optional. Date format
700 * @param type $time_format - Optional. Time format
701 * @return array( 'DATE in custom Format', 'TIME in custom Format' )
702 */
703 function wpbc_get_date_in_correct_format( $dt, $date_format = false, $time_format = false ) {
704
705 $is_no_date = apply_filters( 'wpbc_maybe_no_booking_date', false, $dt );
706 if ( $is_no_date ) {
707 return array( '---', '' );
708 }
709
710 if ( $date_format === false ) $date_format = get_bk_option( 'booking_date_format');
711 if ( empty( $date_format ) ) $date_format = "m / d / Y, D";
712
713 if ( $time_format === false ) $time_format = get_bk_option( 'booking_time_format');
714 if ( empty( $time_format ) ) $time_format = get_option( 'time_format' ); //'h:i a'; //FixIn: TimeFree 2 - in Booking Calendar Free version show by default times hints in AM/PM format
715
716 $my_time = gmdate( 'H:i:s' , mysql2date( 'U', $dt ) );
717 if ( $my_time == '00:00:00' ) $time_format = '';
718
719 $bk_date = date_i18n( $date_format, mysql2date( 'U', $dt ) );
720 $bk_time = date_i18n( ' ' . $time_format , mysql2date( 'U', $dt ) );
721
722 if ( $bk_time == ' ' ) $bk_time = '';
723
724 return array($bk_date, $bk_time);
725 }
726
727
728 /**
729 * Get SHORT Dates showing data
730 *
731 * @param array $bk_dates_short - Array of dates
732 * @param bool $is_approved - is dates approved or not
733 * @param type $bk_dates_short_id
734 * @param type $booking_types
735 * @return string
736 */
737 function wpbc_get_short_dates_formated_to_show( $bk_dates_short, $is_approved = false, $bk_dates_short_id = array() , $booking_types = array() ){
738
739 $short_dates_content = '';
740 $dcnt = 0;
741 foreach ( $bk_dates_short as $dt ) {
742 if ( $dt == '-' ) {
743 $short_dates_content .= '<span class="date_tire"> - </span>';
744 } elseif ( $dt == ',' ) {
745 $short_dates_content .= '<span class="date_tire">, </span>';
746 } else {
747 $short_dates_content .= '<a href="javascript:void(0)" class="field-booking-date label flex-label ';
748 if ( $is_approved )
749 $short_dates_content .= ' approved';
750 $short_dates_content .= '">';
751
752 $bk_date = wpbc_get_date_in_correct_format( $dt );
753 $short_dates_content .= $bk_date[0];
754 $short_dates_content .= '<sup class="field-booking-time">' . $bk_date[1] . '</sup>';
755
756 if ( class_exists( 'wpdev_bk_biz_l' ) ) { // BL
757 if ( ( !empty( $bk_dates_short_id[$dcnt] ) ) && ( isset( $booking_types[$bk_dates_short_id[$dcnt]] ) ) ){
758 $bk_booking_type_name_date = $booking_types[$bk_dates_short_id[$dcnt]]->title; // Default
759
760 if ( strlen( $bk_booking_type_name_date ) > 19 )
761 $bk_booking_type_name_date = substr( $bk_booking_type_name_date, 0, 13 )
762 . '...'
763 . substr( $bk_booking_type_name_date, -3 );
764
765 $short_dates_content .= '<sup class="field-booking-time date_from_dif_type"> ' . $bk_booking_type_name_date . '</sup>';
766 }
767 }
768 $short_dates_content .= '</a>';
769 }
770 $dcnt++;
771 }
772 return $short_dates_content;
773 }
774
775 // FixIn: 9.6.3.5.
776
777 /**
778 * Get booking dates from DB for specific calendar
779 *
780 * @param array $params array(
781 'approved' => '' // '' - all | '0' - pending | '1' - approved
782 , 'resource_id' => 1 // int or dcv
783 , 'skip_booking_id' => '' // int or dcv
784
785 )
786 *
787 * @return array array( [1-7-2023] => array(
788 [sec_0] => stdClass Object
789 (
790 [booking_date] => 2023-01-07 00:00:00
791 [approved] => 0
792 [booking_id] => 96
793 )
794
795 )
796 [1-8-2023] => Array(
797 [sec_0] => stdClass Object
798 (
799 [booking_date] => 2023-01-08 00:00:00
800 [approved] => 0
801 [booking_id] => 42
802 )
803 )
804 ...
805
806 */
807 function wpbc__sql__get_booked_dates( $params ){
808
809 $defaults = array(
810 'approved' => '' // '' - all | '0' - pending | '1' - approved
811 , 'resource_id' => 1 // int or dcv
812 , 'skip_booking_id' => '' // int or dcv
813 );
814 $params = wp_parse_args( $params, $defaults );
815
816 // S a n i t i z e
817 $params['approved'] = ( '' != $params['approved'] ) ? intval( $params['approved'] ) : '';
818 $params['skip_booking_id'] = ( '' != $params['skip_booking_id'] ) ? wpbc_sanitize_digit_or_csd( $params['skip_booking_id'] ) : '';
819 $params['resource_id'] = ( '' != $params['resource_id'] ) ? wpbc_sanitize_digit_or_csd( $params['resource_id'] ) : 1;
820
821
822 // S Q L
823 global $wpdb;
824 $sql = "SELECT DISTINCT dt.booking_date, dt.approved, bk.booking_id
825
826 FROM {$wpdb->prefix}bookingdates as dt
827
828 INNER JOIN {$wpdb->prefix}booking as bk
829
830 ON bk.booking_id = dt.booking_id
831
832 WHERE ( 1 = 1 )";
833
834 // W H E R E
835 $sql_where = '';
836 $sql_where .= ( '' != $params['approved'] ) ? " AND ( dt.approved = {$params['approved']} ) " : ''; // Approved (1) or Pending (0) or All // int
837 $sql_where .= " AND dt.booking_date >= " . wpbc_sql_date_math_expr_explicit('', 'curdate') . " "; // Only actual bookings
838 $sql_where .= " AND bk.trash != 1 "; // Not in Trash // int
839 $sql_where .= " AND bk.booking_type IN ( {$params['resource_id']} ) "; // For specific calendar (booking resource) // int
840 $sql_where .= ( '' != $params['skip_booking_id'] ) ? " AND dt.booking_id NOT IN ( {$params['skip_booking_id']} ) " : '' ; // Skip some bookings ? Usually, during booking edit.
841
842 // O R D E R
843 $sql_order = " ORDER BY dt.booking_date"; // Order by booking dates & times
844
845
846 /**
847 * Array( [0] => stdClass Object ( [booking_date] => 2022-12-27 00:00:00, [approved] => 0, [booking_id] => 187 )
848 [1] => stdClass Object ( [booking_date] => 2022-12-28 00:00:00, [approved] => 1, [booking_id] => 26 )
849 ...
850 */
851
852 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
853 $result_arr = $wpdb->get_results( $sql . $sql_where . $sql_order );
854
855 // P A R S E
856 $prior_check_out_date = false;
857 $dates_arr = array();
858 foreach ( $result_arr as $sql_date ) {
859
860 $blocked_days_range = array( $sql_date->booking_date );
861 $resource_id = explode( ',', $params['resource_id'] );
862 $resource_id = $resource_id[0];
863 if (
864 ( ! class_exists( 'wpdev_bk_biz_l' ) )
865 || ( ( class_exists( 'wpdev_bk_biz_l' ) ) && ( ! wpbc_is_this_parent_resource( $resource_id ) ) )
866 ){ // FixIn: 9.1.2.7.
867 list( $blocked_days_range, $prior_check_out_date ) = apply_filters( 'wpbc_get_extended_block_dates_filter', array( $blocked_days_range, $prior_check_out_date ) );
868 }
869
870 foreach ( $blocked_days_range as $date_ymd_his ) {
871
872 $sql_date->booking_date = $date_ymd_his;
873
874
875 $date_as_int = strtotime( $sql_date->booking_date );
876
877 $date_key = gmdate( 'Y-m-d', $date_as_int );
878 $date_seconds = $date_as_int - strtotime( $date_key );
879
880 // Transform '2022-09-01' to 9-1-2022
881 $date_key__for_calendar = gmdate( 'n-j-Y', $date_as_int ); // j - Day of the month without leading zeros 1 to 31 ; n - Number of month, without leading zeros 1 to 12
882
883 if ( empty( $dates_arr[ $date_key__for_calendar ] ) ) {
884 $dates_arr[ $date_key__for_calendar ] = array();
885 }
886
887 /**
888 * Important info about [ 'sec_' . $date_seconds ]
889 *
890 * We need to have 'sec_0' instead of simple 0
891 *
892 * for having JavaScript Objects (object property 'sec_o') instead of Array (index 0), after sending Ajax response and JSON decode!
893 */
894 $dates_arr[ $date_key__for_calendar ][ 'sec_' . $date_seconds] = $sql_date;
895 }
896
897
898 }
899
900 return $dates_arr;
901 }
902
903
904 /**
905 * Get season availability based on booking resource and seasons from Booking > Resources > Availability page
906 *
907 * @param array $params array(
908 'resource_id' => 1 // int or dcv
909 , 'from' => 'NOW' // any value that is possible to use in strtotime()
910 , 'count' => 365 // int
911 )
912 *
913 * @return array Array (
914 [2023-01-09] => 1
915 [2023-01-10] => 1
916 [2023-01-11] => 1
917 [2023-01-12] => 1
918 [2023-01-13] => 1
919 [2023-01-14] =>
920 [2023-01-15] =>
921 [2023-01-16] => 1
922 [2023-01-17] => 1
923 [2023-01-18] => 1
924 [2023-01-19] => 1
925 ...
926 */
927 function wpbc__sql__get_season_availability( $params ){
928
929 // FixIn: 9.5.4.4.
930 $max_days_count = 365;
931 $max_monthes_in_calendar = get_bk_option( 'booking_max_monthes_in_calendar' );
932
933 if ( strpos( $max_monthes_in_calendar, 'm' ) !== false ) {
934 $max_days_count = intval( str_replace( 'm', '', $max_monthes_in_calendar ) ) * 31 + 5; // FixIn: 9.6.1.1.
935 } else {
936 $max_days_count = intval( str_replace( 'y', '', $max_monthes_in_calendar ) ) * 365 + 15; // FixIn: 9.6.1.1.
937 }
938
939 $defaults = array(
940 'resource_id' => 1 // int or dcv
941 , 'from' => 'NOW' // any value that is possible to use in strtotime()
942 , 'count' => $max_days_count // int
943 );
944 $params = wp_parse_args( $params, $defaults );
945
946
947 // S a n i t i z e
948 $params['resource_id'] = ( '' != $params['resource_id'] ) ? wpbc_sanitize_digit_or_csd( $params['resource_id'] ) : 1;
949
950 $is_all_days_available = true;
951
952 $season_filters_id_arr = array();
953
954 if ( ( class_exists( 'wpdev_bk_biz_m' ) ) && ( function_exists( 'wpbc_get_resource_meta' ) ) ) { // BM and higher // FixIn: 9.9.0.13.
955
956 // S Q L
957 $availability_res = wpbc_get_resource_meta( $params['resource_id'], 'availability' );
958
959 if ( ! empty( $availability_res ) ) {
960
961 /**
962 * Array ( [general] => On, [filter] => Array ( [1] => On, ...
963 * [2] => Off
964 * ...
965 * [8] => Off
966 * [9] => On
967 * )
968 * )
969 */
970 $availability = maybe_unserialize( $availability_res[0]->value );
971
972 $is_all_days_available = ( 'On' === $availability['general'] ) ? true : false;
973 $season_filter = $availability['filter'];
974
975 // Get ID of only activated Seasons
976 if ( is_array( $season_filter ) ) {
977 foreach ( $season_filter as $key => $value ) {
978 if ( $value == 'On' ) {
979 $season_filters_id_arr[] = intval( $key ); // Sanitize booking_filter_id for future SQL
980 }
981 }
982 }
983
984 }
985
986 }
987
988 $days_availability = array();
989
990 for( $i = 0; $i < $params['count']; $i++) {
991
992 $date_y_m_d = gmdate( 'Y-m-d', strtotime( '+' . $i . 'days', strtotime( $params['from'] ) ) );
993
994 $days_availability[ $date_y_m_d ] = $is_all_days_available;
995
996 $date_arr = explode( '-', $date_y_m_d );
997
998 foreach ( $season_filters_id_arr as $filter_id ) {
999
1000 $day = intval( $date_arr[2] );
1001 $month = intval( $date_arr[1] );
1002 $year = intval( $date_arr[0] );
1003
1004 if ( wpbc_is_day_inside_of_filter( $day, $month, $year, $filter_id ) ){
1005 $days_availability[ $date_y_m_d ] = ! $days_availability[ $date_y_m_d ];
1006 break;
1007 }
1008 }
1009
1010 }
1011
1012 return $days_availability;
1013 }