Restaurant Reservations - Version 2.0.14

Version Description

(2020-02-18) = - Corrects issue in which all bookings were automatically confirming, even beyond the threshold set using the auto-confirm settings - Corrects issue that was causing the max reservations setting to inaccurately set which time slots should be blocked off

Download this release

Release Info

Developer Rustaurius
Plugin Icon 128x128 Restaurant Reservations
Version 2.0.14
Comparing to
See all releases

Code changes from version 2.0.13 to 2.0.14

includes/Ajax.class.php CHANGED
@@ -42,28 +42,28 @@ class rtbAJAX {
42
 
43
  $max_reservations_setting = $rtb_controller->settings->get_setting( 'rtb-max-tables-count' );
44
  $max_reservations = substr( $max_reservations_setting, 0, strpos( $max_reservations_setting, '_' ) );
45
-
46
  $this->year = sanitize_text_field( $_POST['year'] );
47
  $this->month = sanitize_text_field( $_POST['month'] );
48
  $this->day = sanitize_text_field( $_POST['day'] );
49
-
50
  $dining_block_setting = $rtb_controller->settings->get_setting( 'rtb-dining-block-length' );
51
  $dining_block = substr( $dining_block_setting, 0, strpos( $dining_block_setting, '_' ) );
52
  $dining_block_seconds = ( $dining_block * 60 - 1 ); // Take 1 second off, to avoid bookings that start or end exactly at the beginning of a booking block
53
-
54
  // Get opening/closing times for this particular day
55
  $hours = $this->get_opening_hours();
56
-
57
  // If the restaurant is closed that day, return false
58
  if ( ! $hours ) { echo $hours; die(); }
59
-
60
  $args = array(
61
- 'post_count' => -1,
62
  'date_range' => 'dates',
63
  'start_date' => $this->year . '-' . $this->month . '-' . $this->day,
64
  'end_date' => $this->year . '-' . $this->month . '-' . $this->day
65
  );
66
-
67
  require_once( RTB_PLUGIN_DIR . '/includes/Query.class.php' );
68
  $query = new rtbQuery( $args );
69
  $query->prepare_args();
@@ -73,37 +73,44 @@ class rtbAJAX {
73
  foreach ( $query->get_bookings() as $booking ) {
74
  $times[] = strtotime( $booking->date );
75
  }
76
-
77
  sort( $times );
78
-
79
  // Go through all current booking times and figure out when we're at or above the max
80
  $blocked = false;
81
  $blocked_times = array();
82
- $current_times = array();
83
  if ($max_reservations != 'undefined' and $max_reservations != 0) {
84
- foreach ( $times as $time ) {
85
  $current_times[] = $time;
86
 
87
- while ( sizeOf( $current_times ) > 0 and reset( $current_times ) < $time - $dining_block_seconds ) { array_shift( $current_times ); }
88
-
89
- if ( $blocked and sizeOf( $current_times ) < $max_reservations ) {
90
- $blocked = false;
91
- $blocked_times[] = $time + $dining_block_seconds;
 
 
 
 
 
 
 
92
  }
93
 
94
  // Check if we're at or above the maximum number of reservations
95
- if ( sizeOf( $current_times ) >= $max_reservations ) {
96
  $blocked = true;
97
  $blocked_times[] = $time - $dining_block_seconds;
98
  }
99
  }
100
  }
101
-
102
  if ( $blocked ) { $blocked_times[] = end( $current_times ) + $dining_block_seconds; }
103
-
104
  $combined_times = array_merge( $blocked_times, $hours );
105
  sort( $combined_times );
106
-
107
  //Go through all of times to determine when the restaurant is open and not blocked
108
  $open = false;
109
  $blocked = false;
@@ -132,9 +139,9 @@ class rtbAJAX {
132
  }
133
  }
134
  }
135
-
136
  echo json_encode( $valid_times );
137
-
138
  die();
139
  }
