PluginProbe
Booking Calendar / 10.10
Booking Calendar v10.10
11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 10.11 10.11.2 10.11.3 All 202 releases
booking / includes / _capacity / capacity.php

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

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