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
← All changes | core/wpbc/wpbm-bc-import.php +831 -247 2.0.18 → 2.1.21 View file →
@@ -1,4 +1,4 @@
1 1 <?php
2 2 /**
3 3 * @version 1.0
4 4 * @description Booking Calendar integration - Import bookings from ICS events
@@ -21,39 +21,85 @@
21 21 function wpbm_delete_all_imported_bookings( $params ){ //FixIn: 2.0.10.3
22 22
23 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 24
25 - if ( 'On' !== $booking_ics_force_trash_before_import ) {
25 + if ( 'Off' == $booking_ics_force_trash_before_import ) {
26 26 return false;
27 27 }
28 28
29 -
30 29 global $wpdb;
31 30
32 31 $resource_id = $params['resource_id'];
32 + $is_trash = 1;
33 33
34 - $is_trash = 1;
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}";
35 41
36 - $my_sql = "UPDATE {$wpdb->prefix}booking AS bk SET bk.trash = {$is_trash} WHERE sync_gid != '' AND trash != 1 AND booking_type = {$resource_id}";
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 + }
37 46
38 - if ( false === $wpdb->query( $my_sql ) ){
39 - ?> <script type="text/javascript">
40 - var my_message = '<?php echo html_entity_decode( esc_js( get_debuge_error('Error during trash booking in DB' ,__FILE__,__LINE__) ),ENT_QUOTES) ; ?>';
41 - wpbc_admin_show_message( my_message, 'error', 30000 );
42 - </script> <?php
47 + } else { // Permanently delete bookings
43 48
44 - return false;
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 +
45 65 }
46 66
47 67 return true;
48 68 }
49 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 +
50 96 ////////////////////////////////////////////////////////////////////////////////////////////
51 97 // I M P O R T
52 98 ////////////////////////////////////////////////////////////////////////////////////////////
53 99
54 -/** Import ICS feed and create bookings .in Booking Calendar
55 - *
100 +/** Import ICS feed and create bookings .in Booking Calendar
101 + *
56 102 * @param array $attr = array(
57 103 'url' => ''
58 104 , 'resource_id' => 1
59 105 , 'import_conditions' => '' | 'if_dates_free' // maybe rename ??? if_dates_booked_then_not_import
@@ -61,9 +107,15 @@
61 107 * @return int|bool number of imported bookings or FALSE if error
62 108 */
63 109 function wpbm_ics_import_start( $attr ) {
64 110
65 - // <editor-fold defaultstate="collapsed" desc=" Parse / validate parameters " >
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 " >
66 118 /////////////////////////////////////////////////////////////////////
67 119 // Parse / validate parameters
68 120 /////////////////////////////////////////////////////////////////////
69 121 $defaults = array(
@@ -68,9 +120,10 @@
68 120 /////////////////////////////////////////////////////////////////////
69 121 $defaults = array(
70 122 'url' => ''
71 123 , 'resource_id' => 1
72 - , 'import_conditions' => ''
124 + , 'delete' => 0
125 + , 'import_conditions' => ''
73 126 , 'from' => 'any' // 'today' // '00:00 today'
74 127 , 'from_offset' => ''
75 128 , 'until' => 'any' // 'year-end'
76 129 , 'until_offset' => ''
@@ -82,77 +135,76 @@
82 135 foreach ( $attr as $param_name => $param_value ) {
83 136
84 137 switch ( $param_name) { // Validate Params
85 138
86 - case 'url':
139 + case 'url':
87 140 $shortcode[ $param_name ] = esc_url_raw( $param_value ); // $shortcode[ 'url' ]
88 141 $shortcode[ $param_name ] = str_replace( '&amp;', '&', $shortcode[ $param_name ] ); //FixIn: 2.0.14.2
89 142 break;
90 143
91 144 case 'import_conditions':
92 - $shortcode[ $param_name ] = esc_attr( $param_value ); // $shortcode[ 'resource_id' ]
145 + $shortcode[ $param_name ] = esc_attr( $param_value ); // $shortcode[ 'resource_id' ]
93 146 break;
94 -
95 - case 'resource_id':
96 - $shortcode[ $param_name ] = intval($param_value ); // $shortcode[ 'resource_id' ]
147 +
148 + case 'resource_id':
149 + $shortcode[ $param_name ] = intval($param_value ); // $shortcode[ 'resource_id' ]
97 150 break;
98 -
151 +
99 152 case 'from': // 'now', 'today', 'week', 'month-start', 'month-end', 'year-start', 'any', 'date' = 2017-08-07
100 153 $shortcode[ $param_name ] = $param_value;
101 154 break;
102 -
155 +
103 156 case 'from_offset': // 5d, 10h, 5m, 30s -- if from: { 'now', 'today', 'week', 'month-start', 'month-end', 'year-start' }
104 - $shortcode[ $param_name ] = $param_value;
157 + $shortcode[ $param_name ] = $param_value;
105 158 break;
106 -
159 +
107 160 case 'until': // 'now', 'today', 'week', 'month-start', 'month-end', 'year-end', 'any', 'date' = 2017-08-07
108 161 $shortcode[ $param_name ] = $param_value;
109 162 break;
110 -
163 +
111 164 case 'until_offset': // 5d, 10h, 5m, 30s -- if until: { 'now', 'today', 'week', 'month-start', 'month-end', 'year-end' }
112 - $shortcode[ $param_name ] = $param_value;
165 + $shortcode[ $param_name ] = $param_value;
113 166 break;
114 -
115 - case 'max':
116 - $shortcode[ $param_name ] = intval( $param_value );
167 +
168 + case 'max':
169 + $shortcode[ $param_name ] = intval( $param_value );
117 170 break;
118 -
171 +
119 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
120 - $shortcode[ $param_name ] = intval( $param_value );
173 + $shortcode[ $param_name ] = intval( $param_value );
121 174 break;
122 -
123 -
175 +
176 +
124 177 default:
125 178 $shortcode[ $param_name ] = $param_value;
126 179 break;
127 - }
128 - }
180 + }
181 + }
129 182 $shortcode = wp_parse_args( $shortcode, $defaults );
130 183 // </editor-fold>
131 184
132 -//debuge($shortcode);
133 - // <editor-fold defaultstate="collapsed" desc=" Notice - Import Parameters | Error No URL" >
134 -
185 + // <editor-fold defaultstate="collapsed" desc=" Notice - Import Parameters | Error No URL" >
186 +
135 187 do_action( 'wpbc_show_debug', array( 'Import Parameters' , $shortcode ) ); // S_Y_S_T_E_M L_O_G
136 188
137 - if ( empty( $shortcode[ 'url' ] ) ) {
138 - 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
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
139 191 return false;
140 - }
192 + }
141 193 // </editor-fold>
142 194
143 - ///////////////////////////////////////////////////////////////////// - Get, Parse ICS Feed
144 -
195 + ///////////////////////////////////////////////////////////////////// - Get, Parse ICS Feed
196 +
145 197 $ics_array = wpbm_ics_file_to_array( $shortcode[ 'url' ] );
146 198
147 - // <editor-fold defaultstate="collapsed" desc=" Notice - feed contain N events | Error Importing " >
199 + // <editor-fold defaultstate="collapsed" desc=" Notice - feed contain N events | Error Importing " >
148 200 do_action( 'wpbc_show_debug', array( 'Imported data' , $ics_array) ); // S_Y_S_T_E_M L_O_G
149 201
150 202 // If Error
151 203 if ( is_wp_error( $ics_array ) ) {
152 -
153 - $error_message = $ics_array->get_error_message();
154 - do_action( 'wpbc_admin_show_top_notice', $error_message, 'error', 5000 ); // N_O_T_I_C_E in H_E_A_D_E_R
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
155 207 return false;
156 208 }
157 209
158 210 //FixIn: 2.0.7.3
@@ -161,21 +213,22 @@
161 213 $ics_array_events_num = count( $ics_array[ 'events' ] );
162 214 }
163 215 do_action( 'wpbc_admin_show_top_notice' // N_O_T_I_C_E in H_E_A_D_E_R
164 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>' )
165 - , 'info', 5000 );
217 + , 'info', 5000 );
166 218 // </editor-fold>
167 219
168 - //FixIn: 2.0.18.3
169 - wpbm_delete_all_imported_bookings( array( 'resource_id' => $shortcode['resource_id'] ) ); //FixIn: 2.0.10.3
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 + }
170 223
171 224
172 225 $bk_array = array();
173 - // Get Only '_BOOKING...' field from ICS array
174 - if ( $ics_array !== false ) {
175 - $bk_array = wpbm_get_booking_fields_from_ics_array( $ics_array[ 'events' ] );
176 - }
177 -
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 +
178 231 do_action( 'wpbc_show_debug', array( 'Imported Events', $bk_array ) ); // S_Y_S_T_E_M L_O_G
179 232
180 233
181 234 //FixIn: 2.0.6.1 - Set timezone frrom Booking > Settings > Sync page for booking listing shortcode
@@ -216,30 +269,514 @@
216 269
217 270 ///////////////////////////////////////////////////////////////////// - Check if these EVENTS was imported before or NOT
218 271
219 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 + }
220 285
221 - if ( 'On' !== $booking_ics_force_import ) {
222 - $bk_array = wpbm_clear_events_from_exist_bookings( $bk_array );
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;
223 297 }
298 + // </editor-fold>
224 299
225 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 = '[email protected]'; //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 = '[email protected]';
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' ]; // [email protected]
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 +
226 763 // <editor-fold defaultstate="collapsed" desc=" Notice - if events was imported previously | Already ALL Imported " >
227 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
228 765
229 766 if ( empty( $bk_array ) ) {
230 -
231 - do_action( 'wpbc_admin_show_top_notice' // N_O_T_I_C_E in H_E_A_D_E_R
232 - , '<strong>' . __( 'Warning', 'booking' ) . '!</strong> '
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> '
233 770 . sprintf( __( 'No any new events to import! These events was import previously, already.', 'booking-manager' ), '<strong>' . count( $bk_array ) . '</strong>' )
234 - , 'warning', 3000 );
235 - return 0;
771 + , 'warning', 3000 );
772 + return 0;
236 773 }
237 774 // </editor-fold>
238 -
239 -
240 - ///////////////////////////////////////////////////////////////////// - Skip events that does not fit to filter parameters: FROM - UNTIL
241 -
775 +
776 +
777 + ///////////////////////////////////////////////////////////////////// - Skip events that does not fit to filter parameters: FROM - UNTIL
778 +
242 779 // $bk_array = wpbm_clear_events_by_dates( $bk_array, $shortcode );
243 780
244 781
245 782 // Sort Events
@@ -244,51 +781,74 @@
244 781
245 782 // Sort Events
246 783 $bk_array = wpbm_sort_events_by( $bk_array );
247 784
248 - // Filter By Dates - "From - Until"
785 + // Filter By Dates - "From - Until"
249 786 $bk_array = wpbm_clear_events_by_dates( $bk_array, $shortcode );
250 787
251 - // Filter events by - "Max"
788 + // Filter events by - "Max"
252 789 $bk_array = wpbm_clear_events_by_count( $bk_array, $shortcode );
253 790
254 -
255 - // <editor-fold defaultstate="collapsed" desc=" Notice - Creation of N bookings " >
791 +
792 + // <editor-fold defaultstate="collapsed" desc=" Notice - Creation of N bookings " >
256 793 do_action( 'wpbc_admin_show_top_notice' // N_O_T_I_C_E in H_E_A_D_E_R
257 794 , sprintf( __( 'Imported of %s bookings', 'booking-manager' ), '<strong>' . count( $bk_array ) . '</strong>' )
258 - , 'info', 3000 );
259 -
795 + , 'info', 3000 );
796 +
260 797 do_action( 'wpbc_show_debug', array( 'Create bookings after filtering', $bk_array ) ); // S_Y_S_T_E_M L_O_G
261 798 // </editor-fold>
262 -
799 +
263 800 ///////////////////////////////////////////////////////////////////// - Loop events > C r e a t e B o o k i n g s
264 801
265 - // Get assigning fields for SUMMARY, DESCRIPTION, LOCATION
802 + // Get assigning fields for SUMMARY, DESCRIPTION, LOCATION
266 803 $assigned_fields_arr = WPBM_create_bookings_from_events::get_assigned_form_fields();
267 -
804 +
268 805 $booking_added_num = 0;
269 -
806 +
270 807 foreach ( $bk_array as $ics_event) {
271 808
272 809 //FixIn: 2.0.5.2
273 810 //FixIn: 8.1.3.29
274 - if ( ( class_exists( 'wpdev_bk_biz_s' ) )
275 - && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
276 - && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
277 - && ( get_bk_option( 'booking_ics_import_append_checkout_day' ) !== 'Off' )
278 - ) {
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
279 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
280 818 // Later system is adding check in/out times from Booking Calendar to this event
281 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 +
282 836 $ics_event_check_out = strtotime( $ics_event_check_out );
283 837 $ics_event_check_out = strtotime( '+1 day', $ics_event_check_out );
284 - $ics_event_check_out = date_i18n( "Y-m-d 00:00:00", $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 );
285 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 + }
286 847 }
287 848
288 849 $booking_data = array();
289 850
290 -
291 851 if ( ( class_exists( 'wpdev_bk_biz_s' ) )
292 852 && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
293 853 && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
294 854 && ( count( $ics_event[ '_BOOKING_DATES' ] ) > 1 )
@@ -298,10 +858,10 @@
298 858 $dates_formats = array_fill( 0, count( $ics_event[ '_BOOKING_DATES' ] ), "Y-m-d H:i:s" ); //FixIn: 2.0.15.4
299 859 }
300 860 $booking_dates_unix = array_map( 'strtotime', $ics_event[ '_BOOKING_DATES' ] ); // Array ( [0] => 1498262400 [1] => 1498348800 )
301 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' )
302 -//debuge('$ics_event, $simple_booking_dates', $ics_event, $simple_booking_dates);
303 862
863 +
304 864 //FixIn: 8.1.3.29
305 865 if ( ( class_exists( 'wpdev_bk_biz_s' ) )
306 866 && ( get_bk_option( 'booking_range_selection_time_is_active') == 'On' )
307 867 && ( get_bk_option( 'booking_ics_import_add_change_over_time' ) !== 'Off' )
@@ -332,9 +892,9 @@
332 892
333 893 $booking = array(
334 894 'dates' => $simple_booking_dates // array( '2017-06-24', '2017-06-24', '2017-06-25', '2017-06-26' )
335 895 , 'data' => array()
336 - , 'resource_id' => $shortcode[ 'resource_id' ]
896 + , 'resource_id' => $shortcode[ 'resource_id' ]
337 897 );
338 898
339 899
340 900 $bk_data = array();
@@ -341,17 +901,17 @@
341 901 foreach ( $assigned_fields_arr as $assigned_field ) {
342 902
343 903 switch ( $assigned_field[ 'ics_field_name' ] ) {
344 904
345 - case 'title':
905 + case 'title':
346 906 $bk_data [ $assigned_field[ 'name' ] ]= array( 'type' => $assigned_field[ 'type' ], 'value' => trim( $ics_event[ '_BOOKING_SUMMARY' ] ) );
347 907 break;
348 908
349 - case 'description':
909 + case 'description':
350 910 $bk_data [ $assigned_field[ 'name' ] ]= array( 'type' => $assigned_field[ 'type' ], 'value' => trim( $ics_event[ '_BOOKING_DESCRIPTION' ] ) );
351 911 break;
352 912
353 - case 'where':
913 + case 'where':
354 914 $bk_data [ $assigned_field[ 'name' ] ]= array( 'type' => $assigned_field[ 'type' ], 'value' => trim( $ics_event[ '_BOOKING_LOCATION' ] ) );
355 915 break;
356 916
357 917 default:
@@ -359,9 +919,9 @@
359 919 }
360 920 }
361 921
362 922 // Email
363 - $home_url = explode( '://', home_url() );
923 + $home_url = explode( '://', home_url() );
364 924 //if (count($home_url>0)) //FixIn: 2.0.3.2
365 925 // $email = 'ics@' . $home_url[1];
366 926 //else
367 927 $email = get_option ( 'admin_email' );
@@ -396,19 +956,22 @@
396 956 // $ics_event[ '_BOOKING_SUMMARY' ]; // Event (timezone Pacific GMT-07:00)
397 957 // $ics_event[ '_BOOKING_DESCRIPTION' ]; // 8/7/2017 1:00pm TO 3:30pm 8/8/2017 (GMT-07:00) Pacific Time
398 958 // $ics_event[ '_BOOKING_LOCATION' ]; // Pacific Coast Highway, Pacific Coast Hwy, Los Angeles, CA, USA
399 959 // $ics_event[ '_BOOKING_UID' ]; // [email protected]
400 - // $ics_event[ '_BOOKING_MODIFIED' ]; // 2017-06-28 10:12:35
960 + // $ics_event[ '_BOOKING_MODIFIED' ]; // 2017-06-28 10:12:35
401 961 */
402 -
962 +
403 963 add_filter( 'wpbc_get_insert_sql_for_dates', 'wpbm_get_insert_sql_for_dates', 10, 5 );
404 -
964 +
405 965 // Do not overupdate "child booking resources" when saving bookings to parent booking resource. Just skip this checking
406 - add_filter( 'wpbc_is_reupdate_dates_to_child_resources', 'wpbm_is_reupdate_dates_to_child_resources', 10, 7 );
966 + add_filter( 'wpbc_is_reupdate_dates_to_child_resources', 'wpbm_is_reupdate_dates_to_child_resources', 10, 7 );
407 967
408 - // Check dates availability and process
968 + // Check dates availability and process
409 969 // only if dates available in specific booking resource!
410 - if ( $shortcode[ 'import_conditions' ] == 'if_dates_free' ) {
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 + ){
411 974 $is_dates_booked = wpbc_api_is_dates_booked( $ics_event['_BOOKING_DATES'], $booking['resource_id'] ); //FixIn: 2.0.15.2
412 975 //$is_dates_booked = wpbc_api_is_dates_booked( $booking['dates'], $booking['resource_id'] );
413 976 } else{
414 977 $is_dates_booked = false;
@@ -415,10 +978,10 @@
415 978 }
416 979
417 980
418 981 if ( ! $is_dates_booked ) {
419 -
420 - $booking_id = wpbc_api_booking_add_new( $booking[ 'dates' ], $booking[ 'data' ], $booking[ 'resource_id' ] , $additional_params );
982 +
983 + $booking_id = wpbc_api_booking_add_new( $booking[ 'dates' ], $booking[ 'data' ], $booking[ 'resource_id' ] , $additional_params );
421 984 $booking_added_num++;
422 985
423 986 //if ( ( defined( 'WP_BK_AUTO_APPROVE_WHEN_IMPORT_GCAL' ) ) && ( WP_BK_AUTO_APPROVE_WHEN_IMPORT_GCAL ) ){ // Auto approve booking if imported
424 987 if ( ( function_exists( 'get_bk_option' )) && ( get_bk_option( 'booking_auto_approve_bookings_when_import' ) == 'On' ) ) { //FixIn: 8.1.3.27
@@ -457,9 +1020,9 @@
457 1020 } else {
458 1021
459 1022 do_action( 'wpbc_show_debug', // S_Y_S_T_E_M L_O_G
460 1023 sprintf ( 'Event was not create becausse dates %s already booked in booking resource ID = %d'
461 - , implode( ', ', $booking[ 'dates' ] ) , $booking[ 'resource_id' ] ) );
1024 + , implode( ', ', $booking[ 'dates' ] ) , $booking[ 'resource_id' ] ) );
462 1025 }
463 1026
464 1027 remove_filter( 'wpbc_get_insert_sql_for_dates', 'wpbm_get_insert_sql_for_dates', 10 );
465 1028 remove_filter( 'wpbc_is_reupdate_dates_to_child_resources', 'wpbm_is_reupdate_dates_to_child_resources', 10 );
@@ -464,16 +1027,16 @@
464 1027 remove_filter( 'wpbc_get_insert_sql_for_dates', 'wpbm_get_insert_sql_for_dates', 10 );
465 1028 remove_filter( 'wpbc_is_reupdate_dates_to_child_resources', 'wpbm_is_reupdate_dates_to_child_resources', 10 );
466 1029
467 1030 // Remove previously saved dates to our 'Static' class.
468 - WPBM_create_bookings_from_events::erase_ics_dates();
1031 + WPBM_create_bookings_from_events::erase_ics_dates();
469 1032 }
470 -
471 - return $booking_added_num;
1033 +
1034 + return $booking_added_num;
472 1035 }
473 -add_action( 'wpbm_ics_import_start', 'wpbm_ics_import_start', 10, 1 );
474 1036
475 1037
1038 +
476 1039 ////////////////////////////////////////////////////////////////////////////////////////////
477 1040 // Booking Calendar support functions
478 1041 ////////////////////////////////////////////////////////////////////////////////////////////
479 1042
@@ -479,9 +1042,9 @@
479 1042
480 1043
481 1044 /** Clear array of Events from events that already exist in Booking table
482 1045 * Check UID and GUID sync paramaters
483 - *
1046 + *
484 1047 * @param array $bk_array - array of events
485 1048 * @return array - trimmed array
486 1049 */
487 1050 function wpbm_clear_events_from_exist_bookings( $bk_array ) {
@@ -488,11 +1051,11 @@
488 1051
489 1052 $bk_uid = $bk_guid = array();
490 1053 // GET array of UID for imported bookings
491 1054 foreach ( $bk_array as $ics_key => $ics_event) {
492 -
1055 +
493 1056 $bk_uid[ $ics_key ] = $ics_event[ '_BOOKING_UID' ];
494 -
1057 +
495 1058 if ( strpos( $ics_event[ '_BOOKING_UID' ], '@google.com') !== false ) {
496 1059 // [email protected] - ID of event from ICS
497 1060 // 15ig8t0i739kajgjc8ekc386dt_20170815 - ID of event during import from Google Calendar (probabaly created by ID before @ + first date)
498 1061
@@ -497,24 +1060,24 @@
497 1060 // 15ig8t0i739kajgjc8ekc386dt_20170815 - ID of event during import from Google Calendar (probabaly created by ID before @ + first date)
498 1061
499 1062 $bk_guid[ $ics_key ] = str_replace( '@google.com'
500 1063 , date_i18n( '_Ymd', strtotime( $ics_event[ '_BOOKING_DATES' ][0] ) )
501 - , $ics_event[ '_BOOKING_UID' ]
1064 + , $ics_event[ '_BOOKING_UID' ]
502 1065 );
503 - }
504 - }
1066 + }
1067 + }
505 1068 $bookings_check_uid = array_merge( $bk_uid,$bk_guid );
506 -
1069 +
507 1070 $bookings_exit_uid = wpbm_get_exist_bookings_gid( $bookings_check_uid );
508 1071
509 1072 // Remove events which already exist
510 1073 foreach ( $bk_uid as $ics_key => $ics_uid ) {
511 -
1074 +
512 1075 // If exist UID remove it from event
513 1076 if ( in_array( $ics_uid, $bookings_exit_uid ) ) {
514 1077 unset( $bk_array[ $ics_key ] );
515 1078 }
516 -
1079 +
517 1080 // If we are having such GUID and it exist, then remove ir
518 1081 if ( isset( $bk_guid[ $ics_key ] ) ) {
519 1082 $ics_gid = $bk_guid[ $ics_key ];
520 1083 if ( in_array( $ics_uid, $bookings_exit_uid ) ) {
@@ -527,191 +1090,212 @@
527 1090 return $bk_array;
528 1091 }
529 1092
530 1093
531 - /** Check if bookings exist with specific sync UID
532 - *
533 - * @global type $wpdb
534 - * @param array of UID to check
535 - * @return array of exist UID
536 - */
537 - function wpbm_get_exist_bookings_gid( $uid_arr ) {
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 +}
538 1144
539 - $sql_sync_gid = implode( "','", $uid_arr );
540 1145
541 - $exist_bookings_guid = array();
542 -
543 - if ( ! empty( $sql_sync_gid ) ) {
544 - global $wpdb;
545 -
546 - $my_sql = "SELECT * FROM {$wpdb->prefix}booking WHERE sync_gid IN ('{$sql_sync_gid}') AND trash != 1"; //FixIn: 2.0.9.3
547 -//debuge($sql_sync_gid);
548 -//$my_sql = "SELECT * FROM wp_booking WHERE sync_gid IN ('[email protected]','[email protected]','[email protected]','[email protected]','[email protected]','[email protected]')";
549 -//debuge($my_sql);
550 - $exist_bookings = $wpdb->get_results( $my_sql );
551 -
552 -//debuge( 'wpbc_show_debug', array( 'SQL: ', $my_sql, $exist_bookings ) );
553 -
554 - foreach ( $exist_bookings as $bk ) {
555 - $exist_bookings_guid[] = $bk->sync_gid;
556 - }
557 - }
558 - return $exist_bookings_guid;
559 - }
560 -
561 -
562 1146 /** Trim number of events in array
563 - *
1147 + *
564 1148 * @param array $bk_array
565 1149 * @param array $shortcode
566 1150 * @return array
567 - */
1151 + */
568 1152 function wpbm_clear_events_by_count( $bk_array, $shortcode ) {
569 -
1153 +
570 1154 if ( empty( $shortcode['max'] ) ) {
571 1155 return $bk_array;
572 1156 } else {
573 1157 $max = intval( $shortcode['max'] );
574 1158 }
575 -
1159 +
576 1160 $bk_count= count( $bk_array );
577 1161 if ( $max > $bk_count )
578 1162 return $bk_array;
579 -
1163 +
580 1164 $cnt = 0;
581 1165 $events_arr = array();
582 -
1166 +
583 1167 foreach ( $bk_array as $ev_key => $ev_arr ) {
584 -
1168 +
585 1169 $events_arr[] = $ev_arr;
586 -
1170 +
587 1171 $cnt++;
588 - if ( $cnt >= $max )
1172 + if ( $cnt >= $max )
589 1173 break;
590 1174 }
591 -
1175 +
592 1176 return $events_arr;
593 -}
594 -
1177 +}
595 1178
596 1179
597 1180
1181 +
598 1182 /** Remove ONLY dates from event(s) that does not fit to filter parameters: FROM - UNTIL -- All events will exist here
599 - *
1183 + *
600 1184 * @param array $bk_array - array of events
601 1185 * @param array $shortcode
602 1186 * @return array - trimmed array
603 - */
1187 + */
604 1188 function wpbm_remove_dates_from_event_not_in_condition( $bk_array, $shortcode ) {
605 -
1189 +
606 1190 if ( ( ! isset( $shortcode['from'] ) ) && ( ! isset( $shortcode['until'] ) ) ) {
607 1191 return $bk_array;
608 1192 }
609 -
610 - // <editor-fold defaultstate="collapsed" desc=" F R O M C o n d " >
611 1193
1194 + // <editor-fold defaultstate="collapsed" desc=" F R O M C o n d " >
1195 +
612 1196 // F R O M
613 1197 $offset = wpbm_get_offset_unix_from_param( $shortcode[ 'from_offset' ] );
614 -
615 - if ( $shortcode['from'] == 'any' ) $shortcode['from'] = 'any-start';
616 - if ( $shortcode['from'] == 'week' ) $shortcode['from'] = 'week-start';
617 -
1198 +
1199 + if ( $shortcode['from'] == 'any' ) $shortcode['from'] = 'any-start';
1200 + if ( $shortcode['from'] == 'week' ) $shortcode['from'] = 'week-start';
1201 +
618 1202 $condition_from = wpbm_get_time_unix_from_param_offset( $shortcode['from'], $offset );
619 -
1203 +
620 1204 // </editor-fold>
621 -
622 1205
623 - // <editor-fold defaultstate="collapsed" desc=" U N T I L C o n d " >
624 -
625 - // U N T I L
1206 +
1207 + // <editor-fold defaultstate="collapsed" desc=" U N T I L C o n d " >
1208 +
1209 + // U N T I L
626 1210 $offset = wpbm_get_offset_unix_from_param( $shortcode[ 'until_offset' ] );
627 -
628 - if ( $shortcode['until'] == 'any' ) $shortcode['until'] = 'any-end';
629 - if ( $shortcode['until'] == 'week' ) $shortcode['until'] = 'week-end';
630 -
1211 +
1212 + if ( $shortcode['until'] == 'any' ) $shortcode['until'] = 'any-end';
1213 + if ( $shortcode['until'] == 'week' ) $shortcode['until'] = 'week-end';
1214 +
631 1215 $condition_until = wpbm_get_time_unix_from_param_offset( $shortcode['until'], $offset );
632 -
1216 +
633 1217 // </editor-fold>
634 -
635 -
1218 +
1219 +
636 1220 foreach ( $bk_array as $e_key => $ics_event ) {
637 -
1221 +
638 1222 $new_dates = array();
639 -//debuge($ics_event[ '_BOOKING_DATES' ] );
1223 +//debuge($ics_event[ '_BOOKING_DATES' ] );
640 1224 foreach ( $ics_event[ '_BOOKING_DATES' ] as $d_key => $ics_date ) {
641 -
1225 +
642 1226 $ics_date_unix = strtotime( $ics_date );
643 -//debuge( $d_key, $ics_date , array( $condition_from, $condition_until ) );
644 - if ( ( $condition_from <= $ics_date_unix ) && ( $condition_until >= $ics_date_unix ) ) {
645 -
1227 +//debuge( $d_key, $ics_date , array( $condition_from, $condition_until ) );
1228 + if ( ( $condition_from <= $ics_date_unix ) && ( $condition_until >= $ics_date_unix ) ) {
1229 +
646 1230 $new_dates[] = $ics_date;
647 1231 }
648 1232 }
649 -//debuge( $new_dates ); die;
1233 +//debuge( $new_dates ); die;
650 1234 $bk_array[ $e_key ][ '_BOOKING_DATES' ] = $new_dates;
651 1235 }
652 -
1236 +
653 1237 return $bk_array;
654 1238 }
655 1239
656 1240
657 1241 /** Skip events that does not fit to filter parameters: FROM - UNTIL
658 - *
1242 + *
659 1243 * @param array $bk_array - array of events
660 1244 * @param array $shortcode
661 1245 * @return array - trimmed array
662 - */
1246 + */
663 1247 function wpbm_clear_events_by_dates( $bk_array, $shortcode ) {
664 1248
665 1249 if ( ( ! isset( $shortcode['from'] ) ) && ( ! isset( $shortcode['until'] ) ) ) {
666 1250 return $bk_array;
667 1251 }
668 -
669 - // <editor-fold defaultstate="collapsed" desc=" F R O M C o n d " >
670 1252
1253 + // <editor-fold defaultstate="collapsed" desc=" F R O M C o n d " >
1254 +
671 1255 // F R O M
672 1256 $offset = wpbm_get_offset_unix_from_param( $shortcode[ 'from_offset' ] );
673 -
674 - if ( $shortcode['from'] == 'any' ) $shortcode['from'] = 'any-start';
675 - if ( $shortcode['from'] == 'week' ) $shortcode['from'] = 'week-start';
676 -
1257 +
1258 + if ( $shortcode['from'] == 'any' ) $shortcode['from'] = 'any-start';
1259 + if ( $shortcode['from'] == 'week' ) $shortcode['from'] = 'week-start';
1260 +
677 1261 $condition_from = wpbm_get_time_unix_from_param_offset( $shortcode['from'], $offset );
678 -
1262 +
679 1263 // </editor-fold>
680 -
681 1264
682 - // <editor-fold defaultstate="collapsed" desc=" U N T I L C o n d " >
683 -
684 - // U N T I L
1265 +
1266 + // <editor-fold defaultstate="collapsed" desc=" U N T I L C o n d " >
1267 +
1268 + // U N T I L
685 1269 $offset = wpbm_get_offset_unix_from_param( $shortcode[ 'until_offset' ] );
686 -
687 - if ( $shortcode['until'] == 'any' ) $shortcode['until'] = 'any-end';
688 - if ( $shortcode['until'] == 'week' ) $shortcode['until'] = 'week-end';
689 -
1270 +
1271 + if ( $shortcode['until'] == 'any' ) $shortcode['until'] = 'any-end';
1272 + if ( $shortcode['until'] == 'week' ) $shortcode['until'] = 'week-end';
1273 +
690 1274 $condition_until = wpbm_get_time_unix_from_param_offset( $shortcode['until'], $offset );
691 -
1275 +
692 1276 // </editor-fold>
693 1277
694 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
695 1279 if ( ! isset( $shortcode['is_all_dates_in'] ) )
696 - $is_all_dates_in_condition = true;
697 - else
698 - $is_all_dates_in_condition = (bool) $shortcode['is_all_dates_in'];
699 -
1280 + $is_all_dates_in_condition = true;
1281 + else
1282 + $is_all_dates_in_condition = (bool) $shortcode['is_all_dates_in'];
1283 +
700 1284 //debuge($condition_from, date_i18n('Y-m-d H:is',$condition_from));
701 1285 //debuge($condition_until, date_i18n('Y-m-d H:is',$condition_until));
702 1286 //debuge( (int) $is_all_dates_in_condition );
703 1287 //die;
704 1288 // Remove some events, that does not inside From | End time
705 - $remove_events_keys = array();
1289 + $remove_events_keys = array();
706 1290 foreach ( $bk_array as $e_key => $ics_event ) {
707 1291 foreach ( $ics_event[ '_BOOKING_DATES' ] as $d_key => $ics_date ) {
708 1292 $ics_date = strtotime( $ics_date );
709 -
1293 +
710 1294 if ( $is_all_dates_in_condition ) {
711 1295 // STRICT - ALL DATES
712 1296 if ( ( $condition_from > $ics_date ) || ($condition_until < $ics_date ) ) {
713 -
1297 +
714 1298 $remove_events_keys[] = $e_key;
715 1299 continue;
716 1300 }
717 1301 } else {
@@ -716,9 +1300,9 @@
716 1300 }
717 1301 } else {
718 1302 // AT LEAST 1 DATE
719 1303 if ( ( $condition_from <= $ics_date ) && ( $condition_until >= $ics_date ) ) {
720 -
1304 +
721 1305 $remove_events_keys = array_diff( $remove_events_keys, array( $e_key ) ); // Remove values "$e_key" from array
722 1306 break;
723 1307 } else {
724 1308 if ( ! in_array( $e_key, $remove_events_keys ) ) {
@@ -724,18 +1308,18 @@
724 1308 if ( ! in_array( $e_key, $remove_events_keys ) ) {
725 1309 $remove_events_keys[] = $e_key;
726 1310 }
727 1311 }
728 -
1312 +
729 1313 }
730 -
1314 +
731 1315 }
732 1316 }
733 -
1317 +
734 1318 // Remove them
735 1319 $remove_events_keys = array_unique( $remove_events_keys );
736 -
737 -//debuge( $bk_array, $remove_events_keys);
1320 +
1321 +//debuge( $bk_array, $remove_events_keys);
738 1322 foreach ( $remove_events_keys as $evnt_key ) {
739 1323 unset( $bk_array[ $evnt_key ] );
740 1324 }
741 1325
@@ -743,22 +1327,22 @@
743 1327 }
744 1328
745 1329
746 1330 /** Get time offset in seconds based on parameter
747 - *
1331 + *
748 1332 * @param string $offset_param 30s | 5m | 2h | 7d | just seconds
749 1333 * @return int
750 1334 */
751 1335 function wpbm_get_offset_unix_from_param( $offset_param ) {
752 -
753 - $offset = 0;
1336 +
1337 + $offset = 0;
754 1338 if ( ! empty( $offset_param ) ) {
755 -
1339 +
756 1340 $offset_type = substr( $offset_param, -1 );
757 1341 $offset_value = substr( $offset_param, 0, -1 );
758 -
1342 +
759 1343 switch ( $offset_type ) {
760 - case "s": // Seconds
1344 + case "s": // Seconds
761 1345 $offset = intval( $offset_value );
762 1346 break;
763 1347 case "m": // Minutes
764 1348 $offset = intval( $offset_value ) * 60 ;
@@ -770,65 +1354,65 @@
770 1354 $offset = intval( $offset_value ) * 86400 ;
771 1355 break;
772 1356 default:
773 1357 $offset = intval( $offset_value );
774 - }
775 - }
1358 + }
1359 + }
776 1360 return $offset;
777 1361 }
778 1362
779 1363
780 1364 /** Get Unix Time based on date parameter / condition and offset in seconds
781 - *
1365 + *
782 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'
783 1367 * @param int $offset_unix - offset in seconds
784 1368 * @return int - Unix time in seconds
785 1369 */
786 1370 function wpbm_get_time_unix_from_param_offset( $check_day, $offset_unix ) {
787 -
1371 +
788 1372 // $condition_end = strtotime ( $shortcode['until'] . ' +1 day - 1 second' );
789 -
1373 +
790 1374 $check_sql_day = explode( '-', $check_day );
791 1375 if ( count( $check_sql_day ) == 3 ) {
792 1376 $check_day = 'date';
793 - }
1377 + }
794 1378
795 1379 switch ( $check_day ) {
796 - // Don't just use time() for 'now', as this will effectively make cache duration 1 second.
1380 + // Don't just use time() for 'now', as this will effectively make cache duration 1 second.
797 1381 // Instead set to previous minute. Events in Google Calendar cannot be set to precision of seconds anyway
798 1382 case 'now':
799 -
800 - //$time_unix = strtotime( date_i18n( 'Y-m-d H:i:s' ) ) + $offset_unix; // "Now" in "Timezone" from WordPress > Settings
801 - $time_unix = mktime( date_i18n( 'H' ), date_i18n( 'i' ), 0, date_i18n( 'm' ), date_i18n( 'j' ), date_i18n( 'Y' ) ) + $offset_unix ;
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 ;
802 1386 break;
803 1387 case 'today':
804 - //$time_unix = strtotime( date_i18n( 'Y-m-d 00:00:00' ) ) + $offset_unix; // "Today 00:00" in "Timezone" from WordPress > Settings
1388 + //$time_unix = strtotime( date_i18n( 'Y-m-d 00:00:00' ) ) + $offset_unix; // "Today 00:00" in "Timezone" from WordPress > Settings
805 1389 $time_unix = mktime( 0, 0, 0, date_i18n( 'm' ), date_i18n( 'j' ), date_i18n( 'Y' ) ) + $offset_unix ;
806 1390 break;
807 1391 case 'week':
808 1392 case 'week-start':
809 -
810 - $start_of_week = get_wpbm_option( 'wpbm_start_day_weeek' ); //get_option( 'start_of_week' );
811 - if ( empty( $start_of_week ) )
1393 +
1394 + $start_of_week = get_wpbm_option( 'wpbm_start_day_weeek' ); //get_option( 'start_of_week' );
1395 + if ( empty( $start_of_week ) )
812 1396 $start_of_week = 0;
813 -
1397 +
814 1398 $start_day = date_i18n( 'w' ) - $start_of_week ;
815 - if ( $start_day < 0 )
1399 + if ( $start_day < 0 )
816 1400 $start_day = 7 + $start_day;
817 1401
818 1402 $time_unix = mktime( 0, 0, 0, date_i18n( 'm' ), ( date_i18n( 'j' ) - $start_day ), date_i18n( 'Y' ) ) + $offset_unix ;
819 1403 break;
820 1404 case 'week-end':
821 -
1405 +
822 1406 $start_of_week = get_wpbm_option( 'wpbm_start_day_weeek' ); //get_option( 'start_of_week' );
823 - if ( empty( $start_of_week ) )
1407 + if ( empty( $start_of_week ) )
824 1408 $start_of_week = 0;
825 -
1409 +
826 1410 $start_day = date_i18n( 'w' ) - $start_of_week ;
827 - if ( $start_day < 0 )
828 - $start_day = 7 + $start_day;
1411 + if ( $start_day < 0 )
1412 + $start_day = 7 + $start_day;
829 1413 // minus 1 second -- prevent of events exactly == start Next period
830 - $time_unix = mktime( 0, 0, 0, date_i18n( 'm' ), ( date_i18n( 'j' ) - $start_day + 7 ), date_i18n( 'Y' ) ) + $offset_unix - 1;
1414 + $time_unix = mktime( 0, 0, 0, date_i18n( 'm' ), ( date_i18n( 'j' ) - $start_day + 7 ), date_i18n( 'Y' ) ) + $offset_unix - 1;
831 1415 break;
832 1416 case 'month-start':
833 1417 $time_unix = mktime( 0, 0, 0, date_i18n( 'm' ), 1, date_i18n( 'Y' ) ) + $offset_unix ;
834 1418 break;
@@ -836,12 +1420,12 @@
836 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
837 1421 break;
838 1422 case 'year-start':
839 1423 $time_unix = mktime( 0, 0, 0, 1, 1, date_i18n( 'Y' ) ) + $offset_unix ;
840 - break;
1424 + break;
841 1425 case 'year-end':
842 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
843 - break;
1427 + break;
844 1428 case 'date':
845 1429
846 1430 if ( intval( $check_sql_day[0] ) - intval( date('Y') ) > 15 ) { //FixIn m.2.0.1
847 1431 $time_unix =2145916800;
@@ -848,12 +1432,12 @@
848 1432 } else {
849 1433 $time_unix = mktime( 0, 0, 0, intval( $check_sql_day[1] ), intval( $check_sql_day[2] ), intval( $check_sql_day[0] ) );
850 1434 }
851 1435 break;
852 - case 'any-start':
1436 + case 'any-start':
853 1437 $time_unix = 0; // any - 1970-01-01 00:00
854 1438 break;
855 - case 'any-end':
1439 + case 'any-end':
856 1440 $time_unix = 2145916800; //any - 2038-01-01 00:00
857 1441 break;
858 1442 default:
859 1443 $time_unix = 2145916800; //any END - 2038-01-01 00:00
@@ -858,9 +1442,9 @@
858 1442 default:
859 1443 $time_unix = 2145916800; //any END - 2038-01-01 00:00
860 1444 }
861 1445
862 -//debuge($time_unix, date_i18n('Y-m-d H:i:s (D)',$time_unix));
1446 +//debuge($time_unix, date_i18n('Y-m-d H:i:s (D)',$time_unix));
863 1447
864 1448
865 1449 return $time_unix;
866 1450 }
@@ -887,9 +1471,9 @@
887 1471 'wh_trash' => 'any',
888 1472 'wh_modification_dateprior' => 1,
889 1473 'wh_modification_date' => 3,
890 1474 'wh_pay_status' => 'all',
891 - 'view_mode' => 'vm_listing',
1475 +
892 1476 'wh_booking_type' => '-999',
893 1477 'wh_keyword' => $uid
894 1478 );
895 1479
@@ -905,11 +1489,11 @@
905 1489
906 1490 foreach ( $res as $booking_obj ) {
907 1491 $booking_id[] = $booking_obj->booking_id;
908 1492 }
909 -
1493 +
910 1494 //debuge('$bookings_arr',$res);
911 1495
912 1496 }
913 1497
914 1498 return implode( ',', $booking_id );
915 -}
1499 +}