140
 
42
 
43
  $max_reservations_setting = $rtb_controller->settings->get_setting( 'rtb-max-tables-count' );
44
  $max_reservations = substr( $max_reservations_setting, 0, strpos( $max_reservations_setting, '_' ) );
45
+
46
  $this->year = sanitize_text_field( $_POST['year'] );
47
  $this->month = sanitize_text_field( $_POST['month'] );
48
  $this->day = sanitize_text_field( $_POST['day'] );
49
+
50
  $dining_block_setting = $rtb_controller->settings->get_setting( 'rtb-dining-block-length' );
51
  $dining_block = substr( $dining_block_setting, 0, strpos( $dining_block_setting, '_' ) );
52
  $dining_block_seconds = ( $dining_block * 60 - 1 ); // Take 1 second off, to avoid bookings that start or end exactly at the beginning of a booking block
53
+
54
  // Get opening/closing times for this particular day
55
  $hours = $this->get_opening_hours();
56
+
57
  // If the restaurant is closed that day, return false
58
  if ( ! $hours ) { echo $hours; die(); }
59
+
60
  $args = array(
61
+ 'posts_per_page' => -1,
62
  'date_range' => 'dates',
63
  'start_date' => $this->year . '-' . $this->month . '-' . $this->day,
64
  'end_date' => $this->year . '-' . $this->month . '-' . $this->day
65
  );
66
+
67
  require_once( RTB_PLUGIN_DIR . '/includes/Query.class.php' );
68
  $query = new rtbQuery( $args );
69
  $query->prepare_args();
73
  foreach ( $query->get_bookings() as $booking ) {
74
  $times[] = strtotime( $booking->date );
75
  }
76
+
77
  sort( $times );
78
+
79
  // Go through all current booking times and figure out when we're at or above the max
80
  $blocked = false;
81
  $blocked_times = array();
82
+ $current_times = array();
83
  if ($max_reservations != 'undefined' and $max_reservations != 0) {
84
+ foreach ( $times as $key => $time ) {
85
  $current_times[] = $time;
86
 
87
+ while ( sizeOf( $current_times ) > 0 and reset( $current_times ) < $time - $dining_block_seconds ) {
88
+ //save the time to know when the blocking potentially ends
89
+ $removed_time = reset( $current_times );
90
+
91
+ // remove the expired time
92
+ array_shift( $current_times );
93
+
94
+ // remove the block if we've dropped below the max reservation count
95
+ if ( $blocked and sizeOf( $current_times ) < $max_reservations ) {
96
+ $blocked = false;
97
+ $blocked_times[] = $removed_time + $dining_block_seconds;
98
+ }
99
  }
100
 
101
  // Check if we're at or above the maximum number of reservations
102
+ if ( ! $blocked and sizeOf( $current_times ) >= $max_reservations ) {
103
  $blocked = true;
104
  $blocked_times[] = $time - $dining_block_seconds;
105
  }
106
  }
107
  }
108
+
109
  if ( $blocked ) { $blocked_times[] = end( $current_times ) + $dining_block_seconds; }
110
+
111
  $combined_times = array_merge( $blocked_times, $hours );
112
  sort( $combined_times );
113
+
114
  //Go through all of times to determine when the restaurant is open and not blocked
115
  $open = false;
116
  $blocked = false;
139
  }
140
  }
141
  }
142
+
143
  echo json_encode( $valid_times );
144
+
145
  die();
146
  }
147
 
