PluginProbe
Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar / 2.1.21
Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar v2.1.21
2.1.22 2.1.21 2.1.20 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 trunk 1.1 2.0 2.0.1 2.0.10.2 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.16 2.0.17 2.0.18 2.0.2 2.0.20 2.0.21 All 56 releases
booking-manager / core / wpbc / wpbm-bc-import.php

wpbm-bc-import.php in Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar 2.1.21, at core/wpbc/wpbm-bc-import.php

1,500 lines 63.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @version 1.0
4 * @description Booking Calendar integration - Import bookings from ICS events
5 *
6 * @author wpdevelop
7 * @link https://oplugins.com/
8 * @email info@oplugins.com
9 *
10 * @modified 2017-06-28
11 */
12
13 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
14
15
16 /**
17 * Move All imported bookings into the Trash
18 *
19 * @return bool
20 */
21 function wpbm_delete_all_imported_bookings( $params ){ //FixIn: 2.0.10.3
22
23 $booking_ics_force_trash_before_import = get_bk_option( 'booking_ics_force_trash_before_import' ); //FixIn: 2.0.10.1 <- available in Booking Calendar since update 2.0.10
24
25 if ( 'Off' == $booking_ics_force_trash_before_import ) {
26 return false;
27 }
28
29 global $wpdb;
30
31 $resource_id = $params['resource_id'];
32 $is_trash = 1;
33
34 //FixIn: 2.0.24.1 //FixIn: 9.1.2.6
35 if (
36 ( 'On' == $booking_ics_force_trash_before_import )
37 || ( 'trash' == $booking_ics_force_trash_before_import )
38 ) {
39 // Trash bookings
40 $my_sql = "UPDATE {$wpdb->prefix}booking AS bk SET bk.trash = {$is_trash} WHERE sync_gid != '' AND trash != 1 AND booking_type = {$resource_id}";
41
42 if ( false === $wpdb->query( $my_sql ) ) {
43 ?> <script type="text/javascript"> var my_message = '<?php echo html_entity_decode( esc_js( get_debuge_error( 'Error during trash booking in DB', __FILE__, __LINE__ ) ), ENT_QUOTES ); ?>'; wpbc_admin_show_message( my_message, 'error', 30000 ); </script> <?php
44 return false;
45 }
46
47 } else { // Permanently delete bookings
48
49 $bookings_obj_arr = $wpdb->get_results( "SELECT booking_id as ID FROM {$wpdb->prefix}booking WHERE sync_gid != '' AND trash != 1 AND booking_type = {$resource_id} LIMIT 0, 1000" );
50
51 $id_arr = array();
52 foreach ( $bookings_obj_arr as $booking_obj ) {
53 $id_arr[] = $booking_obj->ID;
54 }
55 $string_id = implode( ',', $id_arr );
56
57 if ( $string_id != '' ) {
58
59 // D E L E T E Dates
60 if ( false === $wpdb->query( "DELETE FROM {$wpdb->prefix}bookingdates WHERE booking_id IN ({$string_id})" ) ) { ?> <script type="text/javascript"> document.getElementById('ajax_working').innerHTML = '<div style=&quot;height:20px;width:100%;text-align:center;margin:15px auto;&quot;><?php debuge_error('Error during updating exist booking for deleting dates in BD' ,__FILE__,__LINE__); ?></div>'; </script> <?php die(); }
61 // D E L E T E Bookings
62 if ( false === $wpdb->query( "DELETE FROM {$wpdb->prefix}booking WHERE booking_id IN ({$string_id})" ) ){ ?> <script type="text/javascript"> document.getElementById('ajax_working').innerHTML = '<div style=&quot;height:20px;width:100%;text-align:center;margin:15px auto;&quot;><?php debuge_error('Error during deleting booking at DB',__FILE__,__LINE__ ); ?></div>'; </script> <?php die(); }
63 }
64
65 }
66
67 return true;
68 }
69
70
71 /**
72 * Append one extra day after the currently last imported booking date.
73 *
74 * This is an opt-in extension for sites that want to block one additional day
75 * after the imported iCalendar checkout boundary.
76 *
77 * @param array $booking_dates Dates in MySQL format.
78 *
79 * @return array
80 */
81 function wpbm_ics_import_append_extra_checkout_day( $booking_dates ) {
82
83 if ( empty( $booking_dates ) || ! is_array( $booking_dates ) ) {
84 return $booking_dates;
85 }
86
87 $last_date = $booking_dates[ count( $booking_dates ) - 1 ];
88 $last_date = strtotime( $last_date );
89 $last_date = strtotime( '+1 day', $last_date );
90
91 $booking_dates[] = date_i18n( 'Y-m-d H:i:s', $last_date );
92
93 return $booking_dates;
94 }
95
96 ////////////////////////////////////////////////////////////////////////////////////////////
97 // I M P O R T
98 ////////////////////////////////////////////////////////////////////////////////////////////
99
100 /** Import ICS feed and create bookings .in Booking Calendar
101 *
102 * @param array $attr = array(
103 'url' => ''
104 , 'resource_id' => 1
105 , 'import_conditions' => '' | 'if_dates_free' // maybe rename ??? if_dates_booked_then_not_import
106 )
107 * @return int|bool number of imported bookings or FALSE if error
108 */
109 function wpbm_ics_import_start( $attr ) {
110
111 if ( ! wpbm_is_wpbc_supported() ) {
112 // echo 'Booking Manager require Booking Calendar 9.8 or newer';
113 return wpbm_ics_import_start_legacy( $attr );
114
115 }
116
117 // <editor-fold defaultstate="collapsed" desc=" Parse / validate parameters " >
118 /////////////////////////////////////////////////////////////////////
119 // Parse / validate parameters
120 /////////////////////////////////////////////////////////////////////
121 $defaults = array(
122 'url' => ''
123 , 'resource_id' => 1
124 , 'delete' => 0
125 , 'import_conditions' => ''
126 , 'from' => 'any' // 'today' // '00:00 today'
127 , 'from_offset' => ''
128 , 'until' => 'any' // 'year-end'
129 , 'until_offset' => ''
130 , 'max' => ''
131 , 'is_all_dates_in' => true // Conditional of Dates checking. TRUE - Remove event if al least 1 day not in conditional interval, FALSE - save event, if at leat one date in conditional interval
132 );
133 $shortcode = array();
134
135 foreach ( $attr as $param_name => $param_value ) {
136
137 switch ( $param_name) { // Validate Params
138
139 case 'url':
140 $shortcode[ $param_name ] = esc_url_raw( $param_value ); // $shortcode[ 'url' ]
141 $shortcode[ $param_name ] = str_replace( '&amp;', '&', $shortcode[ $param_name ] ); //FixIn: 2.0.14.2
142 break;
143
144 case 'import_conditions':
145 $shortcode[ $param_name ] = esc_attr( $param_value ); // $shortcode[ 'resource_id' ]
146 break;
147
148 case 'resource_id':
149 $shortcode[ $param_name ] = intval($param_value ); // $shortcode[ 'resource_id' ]
150 break;
151
152 case 'from': // 'now', 'today', 'week', 'month-start', 'month-end', 'year-start', 'any', 'date' = 2017-08-07
153 $shortcode[ $param_name ] = $param_value;
154 break;
155
156 case 'from_offset': // 5d, 10h, 5m, 30s -- if from: { 'now', 'today', 'week', 'month-start', 'month-end', 'year-start' }
157 $shortcode[ $param_name ] = $param_value;
158 break;
159
160 case 'until': // 'now', 'today', 'week', 'month-start', 'month-end', 'year-end', 'any', 'date' = 2017-08-07
161 $shortcode[ $param_name ] = $param_value;
162 break;
163
164 case 'until_offset': // 5d, 10h, 5m, 30s -- if until: { 'now', 'today', 'week', 'month-start', 'month-end', 'year-end' }
165 $shortcode[ $param_name ] = $param_value;
166 break;
167
168 case 'max':
169 $shortcode[ $param_name ] = intval( $param_value );
170 break;
171
172 case 'is_all_dates_in': // Conditional of Dates checking. TRUE - Remove event if al least 1 day not in conditional interval, FALSE - save event, if at leat one date in conditional interval
173 $shortcode[ $param_name ] = intval( $param_value );
174 break;
175
176
177 default:
178 $shortcode[ $param_name ] = $param_value;
179 break;
180 }
181 }
182 $shortcode = wp_parse_args( $shortcode, $defaults );
183 // </editor-fold>
184
185 // <editor-fold defaultstate="collapsed" desc=" Notice - Import Parameters | Error No URL" >
186
187 do_action( 'wpbc_show_debug', array( 'Import Parameters' , $shortcode ) ); // S_Y_S_T_E_M L_O_G
188
189 if ( empty( $shortcode[ 'url' ] ) ) {
190 do_action( 'wpbc_admin_show_top_notice', __( 'No ics url feed', 'booking-manager' ), 'error', 5000 ); // N_O_T_I_C_E in H_E_A_D_E_R
191 return false;
192 }
193 // </editor-fold>
194
195 ///////////////////////////////////////////////////////////////////// - Get, Parse ICS Feed
196
197 $ics_array = wpbm_ics_file_to_array( $shortcode[ 'url' ] );
198
199 // <editor-fold defaultstate="collapsed" desc=" Notice - feed contain N events | Error Importing " >
200 do_action( 'wpbc_show_debug', array( 'Imported data' , $ics_array) ); // S_Y_S_T_E_M L_O_G
201
202 // If Error
203 if ( is_wp_error( $ics_array ) ) {
204
205 $error_message = $ics_array->get_error_message();
206 do_action( 'wpbc_admin_show_top_notice', $error_message, 'error', 5000 ); // N_O_T_I_C_E in H_E_A_D_E_R
207 return false;
208 }
209
210 //FixIn: 2.0.7.3
211 $ics_array_events_num = 0;
212 if ( ( ! empty( $ics_array ) ) && ( ! empty( $ics_array[ 'events' ] ) ) && ( is_array( $ics_array[ 'events' ] ) ) ) {
213 $ics_array_events_num = count( $ics_array[ 'events' ] );
214 }
215 do_action( 'wpbc_admin_show_top_notice' // N_O_T_I_C_E in H_E_A_D_E_R
216 , sprintf ( __( '.ics feed contain %s events at URL %s', 'booking-manager' ), '<b>' . $ics_array_events_num . '</b>', '<b><a href="'. $shortcode[ 'url' ] .'">' . $shortcode[ 'url' ] . '</a></b>' )
217 , 'info', 5000 );
218 // </editor-fold>
219
220 if ( 'skip' != $shortcode['delete'] ) {
221 wpbm_delete_all_imported_bookings( array( 'resource_id' => $shortcode['resource_id'] ) ); //FixIn: 2.0.18.3 //FixIn: 2.0.10.3
222 }
223
224
225 $bk_array = array();
226 // Get Only '_BOOKING...' field from ICS array
227 if ( $ics_array !== false ) {
228 $bk_array = wpbm_get_booking_fields_from_ics_array( $ics_array[ 'events' ] );
229 }
230
231 do_action( 'wpbc_show_debug', array( 'Imported Events', $bk_array ) ); // S_Y_S_T_E_M L_O_G
232
233
234 //FixIn: 2.0.6.1 - Set timezone frrom Booking > Settings > Sync page for booking listing shortcode
235 $tzid = get_bk_option( 'booking_gcal_timezone' );
236 if ( ! empty( $tzid ) ) {
237 foreach ( $bk_array as $bk_k => $bk_ics_data_arr ) {
238
239
240 //apply our timezone from the Booking > Settings > Search page
241 foreach ( $bk_array[ $bk_k ]['_BOOKING_DATES'] as $dk => $day ) {
242 //$bk_array[ $bk_k ][ '_BOOKING_DATES' ][ $dk ] = ZDateHelper::toLocalDateTime( get_gmt_from_date( $day ), $tzid );
243
244 //FixIn: 2.0.7.4 - Skip adding Timezone to "middle" days, if days start with time 00:00:00 - its means event for full day, not the start/end time
245 // Apply timezone only to fist and last days in a list, if the change over days activated in the Booking Calendar
246 $ics_time_in_day = substr( $day, -8);
247 if ( '00:00:00' == $ics_time_in_day ) {
248 continue;
249 }
250 //FixIn: 2.0.7.4 - Skip adding Timezone to "middle" days, if Booking Calendar use change over days, to prevent of having clock icon in middle days.
251 if ( ( class_exists( 'wpdev_bk_biz_s' ) )
252 && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
253 && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
254 ) { //FixIn: 2.0.5.1
255 $days_number = count( $bk_array[ $bk_k ]['_BOOKING_DATES'] );
256 if ( ( 0 != $dk ) && ( ( $days_number - 1) != $dk ) ) {
257 continue;
258 }
259 // We are append one day to the booking, so skip this day for timezone, as well
260 if ( ( get_bk_option( 'booking_ics_import_append_checkout_day' ) !== 'Off' ) && ( ( $days_number - 1) == $dk ) ) {
261 continue;
262 }
263 }
264
265 $bk_array[ $bk_k ]['_BOOKING_DATES'][ $dk ] = ZDateHelper::toLocalDateTime( $day, $tzid );
266 }
267 }
268 }
269
270 ///////////////////////////////////////////////////////////////////// - Check if these EVENTS was imported before or NOT
271
272 $booking_ics_force_import = get_bk_option( 'booking_ics_force_import' ); //FixIn: 2.0.10.1
273 $booking_condition_import_only_new = get_bk_option( 'booking_condition_import_only_new' ); //FixIn: 9.8.15.8
274 if ( false === $booking_condition_import_only_new ) {
275 // OLD:
276 if ( 'On' !== $booking_ics_force_import ) {
277 $bk_array = wpbm_clear_events_from_exist_bookings( $bk_array );
278 }
279 } else {
280 // NEW
281 if ( 'On' === $booking_condition_import_only_new ) {
282 $bk_array = wpbm_clear_events_from_exist_bookings( $bk_array );
283 }
284 }
285
286
287 // <editor-fold defaultstate="collapsed" desc=" Notice - if events was imported previously | Already ALL Imported " >
288 do_action( 'wpbc_show_debug', array( 'Check, if events was imported previously. New events: ', $bk_array ) ); // S_Y_S_T_E_M L_O_G
289
290 if ( empty( $bk_array ) ) {
291
292 do_action( 'wpbc_admin_show_top_notice' // N_O_T_I_C_E in H_E_A_D_E_R
293 , '<strong>' . __( 'Warning', 'booking' ) . '!</strong> '
294 . sprintf( __( 'No any new events to import! These events was import previously, already.', 'booking-manager' ), '<strong>' . count( $bk_array ) . '</strong>' )
295 , 'warning', 3000 );
296 return 0;
297 }
298 // </editor-fold>
299
300
301 ///////////////////////////////////////////////////////////////////// - Skip events that does not fit to filter parameters: FROM - UNTIL
302
303 // Sort Events
304 $bk_array = wpbm_sort_events_by( $bk_array );
305
306 // Filter By Dates - "From - Until"
307 $bk_array = wpbm_clear_events_by_dates( $bk_array, $shortcode );
308
309 // Filter events by - "Max"
310 $bk_array = wpbm_clear_events_by_count( $bk_array, $shortcode );
311
312
313 // <editor-fold defaultstate="collapsed" desc=" Notice - Creation of N bookings " >
314 do_action( 'wpbc_admin_show_top_notice' // N_O_T_I_C_E in H_E_A_D_E_R
315 , sprintf( __( 'Imported of %s bookings', 'booking-manager' ), '<strong>' . count( $bk_array ) . '</strong>' )
316 , 'info', 3000 );
317
318 do_action( 'wpbc_show_debug', array( 'Create bookings after filtering', $bk_array ) ); // S_Y_S_T_E_M L_O_G
319 // </editor-fold>
320
321 ///////////////////////////////////////////////////////////////////// - Loop events > C r e a t e B o o k i n g s
322
323 // Get assigning fields for SUMMARY, DESCRIPTION, LOCATION
324 $assigned_fields_arr = WPBM_create_bookings_from_events::get_assigned_form_fields();
325
326 $booking_added_num = 0;
327
328 foreach ( $bk_array as $ics_event) {
329
330 //FixIn: 2.1.3
331 if (
332 ( 'On' == get_bk_option( 'booking_ics_import_append_checkout_day' ) )
333 || (
334 ( class_exists( 'wpdev_bk_biz_s' ) )
335 && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
336 && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
337 && ( count( $ics_event[ '_BOOKING_DATES' ] ) == 1 )
338 )
339 ) { //FixIn: 2.0.27.1 //FixIn: 9.5.4.1
340 // Add one additional day to .ics event (useful in some cases for bookings with change-over days), if the imported .ics dates is coming without check in/our times
341 // Later system is adding check in/out times from Booking Calendar to this event
342 $ics_event_check_out = $ics_event['_BOOKING_DATES'][ ( count( $ics_event['_BOOKING_DATES'] ) - 1 ) ];
343
344 //FixIn Start: 2.0.28.1 ------------------------------------------------------------------------------------
345 // Is check in/out dates in this event it's the same date
346 $test_check_in = substr( $ics_event['_BOOKING_DATES'][0], 0, 10 );
347 $test_check_out = substr( $ics_event['_BOOKING_DATES'][ ( count( $ics_event['_BOOKING_DATES'] ) - 1 ) ], 0, 10 );
348 if ( count( $ics_event['_BOOKING_DATES'] ) > 1 ) { //FixIn: 2.1.3
349 if ( $test_check_in === $test_check_out ) {
350 // It is the same date, like 2024-02-12 10:00:01, 2024-02-12 14:59:52, then remove this date, because we will add new date
351 unset( $ics_event['_BOOKING_DATES'][ ( count( $ics_event['_BOOKING_DATES'] ) - 1 ) ] );
352 // Important! Reindex array, after unset operation.
353 $ics_event['_BOOKING_DATES'] = array_values( $ics_event['_BOOKING_DATES'] );
354 } else {
355 // It is other date, in this case, we need to define other time:
356 $ics_event['_BOOKING_DATES'][ ( count( $ics_event['_BOOKING_DATES'] ) - 1 ) ] = $test_check_out . ' 00:00:00';
357 }
358 }
359 //FixIn End: 2.0.28.1 --------------------------------------------------------------------------------------
360
361 $ics_event_check_out = strtotime( $ics_event_check_out );
362 $ics_event_check_out = strtotime( '+1 day', $ics_event_check_out );
363 $ics_event_check_out = date_i18n( "Y-m-d H:i:s", $ics_event_check_out ); //FixIn: 2.0.28.1 //$ics_event_check_out = date_i18n( "Y-m-d 00:00:00", $ics_event_check_out );
364 $ics_event['_BOOKING_DATES'][] = $ics_event_check_out;
365
366 if (
367 ( 'On' === get_bk_option( 'booking_ics_import_append_checkout_day' ) )
368 && ( 'On' === get_bk_option( 'booking_ics_import_append_extra_checkout_day' ) )
369 ) {
370 $ics_event['_BOOKING_DATES'] = wpbm_ics_import_append_extra_checkout_day( $ics_event['_BOOKING_DATES'] );
371 }
372 }
373
374 $booking_data = array();
375
376 if ( ( class_exists( 'wpdev_bk_biz_s' ) )
377 && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
378 && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
379 && ( count( $ics_event[ '_BOOKING_DATES' ] ) > 1 )
380 ) {
381 $dates_formats = array_fill( 0, count( $ics_event[ '_BOOKING_DATES' ] ), "Y-m-d" ); // Array ( [0] => Y-m-d [1] => Y-m-d ... )
382 } else {
383 $dates_formats = array_fill( 0, count( $ics_event[ '_BOOKING_DATES' ] ), "Y-m-d H:i:s" ); //FixIn: 2.0.15.4
384 }
385 $booking_dates_unix = array_map( 'strtotime', $ics_event[ '_BOOKING_DATES' ] ); // Array ( [0] => 1498262400 [1] => 1498348800 )
386 $simple_booking_dates = array_map( 'date_i18n', $dates_formats , $booking_dates_unix ); // Array ( '2017-06-23', '2017-06-24', '2017-06-25', '2017-06-26' )
387
388
389 //Add check in/out times to full day events //FixIn: 8.1.3.29
390 if ( ( class_exists( 'wpdev_bk_biz_s' ) )
391 && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
392 && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
393 ) { //FixIn: 2.0.5.1
394
395 if ( ( is_array( $simple_booking_dates ) ) && ( count( $simple_booking_dates ) > 1 ) ) { //FixIn: 2.0.10.4
396 $wpbc_check_in = ' ' . get_bk_option( 'booking_range_selection_start_time') . ':01'; // ' 14:00:01'
397 $wpbc_check_out = ' ' . get_bk_option( 'booking_range_selection_end_time') . ':02'; // ' 10:00:02';
398 $simple_booking_dates[0] = $simple_booking_dates[0] . $wpbc_check_in;
399 $simple_booking_dates[ ( count( $simple_booking_dates ) - 1 ) ] = $simple_booking_dates[ ( count( $simple_booking_dates ) - 1 ) ] . $wpbc_check_out;
400 $ics_event['_BOOKING_DATES'][0] = $simple_booking_dates[0];
401 $ics_event['_BOOKING_DATES'][ ( count( $simple_booking_dates ) - 1 ) ] = $simple_booking_dates[ ( count( $simple_booking_dates ) - 1 ) ];
402 }
403 }
404
405
406 WPBM_create_bookings_from_events::set_ics_dates( $ics_event[ '_BOOKING_DATES' ] );
407
408 $booking = array(
409 'dates' => $simple_booking_dates // array( '2017-06-24', '2017-06-24', '2017-06-25', '2017-06-26' )
410 , 'data' => array()
411 , 'resource_id' => $shortcode[ 'resource_id' ]
412 );
413
414
415 $bk_data = array();
416 foreach ( $assigned_fields_arr as $assigned_field ) {
417
418 switch ( $assigned_field[ 'ics_field_name' ] ) {
419
420 case 'title':
421 $bk_data [ $assigned_field[ 'name' ] ]= array( 'type' => $assigned_field[ 'type' ], 'value' => trim( $ics_event[ '_BOOKING_SUMMARY' ] ) );
422 break;
423
424 case 'description':
425 $bk_data [ $assigned_field[ 'name' ] ]= array( 'type' => $assigned_field[ 'type' ], 'value' => trim( $ics_event[ '_BOOKING_DESCRIPTION' ] ) );
426 break;
427
428 case 'where':
429 $bk_data [ $assigned_field[ 'name' ] ]= array( 'type' => $assigned_field[ 'type' ], 'value' => trim( $ics_event[ '_BOOKING_LOCATION' ] ) );
430 break;
431
432 default:
433 break;
434 }
435 }
436
437 // Email
438 $email = 'blank@wpbookingmanager.com'; //get_option ( 'admin_email' );
439 if ( ! empty( $ics_event['_BOOKING_ATTENDEE'] ) ) {
440 $email = str_replace( 'mailto:', '', $ics_event['_BOOKING_ATTENDEE'] );
441 if ( ! is_email( $email ) ) {
442 $email = 'blank@wpbookingmanager.com';
443 }
444 }
445 $bk_data [ 'email' ] = array( 'value' => $email, 'type' => 'email' );
446
447 // Optional Start and End times
448 $start_time = substr( $ics_event[ '_BOOKING_DATES' ][ 0 ], 11 );
449 $end_time = $ics_event[ '_BOOKING_DATES' ][ ( count( $ics_event[ '_BOOKING_DATES' ] ) - 1 ) ];
450 $end_time = substr( $end_time, 11 );
451
452 // Convert times H:i:s to seconds +1 +2 seconds and convert back to H:i -----------------------------------
453 $in_seconds = wpbc_transform__24_hours_his__in__seconds( $start_time );
454 $is_check_in_out__or_full = $in_seconds % 10; // 0, 1, 2
455 if ( 1 === $is_check_in_out__or_full ) {
456 $in_seconds = $in_seconds - 1;
457 }
458 $start_time = wpbc_transform__seconds__in__24_hours_his( $in_seconds );
459 $start_time = substr( $start_time, 0, 5 );
460
461 $in_seconds = wpbc_transform__24_hours_his__in__seconds( $end_time );
462 $is_check_in_out__or_full = $in_seconds % 10; // 0, 1, 2
463 if ( 2 === $is_check_in_out__or_full ) {
464 $in_seconds = $in_seconds + 8;
465 }
466 $end_time = wpbc_transform__seconds__in__24_hours_his( $in_seconds );
467 $end_time = substr( $end_time, 0, 5 );
468 // -------------------------------------------------------------------------------------------------------------
469
470 //Add check in/out times //FixIn: 8.1.3.29
471 if ( ( class_exists( 'wpdev_bk_biz_s' ) )
472 && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
473 && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
474 ){ //FixIn: 2.0.5.1
475
476 $start_time = get_bk_option( 'booking_range_selection_start_time' ); // ' 14:00'
477 $end_time = get_bk_option( 'booking_range_selection_end_time' ); // ' 10:00'
478 }
479
480
481 if ( ( $start_time !== '00:00' ) || ( $end_time !== '00:00' ) ) {
482 $bk_data [ 'rangetime' ] = array( 'value' => $start_time . ' - ' . $end_time, 'type' => 'select-one' );
483 }
484
485 $booking['data'] = $bk_data;
486
487 $additional_params = array( 'sync_gid' => $ics_event['_BOOKING_UID'], 'is_send_emeils' => 0 ); //FixIn: 2.0.10.2
488
489 /**
490 *
491 *
492 // $ics_event[ '_BOOKING_DATES' ]; // array ( [0] => 2014-09-16 05:00:01 [1] => 2014-09-16 12:00:02 )
493 // $ics_event[ '_BOOKING_SUMMARY' ]; // Event (timezone Pacific GMT-07:00)
494 // $ics_event[ '_BOOKING_DESCRIPTION' ]; // 8/7/2017 1:00pm TO 3:30pm 8/8/2017 (GMT-07:00) Pacific Time
495 // $ics_event[ '_BOOKING_LOCATION' ]; // Pacific Coast Highway, Pacific Coast Hwy, Los Angeles, CA, USA
496 // $ics_event[ '_BOOKING_UID' ]; // 5t3ogfsb3tqj09po7fiou6hh60@google.com
497 // $ics_event[ '_BOOKING_MODIFIED' ]; // 2017-06-28 10:12:35
498 */
499
500 add_filter( 'wpbc_get_insert_sql_for_dates', 'wpbm_get_insert_sql_for_dates', 10, 5 );
501
502
503 if ( ( function_exists( 'get_bk_option' ) ) && ( get_bk_option( 'booking_auto_approve_bookings_when_import' ) == 'On' ) ) {
504 $additional_params ['is_approve_booking'] = 1;
505 }
506
507
508 // Check dates availability and process only if dates available in specific booking resource!
509 if (
510 ( $shortcode[ 'import_conditions' ] == 'if_dates_free' )
511 || ( 'On' == get_bk_option( 'booking_condition_import_if_available' ) ) //FixIn: 9.8.15.8 - 'Import only, if days are available'
512 ) { //FixIn: 2.0.15.2
513
514 $is_dates_booked = wpbc_api_is_dates_booked( $ics_event['_BOOKING_DATES'], $booking['resource_id']
515 , array(
516 'is_use_booking_recurrent_time' => false // If we import bookings, all the times defined in dates, so no need to use it
517 )
518 );
519 } else{
520 $is_dates_booked = false;
521 $additional_params['save_booking_even_if_unavailable'] = 1;
522 }
523 // $additional_params['is_use_booking_recurrent_time'] = false; // FixIn: 2.1.17.1.
524 $additional_params['is_use_booking_recurrent_time'] = ( 'On' === get_bk_option( 'booking_recurrent_time' ) );
525
526 if ( ! $is_dates_booked ) {
527
528 $booking_id = wpbc_api_booking_add_new( $booking[ 'dates' ], $booking[ 'data' ], $booking[ 'resource_id' ] , $additional_params );
529
530 if ( ( is_int( $booking_id ) ) && ( $booking_id > 0 ) ) {
531
532 $booking_added_num++;
533
534 // Add notes to the booking relative source of imported booking // FixIn: 2.0.7.2
535 $import_url = parse_url( $shortcode[ 'url' ] );
536 if (
537 ( false !== $import_url )
538 && ( ! empty( $import_url[ "host" ]))
539 && ( class_exists('wpdev_bk_personal') )
540 ){
541 $remark_text = '[' . date_i18n( 'Y-m-d H:i:s' ) . '] ' . sprintf( __( 'Imported from %s ', 'booking-manager' ), $import_url["host"] );
542 $remark_text = str_replace( '%', '&#37;', $remark_text );
543 $remark_text = str_replace( array( '"', "'" ), '', $remark_text );
544 $remark_text = trim( $remark_text );
545
546 $is_append = true;
547 make_bk_action( 'wpdev_make_update_of_remark', $booking_id, $remark_text, $is_append );
548 }
549
550 do_action( 'wpbc_show_debug', sprintf ( 'Added new booking ID:<strong>%d</strong> ', $booking_id ) ); // S_Y_S_T_E_M L_O_G
551 }
552
553 if ( is_wp_error( $booking_id ) ) {
554 do_action( 'wpbc_show_debug', implode( ' ', $booking_id->get_error_messages()) );
555
556 do_action( 'wpbc_admin_show_top_notice' // N_O_T_I_C_E in H_E_A_D_E_R
557 , implode( ' ', $booking_id->get_error_messages())
558 , 'warning', 30000 );
559 }
560
561 } else {
562
563 do_action( 'wpbc_show_debug', // S_Y_S_T_E_M L_O_G
564 sprintf ( 'Event was not create becausse dates %s already booked in booking resource ID = %d'
565 , implode( ', ', $booking[ 'dates' ] ) , $booking[ 'resource_id' ] ) );
566 }
567
568 remove_filter( 'wpbc_get_insert_sql_for_dates', 'wpbm_get_insert_sql_for_dates', 10 );
569
570
571 // Remove previously saved dates to our 'Static' class.
572 WPBM_create_bookings_from_events::erase_ics_dates();
573 }
574
575 return $booking_added_num;
576 }
577 add_action( 'wpbm_ics_import_start', 'wpbm_ics_import_start', 10, 1 );
578
579
580 // Legacy Import
581
582 /** Import ICS feed and create bookings .in Booking Calendar
583 *
584 * @param array $attr = array(
585 'url' => ''
586 , 'resource_id' => 1
587 , 'import_conditions' => '' | 'if_dates_free' // maybe rename ??? if_dates_booked_then_not_import
588 )
589 * @return int|bool number of imported bookings or FALSE if error
590 */
591 function wpbm_ics_import_start_legacy( $attr ) {
592
593 // <editor-fold defaultstate="collapsed" desc=" Parse / validate parameters " >
594 /////////////////////////////////////////////////////////////////////
595 // Parse / validate parameters
596 /////////////////////////////////////////////////////////////////////
597 $defaults = array(
598 'url' => ''
599 , 'resource_id' => 1
600 , 'delete' => 0
601 , 'import_conditions' => ''
602 , 'from' => 'any' // 'today' // '00:00 today'
603 , 'from_offset' => ''
604 , 'until' => 'any' // 'year-end'
605 , 'until_offset' => ''
606 , 'max' => ''
607 , 'is_all_dates_in' => true // Conditional of Dates checking. TRUE - Remove event if al least 1 day not in conditional interval, FALSE - save event, if at leat one date in conditional interval
608 );
609 $shortcode = array();
610
611 foreach ( $attr as $param_name => $param_value ) {
612
613 switch ( $param_name) { // Validate Params
614
615 case 'url':
616 $shortcode[ $param_name ] = esc_url_raw( $param_value ); // $shortcode[ 'url' ]
617 $shortcode[ $param_name ] = str_replace( '&amp;', '&', $shortcode[ $param_name ] ); //FixIn: 2.0.14.2
618 break;
619
620 case 'import_conditions':
621 $shortcode[ $param_name ] = esc_attr( $param_value ); // $shortcode[ 'resource_id' ]
622 break;
623
624 case 'resource_id':
625 $shortcode[ $param_name ] = intval($param_value ); // $shortcode[ 'resource_id' ]
626 break;
627
628 case 'from': // 'now', 'today', 'week', 'month-start', 'month-end', 'year-start', 'any', 'date' = 2017-08-07
629 $shortcode[ $param_name ] = $param_value;
630 break;
631
632 case 'from_offset': // 5d, 10h, 5m, 30s -- if from: { 'now', 'today', 'week', 'month-start', 'month-end', 'year-start' }
633 $shortcode[ $param_name ] = $param_value;
634 break;
635
636 case 'until': // 'now', 'today', 'week', 'month-start', 'month-end', 'year-end', 'any', 'date' = 2017-08-07
637 $shortcode[ $param_name ] = $param_value;
638 break;
639
640 case 'until_offset': // 5d, 10h, 5m, 30s -- if until: { 'now', 'today', 'week', 'month-start', 'month-end', 'year-end' }
641 $shortcode[ $param_name ] = $param_value;
642 break;
643
644 case 'max':
645 $shortcode[ $param_name ] = intval( $param_value );
646 break;
647
648 case 'is_all_dates_in': // Conditional of Dates checking. TRUE - Remove event if al least 1 day not in conditional interval, FALSE - save event, if at leat one date in conditional interval
649 $shortcode[ $param_name ] = intval( $param_value );
650 break;
651
652
653 default:
654 $shortcode[ $param_name ] = $param_value;
655 break;
656 }
657 }
658 $shortcode = wp_parse_args( $shortcode, $defaults );
659 // </editor-fold>
660
661 //debuge($shortcode);
662 // <editor-fold defaultstate="collapsed" desc=" Notice - Import Parameters | Error No URL" >
663
664 do_action( 'wpbc_show_debug', array( 'Import Parameters' , $shortcode ) ); // S_Y_S_T_E_M L_O_G
665
666 if ( empty( $shortcode[ 'url' ] ) ) {
667 do_action( 'wpbc_admin_show_top_notice', __( 'No ics url feed', 'booking-manager' ), 'error', 5000 ); // N_O_T_I_C_E in H_E_A_D_E_R
668 return false;
669 }
670 // </editor-fold>
671
672 ///////////////////////////////////////////////////////////////////// - Get, Parse ICS Feed
673
674 $ics_array = wpbm_ics_file_to_array( $shortcode[ 'url' ] );
675
676 // <editor-fold defaultstate="collapsed" desc=" Notice - feed contain N events | Error Importing " >
677 do_action( 'wpbc_show_debug', array( 'Imported data' , $ics_array) ); // S_Y_S_T_E_M L_O_G
678
679 // If Error
680 if ( is_wp_error( $ics_array ) ) {
681
682 $error_message = $ics_array->get_error_message();
683 do_action( 'wpbc_admin_show_top_notice', $error_message, 'error', 5000 ); // N_O_T_I_C_E in H_E_A_D_E_R
684 return false;
685 }
686
687 //FixIn: 2.0.7.3
688 $ics_array_events_num = 0;
689 if ( ( ! empty( $ics_array ) ) && ( ! empty( $ics_array[ 'events' ] ) ) && ( is_array( $ics_array[ 'events' ] ) ) ) {
690 $ics_array_events_num = count( $ics_array[ 'events' ] );
691 }
692 do_action( 'wpbc_admin_show_top_notice' // N_O_T_I_C_E in H_E_A_D_E_R
693 , sprintf ( __( '.ics feed contain %s events at URL %s', 'booking-manager' ), '<b>' . $ics_array_events_num . '</b>', '<b><a href="'. $shortcode[ 'url' ] .'">' . $shortcode[ 'url' ] . '</a></b>' )
694 , 'info', 5000 );
695 // </editor-fold>
696
697 //FixIn: 2.0.18.3
698 if ( 'skip' != $shortcode['delete'] ) {
699 wpbm_delete_all_imported_bookings( array( 'resource_id' => $shortcode['resource_id'] ) ); //FixIn: 2.0.10.3
700 }
701
702 $bk_array = array();
703 // Get Only '_BOOKING...' field from ICS array
704 if ( $ics_array !== false ) {
705 $bk_array = wpbm_get_booking_fields_from_ics_array( $ics_array[ 'events' ] );
706 }
707
708 do_action( 'wpbc_show_debug', array( 'Imported Events', $bk_array ) ); // S_Y_S_T_E_M L_O_G
709
710
711 //FixIn: 2.0.6.1 - Set timezone frrom Booking > Settings > Sync page for booking listing shortcode
712 $tzid = get_bk_option( 'booking_gcal_timezone' );
713 if ( ! empty( $tzid ) ) {
714 foreach ( $bk_array as $bk_k => $bk_ics_data_arr ) {
715
716
717 //apply our timezone from the Booking > Settings > Search page
718 foreach ( $bk_array[ $bk_k ]['_BOOKING_DATES'] as $dk => $day ) {
719 //$bk_array[ $bk_k ][ '_BOOKING_DATES' ][ $dk ] = ZDateHelper::toLocalDateTime( get_gmt_from_date( $day ), $tzid );
720
721 //FixIn: 2.0.7.4 - Skip adding Timezone to "middle" days, if days start with time 00:00:00 - its means event for full day, not the start/end time
722 // Apply timezone only to fist and last days in a list, if the change over days activated in the Booking Calendar
723 $ics_time_in_day = substr( $day, -8);
724 if ( '00:00:00' == $ics_time_in_day ) {
725 continue;
726 }
727 //FixIn: 2.0.7.4 - Skip adding Timezone to "middle" days, if Booking Calendar use change over days, to prevent of having clock icon in middle days.
728 if ( ( class_exists( 'wpdev_bk_biz_s' ) )
729 && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
730 && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
731 ) { //FixIn: 2.0.5.1
732 $days_number = count( $bk_array[ $bk_k ]['_BOOKING_DATES'] );
733 if ( ( 0 != $dk ) && ( ( $days_number - 1) != $dk ) ) {
734 continue;
735 }
736 // We are append one day to the booking, so skip this day for timezone, as well
737 if ( ( get_bk_option( 'booking_ics_import_append_checkout_day' ) !== 'Off' ) && ( ( $days_number - 1) == $dk ) ) {
738 continue;
739 }
740 }
741
742 $bk_array[ $bk_k ]['_BOOKING_DATES'][ $dk ] = ZDateHelper::toLocalDateTime( $day, $tzid );
743 }
744 }
745 }
746
747 ///////////////////////////////////////////////////////////////////// - Check if these EVENTS was imported before or NOT
748
749 $booking_ics_force_import = get_bk_option( 'booking_ics_force_import' ); //FixIn: 2.0.10.1
750 $booking_condition_import_only_new = get_bk_option( 'booking_condition_import_only_new' ); //FixIn: 9.8.15.8
751 if ( false === $booking_condition_import_only_new ) {
752 // OLD:
753 if ( 'On' !== $booking_ics_force_import ) {
754 $bk_array = wpbm_clear_events_from_exist_bookings( $bk_array );
755 }
756 } else {
757 // NEW:
758 if ( 'On' === $booking_condition_import_only_new ) {
759 $bk_array = wpbm_clear_events_from_exist_bookings( $bk_array );
760 }
761 }
762
763 // <editor-fold defaultstate="collapsed" desc=" Notice - if events was imported previously | Already ALL Imported " >
764 do_action( 'wpbc_show_debug', array( 'Check, if events was imported previously. New events: ', $bk_array ) ); // S_Y_S_T_E_M L_O_G
765
766 if ( empty( $bk_array ) ) {
767
768 do_action( 'wpbc_admin_show_top_notice' // N_O_T_I_C_E in H_E_A_D_E_R
769 , '<strong>' . __( 'Warning', 'booking' ) . '!</strong> '
770 . sprintf( __( 'No any new events to import! These events was import previously, already.', 'booking-manager' ), '<strong>' . count( $bk_array ) . '</strong>' )
771 , 'warning', 3000 );
772 return 0;
773 }
774 // </editor-fold>
775
776
777 ///////////////////////////////////////////////////////////////////// - Skip events that does not fit to filter parameters: FROM - UNTIL
778
779 // $bk_array = wpbm_clear_events_by_dates( $bk_array, $shortcode );
780
781
782 // Sort Events
783 $bk_array = wpbm_sort_events_by( $bk_array );
784
785 // Filter By Dates - "From - Until"
786 $bk_array = wpbm_clear_events_by_dates( $bk_array, $shortcode );
787
788 // Filter events by - "Max"
789 $bk_array = wpbm_clear_events_by_count( $bk_array, $shortcode );
790
791
792 // <editor-fold defaultstate="collapsed" desc=" Notice - Creation of N bookings " >
793 do_action( 'wpbc_admin_show_top_notice' // N_O_T_I_C_E in H_E_A_D_E_R
794 , sprintf( __( 'Imported of %s bookings', 'booking-manager' ), '<strong>' . count( $bk_array ) . '</strong>' )
795 , 'info', 3000 );
796
797 do_action( 'wpbc_show_debug', array( 'Create bookings after filtering', $bk_array ) ); // S_Y_S_T_E_M L_O_G
798 // </editor-fold>
799
800 ///////////////////////////////////////////////////////////////////// - Loop events > C r e a t e B o o k i n g s
801
802 // Get assigning fields for SUMMARY, DESCRIPTION, LOCATION
803 $assigned_fields_arr = WPBM_create_bookings_from_events::get_assigned_form_fields();
804
805 $booking_added_num = 0;
806
807 foreach ( $bk_array as $ics_event) {
808
809 //FixIn: 2.0.5.2
810 //FixIn: 8.1.3.29
811 // if ( ( class_exists( 'wpdev_bk_biz_s' ) )
812 // && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
813 // && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
814 // && ( get_bk_option( 'booking_ics_import_append_checkout_day' ) !== 'Off' )
815 // ) {
816 if ( 'On' == get_bk_option( 'booking_ics_import_append_checkout_day' ) ) { //FixIn: 2.0.27.1 //FixIn: 9.5.4.1
817 // Add one additional day to .ics event (useful in some cases for bookings with change-over days), if the imported .ics dates is coming without check in/our times
818 // Later system is adding check in/out times from Booking Calendar to this event
819 $ics_event_check_out = $ics_event['_BOOKING_DATES'][ ( count( $ics_event['_BOOKING_DATES'] ) - 1 ) ];
820
821 //FixIn Start: 2.0.28.1 ------------------------------------------------------------------------------------
822 // Is check in/out dates in this event it's the same date
823 $test_check_in = substr( $ics_event['_BOOKING_DATES'][0], 0, 10 );
824 $test_check_out = substr( $ics_event['_BOOKING_DATES'][ ( count( $ics_event['_BOOKING_DATES'] ) - 1 ) ], 0, 10 );
825 if ( $test_check_in === $test_check_out ) {
826 // It is the same date, like 2024-02-12 10:00:01, 2024-02-12 14:59:52, then remove this date, because we will add new date
827 unset( $ics_event['_BOOKING_DATES'][ ( count( $ics_event['_BOOKING_DATES'] ) - 1 ) ] );
828 // Important! Reindex array, after unset operation.
829 $ics_event['_BOOKING_DATES'] = array_values( $ics_event['_BOOKING_DATES'] );
830 } else {
831 // It is other date, in this case, we need to define other time:
832 $ics_event['_BOOKING_DATES'][ ( count( $ics_event['_BOOKING_DATES'] ) - 1 ) ] = $test_check_out . ' 00:00:00';
833 }
834 //FixIn End: 2.0.28.1 --------------------------------------------------------------------------------------
835
836 $ics_event_check_out = strtotime( $ics_event_check_out );
837 $ics_event_check_out = strtotime( '+1 day', $ics_event_check_out );
838 $ics_event_check_out = date_i18n( "Y-m-d H:i:s", $ics_event_check_out ); //FixIn: 2.0.28.1 //$ics_event_check_out = date_i18n( "Y-m-d 00:00:00", $ics_event_check_out );
839 $ics_event['_BOOKING_DATES'][] = $ics_event_check_out;
840
841 if (
842 ( 'On' === get_bk_option( 'booking_ics_import_append_checkout_day' ) )
843 && ( 'On' === get_bk_option( 'booking_ics_import_append_extra_checkout_day' ) )
844 ) {
845 $ics_event['_BOOKING_DATES'] = wpbm_ics_import_append_extra_checkout_day( $ics_event['_BOOKING_DATES'] );
846 }
847 }
848
849 $booking_data = array();
850
851 if ( ( class_exists( 'wpdev_bk_biz_s' ) )
852 && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
853 && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
854 && ( count( $ics_event[ '_BOOKING_DATES' ] ) > 1 )
855 ) {
856 $dates_formats = array_fill( 0, count( $ics_event[ '_BOOKING_DATES' ] ), "Y-m-d" ); // Array ( [0] => Y-m-d [1] => Y-m-d ... )
857 } else {
858 $dates_formats = array_fill( 0, count( $ics_event[ '_BOOKING_DATES' ] ), "Y-m-d H:i:s" ); //FixIn: 2.0.15.4
859 }
860 $booking_dates_unix = array_map( 'strtotime', $ics_event[ '_BOOKING_DATES' ] ); // Array ( [0] => 1498262400 [1] => 1498348800 )
861 $simple_booking_dates = array_map( 'date_i18n', $dates_formats , $booking_dates_unix ); // Array ( '2017-06-23', '2017-06-24', '2017-06-25', '2017-06-26' )
862
863
864 //FixIn: 8.1.3.29
865 if ( ( class_exists( 'wpdev_bk_biz_s' ) )
866 && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
867 && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
868 ) { //FixIn: 2.0.5.1
869 //Add check in/out times to full day events
870 if ( ( is_array( $simple_booking_dates ) ) && ( count( $simple_booking_dates ) > 1 ) ) { //FixIn: 2.0.10.4
871 $wpbc_check_in = ' ' . get_bk_option( 'booking_range_selection_start_time') . ':01'; // ' 14:00:01'
872 $wpbc_check_out = ' ' . get_bk_option( 'booking_range_selection_end_time') . ':02'; // ' 10:00:02';
873 $simple_booking_dates[0] = $simple_booking_dates[0] . $wpbc_check_in;
874 $simple_booking_dates[ ( count( $simple_booking_dates ) - 1 ) ] = $simple_booking_dates[ ( count( $simple_booking_dates ) - 1 ) ] . $wpbc_check_out;
875 $ics_event['_BOOKING_DATES'][0] = $simple_booking_dates[0];
876 $ics_event['_BOOKING_DATES'][ ( count( $simple_booking_dates ) - 1 ) ] = $simple_booking_dates[ ( count( $simple_booking_dates ) - 1 ) ];
877 }
878 }
879
880 //debuge($ics_event[ '_BOOKING_DATES' ]);die;
881 // Tempoary save our dates
882
883 // if( count( $ics_event['_BOOKING_DATES'] ) > 2 ) {
884 // unset( $ics_event['_BOOKING_DATES'][ ( count( $ics_event['_BOOKING_DATES'] ) - 1 ) ] ); //Remove last imported date
885 // if ( count( $ics_event['_BOOKING_DATES'] ) > 2 ) { // Add one date if number of days in booking more than 2
886 // $ics_event['_BOOKING_DATES'][ ( count( $ics_event['_BOOKING_DATES'] ) - 1 ) ] = $simple_booking_dates[ ( count( $ics_event['_BOOKING_DATES'] ) - 1 ) ] . $wpbc_check_out;
887 // } else if ( count( $ics_event['_BOOKING_DATES'] ) == 1 ) { // Add one date, if we are having only 1 day in booking (previously was having 2 dates
888 // $ics_event['_BOOKING_DATES'][] = $simple_booking_dates[ ( count( $ics_event['_BOOKING_DATES'] ) - 1 ) ] . $wpbc_check_out;
889 // }
890 // }
891 WPBM_create_bookings_from_events::set_ics_dates( $ics_event[ '_BOOKING_DATES' ] );
892
893 $booking = array(
894 'dates' => $simple_booking_dates // array( '2017-06-24', '2017-06-24', '2017-06-25', '2017-06-26' )
895 , 'data' => array()
896 , 'resource_id' => $shortcode[ 'resource_id' ]
897 );
898
899
900 $bk_data = array();
901 foreach ( $assigned_fields_arr as $assigned_field ) {
902
903 switch ( $assigned_field[ 'ics_field_name' ] ) {
904
905 case 'title':
906 $bk_data [ $assigned_field[ 'name' ] ]= array( 'type' => $assigned_field[ 'type' ], 'value' => trim( $ics_event[ '_BOOKING_SUMMARY' ] ) );
907 break;
908
909 case 'description':
910 $bk_data [ $assigned_field[ 'name' ] ]= array( 'type' => $assigned_field[ 'type' ], 'value' => trim( $ics_event[ '_BOOKING_DESCRIPTION' ] ) );
911 break;
912
913 case 'where':
914 $bk_data [ $assigned_field[ 'name' ] ]= array( 'type' => $assigned_field[ 'type' ], 'value' => trim( $ics_event[ '_BOOKING_LOCATION' ] ) );
915 break;
916
917 default:
918 break;
919 }
920 }
921
922 // Email
923 $home_url = explode( '://', home_url() );
924 //if (count($home_url>0)) //FixIn: 2.0.3.2
925 // $email = 'ics@' . $home_url[1];
926 //else
927 $email = get_option ( 'admin_email' );
928 $bk_data [ 'email' ] = array( 'value' => $email, 'type' => 'email' );
929
930 // Optional Start and End times
931 $start_time = substr( $ics_event[ '_BOOKING_DATES' ][ 0 ], 11, 5 );
932 $end_time = $ics_event[ '_BOOKING_DATES' ][ ( count( $ics_event[ '_BOOKING_DATES' ] ) - 1 ) ];
933 $end_time = substr( $end_time, 11, 5 );
934
935 //FixIn: 8.1.3.29
936 if ( ( class_exists( 'wpdev_bk_biz_s' ) )
937 && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
938 && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
939 ){ //FixIn: 2.0.5.1
940 //Add check in/out times
941 $start_time = get_bk_option( 'booking_range_selection_start_time' ); // ' 14:00'
942 $end_time = get_bk_option( 'booking_range_selection_end_time' ); // ' 10:00'
943 }
944
945
946 if ( ( $start_time !== '00:00' ) || ( $end_time !== '00:00' ) ) {
947 $bk_data [ 'rangetime' ] = array( 'value' => $start_time . ' - ' . $end_time, 'type' => 'select-one' );
948 }
949
950 $booking['data'] = $bk_data;
951
952 $additional_params = array( 'sync_gid' => $ics_event['_BOOKING_UID'], 'is_send_emeils' => 0 ); //FixIn: 2.0.10.2
953
954 /**
955 // $ics_event[ '_BOOKING_DATES' ]; // array ( [0] => 2014-09-16 05:00:01 [1] => 2014-09-16 12:00:02 )
956 // $ics_event[ '_BOOKING_SUMMARY' ]; // Event (timezone Pacific GMT-07:00)
957 // $ics_event[ '_BOOKING_DESCRIPTION' ]; // 8/7/2017 1:00pm TO 3:30pm 8/8/2017 (GMT-07:00) Pacific Time
958 // $ics_event[ '_BOOKING_LOCATION' ]; // Pacific Coast Highway, Pacific Coast Hwy, Los Angeles, CA, USA
959 // $ics_event[ '_BOOKING_UID' ]; // 5t3ogfsb3tqj09po7fiou6hh60@google.com
960 // $ics_event[ '_BOOKING_MODIFIED' ]; // 2017-06-28 10:12:35
961 */
962
963 add_filter( 'wpbc_get_insert_sql_for_dates', 'wpbm_get_insert_sql_for_dates', 10, 5 );
964
965 // Do not overupdate "child booking resources" when saving bookings to parent booking resource. Just skip this checking
966 add_filter( 'wpbc_is_reupdate_dates_to_child_resources', 'wpbm_is_reupdate_dates_to_child_resources', 10, 7 );
967
968 // Check dates availability and process
969 // only if dates available in specific booking resource!
970 if (
971 ( $shortcode[ 'import_conditions' ] == 'if_dates_free' )
972 || ( 'On' == get_bk_option( 'booking_condition_import_if_available' ) ) //FixIn: 9.8.15.8 - 'Import only, if days are available'
973 ){
974 $is_dates_booked = wpbc_api_is_dates_booked( $ics_event['_BOOKING_DATES'], $booking['resource_id'] ); //FixIn: 2.0.15.2
975 //$is_dates_booked = wpbc_api_is_dates_booked( $booking['dates'], $booking['resource_id'] );
976 } else{
977 $is_dates_booked = false;
978 }
979
980
981 if ( ! $is_dates_booked ) {
982
983 $booking_id = wpbc_api_booking_add_new( $booking[ 'dates' ], $booking[ 'data' ], $booking[ 'resource_id' ] , $additional_params );
984 $booking_added_num++;
985
986 //if ( ( defined( 'WP_BK_AUTO_APPROVE_WHEN_IMPORT_GCAL' ) ) && ( WP_BK_AUTO_APPROVE_WHEN_IMPORT_GCAL ) ){ // Auto approve booking if imported
987 if ( ( function_exists( 'get_bk_option' )) && ( get_bk_option( 'booking_auto_approve_bookings_when_import' ) == 'On' ) ) { //FixIn: 8.1.3.27
988 // Auto approve booking, when imported. //FixIn:7.0.1.59
989 global $wpdb;
990 if ( false === $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}bookingdates SET approved = %s WHERE booking_id IN ({$booking_id})", '1' ) ) ){
991 ?> <script type="text/javascript">
992 var my_message = '<?php echo html_entity_decode( esc_js( get_debuge_error('Error during updating to DB' ,__FILE__,__LINE__) ),ENT_QUOTES) ; ?>';
993 wpbc_admin_show_message( my_message, 'error', 30000 );
994 </script> <?php
995 die();
996 }
997 }
998
999 //FixIn: 2.0.7.2 - add notes to the booking relative source of imported booking
1000 $import_url = parse_url( $shortcode[ 'url' ] );
1001 if ( ( false !== $import_url ) && ( ! empty( $import_url[ "host" ])) && ( class_exists('wpdev_bk_personal') ) ) {
1002
1003 $remark_text = str_replace('%','&#37;', '[' . date_i18n('Y-m-d H:i:s') . '] ' . sprintf( __( 'Imported from %s ', 'booking-manager'), $import_url[ "host" ] ) );
1004 $my_remark = str_replace( array( '"', "'" ),'',$remark_text);
1005 $my_remark = trim( $my_remark );
1006
1007 global $wpdb;
1008
1009 $update_sql = $wpdb->prepare( "UPDATE {$wpdb->prefix}booking AS bk SET bk.remark= %s WHERE bk.booking_id= %d ", $remark_text, $booking_id );
1010 if ( false === $wpdb->query( $update_sql ) ) {
1011 ?> <script type="text/javascript">
1012 var my_message = '<?php echo html_entity_decode( esc_js( get_debuge_error('Error during updating notes in DB' ,__FILE__,__LINE__) ),ENT_QUOTES) ; ?>';
1013 wpbc_admin_show_message( my_message, 'error', 30000 );
1014 </script> <?php
1015 die();
1016 }
1017 }
1018
1019 do_action( 'wpbc_show_debug', sprintf ( 'Added new booking ID:<strong>%d</strong> ', $booking_id ) ); // S_Y_S_T_E_M L_O_G
1020 } else {
1021
1022 do_action( 'wpbc_show_debug', // S_Y_S_T_E_M L_O_G
1023 sprintf ( 'Event was not create becausse dates %s already booked in booking resource ID = %d'
1024 , implode( ', ', $booking[ 'dates' ] ) , $booking[ 'resource_id' ] ) );
1025 }
1026
1027 remove_filter( 'wpbc_get_insert_sql_for_dates', 'wpbm_get_insert_sql_for_dates', 10 );
1028 remove_filter( 'wpbc_is_reupdate_dates_to_child_resources', 'wpbm_is_reupdate_dates_to_child_resources', 10 );
1029
1030 // Remove previously saved dates to our 'Static' class.
1031 WPBM_create_bookings_from_events::erase_ics_dates();
1032 }
1033
1034 return $booking_added_num;
1035 }
1036
1037
1038
1039 ////////////////////////////////////////////////////////////////////////////////////////////
1040 // Booking Calendar support functions
1041 ////////////////////////////////////////////////////////////////////////////////////////////
1042
1043
1044 /** Clear array of Events from events that already exist in Booking table
1045 * Check UID and GUID sync paramaters
1046 *
1047 * @param array $bk_array - array of events
1048 * @return array - trimmed array
1049 */
1050 function wpbm_clear_events_from_exist_bookings( $bk_array ) {
1051
1052 $bk_uid = $bk_guid = array();
1053 // GET array of UID for imported bookings
1054 foreach ( $bk_array as $ics_key => $ics_event) {
1055
1056 $bk_uid[ $ics_key ] = $ics_event[ '_BOOKING_UID' ];
1057
1058 if ( strpos( $ics_event[ '_BOOKING_UID' ], '@google.com') !== false ) {
1059 // 15ig8t0i739kajgjc8ekc386dt@google.com - ID of event from ICS
1060 // 15ig8t0i739kajgjc8ekc386dt_20170815 - ID of event during import from Google Calendar (probabaly created by ID before @ + first date)
1061
1062 $bk_guid[ $ics_key ] = str_replace( '@google.com'
1063 , date_i18n( '_Ymd', strtotime( $ics_event[ '_BOOKING_DATES' ][0] ) )
1064 , $ics_event[ '_BOOKING_UID' ]
1065 );
1066 }
1067 }
1068 $bookings_check_uid = array_merge( $bk_uid,$bk_guid );
1069
1070 $bookings_exit_uid = wpbm_get_exist_bookings_gid( $bookings_check_uid );
1071
1072 // Remove events which already exist
1073 foreach ( $bk_uid as $ics_key => $ics_uid ) {
1074
1075 // If exist UID remove it from event
1076 if ( in_array( $ics_uid, $bookings_exit_uid ) ) {
1077 unset( $bk_array[ $ics_key ] );
1078 }
1079
1080 // If we are having such GUID and it exist, then remove ir
1081 if ( isset( $bk_guid[ $ics_key ] ) ) {
1082 $ics_gid = $bk_guid[ $ics_key ];
1083 if ( in_array( $ics_uid, $bookings_exit_uid ) ) {
1084 unset( $bk_array[ $ics_key ] );
1085 }
1086 }
1087 }
1088 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1089
1090 return $bk_array;
1091 }
1092
1093
1094 /**
1095 * Return existing non-trashed Booking Calendar synchronization UIDs.
1096 *
1097 * Event UIDs originate in remote iCalendar content. Each UID is therefore
1098 * bound through a separate SQL placeholder instead of being interpolated into
1099 * the dynamic IN clause.
1100 *
1101 * @global wpdb $wpdb WordPress database abstraction object.
1102 *
1103 * @param array $uid_arr Event UIDs to check.
1104 *
1105 * @return array Existing synchronization UIDs.
1106 */
1107 function wpbm_get_exist_bookings_gid( $uid_arr ) {
1108 if ( empty( $uid_arr ) || ! is_array( $uid_arr ) ) {
1109 return array();
1110 }
1111
1112 $uid_values = array();
1113 foreach ( $uid_arr as $uid_value ) {
1114 if ( ! is_scalar( $uid_value ) ) {
1115 continue;
1116 }
1117
1118 $uid_values[] = (string) $uid_value;
1119 }
1120
1121 if ( empty( $uid_values ) ) {
1122 return array();
1123 }
1124
1125 global $wpdb;
1126
1127 $uid_placeholders = implode( ', ', array_fill( 0, count( $uid_values ), '%s' ) );
1128 $query_values = array_merge( $uid_values, array( 1 ) );
1129
1130 // The placeholder list contains only fixed %s tokens; the table name uses WordPress's trusted prefix.
1131 $sql = $wpdb->prepare( // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
1132 "SELECT sync_gid FROM {$wpdb->prefix}booking WHERE sync_gid IN ({$uid_placeholders}) AND trash != %d",
1133 $query_values
1134 );
1135
1136 if ( ! is_string( $sql ) ) {
1137 return array();
1138 }
1139
1140 $existing_booking_uids = $wpdb->get_col( $sql );
1141
1142 return is_array( $existing_booking_uids ) ? $existing_booking_uids : array();
1143 }
1144
1145
1146 /** Trim number of events in array
1147 *
1148 * @param array $bk_array
1149 * @param array $shortcode
1150 * @return array
1151 */
1152 function wpbm_clear_events_by_count( $bk_array, $shortcode ) {
1153
1154 if ( empty( $shortcode['max'] ) ) {
1155 return $bk_array;
1156 } else {
1157 $max = intval( $shortcode['max'] );
1158 }
1159
1160 $bk_count= count( $bk_array );
1161 if ( $max > $bk_count )
1162 return $bk_array;
1163
1164 $cnt = 0;
1165 $events_arr = array();
1166
1167 foreach ( $bk_array as $ev_key => $ev_arr ) {
1168
1169 $events_arr[] = $ev_arr;
1170
1171 $cnt++;
1172 if ( $cnt >= $max )
1173 break;
1174 }
1175
1176 return $events_arr;
1177 }
1178
1179
1180
1181
1182 /** Remove ONLY dates from event(s) that does not fit to filter parameters: FROM - UNTIL -- All events will exist here
1183 *
1184 * @param array $bk_array - array of events
1185 * @param array $shortcode
1186 * @return array - trimmed array
1187 */
1188 function wpbm_remove_dates_from_event_not_in_condition( $bk_array, $shortcode ) {
1189
1190 if ( ( ! isset( $shortcode['from'] ) ) && ( ! isset( $shortcode['until'] ) ) ) {
1191 return $bk_array;
1192 }
1193
1194 // <editor-fold defaultstate="collapsed" desc=" F R O M C o n d " >
1195
1196 // F R O M
1197 $offset = wpbm_get_offset_unix_from_param( $shortcode[ 'from_offset' ] );
1198
1199 if ( $shortcode['from'] == 'any' ) $shortcode['from'] = 'any-start';
1200 if ( $shortcode['from'] == 'week' ) $shortcode['from'] = 'week-start';
1201
1202 $condition_from = wpbm_get_time_unix_from_param_offset( $shortcode['from'], $offset );
1203
1204 // </editor-fold>
1205
1206
1207 // <editor-fold defaultstate="collapsed" desc=" U N T I L C o n d " >
1208
1209 // U N T I L
1210 $offset = wpbm_get_offset_unix_from_param( $shortcode[ 'until_offset' ] );
1211
1212 if ( $shortcode['until'] == 'any' ) $shortcode['until'] = 'any-end';
1213 if ( $shortcode['until'] == 'week' ) $shortcode['until'] = 'week-end';
1214
1215 $condition_until = wpbm_get_time_unix_from_param_offset( $shortcode['until'], $offset );
1216
1217 // </editor-fold>
1218
1219
1220 foreach ( $bk_array as $e_key => $ics_event ) {
1221
1222 $new_dates = array();
1223 //debuge($ics_event[ '_BOOKING_DATES' ] );
1224 foreach ( $ics_event[ '_BOOKING_DATES' ] as $d_key => $ics_date ) {
1225
1226 $ics_date_unix = strtotime( $ics_date );
1227 //debuge( $d_key, $ics_date , array( $condition_from, $condition_until ) );
1228 if ( ( $condition_from <= $ics_date_unix ) && ( $condition_until >= $ics_date_unix ) ) {
1229
1230 $new_dates[] = $ics_date;
1231 }
1232 }
1233 //debuge( $new_dates ); die;
1234 $bk_array[ $e_key ][ '_BOOKING_DATES' ] = $new_dates;
1235 }
1236
1237 return $bk_array;
1238 }
1239
1240
1241 /** Skip events that does not fit to filter parameters: FROM - UNTIL
1242 *
1243 * @param array $bk_array - array of events
1244 * @param array $shortcode
1245 * @return array - trimmed array
1246 */
1247 function wpbm_clear_events_by_dates( $bk_array, $shortcode ) {
1248
1249 if ( ( ! isset( $shortcode['from'] ) ) && ( ! isset( $shortcode['until'] ) ) ) {
1250 return $bk_array;
1251 }
1252
1253 // <editor-fold defaultstate="collapsed" desc=" F R O M C o n d " >
1254
1255 // F R O M
1256 $offset = wpbm_get_offset_unix_from_param( $shortcode[ 'from_offset' ] );
1257
1258 if ( $shortcode['from'] == 'any' ) $shortcode['from'] = 'any-start';
1259 if ( $shortcode['from'] == 'week' ) $shortcode['from'] = 'week-start';
1260
1261 $condition_from = wpbm_get_time_unix_from_param_offset( $shortcode['from'], $offset );
1262
1263 // </editor-fold>
1264
1265
1266 // <editor-fold defaultstate="collapsed" desc=" U N T I L C o n d " >
1267
1268 // U N T I L
1269 $offset = wpbm_get_offset_unix_from_param( $shortcode[ 'until_offset' ] );
1270
1271 if ( $shortcode['until'] == 'any' ) $shortcode['until'] = 'any-end';
1272 if ( $shortcode['until'] == 'week' ) $shortcode['until'] = 'week-end';
1273
1274 $condition_until = wpbm_get_time_unix_from_param_offset( $shortcode['until'], $offset );
1275
1276 // </editor-fold>
1277
1278 // Conditional of Dates checking. TRUE - Remove event if al least 1 day not in conditional interval, FALSE - save event, if at leat one date in conditional interval
1279 if ( ! isset( $shortcode['is_all_dates_in'] ) )
1280 $is_all_dates_in_condition = true;
1281 else
1282 $is_all_dates_in_condition = (bool) $shortcode['is_all_dates_in'];
1283
1284 //debuge($condition_from, date_i18n('Y-m-d H:is',$condition_from));
1285 //debuge($condition_until, date_i18n('Y-m-d H:is',$condition_until));
1286 //debuge( (int) $is_all_dates_in_condition );
1287 //die;
1288 // Remove some events, that does not inside From | End time
1289 $remove_events_keys = array();
1290 foreach ( $bk_array as $e_key => $ics_event ) {
1291 foreach ( $ics_event[ '_BOOKING_DATES' ] as $d_key => $ics_date ) {
1292 $ics_date = strtotime( $ics_date );
1293
1294 if ( $is_all_dates_in_condition ) {
1295 // STRICT - ALL DATES
1296 if ( ( $condition_from > $ics_date ) || ($condition_until < $ics_date ) ) {
1297
1298 $remove_events_keys[] = $e_key;
1299 continue;
1300 }
1301 } else {
1302 // AT LEAST 1 DATE
1303 if ( ( $condition_from <= $ics_date ) && ( $condition_until >= $ics_date ) ) {
1304
1305 $remove_events_keys = array_diff( $remove_events_keys, array( $e_key ) ); // Remove values "$e_key" from array
1306 break;
1307 } else {
1308 if ( ! in_array( $e_key, $remove_events_keys ) ) {
1309 $remove_events_keys[] = $e_key;
1310 }
1311 }
1312
1313 }
1314
1315 }
1316 }
1317
1318 // Remove them
1319 $remove_events_keys = array_unique( $remove_events_keys );
1320
1321 //debuge( $bk_array, $remove_events_keys);
1322 foreach ( $remove_events_keys as $evnt_key ) {
1323 unset( $bk_array[ $evnt_key ] );
1324 }
1325
1326 return $bk_array;
1327 }
1328
1329
1330 /** Get time offset in seconds based on parameter
1331 *
1332 * @param string $offset_param 30s | 5m | 2h | 7d | just seconds
1333 * @return int
1334 */
1335 function wpbm_get_offset_unix_from_param( $offset_param ) {
1336
1337 $offset = 0;
1338 if ( ! empty( $offset_param ) ) {
1339
1340 $offset_type = substr( $offset_param, -1 );
1341 $offset_value = substr( $offset_param, 0, -1 );
1342
1343 switch ( $offset_type ) {
1344 case "s": // Seconds
1345 $offset = intval( $offset_value );
1346 break;
1347 case "m": // Minutes
1348 $offset = intval( $offset_value ) * 60 ;
1349 break;
1350 case "h": // Hours
1351 $offset = intval( $offset_value ) * 3600 ;
1352 break;
1353 case "d": // Days
1354 $offset = intval( $offset_value ) * 86400 ;
1355 break;
1356 default:
1357 $offset = intval( $offset_value );
1358 }
1359 }
1360 return $offset;
1361 }
1362
1363
1364 /** Get Unix Time based on date parameter / condition and offset in seconds
1365 *
1366 * @param string $check_day - date type: // 'now' | 'today' | 'week' == 'week-start' | 'week-end' | 'month-start' | 'month-end' | 'year-start' | 'year-end' | 'any' == 'any-end' | 'any-start' | '2017-08-07'
1367 * @param int $offset_unix - offset in seconds
1368 * @return int - Unix time in seconds
1369 */
1370 function wpbm_get_time_unix_from_param_offset( $check_day, $offset_unix ) {
1371
1372 // $condition_end = strtotime ( $shortcode['until'] . ' +1 day - 1 second' );
1373
1374 $check_sql_day = explode( '-', $check_day );
1375 if ( count( $check_sql_day ) == 3 ) {
1376 $check_day = 'date';
1377 }
1378
1379 switch ( $check_day ) {
1380 // Don't just use time() for 'now', as this will effectively make cache duration 1 second.
1381 // Instead set to previous minute. Events in Google Calendar cannot be set to precision of seconds anyway
1382 case 'now':
1383
1384 //$time_unix = strtotime( date_i18n( 'Y-m-d H:i:s' ) ) + $offset_unix; // "Now" in "Timezone" from WordPress > Settings
1385 $time_unix = mktime( date_i18n( 'H' ), date_i18n( 'i' ), 0, date_i18n( 'm' ), date_i18n( 'j' ), date_i18n( 'Y' ) ) + $offset_unix ;
1386 break;
1387 case 'today':
1388 //$time_unix = strtotime( date_i18n( 'Y-m-d 00:00:00' ) ) + $offset_unix; // "Today 00:00" in "Timezone" from WordPress > Settings
1389 $time_unix = mktime( 0, 0, 0, date_i18n( 'm' ), date_i18n( 'j' ), date_i18n( 'Y' ) ) + $offset_unix ;
1390 break;
1391 case 'week':
1392 case 'week-start':
1393
1394 $start_of_week = get_wpbm_option( 'wpbm_start_day_weeek' ); //get_option( 'start_of_week' );
1395 if ( empty( $start_of_week ) )
1396 $start_of_week = 0;
1397
1398 $start_day = date_i18n( 'w' ) - $start_of_week ;
1399 if ( $start_day < 0 )
1400 $start_day = 7 + $start_day;
1401
1402 $time_unix = mktime( 0, 0, 0, date_i18n( 'm' ), ( date_i18n( 'j' ) - $start_day ), date_i18n( 'Y' ) ) + $offset_unix ;
1403 break;
1404 case 'week-end':
1405
1406 $start_of_week = get_wpbm_option( 'wpbm_start_day_weeek' ); //get_option( 'start_of_week' );
1407 if ( empty( $start_of_week ) )
1408 $start_of_week = 0;
1409
1410 $start_day = date_i18n( 'w' ) - $start_of_week ;
1411 if ( $start_day < 0 )
1412 $start_day = 7 + $start_day;
1413 // minus 1 second -- prevent of events exactly == start Next period
1414 $time_unix = mktime( 0, 0, 0, date_i18n( 'm' ), ( date_i18n( 'j' ) - $start_day + 7 ), date_i18n( 'Y' ) ) + $offset_unix - 1;
1415 break;
1416 case 'month-start':
1417 $time_unix = mktime( 0, 0, 0, date_i18n( 'm' ), 1, date_i18n( 'Y' ) ) + $offset_unix ;
1418 break;
1419 case 'month-end':
1420 $time_unix = mktime( 0, 0, 0, date_i18n( 'm' ) + 1, 1, date_i18n( 'Y' ) ) + $offset_unix - 1; // minus 1 second -- prevent of events exactly == start Next period
1421 break;
1422 case 'year-start':
1423 $time_unix = mktime( 0, 0, 0, 1, 1, date_i18n( 'Y' ) ) + $offset_unix ;
1424 break;
1425 case 'year-end':
1426 $time_unix = mktime( 0, 0, 0, 1, 1, date_i18n( 'Y' ) + 1 ) + $offset_unix - 1; // minus 1 second -- prevent of events exactly == start Next period
1427 break;
1428 case 'date':
1429
1430 if ( intval( $check_sql_day[0] ) - intval( date('Y') ) > 15 ) { //FixIn m.2.0.1
1431 $time_unix =2145916800;
1432 } else {
1433 $time_unix = mktime( 0, 0, 0, intval( $check_sql_day[1] ), intval( $check_sql_day[2] ), intval( $check_sql_day[0] ) );
1434 }
1435 break;
1436 case 'any-start':
1437 $time_unix = 0; // any - 1970-01-01 00:00
1438 break;
1439 case 'any-end':
1440 $time_unix = 2145916800; //any - 2038-01-01 00:00
1441 break;
1442 default:
1443 $time_unix = 2145916800; //any END - 2038-01-01 00:00
1444 }
1445
1446 //debuge($time_unix, date_i18n('Y-m-d H:i:s (D)',$time_unix));
1447
1448
1449 return $time_unix;
1450 }
1451
1452
1453 //FixIn: 2.0.11.4
1454 /**
1455 * Get booking ID, by searching in Booking Calendar by UID
1456 * @param string $uid
1457 *
1458 * @return empty string | int $booking_id
1459 */
1460 function wpbm_get_booking_id_by_UID( $uid ){
1461
1462 $booking_id = array(); //FixIn: 2.0.14.1
1463
1464 if ( function_exists( 'wpbc_api_get_bookings_arr' ) ) {
1465
1466 /*
1467 $param = array(
1468 'wh_booking_datenext' => 1,
1469 'wh_booking_dateprior' => 1,
1470 'wh_booking_date' => 3,
1471 'wh_trash' => 'any',
1472 'wh_modification_dateprior' => 1,
1473 'wh_modification_date' => 3,
1474 'wh_pay_status' => 'all',
1475
1476 'wh_booking_type' => '-999',
1477 'wh_keyword' => $uid
1478 );
1479
1480 $bookings_arr = wpbc_api_get_bookings_arr( $param );
1481 */
1482 global $wpdb;
1483
1484 $sql = "SELECT booking_id FROM {$wpdb->prefix}booking as bk WHERE bk.sync_gid LIKE '%%" . wpbc_clean_like_string_for_db( $uid ) . "%%'";
1485
1486 //$sql_escaped = $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}booking as bk WHERE bk.sync_gid LIKE '%%%s%%'", $uid );
1487
1488 $res = $wpdb->get_results( $sql );
1489
1490 foreach ( $res as $booking_obj ) {
1491 $booking_id[] = $booking_obj->booking_id;
1492 }
1493
1494 //debuge('$bookings_arr',$res);
1495
1496 }
1497
1498 return implode( ',', $booking_id );
1499 }
1500