PluginProbe
Booktics – Appointment Booking Calendar for Service Businesses / 1.0.27
Booktics – Appointment Booking Calendar for Service Businesses v1.0.27
1.0.29 1.0.28 1.0.27 1.0.26 1.0.25 1.0.24 1.0.23 1.0.22 1.0.21 1.0.20 1.0.19 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.2 1.0.3 All 31 releases
← All changes | base/installer.php +137 -22 1.0.0 → 1.0.27 View file →
@@ -1,8 +1,12 @@
1 1 <?php
2 2
3 3 namespace Booktics;
4 4
5 +if ( ! defined( 'ABSPATH' ) ) {
6 + exit;
7 +}
8 +
5 9 use Booktics\Dummy_Data\Dummy_Data_Manager;
6 10
7 11 class Installer {
8 12 /**
@@ -31,16 +35,17 @@
31 35 *
32 36 * Also handles table structure updates by adding missing columns to existing tables
33 37 * and performing necessary column modifications.
34 38 */
35 - private static function create_tables(): void {
39 + public static function create_tables(): void {
36 40 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
37 41
38 42 global $wpdb;
39 43 $charset_collate = $wpdb->get_charset_collate();
40 44
45 + $table_prefix = $wpdb->prefix;
41 46 $table_schema = array(
42 - "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}booktics_schedules (
47 + "CREATE TABLE IF NOT EXISTS {$table_prefix}booktics_schedules (
43 48 id mediumint(9) NOT NULL AUTO_INCREMENT,
44 49 team_member_id int(11) NOT NULL,
45 50 service_id int(11) NOT NULL,
46 51 location_id int(11) NOT NULL,
@@ -52,9 +57,9 @@
52 57 updated_at datetime DEFAULT NULL,
53 58 PRIMARY KEY (id)
54 59 ) $charset_collate;",
55 60
56 - "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}booktics_carts (
61 + "CREATE TABLE IF NOT EXISTS {$table_prefix}booktics_carts (
57 62 id mediumint(9) NOT NULL AUTO_INCREMENT,
58 63 uuid varchar(36) NOT NULL,
59 64 user_id int(11) NOT NULL,
60 65 coupon_code varchar(100) DEFAULT NULL,
@@ -63,14 +68,15 @@
63 68 updated_at datetime DEFAULT NULL,
64 69 PRIMARY KEY (id)
65 70 ) $charset_collate;",
66 71
67 - "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}booktics_cart_items (
72 + "CREATE TABLE IF NOT EXISTS {$table_prefix}booktics_cart_items (
68 73 id mediumint(9) NOT NULL AUTO_INCREMENT,
69 74 uuid varchar(36) NOT NULL,
70 75 cart_id mediumint(9) NOT NULL,
71 76 team_member_id int(11) DEFAULT NULL,
72 77 service_id int(11) DEFAULT NULL,
78 + location_id int(11) DEFAULT NULL,
73 79 date date DEFAULT NULL,
74 80 start_time varchar(100) DEFAULT NULL,
75 81 end_time varchar(100) DEFAULT NULL,
76 82 price VARCHAR(100) DEFAULT NULL,
@@ -78,9 +84,9 @@
78 84 updated_at datetime DEFAULT NULL,
79 85 PRIMARY KEY (id)
80 86 ) $charset_collate;",
81 87
82 - "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}booktics_orders (
88 + "CREATE TABLE IF NOT EXISTS {$table_prefix}booktics_orders (
83 89 id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
84 90 order_no VARCHAR(100) NOT NULL,
85 91 customer_id BIGINT UNSIGNED NOT NULL,
86 92 customer_note VARCHAR(100) DEFAULT NULL,
@@ -86,8 +92,9 @@
86 92 customer_note VARCHAR(100) DEFAULT NULL,
87 93 status VARCHAR(50) DEFAULT 'pending',
88 94 payment_status VARCHAR(50) DEFAULT NULL,
89 95 timezone VARCHAR(50) DEFAULT 'UTC',
96 + currency VARCHAR(10) DEFAULT NULL,
90 97 price_breakdown JSON DEFAULT NULL,
91 98 tax_total VARCHAR(100) DEFAULT NULL,
92 99 coupon_code VARCHAR(100) DEFAULT NULL,
93 100 coupon_discount VARCHAR(100) DEFAULT NULL,
@@ -95,15 +102,17 @@
95 102 total VARCHAR(100) DEFAULT 0,
96 103 payment_method VARCHAR(50) DEFAULT NULL,
97 104 payment_intent_id VARCHAR(250) DEFAULT NULL,
98 105 payment_transaction_id VARCHAR(250) DEFAULT NULL,
106 + directorist_id BIGINT UNSIGNED DEFAULT NULL,
99 107 created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
100 108 updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
101 109 PRIMARY KEY (id),
102 - INDEX (order_no)
110 + INDEX (order_no),
111 + INDEX (directorist_id)
103 112 ) $charset_collate;",
104 113
105 - "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}booktics_payments (
114 + "CREATE TABLE IF NOT EXISTS {$table_prefix}booktics_payments (
106 115 id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
107 116 order_id BIGINT UNSIGNED NOT NULL,
108 117 customer_id BIGINT UNSIGNED NOT NULL,
109 118 amount VARCHAR(20) NOT NULL,
@@ -120,16 +129,102 @@
120 129 INDEX (customer_id),
121 130 INDEX (intent_id),
122 131 INDEX (transaction_id)
123 132 ) $charset_collate;",
133 +
134 + "CREATE TABLE IF NOT EXISTS {$table_prefix}booktics_guests (
135 + id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
136 + wp_user_id BIGINT UNSIGNED DEFAULT NULL,
137 + first_name VARCHAR(100) DEFAULT NULL,
138 + last_name VARCHAR(100) DEFAULT NULL,
139 + user_login VARCHAR(100) DEFAULT NULL,
140 + email VARCHAR(100) DEFAULT NULL,
141 + phone VARCHAR(10) DEFAULT NULL,
142 + description VARCHAR(250) DEFAULT NULL,
143 + image VARCHAR(250) DEFAULT NULL,
144 + status INT DEFAULT 0,
145 + created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
146 + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
147 + INDEX (wp_user_id),
148 + INDEX (email),
149 + INDEX (first_name)
150 + ) $charset_collate;",
124 151 );
125 -
126 152 foreach ( $table_schema as $table_sql ) {
127 153 dbDelta( $table_sql );
128 154 }
129 155
156 + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.PreparedSQL.NotPrepared -- Schema migration; direct DB access required, caching inappropriate for DDL, identifiers sanitized via esc_sql().
157 +
158 + // Add currency column to existing orders table if it doesn't exist
159 + $orders_table = "{$table_prefix}booktics_orders";
160 + $column_exists = $wpdb->get_results(
161 + "SHOW COLUMNS FROM `" . \esc_sql( $orders_table ) . "` LIKE 'currency'"
162 + );
163 + if ( empty( $column_exists ) ) {
164 + $wpdb->query(
165 + "ALTER TABLE `" . \esc_sql( $orders_table ) . "` ADD COLUMN currency VARCHAR(10) DEFAULT NULL AFTER timezone"
166 + );
167 + }
168 +
169 + // Handle booktics_guests table
170 + $guests_table = "{$table_prefix}booktics_guests";
171 + $guests_columns = $wpdb->get_col( 'DESC `' . \esc_sql( $guests_table ) . '`', 0 );
172 +
173 + // Drop index on first_name if it exists
174 + $indexes = $wpdb->get_results( "SHOW INDEX FROM `" . \esc_sql( $guests_table ) . "` WHERE Key_name = 'first_name'", ARRAY_A );
175 + if ( ! empty( $indexes ) ) {
176 + $wpdb->query(
177 + sprintf(
178 + 'ALTER TABLE `%s` DROP INDEX `first_name`',
179 + \esc_sql( $guests_table )
180 + )
181 + );
182 + }
183 +
184 + // Rename first_name to name if first_name exists and name does not
185 + if ( in_array( 'first_name', $guests_columns, true ) && ! in_array( 'name', $guests_columns, true ) ) {
186 + $wpdb->query(
187 + sprintf(
188 + 'ALTER TABLE `%s` CHANGE COLUMN `first_name` `name` VARCHAR(100) DEFAULT NULL',
189 + \esc_sql( $guests_table )
190 + )
191 + );
192 + }
193 +
194 + // Remove last_name column if it exists
195 + if ( in_array( 'last_name', $guests_columns, true ) ) {
196 + $wpdb->query(
197 + sprintf(
198 + 'ALTER TABLE `%s` DROP COLUMN `last_name`',
199 + \esc_sql( $guests_table )
200 + )
201 + );
202 + }
203 +
204 + // Add index on name if it does not exist
205 + $indexes_name = $wpdb->get_results( "SHOW INDEX FROM `" . \esc_sql( $guests_table ) . "` WHERE Key_name = 'name'", ARRAY_A );
206 + if ( empty( $indexes_name ) && in_array( 'name', $guests_columns, true ) ) {
207 + $wpdb->query(
208 + sprintf(
209 + 'ALTER TABLE `%s` ADD INDEX (`name`)',
210 + \esc_sql( $guests_table )
211 + )
212 + );
213 + }
214 +
215 + // Alter first_name column if it exists
216 + if ( in_array( 'first_name', $guests_columns, true ) ) {
217 + $wpdb->query(
218 + sprintf(
219 + 'ALTER TABLE `%s` MODIFY COLUMN `first_name` VARCHAR(100) DEFAULT NULL',
220 + \esc_sql( $guests_table )
221 + )
222 + );
223 + }
224 +
130 225 // Add missing columns to booktics_orders table
131 - $orders_table = "{$wpdb->prefix}booktics_orders";
226 + $orders_table = "{$table_prefix}booktics_orders";
132 227 $orders_columns = $wpdb->get_col( 'DESC `' . esc_sql( $orders_table ) . '`', 0 );
133 228
134 229 $orders_columns_to_add = array(
135 230 'payment_method' => 'VARCHAR(50) DEFAULT NULL',
@@ -134,24 +229,39 @@
134 229 $orders_columns_to_add = array(
135 230 'payment_method' => 'VARCHAR(50) DEFAULT NULL',
136 231 'payment_intent_id' => 'VARCHAR(250) DEFAULT NULL',
137 232 'payment_transaction_id' => 'VARCHAR(250) DEFAULT NULL',
233 + 'custom_fields' => 'TEXT DEFAULT NULL',
234 + 'directorist_id' => 'BIGINT UNSIGNED DEFAULT NULL',
138 235 );
139 236
140 237 foreach ( $orders_columns_to_add as $column => $definition ) {
141 238 if ( ! in_array( $column, $orders_columns, true ) ) {
142 - $query = sprintf(
143 - 'ALTER TABLE `%s` ADD COLUMN `%s` %s',
144 - esc_sql( $orders_table ),
145 - esc_sql( $column ),
146 - $definition
239 + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.PreparedSQL.NotPrepared -- Schema migration; identifiers sanitized via esc_sql().
240 + $wpdb->query(
241 + sprintf(
242 + 'ALTER TABLE `%s` ADD COLUMN `%s` %s',
243 + esc_sql( $orders_table ),
244 + esc_sql( $column ),
245 + $definition
246 + )
147 247 );
148 - $wpdb->query( $query );
149 248 }
150 249 }
151 250
251 + // Add index for directorist_id if it doesn't exist
252 + $indexes = $wpdb->get_results( "SHOW INDEX FROM `" . esc_sql( $orders_table ) . "` WHERE Key_name = 'directorist_id'", ARRAY_A );
253 + if ( empty( $indexes ) && in_array( 'directorist_id', $orders_columns, true ) ) {
254 + $wpdb->query(
255 + sprintf(
256 + 'ALTER TABLE `%s` ADD INDEX (`directorist_id`)',
257 + esc_sql( $orders_table )
258 + )
259 + );
260 + }
261 +
152 262 // Handle booktics_cart_items table
153 - $cart_items_table = "{$wpdb->prefix}booktics_cart_items";
263 + $cart_items_table = "{$table_prefix}booktics_cart_items";
154 264 $cart_items_columns = $wpdb->get_col( 'DESC `' . esc_sql( $cart_items_table ) . '`', 0 );
155 265
156 266 // Rename sub_total to subtotal if exists
157 267 if ( in_array( 'sub_total', $cart_items_columns, true ) ) {
@@ -174,19 +284,24 @@
174 284 'extra_services' => 'TEXT DEFAULT NULL',
175 285 'total' => 'VARCHAR(20) NOT NULL',
176 286 'additional_duration_id' => 'VARCHAR(100) NOT NULL',
177 287 'group_booking' => 'TEXT DEFAULT NULL',
288 + 'time_format' => 'VARCHAR(10) DEFAULT NULL',
178 289 );
179 290
180 291 foreach ( $cart_items_columns_to_add as $column => $definition ) {
181 292 if ( ! in_array( $column, $cart_items_columns, true ) ) {
182 - $query = sprintf(
183 - 'ALTER TABLE `%s` ADD COLUMN `%s` %s',
184 - esc_sql( $cart_items_table ),
185 - esc_sql( $column ),
186 - $definition
293 + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.PreparedSQL.NotPrepared -- Schema migration; identifiers sanitized via esc_sql().
294 + $wpdb->query(
295 + sprintf(
296 + 'ALTER TABLE `%s` ADD COLUMN `%s` %s',
297 + esc_sql( $cart_items_table ),
298 + esc_sql( $column ),
299 + $definition
300 + )
187 301 );
188 - $wpdb->query( $query );
189 302 }
190 303 }
304 +
305 + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.PreparedSQL.NotPrepared
191 306 }
192 307 }