includes/Booking.class.php CHANGED
@@ -459,21 +459,7 @@ class rtbBooking {
459
  $this->message = empty( $_POST['rtb-message'] ) ? '' : nl2br( wp_kses_post( stripslashes_deep( $_POST['rtb-message'] ) ) );
460
 
461
  // Post Status (define a default post status if none passed)
462
- if ( !empty( $_POST['rtb-post-status'] ) && array_key_exists( $_POST['rtb-post-status'], $rtb_controller->cpts->booking_statuses ) ) {
463
- $this->post_status = sanitize_text_field( stripslashes_deep( $_POST['rtb-post-status'] ) );
464
- } elseif ( $this->party < $rtb_controller->settings->get_setting( 'auto-confirm-max-party-size' ) ) {
465
- $this->post_status = 'confirmed';
466
- } else {
467
- $this->post_status = 'pending';
468
- }
469
-
470
- // Check if the post status should be changed to confirmed, based on the maximum number of reservations and/or seats for auto-confirmation
471
- if ( $rtb_controller->settings->get_setting( 'auto-confirm-max-reservations' ) ) {
472
- $this->post_status = $this->under_max_confirm_reservations() ? 'confirmed' : $this->post_status;
473
- }
474
- if ( $rtb_controller->settings->get_setting( 'auto-confirm-max-seats' ) ) {
475
- $this->post_status = $this->under_max_confirm_seats() ? 'confirmed' : $this->post_status;
476
- }
477
 
478
  // Consent
479
  $require_consent = $rtb_controller->settings->get_setting( 'require-consent' );
@@ -636,17 +622,17 @@ class rtbBooking {
636
  $max_reservations_setting = $rtb_controller->settings->get_setting( 'auto-confirm-max-reservations' );
637
  $max_reservations = substr( $max_reservations_setting, 0, strpos( $max_reservations_setting, '_' ) );
638
 
639
- if ($max_reservations == 'undefined' or $max_reservations == 0) { return; }
640
 
641
  $dining_block_setting = $rtb_controller->settings->get_setting( 'rtb-dining-block-length' );
642
  $dining_block = substr( $dining_block_setting, 0, strpos( $dining_block_setting, '_' ) );
643
  $dining_block_seconds = ( $dining_block * 60 - 1 ); // Take 1 second off, to avoid bookings that start or end exactly at the beginning of a booking block
644
 
645
- $after_time = strtotime($this->date) - $dining_block_seconds;
646
- $before_time = strtotime($this->date) + $dining_block_seconds;
647
 
648
  $args = array(
649
- 'post_count' => -1,
650
  'date_query' => array(
651
  'before' => date( 'c', $before_time ),
652
  'after' => date( 'c', $after_time )
@@ -655,20 +641,21 @@ class rtbBooking {
655
 
656
  require_once( RTB_PLUGIN_DIR . '/includes/Query.class.php' );
657
  $query = new rtbQuery( $args );
 
658
 
659
  $times = array();
660
  foreach ( $query->get_bookings() as $booking ) {
661
  $times[] = strtotime( $booking->date );
662
  }
663
-
664
  sort( $times );
665
 
666
  $auto_confirm = true;
667
  $current_times = array();
668
  foreach ( $times as $time ) {
669
  $current_times[] = $time;
670
-
671
- if ( reset( $current_times ) < $time - $dining_block_seconds ) { array_shift( $current_times ); }
672
 
673
  // Check if we've reached 1 below the max confirmation number, since adding the current booking will put us at the threshold
674
  if ( sizeOf( $current_times ) + 1 >= $max_reservations ) { $auto_confirm = false; break; }
@@ -689,17 +676,17 @@ class rtbBooking {
689
  $max_seats_setting = $rtb_controller->settings->get_setting( 'auto-confirm-max-seats' );
690
  $max_seats = substr( $max_seats_setting, 0, strpos( $max_seats_setting, '_' ) );
691
 
692
- if ($max_seats == 'undefined' or $max_seats == 0) { return; }
693
 
694
  $dining_block_setting = $rtb_controller->settings->get_setting( 'rtb-dining-block-length' );
695
  $dining_block = substr( $dining_block_setting, 0, strpos( $dining_block_setting, '_' ) );
696
  $dining_block_seconds = ( $dining_block * 60 - 1 ); // Take 1 second off, to avoid bookings that start or end exactly at the beginning of a booking block
697
 
698
- $after_time = strtotime($this->date) - $dining_block_seconds;
699
- $before_time = strtotime($this->date) + $dining_block_seconds;
700
 
701
  $args = array(
702
- 'post_count' => -1,
703
  'date_query' => array(
704
  'before' => date( 'c', $before_time ),
705
  'after' => date( 'c', $after_time )
@@ -734,6 +721,29 @@ class rtbBooking {
734
  return $auto_confirm;
735
  }
736
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
737
  /**
738
  * Add a log entry to the booking
739
  *
459
  $this->message = empty( $_POST['rtb-message'] ) ? '' : nl2br( wp_kses_post( stripslashes_deep( $_POST['rtb-message'] ) ) );
460
 
461
  // Post Status (define a default post status if none passed)
462
+ $this->determine_status();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
463
 
464
  // Consent
465
  $require_consent = $rtb_controller->settings->get_setting( 'require-consent' );
622
  $max_reservations_setting = $rtb_controller->settings->get_setting( 'auto-confirm-max-reservations' );
623
  $max_reservations = substr( $max_reservations_setting, 0, strpos( $max_reservations_setting, '_' ) );
624
 
625
+ if ($max_reservations == 'undefined' or $max_reservations <= 1) { return false; }
626
 
627
  $dining_block_setting = $rtb_controller->settings->get_setting( 'rtb-dining-block-length' );
628
  $dining_block = substr( $dining_block_setting, 0, strpos( $dining_block_setting, '_' ) );
629
  $dining_block_seconds = ( $dining_block * 60 - 1 ); // Take 1 second off, to avoid bookings that start or end exactly at the beginning of a booking block
630
 
631
+ $after_time = strtotime($this->date) - $dining_block_seconds - (3600 * get_option( 'gmt_offset' ) );
632
+ $before_time = strtotime($this->date) + $dining_block_seconds - (3600 * get_option( 'gmt_offset' ) );
633
 
634
  $args = array(
635
+ 'posts_per_page' => -1,
636
  'date_query' => array(
637
  'before' => date( 'c', $before_time ),
638
  'after' => date( 'c', $after_time )
641
 
642
  require_once( RTB_PLUGIN_DIR . '/includes/Query.class.php' );
643
  $query = new rtbQuery( $args );
644
+ $query->prepare_args();
645
 
646
  $times = array();
647
  foreach ( $query->get_bookings() as $booking ) {
648
  $times[] = strtotime( $booking->date );
649
  }
650
+
651
  sort( $times );
652
 
653
  $auto_confirm = true;
654
  $current_times = array();
655
  foreach ( $times as $time ) {
656
  $current_times[] = $time;
657
+ //update_option("EWD_Debugging", reset( $current_times ) . " - " . ($time - $dining_block_seconds) . " - " . $dining_block_seconds);
658
+ if ( reset( $current_times ) < ($time - $dining_block_seconds) ) { array_shift( $current_times ); }
659
 
660
  // Check if we've reached 1 below the max confirmation number, since adding the current booking will put us at the threshold
661
  if ( sizeOf( $current_times ) + 1 >= $max_reservations ) { $auto_confirm = false; break; }
676
  $max_seats_setting = $rtb_controller->settings->get_setting( 'auto-confirm-max-seats' );
677
  $max_seats = substr( $max_seats_setting, 0, strpos( $max_seats_setting, '_' ) );
678
 
679
+ if ($max_seats == 'undefined' or $max_seats <= 1 or $this->party >= $max_seats) { return false; }
680
 
681
  $dining_block_setting = $rtb_controller->settings->get_setting( 'rtb-dining-block-length' );
682
  $dining_block = substr( $dining_block_setting, 0, strpos( $dining_block_setting, '_' ) );
683
  $dining_block_seconds = ( $dining_block * 60 - 1 ); // Take 1 second off, to avoid bookings that start or end exactly at the beginning of a booking block
684
 
685
+ $after_time = strtotime($this->date) - $dining_block_seconds - (3600 * get_option( 'gmt_offset' ) );
686
+ $before_time = strtotime($this->date) + $dining_block_seconds - (3600 * get_option( 'gmt_offset' ) );
687
 
688
  $args = array(
689
+ 'posts_per_page' => -1,
690
  'date_query' => array(
691
  'before' => date( 'c', $before_time ),
692
  'after' => date( 'c', $after_time )
721
  return $auto_confirm;
722
  }
723
 
724
+ /**
725
+ * Determine what status a booking should have
726
+ *
727
+ * @since 2.1.0
728
+ */
729
+ public function determine_status( $payment_made = false ) {
730
+ global $rtb_controller;
731
+
732
+ if ( !empty( $_POST['rtb-post-status'] ) && array_key_exists( $_POST['rtb-post-status'], $rtb_controller->cpts->booking_statuses ) ) {
733
+ $this->post_status = sanitize_text_field( stripslashes_deep( $_POST['rtb-post-status'] ) );
734
+ } elseif ( $rtb_controller->settings->get_setting( 'require-deposit' ) and ! $payment_made ) {
735
+ $this->post_status = 'draft';
736
+ } elseif ( $this->party < $rtb_controller->settings->get_setting( 'auto-confirm-max-party-size' ) ) {
737
+ $this->post_status = 'confirmed';
738
+ } elseif ($rtb_controller->settings->get_setting( 'auto-confirm-max-reservations' ) and $this->under_max_confirm_reservations() ) {
739
+ $this->post_status = 'confirmed';
740
+ } elseif ( $rtb_controller->settings->get_setting( 'auto-confirm-max-seats' ) and $this->under_max_confirm_seats() ) {
741
+ $this->post_status = 'confirmed';
742
+ } else {
743
+ $this->post_status = 'pending';
744
+ }
745
+ }
746
+
747
  /**
748
  * Add a log entry to the booking
749
  *
readme.txt CHANGED
@@ -184,6 +184,10 @@ Find answers to even more questions in the [FAQ](http://doc.fivestarplugins.com/
184
 
185
  == Changelog ==
186
 
 
 
 
 
187
  = 2.0.13 (2020-02-14) =
188
  - Adding in a separate success message option for automatically-confirmed bookings
189
  - Updating the mPDF library
184
 
185
  == Changelog ==
186
 
187
+ = 2.0.14 (2020-02-18) =
188
+ - Corrects issue in which all bookings were automatically confirming, even beyond the threshold set using the auto-confirm settings
189
+ - Corrects issue that was causing the max reservations setting to inaccurately set which time slots should be blocked off
190
+
191
  = 2.0.13 (2020-02-14) =
192
  - Adding in a separate success message option for automatically-confirmed bookings
193
  - Updating the mPDF library
restaurant-reservations.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Five Star Restaurant Reservations
4
  * Plugin URI: http://www.fivestarplugins.com/plugins/five-star-restaurant-reservations/
5
  * Description: Restaurant reservations made easy. Accept bookings online. Quickly confirm or reject reservations, send email notifications, set booking times and more.
6
- * Version: 2.0.13
7
  * Author: FiveStarPlugins
8
  * Author URI: https://profiles.wordpress.org/fivestarplugins/
9
  * Text Domain: restaurant-reservations
3
  * Plugin Name: Five Star Restaurant Reservations
4
  * Plugin URI: http://www.fivestarplugins.com/plugins/five-star-restaurant-reservations/
5
  * Description: Restaurant reservations made easy. Accept bookings online. Quickly confirm or reject reservations, send email notifications, set booking times and more.
6
+ * Version: 2.0.14
7
  * Author: FiveStarPlugins
8
  * Author URI: https://profiles.wordpress.org/fivestarplugins/
9
  * Text Domain: restaurant-reservations