PluginProbe
Booking Calendar / 10.15.6
Booking Calendar v10.15.6
11.8.3 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 All 203 releases
booking / includes / _capacity / capacity.php

capacity.php in Booking Calendar 10.15.6, at includes/_capacity/capacity.php

1,943 lines 104.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly // FixIn: 9.8.0.4.
4
5
6 // <editor-fold defaultstate="collapsed" desc=" == SQL - Get Dates array from DB == " >
7
8 // -----------------------------------------------------------------------------------------------------------------
9 // SQL - Get Dates array from DB
10 // -----------------------------------------------------------------------------------------------------------------
11
12 /**
13 * Get SQL dates array from DB as: [ [0] => std_object( booking_date:'2023-08-08 10:00:01', approved:0, booking_id:45, type:1 ... ), [1] => std_object( ), ... ]
14 *
15 * @param array $params = array(
16 'approved' => 'all' | 0 | 1 default 'all'
17 , 'resource_id' => array, CSD, int if empty then default '1'
18 , 'additional_bk_types' => array, CSD, int OPTIONAL default array()
19 , 'skip_booking_id' => CSD default ''
20 )
21 *
22 * @return array Array ( [0] => stdClass Object ( [booking_date] => 2023-08-08 10:00:01
23 [approved] => 0
24 [date_res_type] =>
25 [booking_id] => 45
26 [form] => selectbox-one^rangetime2^10:00 - 12:00~text^selected_short_dates_hint2^...
27 [parent] => 0
28 [prioritet] => 20
29 [type] => 2
30 )
31 [1] => stdClass Object (
32 [booking_date] => 2023-08-08 10:00:01
33 [approved] => 0
34 [date_res_type] =>
35 [booking_id] => 46
36 [form] => selectbox-one^rangetime10^10:00 - 12:00~text^selected_short_dates_hint10^...
37 [parent] => 2
38 [prioritet] => 1
39 [type] => 10
40 ), ...
41 *
42 *
43 * Example:
44
45 $sql_dates_params = array(
46 'approved' => ( ( 'On' == get_bk_option( 'booking_is_show_pending_days_as_available' ) ) ? '1' : 'all' )
47 , 'resource_id' => $type_id
48 , 'skip_booking_id' => wpbc_get_booking_id__from_hash_in_url() // int | '' // Booking IDs to skip getting from DB
49 );
50 $dates_approve = wpbc__sql__get_booking_dates( $sql_dates_params );
51
52 */
53 function wpbc__sql__get_booking_dates( $params ){
54
55 //TODO: think about pre-caching SQL request for all booking resources - useful for [bookingselect shortcode ...] $params['resource_id'] = implode(',',range(1,17));
56
57 // <editor-fold defaultstate="collapsed" desc=" = CACHE - GET :: check if such request was cached and get it = " >
58
59 $params_for_cache = maybe_serialize( $params );
60 $cache_result = wpbc_cache__get( 'wpbc__sql__get_booking_dates', $params_for_cache );
61 if ( ! is_null( $cache_result ) ) {
62 return $cache_result;
63 }
64
65 // </editor-fold>
66
67 global $wpdb;
68
69 $defaults = array(
70 'dates_to_check' => 'CURDATE' // 'CURDATE' | 'ALL' | [ '2023-07-15' , '2023-07-21' ]
71 , 'approved' => 'all' // 'all' | 0 | 1
72 , 'resource_id' => '' // INT
73 , 'additional_bk_types' => array() // arrays only
74 , 'skip_booking_id' => '' // CSD '3,5'
75 , 'as_single_resource' => false // get dates as for 'single resource' or 'parent' resource including bookings in all 'child booking resources'
76 );
77 $params = wp_parse_args( $params, $defaults );
78
79
80 // Convert $params['additional_bk_types'] and $params['resource_id'] to one CSD variable or default '1' if all empty
81 $resource_id__arr = wpbc_get_unique_array_of_resources_id( $params['resource_id'], $params['additional_bk_types'] );
82 $resource_id__csd = implode( ',', $resource_id__arr );
83
84 // S a n i t i z e
85 $resource_id__csd = wpbc_sanitize_digit_or_csd( $resource_id__csd );
86 $params['skip_booking_id'] = wpbc_sanitize_digit_or_csd( $params['skip_booking_id'] );
87 $params['approved'] = ( 'all' == $params['approved'] ) ? 'all' : intval( $params['approved'] );
88
89
90 $sql_trash_bookings = ' AND bk.trash != 1 ';
91 $sql_skip_bookings = ( '' == $params['skip_booking_id'] ) ? '' : " AND dt.booking_id NOT IN ( {$params['skip_booking_id']} ) ";
92 $sql_approved_bookings = ( 'all' == $params['approved'] ) ? '' : " AND dt.approved = {$params['approved']} ";
93
94 $or__sql_child_bookings_4_parent = ( ! $params['as_single_resource'] ) ? " OR bt.parent IN ( {$resource_id__csd} ) " : '' ;
95
96 $where_dates = wpbc_get__sql_where__for__dates( $params );
97
98 /**
99 * Description:
100 * OR dt.type_id IN ( {$resource_id__csd} )
101 * It is means that sometimes bookings can be started in one booking resource,
102 * and in future dates can be finished in other 'child' booking resource(s).
103 * It's possible, when 'main' booking resource, where booking was started
104 * has future dates as 'unavailable' or booked
105 *
106 * OR dt.type_id IN ( {$resource_id__csd} )
107 * It's means that this booking belong to child booking resource, and do not belong to parent booking resource!
108 */
109
110 if ( class_exists('wpdev_bk_biz_l') ) {
111
112 $my_sql = "SELECT DISTINCT dt.booking_date, dt.approved, dt.type_id as date_res_type, dt.booking_id, bk.form, bt.parent, bt.prioritet, bt.booking_type_id as type
113 FROM {$wpdb->prefix}bookingdates as dt
114
115 INNER JOIN {$wpdb->prefix}booking as bk
116 ON bk.booking_id = dt.booking_id
117
118 INNER JOIN {$wpdb->prefix}bookingtypes as bt
119 ON bk.booking_type = bt.booking_type_id
120
121 WHERE 1 = 1
122 {$where_dates}
123 AND (
124 bk.booking_type IN ( {$resource_id__csd} )
125 OR dt.type_id IN ( {$resource_id__csd} )
126 {$or__sql_child_bookings_4_parent}
127 )
128 {$sql_approved_bookings}
129 {$sql_trash_bookings}
130 {$sql_skip_bookings}
131 ORDER BY dt.booking_date";
132
133 // Explanation:
134 // OR bt.parent IN ( ... ) -> Bookings from CHILD booking resources
135 // OR dt.type_id IN ( ... ) -> Dates from other booking resources, which belong to this booking resource
136
137 } else if ( class_exists('wpdev_bk_biz_m') ) { // Here we get form for booking details.
138
139 $my_sql = "SELECT DISTINCT dt.booking_date, dt.approved, dt.booking_id, bk.booking_type as type, bk.form
140 FROM {$wpdb->prefix}bookingdates as dt
141
142 INNER JOIN {$wpdb->prefix}booking as bk
143 ON bk.booking_id = dt.booking_id
144
145 WHERE 1 = 1
146 {$where_dates}
147 AND bk.booking_type IN ( {$resource_id__csd} )
148 {$sql_approved_bookings}
149 {$sql_trash_bookings}
150 {$sql_skip_bookings}
151 ORDER BY dt.booking_date";
152
153 } else { // Fast request only for dates
154 $my_sql = "SELECT DISTINCT dt.booking_date, dt.approved, dt.booking_id, bk.booking_type as type
155 FROM {$wpdb->prefix}bookingdates as dt
156
157 INNER JOIN {$wpdb->prefix}booking as bk
158 ON bk.booking_id = dt.booking_id
159
160 WHERE 1 = 1
161 {$where_dates}
162 AND bk.booking_type IN ( {$resource_id__csd} )
163 {$sql_approved_bookings}
164 {$sql_trash_bookings}
165 {$sql_skip_bookings}
166 ORDER BY dt.booking_date";
167 }
168
169
170
171 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter
172 $sql__dates_obj__arr = $wpdb->get_results( $my_sql );
173
174
175 // <editor-fold defaultstate="collapsed" desc=" = CACHE - SAVE :: = " >
176 $cache_result = wpbc_cache__save( 'wpbc__sql__get_booking_dates', $params_for_cache, $sql__dates_obj__arr );
177 // </editor-fold>
178
179 return $sql__dates_obj__arr;
180 }
181
182
183 /**
184 * Get SQL WHERE condition for Dates
185 *
186 * @param array $params [ 'dates_to_check' => 'CURDATE' ] | [ 'dates_to_check' => 'ALL' ] | [ 'dates_to_check' => [ '2023-07-15' , '2023-07-21' ] ]
187 *
188 * @return string ' AND ( dt.booking_date >= C URDATE() ) '
189 */
190 function wpbc_get__sql_where__for__dates( $params ){
191
192 $defaults = array(
193 'dates_to_check' => 'CURDATE' // 'CURDATE' | 'ALL' | [ '2023-07-15' , '2023-07-21' ]
194 );
195 $params = wp_parse_args( $params, $defaults );
196
197
198 if ( 'ALL' == $params['dates_to_check'] ) { // All dates -> ''
199
200 return '';
201
202 } else if ( 'CURDATE' == $params['dates_to_check'] ) { // Current dates -> CURDATE
203
204 return ' AND ( dt.booking_date >= ' . wpbc_sql_date_math_expr_explicit('', 'curdate') . ' ) ' ;
205
206 } else if ( is_array( $params['dates_to_check'] ) ) { // Specific Date(s).
207
208 // FixIn: 10.14.9.1.
209
210 // Sanitize and validate all incoming dates first.
211 $dates_to_check = wpbc_sanitize_dates_to_check( $params['dates_to_check'] );
212
213 // If nothing valid left – do not add any date filter (or return empty string).
214 if ( empty( $dates_to_check ) ) {
215 return '';
216 }
217
218 global $wpdb;
219
220 $count_dates = count( $dates_to_check );
221
222 // Case 1: date range (2 items: start / end).
223 if ( 2 === $count_dates ) {
224 $start = $dates_to_check[0] . ' 00:00:00';
225 $end = $dates_to_check[1] . ' 23:59:59';
226
227 // %s will be properly escaped and quoted by $wpdb->prepare().
228 $dates_sql_str = $wpdb->prepare( ' ( ( dt.booking_date >= %s ) AND ( dt.booking_date <= %s ) ) ', $start, $end );
229
230 // Case 2: one date – from that day forward.
231 } else if ( 1 === $count_dates ) {
232
233 $start = $dates_to_check[0] . ' 00:00:00';
234
235 $dates_sql_str = $wpdb->prepare( ' ( dt.booking_date >= %s ) ', $start );
236
237 // Case 3: list of specific separate dates – OR between each day.
238 } else {
239
240 $conditions = array();
241 $values = array();
242
243 foreach ( $dates_to_check as $date ) {
244
245 $conditions[] = '( ( dt.booking_date >= %s ) AND ( dt.booking_date <= %s ) )';
246
247 $values[] = $date . ' 00:00:00';
248 $values[] = $date . ' 23:59:59';
249 }
250
251 $conditions_sql = implode( ' OR ', $conditions );
252
253 // $values is an array; $wpdb->prepare() will expand it safely.
254 $dates_sql_str = $wpdb->prepare( $conditions_sql, $values ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
255 }
256
257 return ' AND ( ' . $dates_sql_str . ' ) ';
258 }
259
260 // Default CURDATE
261 return ' AND ( dt.booking_date >= ' . wpbc_sql_date_math_expr_explicit('', 'curdate') . ' ) ';
262 }
263
264
265
266 /**
267 * Get array of "Booked Dates" as: ['2023-08-30'][ > resource_id < ][ > time_seconds_range < ] => booking_date_obj[ booking_id:45, approved:1, ...
268 *
269 * @param array $params array(
270 * 'approved' => 'all' // 'all' | 0 | 1
271 * , 'resource_id' => '1' // arrays | CSD | int
272 * , 'additional_bk_types' => array() OPTIONAL // arrays | CSD | int
273 * , 'skip_booking_id' => '' // CSD '3,5'
274 * )
275 *
276 * @return array [ [2023-08-09]: [ [3]: [ '43211 - 86392': object( 'booking_date' => 2023-08-09 12:00:01 ... ), ... ], ... ], [2023-08-10]: ... ]
277 *
278 * Explanation:
279 * [2023-08-09]: [
280 * [3]: [
281 * '43211 - 86392': object(
282 * [booking_date] => 2023-08-09 12:00:01
283 * [approved] => 0
284 * [date_res_type] =>
285 * [booking_id] => 65
286 * [form] => text^selected_short_dates_hint3^August 10...
287 * [parent] => 0
288 * [prioritet] => 30
289 * [type] => 3
290 * [__summary__booking] : [
291 *
292 * [sql__booking_dates__arr] : [
293 * [1691668811] => 2023-08-10 12:00:01
294 * [1691675992] => 2023-08-10 14:00:02
295 * ]
296 * [__dates_obj] => WPBC_BOOKING_DATE Object(
297 * [readable_dates]: [ '2023-08-10': [ 12:00:01 - 14:00:02 ] ]
298 * [is_debug] => 0
299 * )
300 * [__dates_obj__bm__extended] => WPBC_BOOKING_DATE_EXTENDED Object (
301 * [readable_dates] : [
302 * [2023-08-09] : [ 12:00:01 - 24:00:00 ]
303 * [2023-08-10] : [ 00:00:00 - 24:00:00 ]
304 * [2023-08-11] : [ 00:00:00 - 24:00:00 ]
305 * [2023-08-12] : [ 00:00:00 - 24:00:00 ]
306 * [2023-08-13] : [ 00:00:00 - 14:00:02 ]
307 * ]
308 * [is_debug] => 0
309 * [extended_dates_times_arr] : []
310 * [debug_dates_times_arr] : []
311 * )
312 * [sql__booking_dates__arr__extended] : [
313 * [1691582401] => 2023-08-09 12:00:01
314 * [1691625600] => 2023-08-10 00:00:00
315 * [1691712000] => 2023-08-11 00:00:00
316 * [1691798400] => 2023-08-12 00:00:00
317 * [1691935202] => 2023-08-13 14:00:02
318 * ]
319 *
320 * ]
321 * )
322 * '64811 - 86392': object(
323 * [booking_date] => 2023-08-09 18:00:01
324 * [approved] => 0
325 * [date_res_type] =>
326 * [booking_id] => 66
327 * ....
328 * )
329 *
330 * ]
331 *
332 * ]
333 *
334 * [2023-08-10]: [ ... ]
335 * ...
336 *
337 * Example 1:
338 * $booked_dates__per_resources__arr = wpbc_get__booked_dates__per_resources__arr( array( 'resource_id' => $type_id ) );
339 * Example 2:
340 * $booked_dates__per_resources__arr = wpbc_get__booked_dates__per_resources__arr(
341 * 'approved' => 'all' // 'all' | 0 | 1
342 * , 'resource_id' => '1' // arrays | CSD | int
343 * , 'additional_bk_types' => array() // arrays | CSD | int
344 * , 'skip_booking_id' => '' // int | '' // CSD
345 * );
346 *
347 *
348 *
349 *
350 * $booked_dates__resources__seconds__arr[ '2023-08-08' ][ 'resource_id' ][ 'time_seconds_range' ] = Booking Date Object()
351 *
352 * Seconds: [36011 - 43192] - [start_time_second - end_time_second]
353 * Seconds: [0] - FULL DAY Booking
354 *
355 * Day start at ( 10 + 1 ) second
356 * Day End at ( ( 24 * 60 * 60 ) - 10 + 2 ) second
357 *
358 * To prevent intersections:
359 * Each booking Start time has +10 seconds
360 * Each booking End time has -10 seconds
361 * So real time here [36011 - 43192] is [ 36001 - 43202 ]
362 *
363 * Full day booking end with 0
364 * Start time booking end with 1
365 * End time booking end with 2
366 */
367 function wpbc_get__booked_dates__per_resources__arr( $params ){
368
369 $defaults = array(
370 'dates_to_check' => 'CURDATE' // 'CURDATE' | 'ALL' | [ '2023-07-15' , '2023-07-21' ]
371 , 'approved' => ( ( get_bk_option( 'booking_is_show_pending_days_as_available' ) == 'On' ) ? '1' : 'all' ) // 'all' | 0 | 1
372 , 'resource_id' => '1' // arrays | CSD | int
373 , 'additional_bk_types' => array() // arrays | CSD | int // OPTIONAL
374 , 'skip_booking_id' => wpbc_get_booking_id__from_hash_in_url() // int | '' // CSD '3,5'
375 , 'as_single_resource' => false // get dates as for 'single resource' or 'parent' resource including bookings in all 'child booking resources'
376 , 'is_days_always_available' => ( ( 'On' == get_bk_option( 'booking_is_days_always_available' ) ) ? true : false )
377
378 , 'aggregate_params' => array() //Optional. It can contain: [ 'aggregate_resource_id_arr' => [ 4 ] , 'resource_id__with_children__arr' => [3,25] ]
379 );
380 $params_for_dates = wp_parse_args( $params, $defaults );
381
382
383 // $params_for_dates['is_days_always_available'] = in_array( $params_for_dates['resource_id'], array( '1' ) ); // Set some resources as always avavailable.
384
385 if ( $params_for_dates['is_days_always_available'] ) { // All bookings showing as available dates.
386 return array();
387 }
388
389
390 /**
391 * 1. SQL - get array of all booked dates for our booking resource(s): [ [0] => date_object{ [booking_date] => 2023-08-08 10:00:01, [approved] => 0, .. }, .. ]
392 *
393 * Example: [
394 [0] => stdClass Object ( [booking_date] => 2023-08-08 10:00:01
395 [approved] => 0
396 [date_res_type] =>
397 [booking_id] => 45
398 [form] => selectbox-one^rangetime2^10:00 - 12:00~text^selected_short_dates_hint2^...
399 [parent] => 0
400 [prioritet] => 20
401 [type] => 2
402 )
403 [1] => stdClass Object (
404 [booking_date] => 2023-08-08 10:00:01
405 [approved] => 0
406 [date_res_type] =>
407 [booking_id] => 46
408 [form] => selectbox-one^rangetime10^10:00 - 12:00~text^selected_short_dates_hint10^...
409 [parent] => 2
410 [prioritet] => 1
411 [type] => 10
412 ), ...
413 ]
414 */
415 $sql__b_dates__arr = wpbc__sql__get_booking_dates( $params_for_dates );
416
417
418 /**
419 * 2. From SQL dates into: [ > resource_id < ][ > booking_id < ] -> __summary__booking['sql__booking_dates__arr'] = [ [ '>seconds<' ]: '> SQL DATE <' , ... ]
420 * [1693303211] => 2023-08-29 10:00:01
421 * [1693353600] => 2023-08-30 00:00:00
422 * [1693483192] => 2023-08-31 12:00:02
423 * ]
424 */
425 $resources__booking_id__obj = wpbc_support__transform__into__resource_booking_dates__arr(
426 array( 'sql_dates_arr' => wpbc_clone_array_of_objects( $sql__b_dates__arr ) , 'is_sort__dates_arr' => true , 'is_apply__check_in_out__10s' => true ) );
427
428
429 /**
430 * 2.0 Transfer AGGREGATE resource bookings to Main resources
431 *
432 *
433 */
434 if ( ! empty( $params['aggregate_params'] ) ) {
435 $resources__booking_id__obj = wpbc_aggregate__merge_bookings__from_aggregate__in_source_resource__arr(
436 $resources__booking_id__obj,
437 $params['aggregate_params']['resource_id__with_children__arr'],
438 $params['aggregate_params']['aggregate_resource_id_arr']
439 );
440 }
441
442
443 /**
444 * 2.1 Get [ > resource_id < ][ > booking_id < ] -> __summary__booking[ '_readable_dates' ] = [ '2023-08-01': [ 0: "10:00:01 - 12:00:02" ], ...
445 * '2023-08-05': [ 0: "10:00:01 - 12:00:02" ], ...
446 * ]
447 */
448 $resources__booking_id__obj = wpbc__in_all_bookings__create_WPBC_BOOKING_DATE( $resources__booking_id__obj );
449
450
451 /**
452 * 2.2 Extend check in/out dates [ > resource_id < ][ > booking_id < ] -> __summary__booking[ 'sql__booking_dates__arr__extended' ]
453 */
454 if ( function_exists( 'wpbc__extend_availability__before_after__check_in_out' ) ) {
455
456 $resources__booking_id__obj = wpbc__extend_availability__before_after__check_in_out( $resources__booking_id__obj );
457 }
458
459
460 /**
461 * 3. Into: ['2024-01-28'][ > resource_id < ][ > booking_id < ][ > only_time_seconds < ] => obj( booking_date: "2024-01-28 10:00:01", ... )
462 *
463 * From: [ > resource_id < ][ > booking_id < ] => obj( booking_date: "2024-01-28 10:00:01", ['__summary__booking']['sql__booking_dates__arr'][] , ... )
464 */
465 $dt__res__bk__seconds__arr = wpbc_support__transform__into__date_resource_booking_timesec__arr(
466 array( 'resource_booking_dates_arr' => $resources__booking_id__obj , 'is_apply__check_in_out__10s' => true ) );
467
468
469 /**
470 * 4. Into: ['2023-08-30'][ > resource_id < ][ > time_seconds_range < ] => booking_date_obj[ booking_id:45, approved:1, ...
471 *
472 * , where 'time_seconds_range' can be: '0' | '36011 - 43192', ...
473 */
474 $dt__res__time_seconds_range__arr = wpbc_support__transform__into__date_resource_timesec_range__arr(
475 array( 'date_resource_booking_timesec_arr' => $dt__res__bk__seconds__arr , 'is_apply__check_in_out__10s' => true ) );
476
477 return $dt__res__time_seconds_range__arr;
478 }
479
480 // </editor-fold>
481
482
483 // -----------------------------------------------------------------------------------------------------------------
484 // Get Resource array filled by booked Dates
485 // -----------------------------------------------------------------------------------------------------------------
486
487
488 /**
489 * Get all dates STATUSES as: ['2023-08-30'][ 'summary']['status_for_day':'available', 'day_availability':3, [ > resource_id < ] => std_object( '_day_status':'full_day_booking', '__booked__times__details':[ '1 - 43192': std_object( booking_id:46, 'approved':0, ... ), '50300 - 63192': ], 'is_day_unavailable':1, ...
490 *
491 * @param int $single_or_parent__resource_id // 1 --- INT (currently it's works only for one resource (single or parent)
492 * array $params[ 'timeslots_to_check_intersect' ] // [ '10:00 - 12:00' ] if bookings intersect with all time slots in array, then the date unavailable, if empty array then it's skipped
493 *
494 * @return array {
495 * calendar_2: {
496 * id: 2
497 * dates: { "2023-07-21": {…}
498 * "2023-07-22": {
499 * ['summary']['status_for_bookings']: "pending"
500 * ['summary']['status_for_day']: "available"
501 * day_availability: 4
502 * max_capacity: 4
503 * statuses: Object { day: "check_in|check_in|available|available", bookings: "approved|pending||" }
504 *
505 * 2: Object { is_day_unavailable: false, _day_status: "check_in", check_in_out: "check_in", … }
506 * 10: Object { is_day_unavailable: false, _day_status: "check_in", check_in_out: "check_in", … }
507 * 11: Object { is_day_unavailable: false, _day_status: "available", pending_approved: [] }
508 * 12: Object { is_day_unavailable: false, _day_status: "available", pending_approved: [] }
509 * }
510 * , "2023-07-23": {…}
511 * , …
512 * }
513 * }
514 * calendar_5: {...}
515 * , ...
516 * }
517 *
518 *
519 * Important Dates properties:
520 *
521 * ['summary']['status_for_bookings']: "" | "pending" | "approved"
522 * ['summary']['status_for_day']: | 'available';
523 * | 'time_slots_booking';
524 * | 'full_day_booking';
525 * | 'season_filter';
526 * | 'resource_availability';
527 * | 'weekday_unavailable'; 'from_today_unavailable' | 'limit_available_from_today'
528 * | 'change_over';
529 * | 'check_in';
530 * | 'check_out';
531 * | 'change_over check_out' .... variations....
532 *
533 *
534 * @return array array(
535 'dates' => $availability_per_day like ['2023-08-17'] = ...
536 , 'resources_id_arr__in_dates' => $source__resource_id_arr like [ 1,10,11,12,14]
537 )
538 */
539 function wpbc_get_availability_per_days_arr( $params ) {
540
541 if ( 0 ) { // FixIn: 9.8.3.1 ?
542 wpbc_set_limit_php( 300 ); // Set 300 seconds for php execution.
543 }
544
545 $server_request_uri = ( ( isset( $_SERVER['REQUEST_URI'] ) ) ? sanitize_text_field( $_SERVER['REQUEST_URI'] ) : '' ); /* phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash */ /* FixIn: sanitize_unslash */
546 $server_http_referer_uri = ( ( isset( $_SERVER['HTTP_REFERER'] ) ) ? sanitize_text_field( $_SERVER['HTTP_REFERER'] ) : '' ); /* phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash */ /* FixIn: sanitize_unslash */
547
548 $defaults = array(
549 'dates_to_check' => 'CURDATE', // v: 'CURDATE' | 'ALL' | arr: '2023-07-15' , '2023-07-21'.
550 'approved' => ( ( 'On' === get_bk_option( 'booking_is_show_pending_days_as_available' ) ) ? '1' : 'all' ), // v: 'all' | 0 | 1.
551 'resource_id' => '1', // Single or parent booking resource!!!! // arrays | CSD | int ???.
552 'additional_bk_types' => array(), // arrays | CSD | int // OPTIONAL -> aggregate_resource_id_arr ... it is array of booking resources from aggregate shortcode parameter.
553 'skip_booking_id' => wpbc_get_booking_id__from_hash_in_url(), // int | '' // CSD '3,5'.
554 'as_single_resource' => false, // get dates as for 'single resource' or 'parent' resource including bookings in all 'child booking resources'.
555 'max_days_count' => wpbc_get_max_visible_days_in_calendar(), // 365.
556 'timeslots_to_check_intersect' => array(), // arr: '12:20 - 12:55', '13:00 - 14:00' ) // TODO: ? do we really need it, because below we get it from function.
557 'request_uri' => ( ( ( defined( 'DOING_AJAX' ) ) && ( DOING_AJAX ) ) ? $server_http_referer_uri : $server_request_uri ), // front-end: $server_request_uri | ajax: $server_http_referer_uri // It different in Ajax requests. It's used for change-over days to detect for exception at specific pages.
558 'custom_form' => '', // Required for checking all available time-slots and compare with booked time slots.
559 );
560
561 $params = wp_parse_args( $params, $defaults );
562
563 // FixIn: 10.7.1.2. //FixIn: 10.10.3.2.
564 if (
565 ( false !== strpos( $params['request_uri'], 'allow_past' ) ) ||
566 (
567 ( false !== strpos( $params['request_uri'], 'page=wpbc-new' ) ) &&
568 ( false !== strpos( $params['request_uri'], 'booking_hash' ) )
569 )
570 ) {
571 $params['dates_to_check'] = 'ALL';
572 }
573
574 // -----------------------------------------------------------------------------------------------------------------
575 // R e s o u r c e (s) D a t a
576 // -----------------------------------------------------------------------------------------------------------------
577 // Get array of booking resource ID [1, 13, 8, 6, 7] or default: [ 1 ]
578 $source__resource_id_arr = wpbc_get_unique_array_of_resources_id( $params['resource_id'] ); // [1, 13, 8, 6, 7]
579 //$source__resource_id_arr = wpbc_get_unique_array_of_resources_id( $params['resource_id'], $params['additional_bk_types'] ); // [1, 13, 8, 6, 7]
580 $first_resource_id = $source__resource_id_arr[0]; // First from the list, or 1 if not provided.
581
582 // Get here Obj. of booking resource (which can include CHILD booking resources)
583 $resources_obj = new WPBC_RESOURCE_SUPPORT( array(
584 'resource_id' => $source__resource_id_arr, //CSD | D
585 'as_single_resource' => $params['as_single_resource'] // If true, then skip child booking resources
586 ));
587 // Resource ID arr (Can be Parent and Child resource ID)
588 $resource_id__with_children__arr = $resources_obj->get_resource_id_arr(); // [ 2, 10, 11, 12 ]
589
590 // Get Maximum capacity of resource
591 $resource_obj = $resources_obj->get__booking_resource_obj( $first_resource_id );
592 $max_resource_capacity_int = empty( $resource_obj ) ? 1 : $resource_obj->capacity; // 1 | 4
593
594 // Get base cost of resource
595 $resource_base_cost = $resources_obj->get_resources_base_cost_arr(); // [ 0, 25, 100, 99]
596
597
598
599
600 // -----------------------------------------------------------------------------------------------------------------
601 // Get real AGGREGATE resource ID arr
602 // -----------------------------------------------------------------------------------------------------------------
603 $real_resource_id_arr = wpbc_get_unique_array_of_resources_id( $params['resource_id'] ); // [ 1 ]
604 if ( empty( $params['additional_bk_types'] ) ) {
605 $aggregate_resource_id_arr = array();
606 } else {
607 $aggregate_resource_id_arr = wpbc_get_unique_array_of_resources_id( $params['additional_bk_types'] ); // [1, 13, 8, 6, 7]
608 }
609 // Excluding from 'additional_bk_types' all resources in 'resource_id'
610 $aggregate_resource_id_arr = array_diff( $aggregate_resource_id_arr, $real_resource_id_arr ); // [ 13, 8, 6, 7 ]
611 $aggregate_resource_id_arr = array_values( $aggregate_resource_id_arr ); // reindex array, for ability to transfer array instead of obj to JS client side.
612
613 $params['aggregate_params'] = array(
614 'aggregate_resource_id_arr' => $aggregate_resource_id_arr,
615 'resource_id__with_children__arr' => $resource_id__with_children__arr
616 );
617
618 // -----------------------------------------------------------------------------------------------------------------
619 // B o o k i n g s
620 // -----------------------------------------------------------------------------------------------------------------
621 // Main function to get "Bookings": ['2023-08-30'][ > resource_id < ][ > time_seconds_range < ] => booking_date_obj[ booking_id:45, approved:1, ...
622 $bookings__in_dates = wpbc_get__booked_dates__per_resources__arr( $params );
623
624
625
626 // -----------------------------------------------------------------------------------------------------------------
627 // Booking > Availability page
628 // -----------------------------------------------------------------------------------------------------------------
629 $search_dates = $params['dates_to_check']; // 'CURDATE' | 'ALL' | [ "2023-08-03" , "2023-08-04" , "2023-08-05" ]
630
631 //FixIn: 9.8.15.10 Aggregate or not Aggregate Booking > Availability ? aggregate_type = 'all' | 'bookings_only'
632 if ( ( ! empty( $params['aggregate_type'] ) ) && ( 'bookings_only' === $params['aggregate_type'] ) ) { // FixIn: 9.9.0.16.
633 $unavailable_dates__per_resources__arr = wpbc_for_resources_arr__get_unavailable_dates(
634 $resource_id__with_children__arr, // Only One Primary Resource !!
635 $search_dates
636 ); // [ 2: ['2023-08-01', '2023-08-02'], 10: ['2023-08-05', '2023-08-06'] ]
637 } else {
638 $unavailable_dates__per_resources__arr = wpbc_for_resources_arr__get_unavailable_dates(
639 wpbc_get_unique_array_of_resources_id( $resource_id__with_children__arr, $aggregate_resource_id_arr ), // Get unavailable dates for primary and aggregate booking resources
640 $search_dates
641 ); // [ 2: ['2023-08-01', '2023-08-02'], 10: ['2023-08-05', '2023-08-06'] ]
642 }
643 $unavailable_dates__per_resources__arr = wpbc_aggregate_merge_availability( $unavailable_dates__per_resources__arr,
644 $resource_id__with_children__arr,
645 $aggregate_resource_id_arr );
646
647 // -----------------------------------------------------------------------------------------------------------------
648 // Booking > Resources > Availability page
649 // -----------------------------------------------------------------------------------------------------------------
650 $season_filters_availability = array();
651 if ( class_exists('wpdev_bk_biz_m') ) {
652 foreach ( $resource_id__with_children__arr as $resource_id_for_season ) {
653 $season_filters_availability[ $resource_id_for_season ] = apply_bk_filter( 'get_available_days', $resource_id_for_season );
654 }
655 }
656
657
658
659
660 // -----------------------------------------------------------------------------------------------------------------
661 // P a r a m e t e r s f o r L O O P
662 // -----------------------------------------------------------------------------------------------------------------
663
664 // - Is this Booking > Add booking page ? --------------------------------------------------------------------------
665 $is_this_bap_page = ( false !== strpos( $params['request_uri'], 'page=wpbc-new' ) ) ? true : false;
666 $is_this_hash_page = ( false !== strpos( $params['request_uri'], 'booking_hash' ) ) ? true : false; // Set it to TRUE for adding booking in past at Booking > Add booking page
667
668 // FixIn: 10.7.1.2.
669 if ( ! $is_this_hash_page ) {
670 $is_this_hash_page = ( false !== strpos( $params['request_uri'], 'allow_past' ) ) ? true : false;
671 }
672
673 if ( ( $is_this_bap_page ) && ( $is_this_hash_page ) ) { // Start days in calendar from = PAST
674 $params['dates_to_check'] = 'ALL';
675 }
676
677 if ( 'ALL' == $params['dates_to_check'] ) { // All dates -> ''
678
679 $start_day_number = - 1 * $params['max_days_count'];
680 //$today_inix_timestamp = strtotime( '-' . intval( $params['max_days_count'] ) . ' days' ); // - 300 days
681
682 // Get time, relative to Timezone from WordPress > Settings General page // FixIn: 9.9.0.17.
683 $start_date_unix = strtotime( '-' . intval( $params['max_days_count'] ) . ' days' ); // - 365 days
684 $date_with_wp_timezone = wpbc_datetime_localized__use_wp_timezone( gmdate( 'Y-m-d H:i:s', $start_date_unix ), 'Y-m-d 00:00:00' );
685 $today_inix_timestamp = strtotime( $date_with_wp_timezone );
686
687 } else if ( 'CURDATE' == $params['dates_to_check'] ) { // Current dates -> CURDATE
688
689 $start_day_number = 1;
690 // $today_inix_timestamp = strtotime( gmdate( 'Y-m-d 00:00:00', strtotime( 'now' ) ) ); // Today 00:00:00
691
692 // Get time, relative to Timezone from WordPress > Settings General page // FixIn: 9.9.0.17.
693 $start_date_unix = strtotime( 'now' );
694 $date_with_wp_timezone = wpbc_datetime_localized__use_wp_timezone( gmdate( 'Y-m-d H:i:s', $start_date_unix ), 'Y-m-d 00:00:00' );
695 $today_inix_timestamp = strtotime( $date_with_wp_timezone );
696
697 } else if ( is_array( $params['dates_to_check'] ) ) {
698
699 $start_day_number = 1;
700
701 $today_inix_timestamp = strtotime( $params['dates_to_check'][0] . ' 00:00:00' ); // '2023-09-03 00:00:00'
702
703 $dif_in_days = strtotime( $params['dates_to_check'][ ( count( $params['dates_to_check'] ) - 1 ) ] . ' 00:00:00' )
704 - strtotime( $params['dates_to_check'][0] . ' 00:00:00' );
705
706 $dif_in_days = $dif_in_days / ( 24 * 60 * 60 );
707 $params['max_days_count'] = ceil( $dif_in_days ) + 1;
708 }
709
710
711 // Get Time Slots from booking form for Each date: [ '2023-10-25' => [ '12:20 - 12:55', '13:00 - 14:00' ], '2023-10-26' => [ ... ], ... ]
712 $readable_timeslots_arr__in_dates_arr__to_check_intersect = wpbc_get_times_fields_configuration__by_dates(
713 $first_resource_id, // Resource ID (used in case of MultiUser version for getting specific form for regular users)
714 $params['custom_form'], // Form name for getting time slots configuration
715 $today_inix_timestamp, // start_date_unix_timestamp
716 ( $params['max_days_count'] - $start_day_number ) // days_count
717 );
718
719 // =================================================================================================================
720 // -- Here are GO
721 // =================================================================================================================
722 $availability_per_day = array();
723
724 for ( $day_num = $start_day_number; $day_num <= $params['max_days_count']; $day_num ++ ) {
725
726 $my_day_tag = gmdate( 'Y-m-d', $today_inix_timestamp ); // '2023-07-19'
727
728
729 //--------------------------------------------------------------------------------------------------------------
730 // Get Time-Slots from booking form to CHECK INTERSECT :: Convert readable time slot to time slot as seconds [ '12:20 - 12:55', '13:00 - 14:00' ] OR [] if not time slots
731 $as_seconds_timeslots_arr__to_check_intersect = wpbc_get__time_range_in_seconds_arr__for_date( $readable_timeslots_arr__in_dates_arr__to_check_intersect, $my_day_tag );
732 /*
733 // TODO: check this, if it's required ? // If empty, maybe get default 'timeslots_to_check_intersect' from root of this function parameters ????
734 if ( empty( $as_seconds_timeslots_arr__to_check_intersect ) ) {
735
736
737 if ( ! is_array( $params[ 'timeslots_to_check_intersect' ] ) ) { // Root parameters from this function
738 $params[ 'timeslots_to_check_intersect' ] = array( $params[ 'timeslots_to_check_intersect' ] );
739 }
740
741 $as_seconds_timeslots_arr__to_check_intersect = array();
742 foreach ( $params[ 'timeslots_to_check_intersect' ] as $time_slot_readable ) {
743 $as_seconds_timeslots_arr__to_check_intersect[] = wpbc_convert__readable_time_slot__to__time_range_in_seconds( $time_slot_readable );
744 }
745 }
746 */
747 //--------------------------------------------------------------------------------------------------------------
748
749
750 $availability_per_day[ $my_day_tag ] = array();
751
752 // Helpful tip. Definition here variables in such order, useful for having such order in _wpbc JS variable for showing it with _wpbc.bookings_in_calendars__get_all(); command
753 $availability_per_day[ $my_day_tag ]['day_availability'] = $max_resource_capacity_int; // 4
754 $availability_per_day[ $my_day_tag ]['max_capacity'] = $max_resource_capacity_int; // 4
755 $availability_per_day[ $my_day_tag ]['statuses'] = array();
756 $availability_per_day[ $my_day_tag ]['statuses']['day_status'] = array(); // per each child booking resource
757 $availability_per_day[ $my_day_tag ]['statuses']['bookings_status'] = array(); // per each child booking resource
758 $availability_per_day[ $my_day_tag ]['summary'] = array();
759 $availability_per_day[ $my_day_tag ]['summary']['status_for_day'] = ''; // available | time_slots_booking | full_day_booking | ...
760 $availability_per_day[ $my_day_tag ]['summary']['status_for_bookings'] = ''; // pending | approved | CO: pending_pending | pending_approved | approved_pending | approved_approved
761 $availability_per_day[ $my_day_tag ]['summary']['tooltip_times'] = '';
762 $availability_per_day[ $my_day_tag ]['summary']['tooltip_availability'] = '';
763 $availability_per_day[ $my_day_tag ]['summary']['tooltip_day_cost'] = '';
764 $availability_per_day[ $my_day_tag ]['summary']['tooltip_booking_details'] = '';
765
766
767 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
768 // R E S O U R C E S - S t a r t
769 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
770 foreach ( $resource_id__with_children__arr as $resource_id ) { // [1, 13, 8, 6, 7]
771
772 $availability_per_day[ $my_day_tag ][ $resource_id ] = new stdClass();
773 $availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = false;
774 $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'available';
775 $availability_per_day[ $my_day_tag ][ $resource_id ]->pending_approved = array();
776 $availability_per_day[ $my_day_tag ][ $resource_id ]->tooltips = array(
777 'resource_title' => $resources_obj->get_resource_title( $resource_id ),
778 'times' => '',
779 'details' => array()
780 );
781 $availability_per_day[ $my_day_tag ][ $resource_id ]->booked_time_slots = array(
782 'in_seconds' => array(), // seconds
783 'readable24h' => array(), // readable 24H - for debug only
784 'merged_seconds' => array(), // seconds (reduced number of time_ranges)
785 'merged_readable' => array() // readable 12AM
786 );
787 // Day Cost / Rates ---------------------------------------------------------------------------------------
788 $fin_day_cost = wpbc_support_capacity__get_day_cost( $my_day_tag, $resource_id, $resource_base_cost[ $resource_id ] );
789 $availability_per_day[ $my_day_tag ][ $resource_id ]->date_cost_rate = $fin_day_cost;
790
791
792 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
793 // B O O K I N G S - S t a r t
794 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
795
796 if ( ( isset( $bookings__in_dates[ $my_day_tag ] ) )
797 && ( isset( $bookings__in_dates[ $my_day_tag ][ $resource_id ] ) ) ){
798
799 $this_date_bookings = $bookings__in_dates[ $my_day_tag ][ $resource_id ]; // [ [36011 - 86392] => stdClass Object( [approved] => 1 , ... ) ,... ]
800 ksort( $this_date_bookings );
801 $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details = $this_date_bookings;
802
803 } else {
804 $this_date_bookings = array();
805 }
806
807
808 /**
809 * If bookings exist then:
810 * 1. Removing some properties here to hide personal details,
811 * 2. Set Approved / Pending status of the bookings
812 * 3. By default, set "_day_status" as 'time_slots_booking' ( later we will change to 'full_day_booking', if applied )
813 */
814 if ( ! empty( $this_date_bookings ) ) {
815
816 // =====================================================================================================
817 // T i m e s - Start
818 // =====================================================================================================
819 foreach ( $this_date_bookings as $booked_times__key => $booked_times__value ) {
820
821 // By default, set "_day_status" as 'time_slots_booking' ( later we will change to 'full_day_booking', if applied )
822 $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'time_slots_booking';
823
824 // -------------------------------------------------------------------------------------------------
825 // Get Time-Slot
826 if ( false === strpos( $booked_times__key, '-' ) ) { // Full day ? - 0 == $booked_times__key
827 $time_range__seconds__arr = array( 0, 86400 ); // 24 * 60 * 60
828 } else {
829 $time_range__seconds__arr = wpbc_transform_timerange__s_range__in__seconds_arr( $booked_times__key ); // '43211 - 86392' into [43211, 86400]
830 }
831
832 // Real time: [43211, 86400]
833 $availability_per_day[ $my_day_tag ][ $resource_id ]->booked_time_slots['in_seconds'][] = $time_range__seconds__arr;
834
835 // For DEBUG only -- Readable 24H: '10:00:01 - 12:30:02'
836 $availability_per_day[ $my_day_tag ][ $resource_id ]->booked_time_slots['readable24h'][] = wpbc_transform_timerange__seconds_arr__in__24_hours_range( $time_range__seconds__arr );
837
838 // -------------------------------------------------------------------------------------------------
839 // Pending | Approved :: for correct order of all statuses - make it based on start time index / $time_range__seconds__arr[0] == 0 in situation of FULL day booking
840 $availability_per_day[ $my_day_tag ][ $resource_id ]->pending_approved[ $time_range__seconds__arr[0] ] = ( '1' == $booked_times__value->approved ) ? 'approved' : 'pending';
841
842
843 // T O O L T I P :: Booking Details
844 $booked_time_title = ( ( 0 == $time_range__seconds__arr[0] ) && ( $time_range__seconds__arr[1] >= 86400 ) )
845 ? __( 'Full day', 'booking' )
846 : wpbc_transform_timerange__seconds_arr__in__formated_hours( $time_range__seconds__arr );
847 $availability_per_day[ $my_day_tag ][ $resource_id ] = wpbc_support_capacity__tooltip__set_for_details( $availability_per_day, $my_day_tag, $resource_id,
848 $this_date_bookings, $booked_times__key, $resources_obj, $booked_time_title );
849
850 // Unset ...->form and other fields...
851 $this_date_bookings[ $booked_times__key ] = wpbc_support_capacity__unset_some_fields( $this_date_bookings[ $booked_times__key ] );
852
853 } // T i m e s - E n d Booked Times Loop - for current resource
854
855
856 // =====================================================================================================
857 // Merge intersected time intervals =
858 // =====================================================================================================
859 $merged_seconds_arr = wpbc_merge_intersected_intervals( $availability_per_day[ $my_day_tag ][ $resource_id ]->booked_time_slots['in_seconds'] );
860
861 $availability_per_day[ $my_day_tag ][ $resource_id ]->booked_time_slots['merged_seconds'] = $merged_seconds_arr;
862
863 foreach ( $merged_seconds_arr as $booked_time_slots__in_seconds ) {
864 $availability_per_day[ $my_day_tag ][ $resource_id ]->booked_time_slots['merged_readable'][] = wpbc_transform_timerange__seconds_arr__in__formated_hours( $booked_time_slots__in_seconds );
865 }
866
867 // T O O L T I P :: Times
868 $availability_per_day[ $my_day_tag ][ $resource_id ] = wpbc_support_capacity__tooltip_times__set_for_times( $availability_per_day, $my_day_tag, $resource_id, $resource_id__with_children__arr );
869
870 // =====================================================================================================
871 // End times
872 // =====================================================================================================
873
874
875 // For correct order of all booking statuses - we will make it based on start time index - Sort array starting from 1 second 00:00 to 12:00 to 23:00 etc...
876 ksort( $availability_per_day[ $my_day_tag ][ $resource_id ]->pending_approved );
877
878 // array_keys( $booked_time_slots ) can be: [0] -> 'Full day' | ['36011 - 43192', '56011 - 86392'] -> '10:00 - 12:00', '15:55 - 24:00'
879 $booked_time_slots = array_keys( $this_date_bookings );
880
881
882 // =====================================================================================================
883 // Full day booking ----------------------------------------------------------------------------------- full_by_bookings
884 // =====================================================================================================
885 if ( in_array( '0', $booked_time_slots ) ) {
886
887 $availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
888 $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'full_day_booking';
889
890 // Reset all other possible time slot statuses, in general they must not exist, but for some case
891 $availability_per_day[ $my_day_tag ][ $resource_id ]->pending_approved = array();
892
893 // Pending or approved, for full day booking: $this_date_bookings['0']
894 $availability_per_day[ $my_day_tag ][ $resource_id ]->pending_approved[] = ( '1' == $this_date_bookings['0']->approved ) ? 'approved' : 'pending';
895
896 // T O O L T I P :: Times - Full Day Booked
897 $availability_per_day[ $my_day_tag ][ $resource_id ] = wpbc_support_capacity__tooltip_times__set_full_day( $availability_per_day, $my_day_tag, $resource_id
898 , $resource_id__with_children__arr, __( 'Full day', 'booking' ) );
899
900 } // end 'full day' if
901
902
903 // =====================================================================================================
904 // All time slots booked ? -----------------------------------------------------------------------------
905 // =====================================================================================================
906 if (
907 ( ! empty( $as_seconds_timeslots_arr__to_check_intersect ) ) // We need to check intersection with some time slot '36011 - 43192'
908 && ( ! $availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable ) // And this date still free false
909 ){
910
911 $is_some_timeslot_available = wpbc_is_some_timeslot__available__in_arr( $as_seconds_timeslots_arr__to_check_intersect, $booked_time_slots );
912
913 // ------------------------------------------------------------------------------------------------- full_by_bookings
914 if ( ! $is_some_timeslot_available ) {
915 // All time slots booked !!!
916
917 $availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
918 $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'full_day_booking';
919 $availability_per_day[ $my_day_tag ][ $resource_id ]->_booking_form_timeslots_unavailable = implode( '|', $params[ 'timeslots_to_check_intersect' ] );
920
921 // T O O L T I P :: Times - Full Day Booked
922 $availability_per_day[ $my_day_tag ][ $resource_id ] = wpbc_support_capacity__tooltip_times__set_full_day( $availability_per_day, $my_day_tag, $resource_id
923 , $resource_id__with_children__arr, __( 'Full day', 'booking' ) );
924 } else {
925 // Some time slots available or there is no time slot passed in this function
926 }
927
928 } // end 'all time slots booked' if
929
930
931
932 // =====================================================================================================
933 // Change over days =
934 // =====================================================================================================
935 if (
936 ( function_exists( 'wpbc_is_booking_used_check_in_out_time' ) )
937 && ( wpbc_is_booking_used_check_in_out_time( $params[ 'request_uri' ] ) )
938 && ( ! $availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable ) // And this date still free false
939 ) {
940
941 /**
942 * "Change over days" - possible situations: check_in | check_out | change_over | ...
943 *
944 * $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = check_in
945 * | check_out
946 * | change_over
947 * | 'mixed'
948 * 'mixed' - e.g. 'change_over check_out' where several child resources and some is 'change_over' and others are 'check_out'
949 *
950 *
951 * Possible situations for change-over days:
952 *
953 * // A. If in $booked_time_slots array one of values (or in $this_date_bookings one of keys)
954 * // 1. Started with time that is ended with 1 second
955 * // 2. and Ended with '24:00' it is means '86392', like this: '28811 - 86392'
956 * // then it's means that we have 'check_in' time here
957 *
958 * // B. If in $booked_time_slots array one of values (or in $this_date_bookings one of keys)
959 * // 1. Started with '00:00' it is means '1'
960 * // 2. and Ended time that is ended with 2 second
961 * // like this: '1 - 32402'
962 * // then it's means that we have 'check_out' time here
963 *
964 * // C. If we have A. and B. then we have 'change_over' here
965 */
966
967 $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out = array();
968
969 foreach ( $this_date_bookings as $booked_times__key => $booked_times__value ) {
970
971 if ( false === strpos( $booked_times__key, '-' ) ) {
972 continue; // for situation with FULL day booking, here $booked_times__key = 0
973 }
974
975 $rangeA_arr = explode( '-', $booked_times__key );
976 $rangeA_arr[0] = intval( trim( $rangeA_arr[0] ) );
977 $rangeA_arr[1] = intval( trim( $rangeA_arr[1] ) );
978
979 // start time
980 $is_starttime__check_in = $rangeA_arr[0] % 10; // 0, 1, 2
981 $is_starttime__check_in = ( 1 == $is_starttime__check_in ) ? true : false;
982
983 // end time
984 $is_endtime__check_out = $rangeA_arr[1] % 10;
985 $is_endtime__check_out = ( 2 == $is_endtime__check_out ) ? true : false;
986
987
988 if ( ( $is_starttime__check_in ) && ( WPBC_FULL_DAY_TIME_OUT == $rangeA_arr[1] ) ) { // A :: start_time - 86392 e.g. 14:00 - 24:00
989 // only "check in" time here
990 $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out[] = 'check_in';
991
992 } else if ( ( WPBC_FULL_DAY_TIME_IN == $rangeA_arr[0] ) && ( $is_endtime__check_out ) ) { // B :: 1 - end_time e.g. 00:00 - 10:00
993 // only "check out" time here
994 $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out[] = 'check_out';
995 }
996
997 }
998 $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out = array_unique( $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out );
999 $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out = array_filter( $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out ); // All entries of array equal to FALSE (0, '', '0' ) will be removed.
1000
1001 if (
1002 ( in_array( 'check_in', $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out ) )
1003 && ( in_array( 'check_out', $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out ) )
1004 ) {
1005 $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out = array( 'change_over' ); // both check in / out times here
1006 $availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
1007
1008 // Possible statuses: pending_pending | pending_approved | approved_pending | approved_approved
1009 $availability_per_day[ $my_day_tag ][ $resource_id ]->pending_approved = array( implode( '_', $availability_per_day[ $my_day_tag ][ $resource_id ]->pending_approved ) );
1010 }
1011
1012 $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out = implode( '|', $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out );
1013
1014 if ( ! empty( $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out ) ) {
1015 $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = $availability_per_day[ $my_day_tag ][ $resource_id ]->check_in_out;
1016 }
1017 } // end change-over if
1018
1019
1020 }
1021 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1022 // B O O K I N G S - E n d
1023 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1024
1025 //==========================================================================================================
1026 // $availability_per_day[..]->_day_status = 'season_filter' | ...
1027 //==========================================================================================================
1028 // Booking > Resources > Availability page >>> 'season_filter'
1029 $availability_per_day[ $my_day_tag ][ $resource_id ] = wpbc_support_capacity__day_status__season_filter( $availability_per_day, $my_day_tag, $resource_id, $season_filters_availability );
1030
1031 // Booking > Availability page >>> 'resource_availability'
1032 $availability_per_day[ $my_day_tag ][ $resource_id ] = wpbc_support_capacity__day_status__resource_availability( $availability_per_day, $my_day_tag, $resource_id, $unavailable_dates__per_resources__arr );
1033
1034 // Week Days unavailable >>> 'weekday_unavailable'
1035 $availability_per_day[ $my_day_tag ][ $resource_id ] = wpbc_support_capacity__day_status__weekday_unavailable( $availability_per_day, $my_day_tag, $resource_id );
1036
1037 // if ( ( ! $is_this_bap_page ) || ( ! $is_this_hash_page ) ) {
1038 if ( ( ! $is_this_bap_page ) && ( ! $is_this_hash_page ) ) {
1039 // Do not apply these settings at Booking > Add booking page, when we edit booking - e.g. exist 'booking_hash'
1040
1041 // Skip checking unavailable from today, if defined the calendar_dates_start='2025-02-10' calendar_dates_end='2025-12-31' in shortcode. // FixIn: 10.13.1.4.
1042 $is_skip_check__from_today_unavailable = false;
1043 if ( is_array( $params['dates_to_check'] ) ) {
1044 if ( ( ( count( $params['dates_to_check'] ) ) > 0 ) && ( wpbc_is_date_less_than( $params['dates_to_check'][0], $my_day_tag ) ) ) {
1045 $is_skip_check__from_today_unavailable = true;
1046 }
1047 if ( ( ( count( $params['dates_to_check'] ) ) > 1 ) && ( wpbc_is_date_higher_than( $params['dates_to_check'][1], $my_day_tag ) ) ) {
1048 $is_skip_check__from_today_unavailable = true;
1049 }
1050 }
1051
1052 if ( ! $is_skip_check__from_today_unavailable ) {
1053
1054 // Unavailable days from today >>> 'from_today_unavailable'.
1055 $availability_per_day[ $my_day_tag ][ $resource_id ] = wpbc_support_capacity__day_status__from_today_unavailable( $availability_per_day, $my_day_tag, $resource_id );
1056
1057 // Limit available days from today >>> 'limit_available_from_today'.
1058 $availability_per_day[ $my_day_tag ][ $resource_id ] = wpbc_support_capacity__day_status__limit_available_from_today( $availability_per_day, $my_day_tag, $resource_id );
1059 }
1060 }
1061 //==========================================================================================================
1062
1063
1064 // T O O L T I P :: Times - Unavailable Day
1065 if ( in_array( $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status, array( 'season_filter',
1066 'resource_availability',
1067 'weekday_unavailable',
1068 'from_today_unavailable',
1069 'limit_available_from_today'
1070 ) )
1071 ){
1072 $availability_per_day[ $my_day_tag ][ $resource_id ] = wpbc_support_capacity__tooltip_times__set_full_day( $availability_per_day, $my_day_tag, $resource_id
1073 , $resource_id__with_children__arr, __( 'Unavailable', 'booking' ) );
1074 }
1075
1076
1077 // =========================================================================================================
1078 // Entire D A Y statuses
1079 // =========================================================================================================
1080
1081 if ( $availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable ) {
1082 // Set merged time interval as fully unavailable.
1083 $availability_per_day[ $my_day_tag ][ $resource_id ]->booked_time_slots['merged_seconds'] = array( array( 0, 86400 ) ); // FixIn: 10.11.5.1.
1084 // Reduce DAY day_availability, if some season or days unavailable or full by bookings.
1085 --$availability_per_day[ $my_day_tag ]['day_availability'];
1086 }
1087
1088 // 'resource_availability' | 'weekday_unavailable' | 'from_today_unavailable' | 'limit_available_from_today' | 'season_filter' | 'full_day_booking' | 'time_slots_booking' | 'available'.
1089 $availability_per_day[ $my_day_tag ]['statuses']['day_status'][] = $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status;
1090
1091 // 'approved' | 'pending'.
1092 $availability_per_day[ $my_day_tag ]['statuses']['bookings_status'][] = implode( '|', $availability_per_day[ $my_day_tag ][ $resource_id ]->pending_approved );
1093
1094 // Go to next child booking resource.
1095 }
1096
1097 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1098 // R E S O U R C E S - E n d
1099 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1100
1101
1102 // -------------------------------------------------------------------------------------------------------------
1103 // Day summary :
1104 // -------------------------------------------------------------------------------------------------------------
1105 $availability_per_day[ $my_day_tag ] = wpbc_update_summary_availability_per_this_day( $availability_per_day[ $my_day_tag ], $my_day_tag, $resource_id__with_children__arr );
1106
1107 // Go next day + 1 day
1108 $today_inix_timestamp += 24 * 60 * 60;
1109 }
1110
1111
1112 return array(
1113 'dates' => $availability_per_day
1114 , 'resources_id_arr__in_dates' => $resource_id__with_children__arr
1115 , 'aggregate_resource_id_arr' => $aggregate_resource_id_arr
1116 );
1117 }
1118
1119
1120 // <editor-fold defaultstate="collapsed" desc=" == S U P P O R T == " >
1121
1122
1123 // S U P P O R T
1124
1125 /**
1126 * Update Summary statuses for the Day
1127 *
1128 * @param $availability_per_this_day
1129 * @param $my_day_tag
1130 * @param $resource_id_arr
1131 *
1132 * @return mixed
1133 *
1134 *
1135 * Dates Status Concept Strategy ::
1136 *
1137 * Check date booking status based on 'all booking resources':
1138 * ( and as one common situation, when we have only 1 resource )
1139 *
1140 * | 'approved' - when all booking resources has approved FULL day bookings or some booking resource unavailable
1141 * | 'pending' - when at least one booking in one booking resource has pending status and there is no available booking resources
1142 * | 'times_partially_booked' - when at least one booking in one booking resource has time bookings and there is no available booking resources
1143 * and if all time slot approved then status approved
1144 * otherwise if at least one time slot booking has pending status then it has pending status
1145 *
1146 * if all 'time_slots' booked (it's time slot passed into function as parameter)
1147 * then such date in specific booking resource has pending or approved status, based on 'pending'|'approved' rule
1148 *
1149 * | 'check_in' - if activated 'change over days' and all bookings have 'check-in' status
1150 * | 'check_out' - if activated 'change over days' and all bookings have 'check-out' status
1151 * | if in booking resource exist both check in/out bookings, and activated 'change over days'
1152 * then such booking resource date has approved or pending status depends on from status of these bookings
1153 * | 'season_unavailable' - if all booking resources defined as unavailable at Booking > Resources > Availability page
1154 * | 'resource_unavailable' - if all booking resources defined as unavailable at Booking > Availability page
1155 * | 'other_unavailable' - if all booking resources defined as unavailable at Booking > Settings General page in "Availability" section
1156 *
1157 */
1158 function wpbc_update_summary_availability_per_this_day( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
1159
1160 // -------------------------------------------------------------------------------------------------------------
1161 // Summary Tooltips
1162 // -------------------------------------------------------------------------------------------------------------
1163 $availability_per_this_day['summary']['tooltip_times'] = wpbc_support_capacity__tooltip__summary__times( $availability_per_this_day, $my_day_tag, $resource_id_arr );
1164 $availability_per_this_day['summary']['tooltip_booking_details'] = wpbc_support_capacity__tooltip__summary__booked_details( $availability_per_this_day, $my_day_tag, $resource_id_arr );
1165 $availability_per_this_day['summary']['tooltip_day_cost'] = wpbc_support_capacity__tooltip__summary__day_cost( $availability_per_this_day, $my_day_tag, $resource_id_arr );
1166 $availability_per_this_day['summary']['tooltip_availability'] = wpbc_support_capacity__tooltip__summary__availability( $availability_per_this_day, $my_day_tag, $resource_id_arr );
1167
1168
1169 $availability_per_this_day['summary']['hint__in_day__cost'] = wpbc_support_capacity__in_day_hint__summary__day_cost( $availability_per_this_day, $my_day_tag, $resource_id_arr );
1170 $availability_per_this_day['summary']['hint__in_day__availability'] = wpbc_support_capacity__in_day_hint__summary__availability( $availability_per_this_day, $my_day_tag, $resource_id_arr ); // FixIn: 10.6.4.1.
1171
1172 // -------------------------------------------------------------------------------------------------------------
1173 // ['summary']['status_for_day']
1174 // -------------------------------------------------------------------------------------------------------------
1175 $temp_status = array();
1176 foreach ( $availability_per_this_day['statuses']['day_status'] as $bookings_status_arr ) {
1177 $bookings_status_arr = explode( '|', $bookings_status_arr );
1178 foreach ( $bookings_status_arr as $bookings_status_element ) {
1179 $temp_status[] = $bookings_status_element;
1180 }
1181 }
1182 $temp_status = array_filter( $temp_status ); // All entries of array equal to FALSE (0, '', '0' ) will be removed.
1183 $temp_status = array_unique( $temp_status ); // Erase duplicates
1184 $availability_per_this_day['summary']['status_for_day'] = $temp_status;
1185
1186 /**
1187 * Possible day statuses (searched by value of _day_status):
1188 *
1189 * available
1190 * time_slots_booking
1191 * full_day_booking
1192 *
1193 * limit_available_from_today
1194 * from_today_unavailable
1195 * weekday_unavailable
1196 * resource_availability
1197 * season_filter
1198 *
1199 * change_over
1200 * check_out
1201 * check_in
1202 * 'mixed' from check_in/check_out/change_over
1203 */
1204
1205 // Priority: available > time_slots_booking > full_day_booking
1206 // > season_filter > resource_availability
1207 // > weekday_unavailable > from_today_unavailable > limit_available_from_today
1208
1209 // if at least one booking "available" then day has this status
1210 if ( in_array( 'available', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'available';
1211 } else if ( in_array( 'time_slots_booking', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'time_slots_booking';
1212 } else if ( ( ! in_array( 'check_out', $availability_per_this_day['summary']['status_for_day'] ) )
1213 && ( in_array( 'check_in', $availability_per_this_day['summary']['status_for_day'] ) ) ) { $availability_per_this_day['summary']['status_for_day'] = 'check_in';
1214 } else if ( ( ! in_array( 'check_in', $availability_per_this_day['summary']['status_for_day'] ) )
1215 && ( in_array( 'check_out', $availability_per_this_day['summary']['status_for_day'] ) ) ) { $availability_per_this_day['summary']['status_for_day'] = 'check_out';
1216 } else if ( in_array( 'full_day_booking', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'full_day_booking';
1217 } else if ( in_array( 'season_filter', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'season_filter';
1218 } else if ( in_array( 'resource_availability', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'resource_availability';
1219 } else if ( in_array( 'weekday_unavailable', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'weekday_unavailable';
1220 } else if ( in_array( 'from_today_unavailable', $availability_per_this_day['summary']['status_for_day'] ) ) { $availability_per_this_day['summary']['status_for_day'] = 'from_today_unavailable';
1221 } else if ( in_array( 'limit_available_from_today', $availability_per_this_day['summary']['status_for_day'])){ $availability_per_this_day['summary']['status_for_day'] = 'limit_available_from_today';
1222 } else {
1223 $availability_per_this_day['summary']['status_for_day'] = implode( ' ', $availability_per_this_day['summary']['status_for_day'] );
1224 }
1225
1226
1227 // -------------------------------------------------------------------------------------------------------------
1228 // ['summary']['status_for_bookings']
1229 // -------------------------------------------------------------------------------------------------------------
1230 $temp_status = array();
1231 foreach ( $availability_per_this_day['statuses']['bookings_status'] as $bookings_status_arr ) {
1232 $bookings_status_arr = explode( '|', $bookings_status_arr );
1233 foreach ( $bookings_status_arr as $bookings_status_element ) {
1234 $temp_status[] = $bookings_status_element;
1235 }
1236 }
1237 $temp_status = array_filter( $temp_status ); // All entries of array equal to FALSE (0, '', '0' ) will be removed.
1238 $temp_status = array_unique( $temp_status );
1239 $availability_per_this_day['summary']['status_for_bookings'] = $temp_status;
1240
1241 // Priority: pending > approved > ''
1242
1243 // if at least one booking pending then day is pending
1244 if ( in_array( 'pending', $availability_per_this_day['summary']['status_for_bookings'] ) ) { $availability_per_this_day['summary']['status_for_bookings'] = 'pending';
1245 } else if ( in_array( 'pending_pending', $availability_per_this_day['summary']['status_for_bookings'] ) ) { $availability_per_this_day['summary']['status_for_bookings'] = 'pending_pending';
1246 // Usual situations for change over days: pending_pending | pending_approved | approved_pending | approved_approved
1247 } else {
1248 $availability_per_this_day['summary']['status_for_bookings'] = implode( ' ', $availability_per_this_day['summary']['status_for_bookings'] );
1249 }
1250
1251
1252 // -------------------------------------------------------------------------------------------------------------
1253 return $availability_per_this_day;
1254 }
1255
1256
1257 // T O O L T I P s
1258
1259 /**
1260 * Set tooltip summary -- Time-Slots
1261 *
1262 * @param $availability_per_this_day
1263 * @param $my_day_tag
1264 * @param $resource_id_arr
1265 *
1266 * @return string - tooltip content or ''
1267 */
1268 function wpbc_support_capacity__tooltip__summary__times( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
1269
1270 $tooltip = '';
1271
1272 if ( 'On' != get_bk_option( 'booking_disable_timeslots_in_tooltip' ) ) { //FixIn: 9.5.0.2.2
1273
1274 $tooltip_title_word = get_bk_option( 'booking_highlight_timeslot_word' );
1275 $tooltip_title_word = wpbc_lang( $tooltip_title_word );
1276 $tooltip_title_word = ( empty( $tooltip_title_word ) )
1277 ? ''
1278 : '<div class="wpbc_tooltip_title">' . $tooltip_title_word . '</div>' . ' ';
1279
1280 $status_summary_tooltip_times = array();
1281 foreach ( $resource_id_arr as $resource_id ) {
1282 if ( ! empty( $availability_per_this_day[ $resource_id ]->tooltips['times'] ) ) {
1283 $status_summary_tooltip_times[] = $availability_per_this_day[ $resource_id ]->tooltips['times'];
1284 }
1285 }
1286
1287 if ( ! empty( $status_summary_tooltip_times ) ) {
1288
1289 $tooltip = '<div class="wpbc_tooltip_section tooltip__times">'
1290 . $tooltip_title_word
1291 . implode( '', $status_summary_tooltip_times )
1292 . '</div>';
1293 }
1294 }
1295
1296 return $tooltip;
1297 }
1298
1299 function wpbc_support_capacity__tooltip__summary__availability( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
1300
1301 $tooltip = '';
1302
1303 if ( ( 'On' == get_bk_option( 'booking_is_show_availability_in_tooltips' ) ) && ( $availability_per_this_day['max_capacity'] > 1 ) ) {
1304
1305 $tooltip_title_word = get_bk_option( 'booking_highlight_availability_word' );
1306 $tooltip_title_word = wpbc_lang( $tooltip_title_word );
1307 $tooltip_title_word = ( empty( $tooltip_title_word ) )
1308 ? ''
1309 : '<div class="wpbc_tooltip_title">' . $tooltip_title_word . '</div>' . ' ';
1310
1311 $tooltip_content_header = '';
1312
1313 if ( ! empty( $availability_per_this_day['day_availability'] ) ) {
1314
1315 $tooltip = '<div class="wpbc_tooltip_section tooltip__availability">'
1316 . $tooltip_title_word
1317 . '<div class="wpbc_tooltip_resource_container">'
1318 . $tooltip_content_header
1319 . '<div class="wpbc_tooltip_item">'
1320 . $availability_per_this_day['day_availability']
1321 . '</div>'
1322 . '</div>'
1323 . '</div>';
1324 }
1325 }
1326 return $tooltip;
1327 }
1328
1329 function wpbc_support_capacity__tooltip__summary__day_cost( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
1330
1331 $tooltip = '';
1332 if (
1333 ( ! empty( $availability_per_this_day['day_availability'] ) )
1334 && ( 'On' == get_bk_option( 'booking_is_show_cost_in_tooltips' ) )
1335 ){
1336
1337 $tooltip_title_word = get_bk_option( 'booking_highlight_cost_word' );
1338 $tooltip_title_word = wpbc_lang( $tooltip_title_word );
1339 $tooltip_title_word = ( empty( $tooltip_title_word ) )
1340 ? ''
1341 : '<div class="wpbc_tooltip_title">' . $tooltip_title_word . '</div>' . ' ';
1342
1343 if ( isset( $resource_id_arr[0] ) ) {
1344
1345 $id_of_first_resource = $resource_id_arr[0];
1346 $tooltip_content_header = '';
1347
1348 if ( ! empty( $availability_per_this_day[ $id_of_first_resource ]->date_cost_rate ) ) {
1349
1350 $cur_sym = get_bk_option( 'booking_cost_in_date_cell_currency' ); // in Booking > Settings General page in "Calendar" section
1351 //$cur_sym = wpbc_get_currency_symbol(); // in Booking > Settings > Payment page
1352
1353 $cost_text = wpbc_formate_cost_hint__no_html( $availability_per_this_day[ $id_of_first_resource ]->date_cost_rate, $cur_sym );
1354 $cost_text = html_entity_decode( $cost_text );
1355
1356 $tooltip = '<div class="wpbc_tooltip_section tooltip__day_cost">'
1357 . $tooltip_title_word
1358 . '<div class="wpbc_tooltip_resource_container">'
1359 . $tooltip_content_header
1360 . '<div class="wpbc_tooltip_item">'
1361 . $cost_text
1362 . '</div>'
1363 . '</div>'
1364 . '</div>';
1365 }
1366
1367 }
1368 }
1369 return $tooltip;
1370 }
1371
1372
1373 function wpbc_support_capacity__in_day_hint__summary__day_cost( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
1374
1375 $tooltip = '';
1376 if (
1377 ( ! empty( $availability_per_this_day['day_availability'] ) )
1378 && ( 'On' == get_bk_option( 'booking_is_show_cost_in_date_cell' ) )
1379 ){
1380
1381 $id_of_first_resource = $resource_id_arr[0];
1382
1383 if ( ! empty( $availability_per_this_day[ $id_of_first_resource ]->date_cost_rate ) ) {
1384
1385 $cur_sym = get_bk_option( 'booking_cost_in_date_cell_currency' ); // in Booking > Settings General page in "Calendar" section
1386 //$cur_sym = wpbc_get_currency_symbol(); // in Booking > Settings > Payment page
1387
1388 $cost_text = $availability_per_this_day[ $id_of_first_resource ]->date_cost_rate;
1389 $cost_text = number_format( floatval( $cost_text ), wpbc_get_cost_decimals(), '.', '' );
1390 $cost_text = wp_strip_all_tags( wpbc_cost_show( $cost_text, array( 'currency' => 'CURRENCY_SYMBOL' ) ) );
1391 $cost_text = str_replace( array( 'CURRENCY_SYMBOL', '&' ), array( $cur_sym, '&amp;' ), $cost_text );
1392 $cost_text = html_entity_decode($cost_text);
1393
1394 $tooltip = '<span class="wpbc_in_date_hint__cost">' . $cost_text . '</span>';;
1395 }
1396 }
1397 return $tooltip;
1398 }
1399
1400 // FixIn: 10.6.4.1.
1401 /**
1402 * Get availability for in Day cells
1403 *
1404 * @param $availability_per_this_day
1405 * @param $my_day_tag
1406 * @param $resource_id_arr
1407 *
1408 * @return string
1409 */
1410 function wpbc_support_capacity__in_day_hint__summary__availability( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
1411
1412 $tooltip = '';
1413
1414 if (
1415 ( 'On' == get_bk_option( 'booking_is_show_availability_in_date_cell' ) ) &&
1416 ( $availability_per_this_day['max_capacity'] > 1 )
1417 ) {
1418
1419 $tooltip_title_word = get_bk_option( 'booking_highlight_availability_word_in_date_cell' );
1420 $tooltip_title_word = wpbc_lang( $tooltip_title_word );
1421 $tooltip_title_word = ( empty( $tooltip_title_word ) )
1422 ? ''
1423 : '<span class="wpbc_in_date_hint__availability_title">' . $tooltip_title_word . '</span>';
1424
1425
1426 if ( ! empty( $availability_per_this_day['day_availability'] ) ) {
1427
1428 $tooltip = '<span class="wpbc_in_date_hint__availability">'
1429 . '<span class="wpbc_in_date_hint__availability_number">'
1430 . intval( $availability_per_this_day['day_availability'] )
1431 . '&nbsp;'
1432 . '</span>'
1433 . $tooltip_title_word
1434 . '</span>';
1435 $tooltip = html_entity_decode($tooltip);
1436 }
1437 }
1438 return $tooltip;
1439 }
1440
1441
1442
1443 /**
1444 * Set tooltip summary -- Booking Details
1445 *
1446 * @param $availability_per_this_day
1447 * @param $my_day_tag
1448 * @param $resource_id_arr
1449 *
1450 * @return string - tooltip content or ''
1451 */
1452 function wpbc_support_capacity__tooltip__summary__booked_details( $availability_per_this_day, $my_day_tag, $resource_id_arr ){
1453
1454 $tooltip = '';
1455
1456 if ( 'On' == get_bk_option( 'booking_is_show_booked_data_in_tooltips' ) ) { //FixIn: 9.5.0.2.2
1457
1458 $tooltip_title_word = '<div class="wpbc_tooltip_title">' . esc_html__('Booking details','booking') . '</div>';
1459
1460 $status_summary_tooltip_times = array();
1461 foreach ( $resource_id_arr as $resource_id ) {
1462 if ( ! empty( $availability_per_this_day[ $resource_id ]->tooltips['details'] ) ) {
1463
1464 if ( ! empty( $availability_per_this_day[ $resource_id ]->tooltips['resource_title'] ) ){
1465 $tooltip_content_header = '<div class="wpbc_tooltip_header">'
1466 . $availability_per_this_day[ $resource_id ]->tooltips['resource_title'] . ': '
1467 . '</div>';
1468 } else{
1469 $tooltip_content_header = '';
1470 }
1471
1472 $booking_details_text = '<div class="wpbc_tooltip_resource_container">'
1473 . $tooltip_content_header
1474 . implode( ' ', $availability_per_this_day[ $resource_id ]->tooltips['details'] )
1475 . '</div>';
1476
1477 $status_summary_tooltip_times[] = $booking_details_text;
1478 }
1479 }
1480
1481 if ( ! empty( $status_summary_tooltip_times ) ) {
1482
1483 $tooltip = '<div class="wpbc_tooltip_section tooltip__booking_details">'
1484 . $tooltip_title_word
1485 . implode( '', $status_summary_tooltip_times )
1486 . '</div>';
1487 }
1488 }
1489 return $tooltip;
1490 }
1491
1492 /**
1493 * Set Tooltip -- Booking Details
1494 *
1495 * @param $availability_per_day
1496 * @param $my_day_tag
1497 * @param $resource_id
1498 * @param $this_date_bookings
1499 * @param $booked_times__key
1500 * @param $resources_obj
1501 *
1502 * @return array - $availability_per_day[ $my_day_tag ][ $resource_id ];
1503 */
1504 function wpbc_support_capacity__tooltip__set_for_details( $availability_per_day, $my_day_tag, $resource_id, $this_date_bookings, $booked_times__key, $resources_obj, $booked_time ) {
1505
1506 // Get booking details for tooltip, if needed
1507 if ( 'On' == get_bk_option( 'booking_is_show_booked_data_in_tooltips' ) ) {
1508
1509 $booking_id = $this_date_bookings[ $booked_times__key ]->booking_id;
1510 $this_booking_resource_id = $this_date_bookings[ $booked_times__key ]->type;
1511
1512 $booking_details_text = wpbc_support_capacity__get_booking_details(
1513 $this_date_bookings[ $booked_times__key ],
1514 $resources_obj->get__booking_resource_obj( $this_booking_resource_id )
1515 );
1516 $tooltip_text = '';
1517 $tooltip_text .= '<div class="wpbc_tooltip_item tooltip_booked_time">' . $booked_time . '</div>'; // Booked time
1518 $tooltip_text .= '<div class="wpbc_tooltip_item">' . $booking_details_text . '</div>'; // Booking details
1519
1520 $availability_per_day[ $my_day_tag ][ $resource_id ]->tooltips['details'][ $booking_id ] = $tooltip_text;
1521 }
1522
1523 return $availability_per_day[ $my_day_tag ][ $resource_id ];
1524 }
1525
1526 /**
1527 * Set Tooltip Times -- Time-Slots
1528 *
1529 * @param $availability_per_day
1530 * @param $my_day_tag
1531 * @param $resource_id
1532 * @param $resource_id_arr
1533 *
1534 * @return array - $availability_per_day[ $my_day_tag ][ $resource_id ];
1535 */
1536 function wpbc_support_capacity__tooltip_times__set_for_times( $availability_per_day, $my_day_tag, $resource_id, $resource_id_arr ){
1537
1538 // Times Tooltip - time slot list --------------------------------------------------------------------
1539 $tooltip_content_header = '';
1540
1541 if ( count( $resource_id_arr ) > 1 ) {
1542
1543 $class_name = 'tooltip_items_count_' . count( $availability_per_day[ $my_day_tag ][ $resource_id ]->booked_time_slots['merged_readable'] );
1544
1545 $tooltip_content_header = '<div class="wpbc_tooltip_header ' . $class_name . ' ">'
1546 . $availability_per_day[ $my_day_tag ][ $resource_id ]->tooltips['resource_title'] . ': '
1547 . '</div>';
1548 }
1549
1550 $tooltip_content_arr = array_map( function ( $item ) {
1551 return '<div class="wpbc_tooltip_item">' . $item . '</div>';
1552 }
1553 , $availability_per_day[ $my_day_tag ][ $resource_id ]->booked_time_slots['merged_readable']
1554 );
1555
1556 $availability_per_day[ $my_day_tag ][ $resource_id ]->tooltips['times'] = '<div class="wpbc_tooltip_resource_container">'
1557 . $tooltip_content_header
1558 . implode( '', $tooltip_content_arr )
1559 . '</div>';
1560 return $availability_per_day[ $my_day_tag ][ $resource_id ];
1561 }
1562
1563 /**
1564 * Set Tooltip Times -- Full Day
1565 *
1566 * @param $availability_per_day
1567 * @param $my_day_tag
1568 * @param $resource_id
1569 * @param $resource_id_arr
1570 * @param $status_title
1571 *
1572 * @return array - $availability_per_day[ $my_day_tag ][ $resource_id ];
1573 */
1574 function wpbc_support_capacity__tooltip_times__set_full_day( $availability_per_day, $my_day_tag, $resource_id, $resource_id_arr, $status_title ){
1575
1576 // Times Tooltip - FULL DAY --------------------------------------------------------------------
1577 $tooltip_content_header = '';
1578
1579 if ( count( $resource_id_arr ) > 1 ) {
1580
1581 $class_name = 'tooltip_items_count_1';
1582
1583 $tooltip_content_header = '<div class="wpbc_tooltip_header ' . $class_name . ' ">'
1584 . $availability_per_day[ $my_day_tag ][ $resource_id ]->tooltips['resource_title'] . ': '
1585 . '</div>';
1586 }
1587
1588 $tooltip_content_text = '<div class="wpbc_tooltip_item">' . $status_title . '</div>';
1589
1590 $availability_per_day[ $my_day_tag ][ $resource_id ]->tooltips['times'] = '<div class="wpbc_tooltip_resource_container">'
1591 . $tooltip_content_header
1592 . $tooltip_content_text
1593 . '</div>';
1594 return $availability_per_day[ $my_day_tag ][ $resource_id ];
1595 }
1596
1597
1598
1599 /**
1600 * Get parsed booking data, if required
1601 *
1602 * @param object $this_date_bookings
1603 * @param object $resource_obj
1604 *
1605 * @return string
1606 */
1607 function wpbc_support_capacity__get_booking_details( $this_date_bookings, $resource_obj ) {
1608
1609 if ( ( ! class_exists( 'wpdev_bk_biz_m' ) )
1610 || ( 'On' !== get_bk_option( 'booking_is_show_booked_data_in_tooltips' ) )
1611 ){
1612 return '';
1613 }
1614
1615 $booking_details_for_hint = '';
1616
1617 if ( isset( $this_date_bookings->form ) ) {
1618
1619 // Get shortcodes
1620 $booking_shortcodes_in_tooltips = get_bk_option( 'booking_booked_data_in_tooltips' ); // '[name] [secondname]'
1621
1622 $resource_id = $this_date_bookings->type;
1623
1624 // Get parsed booking data field values -- e.g.: [ "rangetime":"12:00 - 14:00", "secondname":"Smith",... ]
1625 $booking_data_arr = wpbc_get_parsed_booking_data_arr( $this_date_bookings->form, $resource_id, array( 'get' => 'value' ) );
1626 $booking_data_arr['booking_id'] = $this_date_bookings->booking_id;
1627 $booking_data_arr['resource_id'] = $resource_id;
1628 $booking_data_arr['resource_title'] = ( ! empty( $resource_obj ) ) ? wpbc_lang( $resource_obj->title ) : '';
1629
1630 // Replace existing shortcodes
1631 foreach ( $booking_data_arr as $replace_shortcode => $replace_value ) {
1632
1633 if ( is_null( $replace_value ) ) { $replace_value = ''; };
1634
1635 $replace_value = wpbc_replace__true_false__to__yes_no( $replace_value ); // FixIn: 9.8.9.1.
1636
1637 $booking_shortcodes_in_tooltips = str_replace( array(
1638 '[' . $replace_shortcode . ']'
1639 , '{' . $replace_shortcode . '}'
1640 )
1641 , $replace_value
1642 , $booking_shortcodes_in_tooltips
1643 );
1644 }
1645
1646 $booking_details_for_hint = $booking_shortcodes_in_tooltips;
1647
1648 // Remove all shortcodes, which is not replaced early.
1649 $booking_details_for_hint = preg_replace( '/[\[\{][a-zA-Z0-9.,_-]{0,}[\]\}]/', '', $booking_details_for_hint );
1650 }
1651
1652 return $booking_details_for_hint;
1653 }
1654
1655
1656 /**
1657 * Unset some fields from booking data for do not show personal data at front-end side
1658 *
1659 * @param object $this_date_bookings
1660 *
1661 * @return object
1662 */
1663 function wpbc_support_capacity__unset_some_fields( $this_date_bookings ) {
1664
1665 if ( isset( $this_date_bookings->form ) ) {
1666 unset( $this_date_bookings->form ); // Hide booking details
1667 }
1668
1669 if ( isset( $this_date_bookings->booking_date ) ) {
1670 unset( $this_date_bookings->booking_date ); // Confusing property of last end booking date, because we have 'sql summary booking dates arrays' for all dates and times
1671 }
1672
1673 return $this_date_bookings;
1674 }
1675
1676
1677 // D A Y S T A T U S U N A V A I L A B L E
1678
1679 /**
1680 * Set > _day_status = 'limit_available_from_today' depends on Booking > Settings General page ---> "Limit available days from today"
1681 *
1682 * @param $availability_per_day [ ... ]
1683 * @param $my_day_tag - '2023-08-08'
1684 * @param $resource_id - 2
1685 *
1686 * @return array - $availability_per_day[ $my_day_tag ][ $resource_id ]
1687 */
1688 function wpbc_support_capacity__day_status__limit_available_from_today( $availability_per_day, $my_day_tag, $resource_id ){
1689
1690 // ----------------------------------------------------------------------------------------------------- // limit_available_from_today
1691 // 3. Limit available days from today
1692 if ( function_exists( 'wpbc_is_day_available__relative__limit_available_from_today' ) ) {
1693 if ( ! wpbc_is_day_available__relative__limit_available_from_today( $my_day_tag ) ) {
1694 // this date unavailable
1695 $availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
1696 $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'limit_available_from_today';
1697
1698 if ( empty( $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details ) ) {
1699 $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details = array(); // Reset bookings details
1700 }
1701 }
1702 }
1703
1704 return $availability_per_day[ $my_day_tag ][ $resource_id ];
1705 }
1706
1707
1708 /**
1709 * Set > _day_status = 'from_today_unavailable' depends on Booking > Settings General page ---> "Unavailable days from today"
1710 *
1711 * @param $availability_per_day [ ... ]
1712 * @param $my_day_tag - '2023-08-08'
1713 * @param $resource_id - 2
1714 *
1715 * @return array - $availability_per_day[ $my_day_tag ][ $resource_id ]
1716 */
1717 function wpbc_support_capacity__day_status__from_today_unavailable( $availability_per_day, $my_day_tag, $resource_id ){
1718
1719 // FixIn: 10.8.1.4.
1720
1721 // ----------------------------------------------------------------------------------------------------- // from_today_unavailable
1722 // 2. Unavailable days from today
1723 $unavailable_days_num_from_today = get_bk_option( 'booking_unavailable_days_num_from_today' );
1724
1725 // FixIn: 10.8.1.4.
1726 if ( ! empty( $unavailable_days_num_from_today ) ) {
1727 if ( 'm' === substr( $unavailable_days_num_from_today, - 1 ) ) {
1728 $start_date_unix = strtotime( '+' . ( intval( $unavailable_days_num_from_today ) - 1 ) . ' minutes' ); // + 0 days
1729 } else {
1730 $start_date_unix = strtotime( '+' . intval( $unavailable_days_num_from_today ) . ' days' ); // + 0 days
1731 }
1732 } else {
1733 $start_date_unix = strtotime( 'now' );
1734 }
1735
1736 $date_start__gmt = gmdate( 'Y-m-d H:i:s', $start_date_unix ); // '2025-01-25 12:50:10'
1737 $date_start__midnight__wp_timezone = wpbc_datetime_localized__use_wp_timezone( $date_start__gmt, 'Y-m-d 00:00:00' ); // Local Midnight.
1738
1739 // 'Today Midnight' - 'Calendar Day Cell' .
1740 $days_number = intval( ( strtotime( $date_start__midnight__wp_timezone ) - strtotime( $my_day_tag ) ) / 86400 );
1741
1742 if ( $days_number > 0 ) {
1743 // This date Unavailable.
1744 $availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
1745 $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'from_today_unavailable';
1746
1747 if ( empty( $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details ) ) {
1748 $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details = array(); // Reset bookings details
1749 }
1750 }
1751
1752 return $availability_per_day[ $my_day_tag ][ $resource_id ];
1753 }
1754
1755
1756 /**
1757 * Set > _day_status = 'weekday_unavailable' depends on Booking > Settings General page ---> "Week Days unavailable"
1758 *
1759 * @param $availability_per_day [ ... ]
1760 * @param $my_day_tag - '2023-08-08'
1761 * @param $resource_id - 2
1762 *
1763 * @return array - $availability_per_day[ $my_day_tag ][ $resource_id ]
1764 */
1765 function wpbc_support_capacity__day_status__weekday_unavailable( $availability_per_day, $my_day_tag, $resource_id ){
1766
1767 // 1. Week Days unavailable -------------------------------------------------------------------------------- // weekday_unavailable
1768 $unavailable_weekdays = array();
1769 foreach ( range( 0, 6 ) as $week_day_num ) {
1770 $unavailable_weekdays[ $week_day_num ] = ( 'On' == get_bk_option( 'booking_unavailable_day' . $week_day_num ) ) ? true : false;
1771 }
1772
1773 $this_day_week_num = gmdate( 'w', strtotime( $my_day_tag ) ); // 0 - 6
1774
1775 if ( $unavailable_weekdays[ $this_day_week_num ] ) {
1776 // this date unavailable
1777 $availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
1778 $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'weekday_unavailable';
1779
1780 if ( empty( $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details ) ) {
1781 $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details = array(); // Reset bookings details
1782 }
1783 }
1784
1785 return $availability_per_day[ $my_day_tag ][ $resource_id ];
1786 }
1787
1788
1789 /**
1790 * Set > _day_status = 'resource_availability' depends on Booking > Availability page
1791 *
1792 * @param $availability_per_day [ ... ]
1793 * @param $my_day_tag - '2023-08-08'
1794 * @param $resource_id - 2
1795 * @param array $unavailable_dates__per_resources__arr - [ 2: ['2023-08-01', '2023-08-02'], 10: ['2023-08-05', '2023-08-06'] ]
1796 *
1797 * @return array - $availability_per_day[ $my_day_tag ][ $resource_id ]
1798 */
1799 function wpbc_support_capacity__day_status__resource_availability( $availability_per_day, $my_day_tag, $resource_id, $unavailable_dates__per_resources__arr ){
1800
1801 // Booking > Availability page ----------------------------------------------------------------------------- // resource_availability
1802 /**
1803 * $unavailable_dates__per_resources__arr = Array ( [2] => Array( [0] => 2023-08-01
1804 [1] => 2023-08-02
1805 )
1806 [10] => Array( [0] => 2023-08-05
1807 [1] => 2023-08-06
1808 )
1809 )
1810 */
1811 if (
1812 ( isset( $unavailable_dates__per_resources__arr[ $resource_id ] ) )
1813 && ( in_array( $my_day_tag, $unavailable_dates__per_resources__arr[ $resource_id ] ) )
1814 ) {
1815
1816 $availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
1817 $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'resource_availability';
1818
1819 if ( empty( $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details ) ) {
1820 $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details = array(); // Reset bookings details
1821 }
1822 }
1823
1824 return $availability_per_day[ $my_day_tag ][ $resource_id ];
1825 }
1826
1827
1828 /**
1829 * Set > _day_status = 'season_filter' depends on Booking > Resources > Availability page
1830 *
1831 * @param $availability_per_day [ ... ]
1832 * @param $my_day_tag - '2023-08-08'
1833 * @param $resource_id - 2
1834 * @param array $season_filters_availability - [...]
1835 *
1836 * @return array - $availability_per_day[ $my_day_tag ][ $resource_id ]
1837 */
1838 function wpbc_support_capacity__day_status__season_filter( $availability_per_day, $my_day_tag, $resource_id, $season_filters_availability ){
1839
1840 if ( function_exists( 'wpbc_is_this_day_available_in_season_filters' ) ) { // BM and higher
1841
1842 $is_date_available = wpbc_is_this_day_available_in_season_filters( $my_day_tag, $resource_id, $season_filters_availability[ $resource_id ] ); // Get availability
1843 if ( ! $is_date_available ) {
1844
1845 $availability_per_day[ $my_day_tag ][ $resource_id ]->is_day_unavailable = true;
1846 $availability_per_day[ $my_day_tag ][ $resource_id ]->_day_status = 'season_filter';
1847
1848 if ( empty( $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details ) ) {
1849 $availability_per_day[ $my_day_tag ][ $resource_id ]->__booked__times__details = array(); // Reset bookings details
1850 }
1851 }
1852 }
1853
1854 return $availability_per_day[ $my_day_tag ][ $resource_id ];
1855 }
1856
1857
1858 // D A Y C O S T
1859
1860 /**
1861 * Get day cost depend on Rates
1862 * @param $my_day_tag - '2023-08-08'
1863 * @param $resource_id - 2
1864 * @param $base_cost - 25
1865 *
1866 * @return int|string
1867 */
1868 function wpbc_support_capacity__get_day_cost( $my_day_tag, $resource_id, $base_cost ) {
1869
1870 $fin_day_cost = 0;
1871 if ( function_exists( 'wpbc_get_1_day_cost_apply_rates' ) ) {
1872
1873 list( $year, $month, $day ) = explode( '-', $my_day_tag );
1874
1875 $day = intval( $day );
1876 $month = intval( $month );
1877 $year = intval( $year );
1878
1879 $fin_day_cost = wpbc_get_1_day_cost_apply_rates( $resource_id, $base_cost, $day, $month, $year );
1880 }
1881
1882 return $fin_day_cost;
1883 }
1884
1885
1886 // </editor-fold>
1887
1888
1889
1890 //TODO: M I G R A T E to 9.8
1891 // .
1892 // instead of this: <script type="text/javascript"> wpbc_settings.set_option( 'pending_days_selectable', true ); </script>
1893 // use this: <script type="text/javascript"> _wpbc.calendar__set_param_value( " . intval( $resource_id ) . ", 'pending_days_selectable' , true ); </script>
1894 // Booking Calendar - JavaScript Settings
1895 // Example or redefine some settings:
1896 // <script type="text/javascript"> wpbc_settings.set_option( 'pending_days_selectable', true ); </script>
1897 // [booking type=1]
1898 // .
1899 // .
1900 // 1. Define parameters for calendar(s):
1901 // _wpbc.calendar__set_parameters( " . intval( $resource_id ) . ", {'days_select_mode': 'single'} );
1902 // _wpbc.calendar__set_parameters( " . intval( $resource_id ) . ", {'days_select_mode': 'multiple'} );
1903 // _wpbc.calendar__set_parameters( " . intval( $resource_id ) . ", {'days_select_mode': 'fixed'} );
1904 // _wpbc.calendar__set_parameters( " . intval( $resource_id ) . ", {'fixed__days_num' : 7 } );
1905 // _wpbc.calendar__set_parameters( " . intval( $resource_id ) . ", {'fixed__week_days__start': [-1] } ); // { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat }
1906 // _wpbc.calendar__set_parameters( " . intval( $resource_id ) . ", {'days_select_mode': 'dynamic'} );
1907 // _wpbc.calendar__set_param_value( " . intval( $resource_id ) . ", 'dynamic__days_min' , 7 );
1908 // _wpbc.calendar__set_param_value( " . intval( $resource_id ) . ", 'dynamic__days_max' , 14 );
1909 // _wpbc.calendar__set_param_value( " . intval( $resource_id ) . ", 'dynamic__days_specific' , [] ); // Example [5,7]
1910 // _wpbc.calendar__set_param_value( " . intval( $resource_id ) . ", 'dynamic__week_days__start' , [-1] ); // { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat }
1911 // JavaScript functions changes:
1912 // wpbc_unselect_all_days( resource_id ) -> wpbc_calendar__unselect_all_dates( resource_id )
1913 // showErrorMessage( element , errorMessage , isScrollStop ); -> wpbc_front_end__show_message__warning( jq_node, message );
1914 // showMessageUnderElement( element , errorMessage , message_type); -> wpbc_front_end__show_message__warning_under_element( jq_node, message );
1915 // makeScroll( object_name ); -> wpbc_do_scroll( jq_node );
1916 // .
1917 // JavaScript hooks changes:
1918 // jQuery( ".booking_form_div" ).trigger( "date_selected", [ resource_id, date ] );
1919 // become
1920 // jQuery( ".booking_form_div" ).trigger( "date_selected", [ resource_id, mouse_clicked_dates, all_selected_dates_arr ] );
1921 // where:
1922 // mouse_clicked_dates Can be: "05.10.2023 - 07.10.2023" | "10.10.2023 - 10.10.2023" |
1923 // all_selected_dates_arr Can be: [ "2023-10-05", "2023-10-06", "2023-10-07", … ]
1924 // PHP actions:
1925 // from: make_bk_action('wpdev_booking_post_inserted', $booking_id, $bktype, $str_dates__dd_mm_yyyy, array($start_time, $end_time ) , $formdata );
1926 // removed!
1927 // . // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
1928 // from: apply_filters('wpdev_booking_form_content', $form , $resource_id);
1929 // to: apply_filters( 'wpbc_booking_form_html__update__append_change_over_times', $form, $resource_id );
1930 // .
1931 // Removed PHP actions:
1932 // . 'show_payment_forms__for_ajax'
1933 // * make_bk_action('wpbc_ add_new_booking' , array(
1934 // * 'bktype' => 1
1935 // * , 'dates' => '27.08.2014, 28.08.2014, 29.08.2014'
1936 // * , 'form' => 'selectbox-one^rangetime1^10:00 - 12:00~text^name1^Jo~text^secondname1^Smith~email^email1^smith@gmail.com~text^phone1^678676678~text^address1^Linkoln Street~text^city1^London~text^postcode1^78788~selectbox-one^country1^GB~selectbox-one^visitors1^1~selectbox-one^children1^1~textarea^details1^Rooms with sea view~checkbox^term_and_condition1[]^I Accept term and conditions'
1937 // * , 'is_send_emeils' => 0
1938 // * // , 'booking_form_type' => ''
1939 // * // , 'wpdev_active_locale' => 'en_US'
1940 // * ) );
1941 // .
1942 // add_bk_filter('wpbc_add_new_booking_filter' , 'wpbc_add_new_booking' );
1943 // TODO: recheck hooks in wpbc-dev-api.php