PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / 5.5.2
LatePoint – Calendar Booking Plugin for Appointments and Events v5.5.2
5.6.5 5.6.4 5.6.3 5.6.2 5.6.1 5.6.0 5.5.2 5.5.1 5.5.0 5.4.2 trunk 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.1.9 5.1.91 5.1.92 5.1.93 5.1.94 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1
latepoint / latepoint.php
latepoint Last commit date
blocks 4 months ago languages 9 months ago lib 1 month ago public 1 month ago latepoint.php 1 month ago readme.txt 1 month ago uninstall.php 4 months ago
latepoint.php
1627 lines
1 <?php
2 /**
3 * Plugin Name: LatePoint
4 * Description: Appointment Scheduling Software for WordPress
5 * Version: 5.5.2
6 * Author: LatePoint
7 * Author URI: https://latepoint.com
8 * Plugin URI: https://latepoint.com
9 * Text Domain: latepoint
10 * Domain Path: /languages
11 * License: GPLv3
12 */
13
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit; // Exit if accessed directly.
16 }
17
18
19 if ( ! class_exists( 'LatePoint' ) ) :
20
21 /**
22 * Main LatePoint Class.
23 *
24 */
25
26 final class LatePoint {
27
28 /**
29 * LatePoint version.
30 *
31 */
32 public $version = '5.5.2';
33 public $db_version = '2.3.0';
34
35
36 /**
37 * LatePoint Constructor.
38 */
39 public function __construct() {
40
41 $this->define_constants();
42 $this->includes();
43 $this->init_hooks();
44 OsDatabaseHelper::check_db_version();
45 OsDatabaseHelper::check_db_version_for_addons();
46
47
48 $GLOBALS['latepoint_settings'] = new OsSettingsHelper();
49 }
50
51
52 /**
53 * Define constant if not already set.
54 *
55 */
56 public function define( $name, $value ) {
57 if ( ! defined( $name ) ) {
58 define( $name, $value );
59 }
60 }
61
62
63 /**
64 * Get the plugin url. *has trailing slash
65 * @return string
66 */
67 public static function plugin_url() {
68 return plugin_dir_url( __FILE__ );
69 }
70
71 public static function public_javascripts() {
72 return plugin_dir_url( __FILE__ ) . 'public/javascripts/';
73 }
74
75 public static function public_vendor_javascripts() {
76 return plugin_dir_url( __FILE__ ) . 'public/javascripts/vendor/';
77 }
78
79 public static function public_stylesheets() {
80 return plugin_dir_url( __FILE__ ) . 'public/stylesheets/';
81 }
82
83 public static function blocks_build_url() {
84 return plugin_dir_url( __FILE__ ) . 'blocks/build/';
85 }
86
87 public static function node_modules_url() {
88 return plugin_dir_url( __FILE__ ) . 'node_modules/';
89 }
90
91 public static function vendor_assets_url() {
92 return plugin_dir_url( __FILE__ ) . 'vendor/';
93 }
94
95 public static function images_url() {
96 return plugin_dir_url( __FILE__ ) . 'public/images/';
97 }
98
99 /**
100 * Get the plugin path.
101 * @return string
102 */
103 public static function plugin_path() {
104 return plugin_dir_path( __FILE__ );
105 }
106
107
108 /**
109 * Define LatePoint Constants.
110 */
111 public function define_constants() {
112 $upload_dir = wp_upload_dir();
113
114 if ( ! defined( 'LATEPOINT_VERSION' ) ) {
115 define( 'LATEPOINT_VERSION', $this->version );
116 }
117 if ( ! defined( 'LATEPOINT_MIN_REQUIRED_PRO_VERSION' ) ) {
118 define( 'LATEPOINT_MIN_REQUIRED_PRO_VERSION', '1.2.5' );
119 }
120
121 // ENVIRONMENTS TYPES
122 if ( ! defined( 'LATEPOINT_ENV_LIVE' ) ) {
123 define( 'LATEPOINT_ENV_LIVE', 'live' );
124 }
125 if ( ! defined( 'LATEPOINT_ENV_DEMO' ) ) {
126 define( 'LATEPOINT_ENV_DEMO', 'demo' );
127 }
128 if ( ! defined( 'LATEPOINT_ENV_DEV' ) ) {
129 define( 'LATEPOINT_ENV_DEV', 'dev' );
130 }
131
132 // PAYMENT ENVIRONMENTS TYPES
133 if ( ! defined( 'LATEPOINT_PAYMENTS_ENV_LIVE' ) ) {
134 define( 'LATEPOINT_PAYMENTS_ENV_LIVE', 'live' );
135 }
136 if ( ! defined( 'LATEPOINT_PAYMENTS_ENV_DEMO' ) ) {
137 define( 'LATEPOINT_PAYMENTS_ENV_DEMO', 'demo' );
138 }
139 if ( ! defined( 'LATEPOINT_PAYMENTS_ENV_DEV' ) ) {
140 define( 'LATEPOINT_PAYMENTS_ENV_DEV', 'dev' );
141 }
142
143
144 if ( ! defined( 'LATEPOINT_PAYMENTS_DEV_SUFFIX' ) ) {
145 define( 'LATEPOINT_PAYMENTS_DEV_SUFFIX', '_dev' );
146 }
147
148 if ( ! defined( 'LATEPOINT_ENV' ) ) {
149 define( 'LATEPOINT_ENV', LATEPOINT_ENV_LIVE );
150 }
151 if ( ! defined( 'LATEPOINT_ALLOW_LOCAL_SERVER' ) ) {
152 define( 'LATEPOINT_ALLOW_LOCAL_SERVER', true );
153 }
154
155 if ( ! defined( 'LATEPOINT_ALLOW_SMS' ) ) {
156 define( 'LATEPOINT_ALLOW_SMS', true );
157 }
158 if ( ! defined( 'LATEPOINT_ALLOW_WHATSAPP' ) ) {
159 define( 'LATEPOINT_ALLOW_WHATSAPP', true );
160 }
161 if ( ! defined( 'LATEPOINT_ALLOW_EMAILS' ) ) {
162 define( 'LATEPOINT_ALLOW_EMAILS', true );
163 }
164
165 if ( ! defined( 'LATEPOINT_PLUGIN_FILE' ) ) {
166 define( 'LATEPOINT_PLUGIN_FILE', __FILE__ );
167 }
168 if ( ! defined( 'LATEPOINT_STYLESHEETS_URL' ) ) {
169 define( 'LATEPOINT_STYLESHEETS_URL', $this->public_stylesheets() );
170 }
171 if ( ! defined( 'LATEPOINT_BLOCKS_BUILD_URL' ) ) {
172 define( 'LATEPOINT_BLOCKS_BUILD_URL', $this->blocks_build_url() );
173 }
174 if ( ! defined( 'LATEPOINT_ABSPATH' ) ) {
175 define( 'LATEPOINT_ABSPATH', dirname( __FILE__ ) . '/' );
176 }
177 if ( ! defined( 'LATEPOINT_LIB_ABSPATH' ) ) {
178 define( 'LATEPOINT_LIB_ABSPATH', LATEPOINT_ABSPATH . 'lib/' );
179 }
180 if ( ! defined( 'LATEPOINT_CONFIG_ABSPATH' ) ) {
181 define( 'LATEPOINT_CONFIG_ABSPATH', LATEPOINT_LIB_ABSPATH . 'config/' );
182 }
183 if ( ! defined( 'LATEPOINT_BLOCKS_ABSPATH' ) ) {
184 define( 'LATEPOINT_BLOCKS_ABSPATH', LATEPOINT_ABSPATH . 'blocks/build/' );
185 }
186 if ( ! defined( 'LATEPOINT_BOWER_ABSPATH' ) ) {
187 define( 'LATEPOINT_BOWER_ABSPATH', LATEPOINT_ABSPATH . 'vendor/bower_components/' );
188 }
189 if ( ! defined( 'LATEPOINT_VIEWS_ABSPATH' ) ) {
190 define( 'LATEPOINT_VIEWS_ABSPATH', LATEPOINT_LIB_ABSPATH . 'views/' );
191 }
192 if ( ! defined( 'LATEPOINT_VIEWS_ABSPATH_SHARED' ) ) {
193 define( 'LATEPOINT_VIEWS_ABSPATH_SHARED', LATEPOINT_LIB_ABSPATH . 'views/shared/' );
194 }
195 if ( ! defined( 'LATEPOINT_VIEWS_MAILERS_ABSPATH' ) ) {
196 define( 'LATEPOINT_VIEWS_MAILERS_ABSPATH', LATEPOINT_VIEWS_ABSPATH . 'mailers/' );
197 }
198 if ( ! defined( 'LATEPOINT_VIEWS_LAYOUTS_ABSPATH' ) ) {
199 define( 'LATEPOINT_VIEWS_LAYOUTS_ABSPATH', LATEPOINT_VIEWS_ABSPATH . 'layouts/' );
200 }
201 if ( ! defined( 'LATEPOINT_VIEWS_PARTIALS_ABSPATH' ) ) {
202 define( 'LATEPOINT_VIEWS_PARTIALS_ABSPATH', LATEPOINT_VIEWS_ABSPATH . 'partials/' );
203 }
204 if ( ! defined( 'LATEPOINT_PLUGIN_BASENAME' ) ) {
205 define( 'LATEPOINT_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
206 }
207
208 if ( ! defined( 'LATEPOINT_PLUGIN_URL' ) ) {
209 define( 'LATEPOINT_PLUGIN_URL', $this->plugin_url() );
210 }
211 if ( ! defined( 'LATEPOINT_LIB_URL' ) ) {
212 define( 'LATEPOINT_LIB_URL', LATEPOINT_PLUGIN_URL . 'lib/' );
213 }
214 if ( ! defined( 'LATEPOINT_PUBLIC_URL' ) ) {
215 define( 'LATEPOINT_PUBLIC_URL', LATEPOINT_PLUGIN_URL . 'public/' );
216 }
217 if ( ! defined( 'LATEPOINT_IMAGES_URL' ) ) {
218 define( 'LATEPOINT_IMAGES_URL', LATEPOINT_PUBLIC_URL . 'images/' );
219 }
220 if ( ! defined( 'LATEPOINT_DEFAULT_AVATAR_URL' ) ) {
221 define( 'LATEPOINT_DEFAULT_AVATAR_URL', LATEPOINT_IMAGES_URL . 'default-avatar.jpg' );
222 }
223 if ( ! defined( 'LATEPOINT_MARKETPLACE' ) ) {
224 define( 'LATEPOINT_MARKETPLACE', 'codecanyon' );
225 }
226 // role to assigne WP user to so they are connected to a LatePoint backend user type (agent or manager)
227 if ( ! defined( 'LATEPOINT_WP_ADMIN_ROLE' ) ) {
228 define( 'LATEPOINT_WP_ADMIN_ROLE', 'administrator' );
229 }
230 if ( ! defined( 'LATEPOINT_WP_AGENT_ROLE' ) ) {
231 define( 'LATEPOINT_WP_AGENT_ROLE', 'latepoint_agent' );
232 }
233 if ( ! defined( 'LATEPOINT_WP_MANAGER_ROLE' ) ) {
234 define( 'LATEPOINT_WP_MANAGER_ROLE', 'latepoint_manager' );
235 }
236 if ( ! defined( 'LATEPOINT_WP_CUSTOMER_ROLE' ) ) {
237 define( 'LATEPOINT_WP_CUSTOMER_ROLE', 'latepoint_customer' );
238 }
239
240 if ( ! defined( 'LATEPOINT_USER_TYPE_ADMIN' ) ) {
241 define( 'LATEPOINT_USER_TYPE_ADMIN', 'admin' );
242 }
243 if ( ! defined( 'LATEPOINT_USER_TYPE_AGENT' ) ) {
244 define( 'LATEPOINT_USER_TYPE_AGENT', 'agent' );
245 }
246 if ( ! defined( 'LATEPOINT_USER_TYPE_CUSTOM' ) ) {
247 define( 'LATEPOINT_USER_TYPE_CUSTOM', 'custom' );
248 }
249 if ( ! defined( 'LATEPOINT_USER_TYPE_CUSTOMER' ) ) {
250 define( 'LATEPOINT_USER_TYPE_CUSTOMER', 'customer' );
251 }
252
253 if ( ! defined( 'LATEPOINT_PARAMS_SCOPE_PUBLIC' ) ) {
254 define( 'LATEPOINT_PARAMS_SCOPE_PUBLIC', 'public' );
255 }
256 if ( ! defined( 'LATEPOINT_PARAMS_SCOPE_ADMIN' ) ) {
257 define( 'LATEPOINT_PARAMS_SCOPE_ADMIN', 'admin' );
258 }
259 if ( ! defined( 'LATEPOINT_PARAMS_SCOPE_CUSTOMER' ) ) {
260 define( 'LATEPOINT_PARAMS_SCOPE_CUSTOMER', 'customer' );
261 }
262
263 if ( ! defined( 'LATEPOINT_ENCRYPTION_KEY' ) ) {
264 define( 'LATEPOINT_ENCRYPTION_KEY', 'oiaf(*Ufdsoh2ie7QEy,R@6(I9H/VoX^r4}SHC_7W-<$S!,/kd)OSw?.Y9lcd105cu$' );
265 }
266
267 if ( ! defined( 'LATEPOINT_AGENT_POST_TYPE' ) ) {
268 define( 'LATEPOINT_AGENT_POST_TYPE', 'latepoint_agent' );
269 }
270
271 if ( ! defined( 'LATEPOINT_UPGRADE_URL' ) ) {
272 define( 'LATEPOINT_UPGRADE_URL', 'https://latepoint.com/upgrade-from-wp' );
273 }
274 if ( ! defined( 'LATEPOINT_SERVICE_POST_TYPE' ) ) {
275 define( 'LATEPOINT_SERVICE_POST_TYPE', 'latepoint_service' );
276 }
277 if ( ! defined( 'LATEPOINT_CUSTOMER_POST_TYPE' ) ) {
278 define( 'LATEPOINT_CUSTOMER_POST_TYPE', 'latepoint_customer' );
279 }
280
281 if ( ! defined( 'LATEPOINT_DB_VERSION' ) ) {
282 define( 'LATEPOINT_DB_VERSION', $this->db_version );
283 }
284
285 global $wpdb;
286 if ( ! defined( 'LATEPOINT_TABLE_RECURRENCES' ) ) {
287 define( 'LATEPOINT_TABLE_RECURRENCES', $wpdb->prefix . 'latepoint_recurrences' );
288 }
289 if ( ! defined( 'LATEPOINT_TABLE_BUNDLES' ) ) {
290 define( 'LATEPOINT_TABLE_BUNDLES', $wpdb->prefix . 'latepoint_bundles' );
291 }
292 if ( ! defined( 'LATEPOINT_TABLE_BUNDLES_SERVICES' ) ) {
293 define( 'LATEPOINT_TABLE_JOIN_BUNDLES_SERVICES', $wpdb->prefix . 'latepoint_bundles_services' );
294 }
295 if ( ! defined( 'LATEPOINT_TABLE_BOOKINGS' ) ) {
296 define( 'LATEPOINT_TABLE_BOOKINGS', $wpdb->prefix . 'latepoint_bookings' );
297 }
298 if ( ! defined( 'LATEPOINT_TABLE_SESSIONS' ) ) {
299 define( 'LATEPOINT_TABLE_SESSIONS', $wpdb->prefix . 'latepoint_sessions' );
300 }
301 if ( ! defined( 'LATEPOINT_TABLE_SERVICES' ) ) {
302 define( 'LATEPOINT_TABLE_SERVICES', $wpdb->prefix . 'latepoint_services' );
303 }
304 if ( ! defined( 'LATEPOINT_TABLE_SETTINGS' ) ) {
305 define( 'LATEPOINT_TABLE_SETTINGS', $wpdb->prefix . 'latepoint_settings' );
306 }
307 if ( ! defined( 'LATEPOINT_TABLE_SERVICE_CATEGORIES' ) ) {
308 define( 'LATEPOINT_TABLE_SERVICE_CATEGORIES', $wpdb->prefix . 'latepoint_service_categories' );
309 }
310 if ( ! defined( 'LATEPOINT_TABLE_WORK_PERIODS' ) ) {
311 define( 'LATEPOINT_TABLE_WORK_PERIODS', $wpdb->prefix . 'latepoint_work_periods' );
312 }
313 if ( ! defined( 'LATEPOINT_TABLE_CUSTOM_PRICES' ) ) {
314 define( 'LATEPOINT_TABLE_CUSTOM_PRICES', $wpdb->prefix . 'latepoint_custom_prices' );
315 }
316 if ( ! defined( 'LATEPOINT_TABLE_AGENTS_SERVICES' ) ) {
317 define( 'LATEPOINT_TABLE_AGENTS_SERVICES', $wpdb->prefix . 'latepoint_agents_services' );
318 }
319 if ( ! defined( 'LATEPOINT_TABLE_ACTIVITIES' ) ) {
320 define( 'LATEPOINT_TABLE_ACTIVITIES', $wpdb->prefix . 'latepoint_activities' );
321 }
322 if ( ! defined( 'LATEPOINT_TABLE_TRANSACTIONS' ) ) {
323 define( 'LATEPOINT_TABLE_TRANSACTIONS', $wpdb->prefix . 'latepoint_transactions' );
324 }
325 if ( ! defined( 'LATEPOINT_TABLE_TRANSACTION_REFUNDS' ) ) {
326 define( 'LATEPOINT_TABLE_TRANSACTION_REFUNDS', $wpdb->prefix . 'latepoint_transaction_refunds' );
327 }
328 if ( ! defined( 'LATEPOINT_TABLE_TRANSACTION_INTENTS' ) ) {
329 define( 'LATEPOINT_TABLE_TRANSACTION_INTENTS', $wpdb->prefix . 'latepoint_transaction_intents' );
330 }
331 if ( ! defined( 'LATEPOINT_TABLE_AGENTS' ) ) {
332 define( 'LATEPOINT_TABLE_AGENTS', $wpdb->prefix . 'latepoint_agents' );
333 }
334 if ( ! defined( 'LATEPOINT_TABLE_CUSTOMERS' ) ) {
335 define( 'LATEPOINT_TABLE_CUSTOMERS', $wpdb->prefix . 'latepoint_customers' );
336 }
337 if ( ! defined( 'LATEPOINT_TABLE_CUSTOMER_META' ) ) {
338 define( 'LATEPOINT_TABLE_CUSTOMER_META', $wpdb->prefix . 'latepoint_customer_meta' );
339 }
340 if ( ! defined( 'LATEPOINT_TABLE_SERVICE_META' ) ) {
341 define( 'LATEPOINT_TABLE_SERVICE_META', $wpdb->prefix . 'latepoint_service_meta' );
342 }
343 if ( ! defined( 'LATEPOINT_TABLE_BOOKING_META' ) ) {
344 define( 'LATEPOINT_TABLE_BOOKING_META', $wpdb->prefix . 'latepoint_booking_meta' );
345 }
346 if ( ! defined( 'LATEPOINT_TABLE_AGENT_META' ) ) {
347 define( 'LATEPOINT_TABLE_AGENT_META', $wpdb->prefix . 'latepoint_agent_meta' );
348 }
349 if ( ! defined( 'LATEPOINT_TABLE_BUNDLE_META' ) ) {
350 define( 'LATEPOINT_TABLE_BUNDLE_META', $wpdb->prefix . 'latepoint_bundle_meta' );
351 }
352 if ( ! defined( 'LATEPOINT_TABLE_STEPS' ) ) {
353 define( 'LATEPOINT_TABLE_STEPS', $wpdb->prefix . 'latepoint_steps' );
354 }
355 if ( ! defined( 'LATEPOINT_TABLE_STEP_SETTINGS' ) ) {
356 define( 'LATEPOINT_TABLE_STEP_SETTINGS', $wpdb->prefix . 'latepoint_step_settings' );
357 }
358 if ( ! defined( 'LATEPOINT_TABLE_LOCATIONS' ) ) {
359 define( 'LATEPOINT_TABLE_LOCATIONS', $wpdb->prefix . 'latepoint_locations' );
360 }
361 if ( ! defined( 'LATEPOINT_TABLE_LOCATION_CATEGORIES' ) ) {
362 define( 'LATEPOINT_TABLE_LOCATION_CATEGORIES', $wpdb->prefix . 'latepoint_location_categories' );
363 }
364 if ( ! defined( 'LATEPOINT_TABLE_PROCESSES' ) ) {
365 define( 'LATEPOINT_TABLE_PROCESSES', $wpdb->prefix . 'latepoint_processes' );
366 }
367 if ( ! defined( 'LATEPOINT_TABLE_PROCESS_JOBS' ) ) {
368 define( 'LATEPOINT_TABLE_PROCESS_JOBS', $wpdb->prefix . 'latepoint_process_jobs' );
369 }
370
371 if ( ! defined( 'LATEPOINT_TABLE_CARTS' ) ) {
372 define( 'LATEPOINT_TABLE_CARTS', $wpdb->prefix . 'latepoint_carts' );
373 }
374 if ( ! defined( 'LATEPOINT_TABLE_CART_META' ) ) {
375 define( 'LATEPOINT_TABLE_CART_META', $wpdb->prefix . 'latepoint_cart_meta' );
376 }
377 if ( ! defined( 'LATEPOINT_TABLE_CART_ITEMS' ) ) {
378 define( 'LATEPOINT_TABLE_CART_ITEMS', $wpdb->prefix . 'latepoint_cart_items' );
379 }
380
381 if ( ! defined( 'LATEPOINT_TABLE_BLOCKED_PERIODS' ) ) {
382 define( 'LATEPOINT_TABLE_BLOCKED_PERIODS', $wpdb->prefix . 'latepoint_blocked_periods' );
383 }
384 if ( ! defined( 'LATEPOINT_TABLE_ORDERS' ) ) {
385 define( 'LATEPOINT_TABLE_ORDERS', $wpdb->prefix . 'latepoint_orders' );
386 }
387 if ( ! defined( 'LATEPOINT_TABLE_ORDER_META' ) ) {
388 define( 'LATEPOINT_TABLE_ORDER_META', $wpdb->prefix . 'latepoint_order_meta' );
389 }
390 if ( ! defined( 'LATEPOINT_TABLE_ORDER_ITEMS' ) ) {
391 define( 'LATEPOINT_TABLE_ORDER_ITEMS', $wpdb->prefix . 'latepoint_order_items' );
392 }
393 if ( ! defined( 'LATEPOINT_TABLE_ORDER_INTENTS' ) ) {
394 define( 'LATEPOINT_TABLE_ORDER_INTENTS', $wpdb->prefix . 'latepoint_order_intents' );
395 }
396 if ( ! defined( 'LATEPOINT_TABLE_ORDER_INTENT_META' ) ) {
397 define( 'LATEPOINT_TABLE_ORDER_INTENT_META', $wpdb->prefix . 'latepoint_order_intent_meta' );
398 }
399 if ( ! defined( 'LATEPOINT_TABLE_ORDER_INVOICES' ) ) {
400 define( 'LATEPOINT_TABLE_ORDER_INVOICES', $wpdb->prefix . 'latepoint_order_invoices' );
401 }
402 if ( ! defined( 'LATEPOINT_TABLE_PAYMENT_REQUESTS' ) ) {
403 define( 'LATEPOINT_TABLE_PAYMENT_REQUESTS', $wpdb->prefix . 'latepoint_payment_requests' );
404 }
405 if ( ! defined( 'LATEPOINT_TABLE_CUSTOMER_OTP_CODES' ) ) {
406 define( 'LATEPOINT_TABLE_CUSTOMER_OTP_CODES', $wpdb->prefix . 'latepoint_customer_otp_codes' );
407 }
408 if ( ! defined( 'LATEPOINT_CUSTOMER_OTP_CODE_STATUS_ACTIVE' ) ) {
409 define( 'LATEPOINT_CUSTOMER_OTP_CODE_STATUS_ACTIVE', 'active' );
410 }
411 if ( ! defined( 'LATEPOINT_CUSTOMER_OTP_CODE_STATUS_USED' ) ) {
412 define( 'LATEPOINT_CUSTOMER_OTP_CODE_STATUS_USED', 'used' );
413 }
414 if ( ! defined( 'LATEPOINT_CUSTOMER_OTP_CODE_STATUS_EXPIRED' ) ) {
415 define( 'LATEPOINT_CUSTOMER_OTP_CODE_STATUS_EXPIRED', 'expired' );
416 }
417 if ( ! defined( 'LATEPOINT_CUSTOMER_OTP_CODE_STATUS_CANCELLED' ) ) {
418 define( 'LATEPOINT_CUSTOMER_OTP_CODE_STATUS_CANCELLED', 'cancelled' );
419 }
420 if ( ! defined( 'LATEPOINT_ORDER_INTENT_STATUS_NEW' ) ) {
421 define( 'LATEPOINT_ORDER_INTENT_STATUS_NEW', 'new' );
422 }
423 if ( ! defined( 'LATEPOINT_ORDER_INTENT_STATUS_CONVERTED' ) ) {
424 define( 'LATEPOINT_ORDER_INTENT_STATUS_CONVERTED', 'converted' );
425 }
426 if ( ! defined( 'LATEPOINT_ORDER_INTENT_STATUS_PROCESSING' ) ) {
427 define( 'LATEPOINT_ORDER_INTENT_STATUS_PROCESSING', 'processing' );
428 }
429 if ( ! defined( 'LATEPOINT_ORDER_INTENT_STATUS_FAILED' ) ) {
430 define( 'LATEPOINT_ORDER_INTENT_STATUS_FAILED', 'failed' );
431 }
432
433 if ( ! defined( 'LATEPOINT_TRANSACTION_INTENT_STATUS_NEW' ) ) {
434 define( 'LATEPOINT_TRANSACTION_INTENT_STATUS_NEW', 'new' );
435 }
436 if ( ! defined( 'LATEPOINT_TRANSACTION_INTENT_STATUS_CONVERTED' ) ) {
437 define( 'LATEPOINT_TRANSACTION_INTENT_STATUS_CONVERTED', 'converted' );
438 }
439 if ( ! defined( 'LATEPOINT_TRANSACTION_INTENT_STATUS_PROCESSING' ) ) {
440 define( 'LATEPOINT_TRANSACTION_INTENT_STATUS_PROCESSING', 'processing' );
441 }
442 if ( ! defined( 'LATEPOINT_TRANSACTION_INTENT_STATUS_FAILED' ) ) {
443 define( 'LATEPOINT_TRANSACTION_INTENT_STATUS_FAILED', 'failed' );
444 }
445
446 if ( ! defined( 'LATEPOINT_BOOKING_STATUS_APPROVED' ) ) {
447 define( 'LATEPOINT_BOOKING_STATUS_APPROVED', 'approved' );
448 }
449 if ( ! defined( 'LATEPOINT_BOOKING_STATUS_PENDING' ) ) {
450 define( 'LATEPOINT_BOOKING_STATUS_PENDING', 'pending' );
451 }
452 if ( ! defined( 'LATEPOINT_BOOKING_STATUS_PAYMENT_PENDING' ) ) {
453 define( 'LATEPOINT_BOOKING_STATUS_PAYMENT_PENDING', 'payment_pending' );
454 }
455 if ( ! defined( 'LATEPOINT_BOOKING_STATUS_CANCELLED' ) ) {
456 define( 'LATEPOINT_BOOKING_STATUS_CANCELLED', 'cancelled' );
457 }
458 if ( ! defined( 'LATEPOINT_BOOKING_STATUS_NO_SHOW' ) ) {
459 define( 'LATEPOINT_BOOKING_STATUS_NO_SHOW', 'no_show' );
460 }
461 if ( ! defined( 'LATEPOINT_BOOKING_STATUS_COMPLETED' ) ) {
462 define( 'LATEPOINT_BOOKING_STATUS_COMPLETED', 'completed' );
463 }
464
465 if ( ! defined( 'LATEPOINT_JOB_STATUS_COMPLETED' ) ) {
466 define( 'LATEPOINT_JOB_STATUS_COMPLETED', 'completed' );
467 }
468 if ( ! defined( 'LATEPOINT_JOB_STATUS_SCHEDULED' ) ) {
469 define( 'LATEPOINT_JOB_STATUS_SCHEDULED', 'scheduled' );
470 }
471 if ( ! defined( 'LATEPOINT_JOB_STATUS_CANCELLED' ) ) {
472 define( 'LATEPOINT_JOB_STATUS_CANCELLED', 'cancelled' );
473 }
474 if ( ! defined( 'LATEPOINT_JOB_STATUS_ERROR' ) ) {
475 define( 'LATEPOINT_JOB_STATUS_ERROR', 'error' );
476 }
477
478 // order statuses
479 if ( ! defined( 'LATEPOINT_ORDER_STATUS_OPEN' ) ) {
480 define( 'LATEPOINT_ORDER_STATUS_OPEN', 'open' );
481 }
482 if ( ! defined( 'LATEPOINT_ORDER_STATUS_CANCELLED' ) ) {
483 define( 'LATEPOINT_ORDER_STATUS_CANCELLED', 'cancelled' );
484 }
485 if ( ! defined( 'LATEPOINT_ORDER_STATUS_COMPLETED' ) ) {
486 define( 'LATEPOINT_ORDER_STATUS_COMPLETED', 'completed' );
487 }
488
489 // order fulfillment statuses
490 if ( ! defined( 'LATEPOINT_ORDER_FULFILLMENT_STATUS_NOT_FULFILLED' ) ) {
491 define( 'LATEPOINT_ORDER_FULFILLMENT_STATUS_NOT_FULFILLED', 'not_fulfilled' );
492 }
493 if ( ! defined( 'LATEPOINT_ORDER_FULFILLMENT_STATUS_FULFILLED' ) ) {
494 define( 'LATEPOINT_ORDER_FULFILLMENT_STATUS_FULFILLED', 'fulfilled' );
495 }
496 if ( ! defined( 'LATEPOINT_ORDER_FULFILLMENT_STATUS_PARTIALLY_FULFILLED' ) ) {
497 define( 'LATEPOINT_ORDER_FULFILLMENT_STATUS_PARTIALLY_FULFILLED', 'partially_fulfilled' );
498 }
499
500 if ( ! defined( 'LATEPOINT_ORDER_PAYMENT_STATUS_NOT_PAID' ) ) {
501 define( 'LATEPOINT_ORDER_PAYMENT_STATUS_NOT_PAID', 'not_paid' );
502 }
503 if ( ! defined( 'LATEPOINT_ORDER_PAYMENT_STATUS_PARTIALLY_PAID' ) ) {
504 define( 'LATEPOINT_ORDER_PAYMENT_STATUS_PARTIALLY_PAID', 'partially_paid' );
505 }
506 if ( ! defined( 'LATEPOINT_ORDER_PAYMENT_STATUS_FULLY_PAID' ) ) {
507 define( 'LATEPOINT_ORDER_PAYMENT_STATUS_FULLY_PAID', 'fully_paid' );
508 }
509 if ( ! defined( 'LATEPOINT_ORDER_PAYMENT_STATUS_PROCESSING' ) ) {
510 define( 'LATEPOINT_ORDER_PAYMENT_STATUS_PROCESSING', 'processing' );
511 }
512 if ( ! defined( 'LATEPOINT_ORDER_PAYMENT_STATUS_REFUNDED' ) ) {
513 define( 'LATEPOINT_ORDER_PAYMENT_STATUS_REFUNDED', 'refunded' );
514 }
515 if ( ! defined( 'LATEPOINT_ORDER_PAYMENT_STATUS_PARTIALLY_REFUNDED' ) ) {
516 define( 'LATEPOINT_ORDER_PAYMENT_STATUS_PARTIALLY_REFUNDED', 'partially_refunded' );
517 }
518
519 if ( ! defined( 'LATEPOINT_DEFAULT_TIME_SYSTEM' ) ) {
520 define( 'LATEPOINT_DEFAULT_TIME_SYSTEM', '12' );
521 }
522 if ( ! defined( 'LATEPOINT_DEFAULT_DATE_FORMAT' ) ) {
523 define( 'LATEPOINT_DEFAULT_DATE_FORMAT', 'm/d/Y' );
524 }
525 if ( ! defined( 'LATEPOINT_DATETIME_DB_FORMAT' ) ) {
526 define( 'LATEPOINT_DATETIME_DB_FORMAT', 'Y-m-d H:i:s' );
527 }
528
529 if ( ! defined( 'LATEPOINT_STATUS_ERROR' ) ) {
530 define( 'LATEPOINT_STATUS_ERROR', 'error' );
531 }
532 if ( ! defined( 'LATEPOINT_STATUS_SUCCESS' ) ) {
533 define( 'LATEPOINT_STATUS_SUCCESS', 'success' );
534 }
535
536 if ( ! defined( 'LATEPOINT_SERVICE_STATUS_ACTIVE' ) ) {
537 define( 'LATEPOINT_SERVICE_STATUS_ACTIVE', 'active' );
538 }
539 if ( ! defined( 'LATEPOINT_SERVICE_STATUS_DISABLED' ) ) {
540 define( 'LATEPOINT_SERVICE_STATUS_DISABLED', 'disabled' );
541 }
542
543 if ( ! defined( 'LATEPOINT_SERVICE_VISIBILITY_VISIBLE' ) ) {
544 define( 'LATEPOINT_SERVICE_VISIBILITY_VISIBLE', 'visible' );
545 }
546 if ( ! defined( 'LATEPOINT_SERVICE_VISIBILITY_HIDDEN' ) ) {
547 define( 'LATEPOINT_SERVICE_VISIBILITY_HIDDEN', 'hidden' );
548 }
549
550
551 if ( ! defined( 'LATEPOINT_LOCATION_STATUS_ACTIVE' ) ) {
552 define( 'LATEPOINT_LOCATION_STATUS_ACTIVE', 'active' );
553 }
554 if ( ! defined( 'LATEPOINT_LOCATION_STATUS_DISABLED' ) ) {
555 define( 'LATEPOINT_LOCATION_STATUS_DISABLED', 'disabled' );
556 }
557
558 if ( ! defined( 'LATEPOINT_AGENT_STATUS_ACTIVE' ) ) {
559 define( 'LATEPOINT_AGENT_STATUS_ACTIVE', 'active' );
560 }
561 if ( ! defined( 'LATEPOINT_AGENT_STATUS_DISABLED' ) ) {
562 define( 'LATEPOINT_AGENT_STATUS_DISABLED', 'disabled' );
563 }
564
565 if ( ! defined( 'LATEPOINT_BUNDLE_STATUS_ACTIVE' ) ) {
566 define( 'LATEPOINT_BUNDLE_STATUS_ACTIVE', 'active' );
567 }
568 if ( ! defined( 'LATEPOINT_BUNDLE_STATUS_DISABLED' ) ) {
569 define( 'LATEPOINT_BUNDLE_STATUS_DISABLED', 'disabled' );
570 }
571
572 if ( ! defined( 'LATEPOINT_BUNDLE_VISIBILITY_VISIBLE' ) ) {
573 define( 'LATEPOINT_BUNDLE_VISIBILITY_VISIBLE', 'visible' );
574 }
575 if ( ! defined( 'LATEPOINT_BUNDLE_VISIBILITY_HIDDEN' ) ) {
576 define( 'LATEPOINT_BUNDLE_VISIBILITY_HIDDEN', 'hidden' );
577 }
578
579 if ( ! defined( 'LATEPOINT_ITEM_VARIANT_BOOKING' ) ) {
580 define( 'LATEPOINT_ITEM_VARIANT_BOOKING', 'booking' );
581 }
582 if ( ! defined( 'LATEPOINT_ITEM_VARIANT_BUNDLE' ) ) {
583 define( 'LATEPOINT_ITEM_VARIANT_BUNDLE', 'bundle' );
584 }
585
586 if ( ! defined( 'LATEPOINT_DEFAULT_TIMEBLOCK_INTERVAL' ) ) {
587 define( 'LATEPOINT_DEFAULT_TIMEBLOCK_INTERVAL', 30 );
588 }
589 if ( ! defined( 'LATEPOINT_DEFAULT_PHONE_CODE' ) ) {
590 define( 'LATEPOINT_DEFAULT_PHONE_CODE', '+1' );
591 }
592 if ( ! defined( 'LATEPOINT_DEFAULT_PHONE_FORMAT' ) ) {
593 define( 'LATEPOINT_DEFAULT_PHONE_FORMAT', '(999) 999-9999' );
594 }
595
596 if ( ! defined( 'LATEPOINT_TRANSACTION_STATUS_SUCCEEDED' ) ) {
597 define( 'LATEPOINT_TRANSACTION_STATUS_SUCCEEDED', 'succeeded' );
598 }
599 if ( ! defined( 'LATEPOINT_TRANSACTION_STATUS_PROCESSING' ) ) {
600 define( 'LATEPOINT_TRANSACTION_STATUS_PROCESSING', 'processing' );
601 }
602 if ( ! defined( 'LATEPOINT_TRANSACTION_STATUS_FAILED' ) ) {
603 define( 'LATEPOINT_TRANSACTION_STATUS_FAILED', 'failed' );
604 }
605
606 // invoices
607 if ( ! defined( 'LATEPOINT_INVOICE_STATUS_OPEN' ) ) {
608 define( 'LATEPOINT_INVOICE_STATUS_OPEN', 'open' );
609 }
610 if ( ! defined( 'LATEPOINT_INVOICE_STATUS_PAID' ) ) {
611 define( 'LATEPOINT_INVOICE_STATUS_PAID', 'paid' );
612 }
613 if ( ! defined( 'LATEPOINT_INVOICE_STATUS_PARTIALLY_PAID' ) ) {
614 define( 'LATEPOINT_INVOICE_STATUS_PARTIALLY_PAID', 'partially_paid' );
615 }
616 if ( ! defined( 'LATEPOINT_INVOICE_STATUS_DRAFT' ) ) {
617 define( 'LATEPOINT_INVOICE_STATUS_DRAFT', 'draft' );
618 }
619 if ( ! defined( 'LATEPOINT_INVOICE_STATUS_VOID' ) ) {
620 define( 'LATEPOINT_INVOICE_STATUS_VOID', 'void' );
621 }
622 if ( ! defined( 'LATEPOINT_INVOICE_STATUS_UNCOLLECTIBLE' ) ) {
623 define( 'LATEPOINT_INVOICE_STATUS_UNCOLLECTIBLE', 'uncollectible' );
624 }
625
626 // PAYMENTS
627
628 if ( ! defined( 'LATEPOINT_PAYMENT_PROCESSOR_STRIPE' ) ) {
629 define( 'LATEPOINT_PAYMENT_PROCESSOR_STRIPE', 'stripe' );
630 }
631 if ( ! defined( 'LATEPOINT_PAYMENT_PROCESSOR_BRAINTREE' ) ) {
632 define( 'LATEPOINT_PAYMENT_PROCESSOR_BRAINTREE', 'braintree' );
633 }
634 if ( ! defined( 'LATEPOINT_PAYMENT_PROCESSOR_PAYPAL' ) ) {
635 define( 'LATEPOINT_PAYMENT_PROCESSOR_PAYPAL', 'paypal' );
636 }
637
638 if ( ! defined( 'LATEPOINT_TRANSACTION_KIND_CAPTURE' ) ) {
639 define( 'LATEPOINT_TRANSACTION_KIND_CAPTURE', 'capture' );
640 }
641 if ( ! defined( 'LATEPOINT_TRANSACTION_KIND_AUTHORIZATION' ) ) {
642 define( 'LATEPOINT_TRANSACTION_KIND_AUTHORIZATION', 'authorization' );
643 }
644 if ( ! defined( 'LATEPOINT_TRANSACTION_KIND_VOID' ) ) {
645 define( 'LATEPOINT_TRANSACTION_KIND_VOID', 'void' );
646 }
647
648 if ( ! defined( 'LATEPOINT_PAYMENT_METHOD_LOCAL' ) ) {
649 define( 'LATEPOINT_PAYMENT_METHOD_LOCAL', 'local' );
650 }
651 if ( ! defined( 'LATEPOINT_PAYMENT_METHOD_PAYPAL' ) ) {
652 define( 'LATEPOINT_PAYMENT_METHOD_PAYPAL', 'paypal' );
653 }
654 if ( ! defined( 'LATEPOINT_PAYMENT_METHOD_CARD' ) ) {
655 define( 'LATEPOINT_PAYMENT_METHOD_CARD', 'card' );
656 }
657
658 if ( ! defined( 'LATEPOINT_PAYMENT_TIME_LATER' ) ) {
659 define( 'LATEPOINT_PAYMENT_TIME_LATER', 'later' );
660 }
661 if ( ! defined( 'LATEPOINT_PAYMENT_TIME_NOW' ) ) {
662 define( 'LATEPOINT_PAYMENT_TIME_NOW', 'now' );
663 }
664
665 if ( ! defined( 'LATEPOINT_VALUE_ON' ) ) {
666 define( 'LATEPOINT_VALUE_ON', 'on' );
667 }
668 if ( ! defined( 'LATEPOINT_VALUE_OFF' ) ) {
669 define( 'LATEPOINT_VALUE_OFF', 'off' );
670 }
671
672 if ( ! defined( 'LATEPOINT_STATUS_ACTIVE' ) ) {
673 define( 'LATEPOINT_STATUS_ACTIVE', 'active' );
674 }
675 if ( ! defined( 'LATEPOINT_STATUS_DISABLED' ) ) {
676 define( 'LATEPOINT_STATUS_DISABLED', 'disabled' );
677 }
678
679 if ( ! defined( 'LATEPOINT_PAYMENT_PORTION_FULL' ) ) {
680 define( 'LATEPOINT_PAYMENT_PORTION_FULL', 'full' );
681 }
682 if ( ! defined( 'LATEPOINT_PAYMENT_PORTION_REMAINING' ) ) {
683 define( 'LATEPOINT_PAYMENT_PORTION_REMAINING', 'remaining' );
684 }
685 if ( ! defined( 'LATEPOINT_PAYMENT_PORTION_DEPOSIT' ) ) {
686 define( 'LATEPOINT_PAYMENT_PORTION_DEPOSIT', 'deposit' );
687 }
688 if ( ! defined( 'LATEPOINT_PAYMENT_PORTION_CUSTOM' ) ) {
689 define( 'LATEPOINT_PAYMENT_PORTION_CUSTOM', 'custom' );
690 }
691
692 if ( ! defined( 'LATEPOINT_ANY_AGENT' ) ) {
693 define( 'LATEPOINT_ANY_AGENT', 'any' );
694 }
695 if ( ! defined( 'LATEPOINT_ANY_LOCATION' ) ) {
696 define( 'LATEPOINT_ANY_LOCATION', 'any' );
697 }
698
699 if ( ! defined( 'LATEPOINT_ANY_AGENT_ORDER_RANDOM' ) ) {
700 define( 'LATEPOINT_ANY_AGENT_ORDER_RANDOM', 'random' );
701 }
702 if ( ! defined( 'LATEPOINT_ANY_AGENT_ORDER_PRICE_HIGH' ) ) {
703 define( 'LATEPOINT_ANY_AGENT_ORDER_PRICE_HIGH', 'price_high' );
704 }
705 if ( ! defined( 'LATEPOINT_ANY_AGENT_ORDER_PRICE_LOW' ) ) {
706 define( 'LATEPOINT_ANY_AGENT_ORDER_PRICE_LOW', 'price_low' );
707 }
708 if ( ! defined( 'LATEPOINT_ANY_AGENT_ORDER_BUSY_HIGH' ) ) {
709 define( 'LATEPOINT_ANY_AGENT_ORDER_BUSY_HIGH', 'busy_high' );
710 }
711 if ( ! defined( 'LATEPOINT_ANY_AGENT_ORDER_BUSY_LOW' ) ) {
712 define( 'LATEPOINT_ANY_AGENT_ORDER_BUSY_LOW', 'busy_low' );
713 }
714 if ( ! defined( 'LATEPOINT_RECURRING_BOOKINGS_UNFOLDED_COUNT' ) ) {
715 define( 'LATEPOINT_RECURRING_BOOKINGS_UNFOLDED_COUNT', 5 );
716 }
717
718 if ( ! defined( 'LATEPOINT_ALL' ) ) {
719 define( 'LATEPOINT_ALL', 'all' );
720 }
721
722 // Latepoint APP URL
723 if ( ! defined( 'LATEPOINT_APP_CONNECT_URL' ) ) {
724 define( 'LATEPOINT_APP_CONNECT_URL', 'https://app.latepoint.com' );
725 }
726
727 // Stripe Connect
728 if ( ! defined( 'LATEPOINT_STRIPE_CONNECT_URL' ) ) {
729 define( 'LATEPOINT_STRIPE_CONNECT_URL', LATEPOINT_APP_CONNECT_URL );
730 }
731 }
732
733
734 /**
735 * Include required core files used in admin and on the frontend.
736 */
737 public function includes() {
738
739 // CONTROLLERS
740 include_once LATEPOINT_ABSPATH . 'lib/controllers/controller.php';
741 include_once LATEPOINT_ABSPATH . 'lib/controllers/pro_controller.php';
742 include_once LATEPOINT_ABSPATH . 'lib/controllers/default_agent_controller.php';
743 include_once LATEPOINT_ABSPATH . 'lib/controllers/activities_controller.php';
744 include_once LATEPOINT_ABSPATH . 'lib/controllers/search_controller.php';
745 include_once LATEPOINT_ABSPATH . 'lib/controllers/customers_controller.php';
746 include_once LATEPOINT_ABSPATH . 'lib/controllers/services_controller.php';
747 include_once LATEPOINT_ABSPATH . 'lib/controllers/carts_controller.php';
748 include_once LATEPOINT_ABSPATH . 'lib/controllers/transactions_controller.php';
749 include_once LATEPOINT_ABSPATH . 'lib/controllers/orders_controller.php';
750 include_once LATEPOINT_ABSPATH . 'lib/controllers/auth_controller.php';
751 include_once LATEPOINT_ABSPATH . 'lib/controllers/processes_controller.php';
752 include_once LATEPOINT_ABSPATH . 'lib/controllers/process_jobs_controller.php';
753 include_once LATEPOINT_ABSPATH . 'lib/controllers/settings_controller.php';
754 include_once LATEPOINT_ABSPATH . 'lib/controllers/form_fields_controller.php';
755 include_once LATEPOINT_ABSPATH . 'lib/controllers/bookings_controller.php';
756 include_once LATEPOINT_ABSPATH . 'lib/controllers/dashboard_controller.php';
757 include_once LATEPOINT_ABSPATH . 'lib/controllers/wizard_controller.php';
758 include_once LATEPOINT_ABSPATH . 'lib/controllers/notifications_controller.php';
759 include_once LATEPOINT_ABSPATH . 'lib/controllers/steps_controller.php';
760 include_once LATEPOINT_ABSPATH . 'lib/controllers/calendars_controller.php';
761 include_once LATEPOINT_ABSPATH . 'lib/controllers/booking_form_settings_controller.php';
762 include_once LATEPOINT_ABSPATH . 'lib/controllers/integrations_controller.php';
763 include_once LATEPOINT_ABSPATH . 'lib/controllers/customer_cabinet_controller.php';
764 include_once LATEPOINT_ABSPATH . 'lib/controllers/manage_booking_by_key_controller.php';
765 include_once LATEPOINT_ABSPATH . 'lib/controllers/manage_order_by_key_controller.php';
766 include_once LATEPOINT_ABSPATH . 'lib/controllers/events_controller.php';
767 include_once LATEPOINT_ABSPATH . 'lib/controllers/stripe_connect_controller.php';
768 include_once LATEPOINT_ABSPATH . 'lib/controllers/invoices_controller.php';
769 include_once LATEPOINT_ABSPATH . 'lib/controllers/support_topics_controller.php';
770
771
772 // MODELS
773 include_once LATEPOINT_ABSPATH . 'lib/models/model.php';
774 include_once LATEPOINT_ABSPATH . 'lib/models/meta_model.php';
775 include_once LATEPOINT_ABSPATH . 'lib/models/bundle_model.php';
776 include_once LATEPOINT_ABSPATH . 'lib/models/cart_model.php';
777 include_once LATEPOINT_ABSPATH . 'lib/models/cart_meta_model.php';
778 include_once LATEPOINT_ABSPATH . 'lib/models/cart_item_model.php';
779 include_once LATEPOINT_ABSPATH . 'lib/models/order_model.php';
780 include_once LATEPOINT_ABSPATH . 'lib/models/order_meta_model.php';
781 include_once LATEPOINT_ABSPATH . 'lib/models/order_item_model.php';
782 include_once LATEPOINT_ABSPATH . 'lib/models/activity_model.php';
783 include_once LATEPOINT_ABSPATH . 'lib/models/work_period_model.php';
784 include_once LATEPOINT_ABSPATH . 'lib/models/agent_model.php';
785 include_once LATEPOINT_ABSPATH . 'lib/models/service_model.php';
786 include_once LATEPOINT_ABSPATH . 'lib/models/connector_model.php';
787 include_once LATEPOINT_ABSPATH . 'lib/models/service_category_model.php';
788 include_once LATEPOINT_ABSPATH . 'lib/models/customer_model.php';
789 include_once LATEPOINT_ABSPATH . 'lib/models/settings_model.php';
790 include_once LATEPOINT_ABSPATH . 'lib/models/booking_model.php';
791 include_once LATEPOINT_ABSPATH . 'lib/models/step_settings_model.php';
792 include_once LATEPOINT_ABSPATH . 'lib/models/transaction_model.php';
793 include_once LATEPOINT_ABSPATH . 'lib/models/transaction_intent_model.php';
794 include_once LATEPOINT_ABSPATH . 'lib/models/transaction_refund_model.php';
795 include_once LATEPOINT_ABSPATH . 'lib/models/booking_meta_model.php';
796 include_once LATEPOINT_ABSPATH . 'lib/models/customer_meta_model.php';
797 include_once LATEPOINT_ABSPATH . 'lib/models/agent_meta_model.php';
798 include_once LATEPOINT_ABSPATH . 'lib/models/service_meta_model.php';
799 include_once LATEPOINT_ABSPATH . 'lib/models/bundle_meta_model.php';
800 include_once LATEPOINT_ABSPATH . 'lib/models/location_model.php';
801 include_once LATEPOINT_ABSPATH . 'lib/models/location_category_model.php';
802 include_once LATEPOINT_ABSPATH . 'lib/models/session_model.php';
803 include_once LATEPOINT_ABSPATH . 'lib/models/order_intent_model.php';
804 include_once LATEPOINT_ABSPATH . 'lib/models/order_intent_meta_model.php';
805 include_once LATEPOINT_ABSPATH . 'lib/models/process_model.php';
806 include_once LATEPOINT_ABSPATH . 'lib/models/process_job_model.php';
807 include_once LATEPOINT_ABSPATH . 'lib/models/join_bundles_services_model.php';
808 include_once LATEPOINT_ABSPATH . 'lib/models/invoice_model.php';
809 include_once LATEPOINT_ABSPATH . 'lib/models/payment_request_model.php';
810 include_once LATEPOINT_ABSPATH . 'lib/models/recurrence_model.php';
811 include_once LATEPOINT_ABSPATH . 'lib/models/off_period_model.php';
812 include_once LATEPOINT_ABSPATH . 'lib/models/otp_model.php';
813
814
815 // HELPERS
816 include_once LATEPOINT_ABSPATH . 'lib/helpers/wp_datetime.php';
817 include_once LATEPOINT_ABSPATH . 'lib/helpers/router_helper.php';
818 include_once LATEPOINT_ABSPATH . 'lib/helpers/sessions_helper.php';
819 include_once LATEPOINT_ABSPATH . 'lib/helpers/auth_helper.php';
820 include_once LATEPOINT_ABSPATH . 'lib/helpers/encrypt_helper.php';
821 include_once LATEPOINT_ABSPATH . 'lib/helpers/license_helper.php';
822 include_once LATEPOINT_ABSPATH . 'lib/helpers/form_helper.php';
823 include_once LATEPOINT_ABSPATH . 'lib/helpers/migrations_helper.php';
824 include_once LATEPOINT_ABSPATH . 'lib/helpers/util_helper.php';
825 include_once LATEPOINT_ABSPATH . 'lib/helpers/debug_helper.php';
826 include_once LATEPOINT_ABSPATH . 'lib/helpers/wp_user_helper.php';
827 include_once LATEPOINT_ABSPATH . 'lib/helpers/menu_helper.php';
828 include_once LATEPOINT_ABSPATH . 'lib/helpers/image_helper.php';
829 include_once LATEPOINT_ABSPATH . 'lib/helpers/events_helper.php';
830 include_once LATEPOINT_ABSPATH . 'lib/helpers/icalendar_helper.php';
831 include_once LATEPOINT_ABSPATH . 'lib/helpers/version_specific_updates_helper.php';
832 include_once LATEPOINT_ABSPATH . 'lib/helpers/plugin_version_update_helper.php';
833 include_once LATEPOINT_ABSPATH . 'lib/helpers/calendar_helper.php';
834 include_once LATEPOINT_ABSPATH . 'lib/helpers/meeting_systems_helper.php';
835 include_once LATEPOINT_ABSPATH . 'lib/helpers/marketing_systems_helper.php';
836 include_once LATEPOINT_ABSPATH . 'lib/helpers/short_links_systems_helper.php';
837 include_once LATEPOINT_ABSPATH . 'lib/helpers/timeline_helper.php';
838 include_once LATEPOINT_ABSPATH . 'lib/helpers/booking_helper.php';
839 include_once LATEPOINT_ABSPATH . 'lib/helpers/order_intent_helper.php';
840 include_once LATEPOINT_ABSPATH . 'lib/helpers/activities_helper.php';
841 include_once LATEPOINT_ABSPATH . 'lib/helpers/settings_helper.php';
842 include_once LATEPOINT_ABSPATH . 'lib/helpers/customer_helper.php';
843 include_once LATEPOINT_ABSPATH . 'lib/helpers/customer_import_helper.php';
844 include_once LATEPOINT_ABSPATH . 'lib/helpers/processes_helper.php';
845 include_once LATEPOINT_ABSPATH . 'lib/helpers/agent_helper.php';
846 include_once LATEPOINT_ABSPATH . 'lib/helpers/service_helper.php';
847 include_once LATEPOINT_ABSPATH . 'lib/helpers/database_helper.php';
848 include_once LATEPOINT_ABSPATH . 'lib/helpers/money_helper.php';
849 include_once LATEPOINT_ABSPATH . 'lib/helpers/time_helper.php';
850 include_once LATEPOINT_ABSPATH . 'lib/helpers/notifications_helper.php';
851 include_once LATEPOINT_ABSPATH . 'lib/helpers/email_helper.php';
852 include_once LATEPOINT_ABSPATH . 'lib/helpers/sms_helper.php';
853 include_once LATEPOINT_ABSPATH . 'lib/helpers/whatsapp_helper.php';
854 include_once LATEPOINT_ABSPATH . 'lib/helpers/styles_helper.php';
855 include_once LATEPOINT_ABSPATH . 'lib/helpers/work_periods_helper.php';
856 include_once LATEPOINT_ABSPATH . 'lib/helpers/bundles_helper.php';
857 include_once LATEPOINT_ABSPATH . 'lib/helpers/carts_helper.php';
858 include_once LATEPOINT_ABSPATH . 'lib/helpers/orders_helper.php';
859 include_once LATEPOINT_ABSPATH . 'lib/helpers/replacer_helper.php';
860 include_once LATEPOINT_ABSPATH . 'lib/helpers/payments_helper.php';
861 include_once LATEPOINT_ABSPATH . 'lib/helpers/resource_helper.php';
862 include_once LATEPOINT_ABSPATH . 'lib/helpers/meta_helper.php';
863 include_once LATEPOINT_ABSPATH . 'lib/helpers/shortcodes_helper.php';
864 include_once LATEPOINT_ABSPATH . 'lib/helpers/connector_helper.php';
865 include_once LATEPOINT_ABSPATH . 'lib/helpers/location_helper.php';
866 include_once LATEPOINT_ABSPATH . 'lib/helpers/csv_helper.php';
867 include_once LATEPOINT_ABSPATH . 'lib/helpers/steps_helper.php';
868 include_once LATEPOINT_ABSPATH . 'lib/helpers/params_helper.php';
869 include_once LATEPOINT_ABSPATH . 'lib/helpers/process_jobs_helper.php';
870 include_once LATEPOINT_ABSPATH . 'lib/helpers/blocks_helper.php';
871 include_once LATEPOINT_ABSPATH . 'lib/helpers/roles_helper.php';
872 include_once LATEPOINT_ABSPATH . 'lib/helpers/price_breakdown_helper.php';
873 include_once LATEPOINT_ABSPATH . 'lib/helpers/stripe_connect_helper.php';
874 include_once LATEPOINT_ABSPATH . 'lib/helpers/pages_helper.php';
875 include_once LATEPOINT_ABSPATH . 'lib/helpers/elementor_helper.php';
876 include_once LATEPOINT_ABSPATH . 'lib/helpers/bricks_helper.php';
877 include_once LATEPOINT_ABSPATH . 'lib/helpers/transaction_intent_helper.php';
878 include_once LATEPOINT_ABSPATH . 'lib/helpers/transaction_helper.php';
879 include_once LATEPOINT_ABSPATH . 'lib/helpers/invoices_helper.php';
880 include_once LATEPOINT_ABSPATH . 'lib/helpers/support_topics_helper.php';
881 include_once LATEPOINT_ABSPATH . 'lib/helpers/otp_helper.php';
882 include_once LATEPOINT_ABSPATH . 'lib/helpers/nps_survey_helper.php';
883 include_once LATEPOINT_ABSPATH . 'lib/helpers/analytics_helper.php';
884
885 // MISC
886 include_once LATEPOINT_ABSPATH . 'lib/misc/time_period.php';
887 include_once LATEPOINT_ABSPATH . 'lib/misc/blocked_period.php';
888 include_once LATEPOINT_ABSPATH . 'lib/misc/booked_period.php';
889 include_once LATEPOINT_ABSPATH . 'lib/misc/stripe_connect_customer.php';
890 include_once LATEPOINT_ABSPATH . 'lib/misc/booking_request.php';
891 include_once LATEPOINT_ABSPATH . 'lib/misc/booking_resource.php';
892 include_once LATEPOINT_ABSPATH . 'lib/misc/work_period.php';
893 include_once LATEPOINT_ABSPATH . 'lib/misc/filter.php';
894 include_once LATEPOINT_ABSPATH . 'lib/misc/booking_slot.php';
895 include_once LATEPOINT_ABSPATH . 'lib/misc/process_event.php';
896 include_once LATEPOINT_ABSPATH . 'lib/misc/process_action.php';
897 include_once LATEPOINT_ABSPATH . 'lib/misc/role.php';
898 include_once LATEPOINT_ABSPATH . 'lib/misc/user.php';
899 include_once LATEPOINT_ABSPATH . 'lib/misc/step.php';
900 include_once LATEPOINT_ABSPATH . 'lib/misc/router.php';
901
902 // MAILERS
903 include_once LATEPOINT_ABSPATH . 'lib/mailers/mailer.php';
904 include_once LATEPOINT_ABSPATH . 'lib/mailers/agent_mailer.php';
905 include_once LATEPOINT_ABSPATH . 'lib/mailers/customer_mailer.php';
906
907 // ABILITIES (WordPress 6.9+ Abilities API)
908 $abilities_enabled = OsSettingsHelper::is_on( 'latepoint_abilities_api' );
909 if ( $abilities_enabled && function_exists( 'wp_register_ability' ) ) {
910 include_once LATEPOINT_ABSPATH . 'lib/abilities/class-latepoint-abilities.php';
911 }
912
913 do_action( 'latepoint_includes' );
914 }
915
916
917 /**
918 * Hook into actions and filters.
919 */
920 public function init_hooks() {
921 if ( isset( $_GET['latepoint'] ) && $_GET['latepoint'] == 'instant' ) {
922 add_action( 'init', array( $this, 'public_route_call' ), 100 );
923 }
924 $siteurl = get_site_option( 'siteurl' );
925 if ( $siteurl ) {
926 $siteurl_hash = md5( $siteurl );
927 } else {
928 $siteurl_hash = '';
929 }
930
931 if ( ! defined( 'LATEPOINT_CUSTOMER_LOGGED_IN_COOKIE' ) ) {
932 define( 'LATEPOINT_CUSTOMER_LOGGED_IN_COOKIE', 'latepoint_customer_logged_in_' . $siteurl_hash );
933 }
934 if ( ! defined( 'LATEPOINT_ADMIN_MENU_LAYOUT_STYLE_COOKIE' ) ) {
935 define( 'LATEPOINT_ADMIN_MENU_LAYOUT_STYLE_COOKIE', 'latepoint_admin_menu_layout_style_' . $siteurl_hash );
936 }
937 if ( ! defined( 'LATEPOINT_SELECTED_TIMEZONE_COOKIE' ) ) {
938 define( 'LATEPOINT_SELECTED_TIMEZONE_COOKIE', 'latepoint_selected_timezone_' . $siteurl_hash );
939 }
940
941 if ( ! defined( 'LATEPOINT_CART_COOKIE' ) ) {
942 define( 'LATEPOINT_CART_COOKIE', 'latepoint_cart_' . $siteurl_hash );
943 }
944
945 // Plugins loaded
946 add_action( 'plugins_loaded', array( $this, 'plugins_loaded_hook' ) );
947
948 // Addon version compatibility checks.
949 add_action( 'admin_init', array( $this, 'check_addon_versions' ) );
950
951 // Activation / deactivation hooks.
952 register_activation_hook( __FILE__, array( $this, 'create_required_tables' ) );
953 register_activation_hook( __FILE__, array( $this, 'on_activate' ) );
954 register_deactivation_hook( __FILE__, [ $this, 'on_deactivate' ] );
955
956 add_action( 'after_setup_theme', array( $this, 'setup_environment' ) );
957 add_action( 'init', array( $this, 'init' ), 0 );
958 add_action( 'init', array( $this, 'init_widgets' ), 11 );
959
960 // Should be triggered after all plugins are loaded and textdomain is ready.
961 add_action( 'init', array( 'OsPluginVersionUpdateHelper', 'init' ) );
962
963 add_action( 'admin_menu', array( $this, 'init_menus' ) );
964 add_action( 'wp_enqueue_scripts', array( $this, 'load_front_scripts_and_styles' ) );
965 add_action( 'admin_enqueue_scripts', array( $this, 'load_admin_scripts_and_styles' ) );
966 add_filter( 'admin_body_class', array( $this, 'add_admin_body_class' ), 40 );
967 add_filter( 'body_class', array( $this, 'add_body_class' ) );
968
969 add_filter( 'cron_schedules', [ $this, 'add_custom_cron_schedules' ] );
970
971 // used for testing of localhost to prevent wordpress issues with getting files from local server
972 if ( LATEPOINT_ALLOW_LOCAL_SERVER ) {
973 add_filter( 'http_request_args', [ $this, 'disable_localhost_url_check_for_development' ] );
974 }
975
976 // Add Link to latepoint to admin bar
977 add_action( 'admin_bar_menu', array( $this, 'add_latepoint_link_to_admin_bar' ), 999 );
978
979
980 // fix for output buffering error in WP
981 // remove_action( 'shutdown', 'wp_ob_end_flush_all', 1 );
982
983 add_action( 'wp_loaded', array( $this, 'pre_route_call' ) );
984
985
986 // Create router action
987 // ajax
988 add_action( 'wp_ajax_latepoint_route_call', array( $this, 'route_call' ) );
989 add_action( 'wp_ajax_nopriv_latepoint_route_call', array( $this, 'route_call' ) );
990 // admin custom post/get
991 add_action( 'admin_post_latepoint_route_call', array( $this, 'route_call' ) );
992 add_action( 'admin_post_nopriv_latepoint_route_call', array( $this, 'route_call' ) );
993
994 // crons
995 add_action( 'latepoint_clear_old_activity_logs', [ $this, 'clear_old_activity_logs' ] );
996
997
998 add_action( 'latepoint_on_addon_activate', [ $this, 'addon_activated' ], 10, 2 );
999 add_action( 'latepoint_on_addon_deactivate', [ $this, 'addon_deactivated' ], 10, 2 );
1000
1001
1002 add_action( 'latepoint_email_processor_settings', [ $this, 'email_processor_settings' ], 10, 2 );
1003
1004
1005 // Auth
1006 add_filter( 'login_redirect', [ $this, 'redirect_manager_and_agent_to_latepoint' ], 10, 3 );
1007
1008
1009 // But WordPress has a whitelist of variables it allows, so we must put it on that list
1010 add_action( 'query_vars', array( $this, 'front_route_query_vars' ) );
1011
1012 // If this is done, we can access it later
1013 // This example checks very early in the process:
1014 // if the variable is set, we include our page and stop execution after it
1015 add_action( 'parse_request', array( $this, 'front_route_parse_request' ) );
1016
1017
1018 add_action( 'admin_init', array( $this, 'redirect_after_activation' ) );
1019
1020 add_filter( 'display_post_states', 'OsPagesHelper::add_display_post_states', 10, 2 );
1021
1022 // allow agents to access admin when woocommerce plugin is installed
1023 add_filter( 'woocommerce_prevent_admin_access', [ $this, 'woocommerce_allow_agent_to_access_admin' ], 20, 1 );
1024
1025 // plugin related hooks
1026 add_action( 'latepoint_model_save', [ $this, 'save_connected_wordpress_user' ] );
1027
1028 // Stripe Connect
1029
1030 add_filter( 'latepoint_payment_processors', 'OsStripeConnectHelper::register_payment_processor' );
1031 add_action( 'latepoint_payment_processor_settings', 'OsStripeConnectHelper::add_settings_fields', 10 );
1032 add_action( 'latepoint_step_payment__pay_content', 'OsStripeConnectHelper::output_payment_step_contents', 10 );
1033 add_action( 'latepoint_order_payment__pay_content_after', 'OsStripeConnectHelper::output_order_payment_pay_contents', 10 );
1034
1035 add_filter( 'latepoint_convert_charge_amount_to_requirements', 'OsStripeConnectHelper::convert_charge_amount_to_requirements', 10, 2 );
1036 add_filter( 'latepoint_process_payment_for_order_intent', 'OsStripeConnectHelper::process_payment', 10, 2 );
1037 add_filter( 'latepoint_process_payment_for_transaction_intent', 'OsStripeConnectHelper::process_payment_for_transaction_intent', 10, 2 );
1038 add_filter( 'latepoint_transaction_intent_specs_charge_amount', 'OsStripeConnectHelper::convert_transaction_intent_charge_amount_to_specs', 10, 2 );
1039
1040 add_filter( 'latepoint_get_all_payment_times', 'OsStripeConnectHelper::add_all_payment_methods_to_payment_times' );
1041 add_filter( 'latepoint_get_enabled_payment_times', 'OsStripeConnectHelper::add_enabled_payment_methods_to_payment_times' );
1042 add_filter( 'latepoint_transaction_is_refund_available', 'OsStripeConnectHelper::transaction_is_refund_available', 10, 2 );
1043 add_filter( 'latepoint_process_refund', 'OsStripeConnectHelper::process_refund', 10, 3 );
1044 add_filter( 'plugin_action_links', [ $this, 'add_upgrade_link' ], 10, 2 );
1045
1046
1047 add_action( 'latepoint_customer_edit_form_after', 'OsStripeConnectHelper::output_stripe_link_on_customer_quick_form' );
1048
1049 add_action( 'save_post', 'OsBlockHelper::save_blocks_styles' );
1050 // misc
1051 add_action( 'latepoint_after_step_content', 'OsStepsHelper::output_preset_fields' );
1052
1053 OsActivitiesHelper::init_hooks();
1054 OsProcessJobsHelper::init_hooks();
1055
1056 // Initialize NPS Survey.
1057 OsNpsSurveyHelper::get_instance();
1058
1059 do_action( 'latepoint_init_hooks' );
1060 }
1061
1062 function plugins_loaded_hook() {
1063 OsAnalyticsHelper::init();
1064 }
1065
1066 function check_addon_versions() {
1067 if ( ! current_user_can( 'update_plugins' ) ) {
1068 return;
1069 }
1070
1071 if (
1072 defined( 'LATEPOINT_ADDON_PRO_VERSION' )
1073 && defined( 'LATEPOINT_MIN_REQUIRED_PRO_VERSION' )
1074 && version_compare( LATEPOINT_ADDON_PRO_VERSION, LATEPOINT_MIN_REQUIRED_PRO_VERSION, '<' )
1075 ) {
1076 add_action( 'admin_notices', array( $this, 'pro_version_outdated_notice' ) );
1077 }
1078 }
1079
1080 function pro_version_outdated_notice() {
1081 $screen = get_current_screen();
1082 if ( isset( $screen->parent_file ) && 'plugins.php' === $screen->parent_file && 'update' === $screen->id ) {
1083 return;
1084 }
1085
1086 $message = sprintf(
1087 /* translators: 1: bold open tag, 2: bold close tag, 3: required version, 4: current version */
1088 __( 'You are using an older version of the %1$sLatePoint Pro Features%2$s plugin (v%4$s). Please update the %1$sLatePoint Pro Features%2$s plugin to version %1$s%3$s or later%2$s.', 'latepoint' ),
1089 '<strong>',
1090 '</strong>',
1091 esc_html( LATEPOINT_MIN_REQUIRED_PRO_VERSION ),
1092 esc_html( LATEPOINT_ADDON_PRO_VERSION )
1093 );
1094 $button = '<p><a href="' . esc_url( self_admin_url( 'plugins.php' ) ) . '" class="button-primary">'
1095 . esc_html__( 'Update Now', 'latepoint' ) . '</a></p>';
1096
1097 printf(
1098 '<div class="notice notice-warning"><p>%1$s</p>%2$s</div>',
1099 wp_kses_post( $message ),
1100 wp_kses_post( $button )
1101 );
1102 }
1103
1104 function add_custom_cron_schedules( $schedules ) {
1105 if ( ! isset( $schedules['latepoint_5_minutes'] ) ) {
1106 $schedules['latepoint_5_minutes'] = array(
1107 'interval' => 5 * 60,
1108 'display' => __( 'Once every 5 minutes', 'latepoint' ),
1109 );
1110 }
1111
1112 return $schedules;
1113 }
1114
1115 function add_upgrade_link( $links, $plugin_file ) {
1116 if ( plugin_basename( __FILE__ ) == $plugin_file ) {
1117 if ( apply_filters( 'latepoint_show_upgrade_link_on_plugins_page', true, $plugin_file ) ) {
1118 $custom_link = '<a class="latepoint-plugin-upgrade-premium-link" href="' . LATEPOINT_UPGRADE_URL . '">' . esc_html__( 'Get LatePoint Pro' ) . '</a>';
1119 $links[] = $custom_link;
1120 }
1121 }
1122
1123 return $links;
1124 }
1125
1126 function woocommerce_allow_agent_to_access_admin( $prevent_access ) {
1127 if ( OsAuthHelper::is_agent_logged_in() ) {
1128 $prevent_access = false;
1129 }
1130
1131 return $prevent_access;
1132 }
1133
1134 function email_processor_settings( $processor_code ) {
1135 if ( $processor_code == 'wp_mail' ) {
1136 echo '<div class="sub-section-row">
1137 <div class="sub-section-label">
1138 <h3>' . esc_html__( 'Email Settings', 'latepoint' ) . '</h3>
1139 </div>
1140 <div class="sub-section-content">
1141 <div class="os-row">
1142 <div class="os-col-4">' . OsFormHelper::text_field( 'settings[notification_email_setting_from_name]', __( 'From Name', 'latepoint' ), OsSettingsHelper::get_settings_value( 'notification_email_setting_from_name', get_bloginfo( 'name' ) ), [ 'theme' => 'simple' ] ) . '</div>
1143 <div class="os-col-8">' . OsFormHelper::text_field( 'settings[notification_email_setting_from_email]', __( 'From Email Address', 'latepoint' ), OsSettingsHelper::get_settings_value( 'notification_email_setting_from_email', get_bloginfo( 'admin_email' ) ), [ 'theme' => 'simple' ] ) . '</div>
1144 </div>
1145 </div>
1146 </div>';
1147 }
1148 }
1149
1150 public function save_connected_wordpress_user( $customer ) {
1151 if ( ! $customer instanceof OsCustomerModel ) {
1152 return;
1153 }
1154
1155 if ( $customer->is_new_record() ) {
1156 return;
1157 }
1158
1159 if ( $customer->wordpress_user_id ) {
1160 // has connected wp user
1161 $wp_user = get_user_by( 'id', $customer->wordpress_user_id );
1162 if ( $wp_user && OsCustomerHelper::is_wp_user_safe_for_customer_link( $wp_user->ID ) ) {
1163 // Only sync to the linked WP user when request comes from the account owner or an admin.
1164 // This prevents unauthenticated guest booking requests from overwriting WP user data.
1165 $current_user_id = get_current_user_id();
1166 $wp_user_id = (int) $customer->wordpress_user_id;
1167 $is_owner_or_admin = is_user_logged_in() && ( $current_user_id === $wp_user_id || current_user_can( 'manage_options' ) );
1168 if ( $is_owner_or_admin ) {
1169 if ( $customer->first_name && $customer->first_name != $wp_user->first_name ) {
1170 $wp_user->first_name = $customer->first_name;
1171 }
1172 if ( $customer->last_name && $customer->last_name != $wp_user->last_name ) {
1173 $wp_user->last_name = $customer->last_name;
1174 }
1175 if ( $customer->email && $customer->email != $wp_user->user_email ) {
1176 $wp_user->user_email = $customer->email;
1177 }
1178 $result = wp_update_user( $wp_user );
1179 if ( is_wp_error( $result ) ) {
1180 error_log( 'Error saving wp user' );
1181 } else {
1182 // update user cookies because their data has changed
1183 }
1184 }
1185 }
1186 } else {
1187 if ( OsAuthHelper::can_wp_users_login_as_customers() ) {
1188 OsCustomerHelper::create_wp_user_for_customer( $customer );
1189 }
1190 }
1191 }
1192
1193 // used for testing of localhost to prevent wordpress issues with getting files from local server
1194 public function disable_localhost_url_check_for_development( $parsed_args ) {
1195 $parsed_args['reject_unsafe_urls'] = false;
1196
1197 return $parsed_args;
1198 }
1199
1200 /*
1201 * Check if current user is Agent or Manager, automatically redirect to latepoint dashboard instead of default WordPress admin
1202 */
1203 public function redirect_manager_and_agent_to_latepoint( $redirect_to, $request, $user ) {
1204 if ( $user && is_object( $user ) && is_a( $user, 'WP_User' ) ) {
1205 if ( $user->has_cap( 'edit_bookings' ) || $user->has_cap( 'manage_latepoint' ) ) {
1206 return OsRouterHelper::build_link( [ 'dashboard', 'index' ] );
1207 }
1208 }
1209
1210 return $redirect_to;
1211 }
1212
1213
1214 public function clear_old_activity_logs() {
1215 if ( OsSettingsHelper::is_on( 'should_clear_old_activity_log' ) ) {
1216 global $wpdb;
1217 $activity = new OsActivityModel();
1218
1219 $now_datetime = OsTimeHelper::now_datetime_object();
1220
1221 $cutoff = $now_datetime->modify( '-6 months' )->format( LATEPOINT_DATETIME_DB_FORMAT );
1222 $wpdb->query( $wpdb->prepare( 'DELETE FROM %i WHERE `created_at` < %s', [ esc_sql( $activity->table_name ), $cutoff ] ) );
1223 }
1224 }
1225
1226 public function addon_activated( $addon_name, $addon_version ) {
1227 OsDatabaseHelper::check_db_version_for_addons();
1228 }
1229
1230 public function addon_deactivated( $addon_name, $addon_version ) {
1231 OsDatabaseHelper::delete_addon_info( $addon_name, $addon_version );
1232 }
1233
1234
1235 public function on_deactivate() {
1236 wp_clear_scheduled_hook( 'latepoint_check_if_addons_update_available' );
1237 wp_clear_scheduled_hook( 'latepoint_clear_old_activity_logs' );
1238 }
1239
1240 function on_activate() {
1241 OsRolesHelper::register_roles_in_wp();
1242
1243 if ( ! wp_next_scheduled( 'latepoint_check_if_addons_update_available' ) ) {
1244 wp_schedule_event( time(), 'daily', 'latepoint_check_if_addons_update_available' );
1245 }
1246
1247 if ( ! wp_next_scheduled( 'latepoint_clear_old_activity_logs' ) ) {
1248 wp_schedule_event( time(), 'daily', 'latepoint_clear_old_activity_logs' );
1249 }
1250
1251 // if wizard has not been visited yet - redirect to it
1252 if ( ! get_option( 'latepoint_wizard_visited', false ) ) {
1253 add_option( 'latepoint_redirect_to_wizard', true );
1254 }
1255
1256 // create default location
1257 OsLocationHelper::get_default_location();
1258
1259 # create default pages if not existing (customer cabinet)
1260 OsPagesHelper::create_predefined_pages();
1261
1262 do_action( 'latepoint_on_activate', 'latepoint', $this->version );
1263 }
1264
1265 function redirect_after_activation() {
1266 if ( get_option( 'latepoint_redirect_to_wizard', false ) ) {
1267 delete_option( 'latepoint_redirect_to_wizard' );
1268 if ( ! isset( $_GET['activate-multi'] ) ) {
1269 wp_redirect( OsRouterHelper::build_link( OsRouterHelper::build_route_name( 'wizard', 'setup' ) ) );
1270 }
1271 } elseif ( get_option( 'latepoint_show_version_5_modal', false ) ) {
1272 delete_option( 'latepoint_show_version_5_modal' );
1273 if ( ! isset( $_GET['activate-multi'] ) ) {
1274 wp_redirect( OsRouterHelper::build_link( OsRouterHelper::build_route_name( 'settings', 'version_5_intro' ) ) );
1275 }
1276 }
1277 }
1278
1279 public function front_route_parse_request( $wp ) {
1280 if ( isset( $wp->query_vars['latepoint_is_custom_route'] ) ) {
1281 if ( isset( $wp->query_vars['route_name'] ) ) {
1282 $this->route_call();
1283 }
1284 }
1285 }
1286
1287 public function front_route_query_vars( $query_vars ) {
1288 $query_vars[] = 'latepoint_booking_id';
1289 $query_vars[] = 'latepoint_is_custom_route';
1290 $query_vars[] = 'route_name';
1291
1292 return $query_vars;
1293 }
1294
1295 public function route_call() {
1296 $route_name = OsRouterHelper::get_request_param( 'route_name', OsRouterHelper::build_route_name( 'dashboard', 'index' ) );
1297 OsRouterHelper::call_by_route_name( $route_name, OsRouterHelper::get_request_param( 'return_format', 'html' ) );
1298 }
1299
1300 public function public_route_call() {
1301 OsRouterHelper::call_by_route_name( OsRouterHelper::build_route_name( 'steps', 'start_instant' ), OsRouterHelper::get_request_param( 'return_format', 'html' ) );
1302 }
1303
1304 public function pre_route_call() {
1305 if ( OsRouterHelper::get_request_param( 'pre_route' ) ) {
1306 $this->route_call();
1307 }
1308 }
1309
1310
1311 /**
1312 * Init LatePoint when WordPress Initialises.
1313 */
1314 public function init() {
1315 OsAuthHelper::set_current_user();
1316 OsStepsHelper::init_step_actions();
1317 OsSettingsHelper::run_autoload();
1318 $this->register_post_types();
1319 $this->register_shortcodes();
1320 // Set up localisation.
1321 $this->load_plugin_textdomain();
1322 do_action( 'latepoint_init' );
1323 add_filter( 'http_request_host_is_external', '__return_true' );
1324
1325 OsBlockHelper::register_blocks();
1326 }
1327
1328 public function init_widgets() {
1329 OsElementorHelper::init();
1330 OsBricksHelper::init();
1331 }
1332
1333 public function load_plugin_textdomain() {
1334 load_plugin_textdomain( 'latepoint', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
1335 }
1336
1337
1338 /**
1339 * Register a custom menu page.
1340 */
1341 function init_menus() {
1342 // link for admins
1343 add_menu_page(
1344 __( 'LatePoint', 'latepoint' ),
1345 __( 'LatePoint', 'latepoint' ),
1346 OsAuthHelper::get_current_user()->wp_capability,
1347 'latepoint',
1348 [ $this, 'route_call' ],
1349 'none'
1350 );
1351 }
1352
1353
1354 function add_latepoint_link_to_admin_bar( $wp_admin_bar ) {
1355 if ( OsAuthHelper::get_current_user()->has_backend_access() ) {
1356 // build link depending on who is logged in
1357 $args = [
1358 'id' => 'latepoint_top_link',
1359 'title' => '<span class="latepoint-icon latepoint-icon-lp-logo" style="margin-right: 7px;"></span><span style="">' . __( 'LatePoint', 'latepoint' ) . '</span>',
1360 'href' => OsRouterHelper::build_link( [ 'dashboard', 'index' ] ),
1361 'meta' => array( 'class' => '' ),
1362 ];
1363 $wp_admin_bar->add_node( $args );
1364 }
1365 }
1366
1367
1368 /**
1369 * Register shortcodes
1370 */
1371 public function register_shortcodes() {
1372 add_shortcode( 'latepoint_book_button', array( 'OsShortcodesHelper', 'shortcode_latepoint_book_button' ) );
1373 add_shortcode( 'latepoint_book_form', array( 'OsShortcodesHelper', 'shortcode_latepoint_book_form' ) );
1374 add_shortcode( 'latepoint_customer_dashboard', array( 'OsShortcodesHelper', 'shortcode_latepoint_customer_dashboard' ) );
1375 add_shortcode( 'latepoint_customer_login', array( 'OsShortcodesHelper', 'shortcode_latepoint_customer_login' ) );
1376 add_shortcode( 'latepoint_resources', array( 'OsShortcodesHelper', 'shortcode_latepoint_resources' ) );
1377 add_shortcode( 'latepoint_calendar', array( 'OsShortcodesHelper', 'shortcode_latepoint_calendar' ) );
1378 }
1379
1380 /*
1381
1382 SHORTCODES
1383
1384 */
1385
1386
1387 public function setup_environment() {
1388 if ( ! current_theme_supports( 'post-thumbnails' ) ) {
1389 add_theme_support( 'post-thumbnails' );
1390 }
1391 add_post_type_support( LATEPOINT_AGENT_POST_TYPE, 'thumbnail' );
1392 add_post_type_support( LATEPOINT_SERVICE_POST_TYPE, 'thumbnail' );
1393 add_post_type_support( LATEPOINT_CUSTOMER_POST_TYPE, 'thumbnail' );
1394 }
1395
1396
1397 public function create_required_tables() {
1398 OsDatabaseHelper::run_setup();
1399 }
1400
1401
1402 /**
1403 * Register core post types.
1404 */
1405 public function register_post_types() {
1406 }
1407
1408
1409 /**
1410 * Register scripts and styles - FRONT
1411 */
1412 public function load_front_scripts_and_styles() {
1413 $localized_vars = [
1414 'route_action' => 'latepoint_route_call',
1415 'response_status' => [
1416 'success' => 'success',
1417 'error' => 'error',
1418 ],
1419 'ajaxurl' => admin_url( 'admin-ajax.php' ),
1420 'time_pick_style' => OsStepsHelper::get_time_pick_style(),
1421 'string_today' => __( 'Today', 'latepoint' ),
1422 'reload_booking_form_summary_route' => OsRouterHelper::build_route_name( 'steps', 'reload_booking_form_summary_panel' ),
1423 'time_system' => OsTimeHelper::get_time_system(),
1424 'msg_not_available' => __( 'Not Available', 'latepoint' ),
1425 'booking_button_route' => OsRouterHelper::build_route_name( 'steps', 'start' ),
1426 'remove_cart_item_route' => OsRouterHelper::build_route_name( 'carts', 'remove_item_from_cart' ),
1427 'show_booking_end_time' => ( OsSettingsHelper::is_on( 'show_booking_end_time' ) ) ? 'yes' : 'no',
1428 'customer_dashboard_url' => OsSettingsHelper::get_customer_dashboard_url( true ),
1429 'demo_mode' => OsSettingsHelper::is_env_demo(),
1430 'cancel_booking_prompt' => __( 'Are you sure you want to cancel this appointment?', 'latepoint' ),
1431 'single_space_message' => __( 'Space Available', 'latepoint' ),
1432 'many_spaces_message' => __( 'Spaces Available', 'latepoint' ),
1433 'body_font_family' => '"latepoint", -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif ',
1434 'headings_font_family' => '"latepoint", -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif ',
1435 'currency_symbol_before' => OsSettingsHelper::get_settings_value( 'currency_symbol_before', '' ),
1436 'currency_symbol_after' => OsSettingsHelper::get_settings_value( 'currency_symbol_after', '' ),
1437 'thousand_separator' => OsSettingsHelper::get_settings_value( 'thousand_separator', ',' ),
1438 'decimal_separator' => OsSettingsHelper::get_settings_value( 'decimal_separator', '.' ),
1439 'number_of_decimals' => OsSettingsHelper::get_settings_value( 'number_of_decimals', '2' ),
1440 'included_phone_countries' => wp_json_encode( OsSettingsHelper::get_included_phone_countries() ),
1441 'default_phone_country' => OsSettingsHelper::get_default_phone_country(),
1442 'is_timezone_selected' => OsTimeHelper::is_timezone_saved_in_session(),
1443 'start_from_order_intent_route' => OsRouterHelper::build_route_name( 'steps', 'start_from_order_intent' ),
1444 'start_from_order_intent_key' => OsRouterHelper::get_request_param( 'latepoint_order_intent_key' ) ? OsRouterHelper::get_request_param( 'latepoint_order_intent_key' ) : '',
1445 'is_enabled_show_dial_code_with_flag' => OsSettingsHelper::is_enabled_show_dial_code_with_flag(),
1446 'mask_phone_number_fields' => OsSettingsHelper::is_on( 'mask_phone_number_fields', LATEPOINT_VALUE_ON ),
1447 'msg_validation_presence' => __( 'can not be blank', 'latepoint' ),
1448 'msg_validation_presence_checkbox' => __( 'has to be checked', 'latepoint' ),
1449 'msg_validation_invalid' => __( 'is invalid', 'latepoint' ),
1450 'msg_minutes_suffix' => __( ' minutes', 'latepoint' ),
1451 'is_stripe_connect_enabled' => OsPaymentsHelper::is_payment_processor_enabled( OsStripeConnectHelper::$processor_code ),
1452 'check_order_intent_bookable_route' => OsRouterHelper::build_route_name( 'steps', 'check_order_intent_bookable' ),
1453 'generate_timeslots_for_day_route' => OsRouterHelper::build_route_name( 'steps', 'generate_timeslots_for_day' ),
1454 'payment_environment' => OsSettingsHelper::get_payments_environment(),
1455 'style_border_radius' => OsSettingsHelper::get_booking_form_border_radius(),
1456 'datepicker_timeslot_selected_label' => __( 'Selected', 'latepoint' ),
1457 'invoices_payment_form_route' => OsRouterHelper::build_route_name( 'invoices', 'payment_form' ),
1458 'invoices_summary_before_payment_route' => OsRouterHelper::build_route_name( 'invoices', 'summary_before_payment' ),
1459 'reset_presets_when_adding_new_item' => OsSettingsHelper::is_on( 'reset_presets_when_adding_new_item' ),
1460 ];
1461
1462 $localized_vars['start_from_transaction_access_key'] = '';
1463 if ( OsRouterHelper::get_request_param( 'latepoint_transaction_intent_key' ) ) {
1464 $invoice = OsInvoicesHelper::get_invoice_by_transaction_intent_key( OsRouterHelper::get_request_param( 'latepoint_transaction_intent_key' ) );
1465 if ( $invoice ) {
1466 $localized_vars['start_from_transaction_access_key'] = $invoice->access_key;
1467 }
1468 }
1469
1470 if ( OsPaymentsHelper::is_payment_processor_enabled( OsStripeConnectHelper::$processor_code ) ) {
1471 $localized_vars['stripe_connect_key'] = OsStripeConnectHelper::get_connect_publishable_key();
1472 $localized_vars['stripe_connected_account_id'] = OsStripeConnectHelper::get_connect_account_id();
1473 }
1474 $localized_vars['stripe_connect_route_create_payment_intent'] = OsRouterHelper::build_route_name( 'stripe_connect', 'create_payment_intent' );
1475 $localized_vars['stripe_connect_route_create_payment_intent_for_transaction_intent'] = OsRouterHelper::build_route_name( 'stripe_connect', 'create_payment_intent_for_transaction' );
1476
1477 // Stylesheets
1478 wp_enqueue_style( 'latepoint-main-front', $this->public_stylesheets() . 'front.css', false, $this->version );
1479
1480 // add styles from options if gutenberg blocks exists
1481 OsBlockHelper::add_block_styles_to_page();
1482
1483 // Javscripts
1484
1485 // Addon scripts and styles
1486 do_action( 'latepoint_wp_enqueue_scripts' );
1487
1488 if ( OsPaymentsHelper::is_payment_processor_enabled( OsStripeConnectHelper::$processor_code ) ) {
1489 wp_enqueue_script( 'stripe', 'https://js.stripe.com/v3/', false, null );
1490 }
1491
1492 wp_register_script( 'latepoint-vendor-front', $this->public_javascripts() . 'vendor-front.js', [ 'jquery' ], $this->version );
1493 wp_register_script(
1494 'latepoint-main-front',
1495 $this->public_javascripts() . 'front.js',
1496 [
1497 'jquery',
1498 'latepoint-vendor-front',
1499 'wp-i18n',
1500 ],
1501 $this->version
1502 );
1503
1504
1505 $localized_vars = apply_filters( 'latepoint_localized_vars_front', $localized_vars );
1506
1507 wp_localize_script( 'latepoint-main-front', 'latepoint_helper', $localized_vars );
1508 wp_enqueue_script( 'latepoint-main-front' );
1509
1510
1511 $latepoint_css_variables = OsStylesHelper::generate_css_variables();
1512 wp_add_inline_style( 'latepoint-main-front', $latepoint_css_variables );
1513 }
1514
1515 public function add_admin_body_class( $classes ) {
1516 if ( ( is_admin() ) && isset( $_GET['page'] ) && $_GET['page'] == 'latepoint' ) {
1517 $classes = $classes . ' latepoint-admin latepoint';
1518 }
1519
1520 return $classes;
1521 }
1522
1523 public function add_body_class( $classes ) {
1524 $classes[] = 'latepoint';
1525
1526 return $classes;
1527 }
1528
1529
1530 /**
1531 * Register admin scripts and styles - ADMIN
1532 */
1533 public function load_admin_scripts_and_styles() {
1534 // Stylesheets
1535 wp_enqueue_style( 'latepoint-blocks-editor', LatePoint::plugin_url() . 'blocks/assets/css/editor-styles.css', array( 'wp-edit-blocks' ), $this->version );
1536 wp_enqueue_style( 'latepoint-main-admin', $this->public_stylesheets() . 'admin.css', false, $this->version );
1537
1538 // Javscripts
1539 wp_enqueue_media();
1540
1541
1542 wp_enqueue_script( 'latepoint-vendor-admin', $this->public_javascripts() . 'vendor-admin.js', [ 'jquery' ], $this->version );
1543 wp_enqueue_script(
1544 'latepoint-main-admin',
1545 $this->public_javascripts() . 'admin.js',
1546 [
1547 'jquery',
1548 'latepoint-vendor-admin',
1549 'wp-i18n',
1550 ],
1551 $this->version
1552 );
1553
1554
1555 do_action( 'latepoint_admin_enqueue_scripts' );
1556
1557 $localized_vars = [
1558 'route_action' => 'latepoint_route_call',
1559 'response_status' => [
1560 'success' => 'success',
1561 'error' => 'error',
1562 ],
1563 'ajaxurl' => admin_url( 'admin-ajax.php' ),
1564 'value_all' => LATEPOINT_ALL,
1565 'value_on' => LATEPOINT_VALUE_ON,
1566 'value_off' => LATEPOINT_VALUE_OFF,
1567 'body_font_family' => '"latepoint", -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif ',
1568 'headings_font_family' => '"latepoint", -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif ',
1569 'wp_locale' => get_locale(),
1570 'string_today' => __( 'Today', 'latepoint' ),
1571 'click_to_copy_done' => __( 'Copied', 'latepoint' ),
1572 'click_to_copy_prompt' => __( 'Just click to copy', 'latepoint' ),
1573 'approve_confirm' => __( 'Are you sure you want to approve this booking?', 'latepoint' ),
1574 'reject_confirm' => __( 'Are you sure you want to reject this booking?', 'latepoint' ),
1575 'time_system' => OsTimeHelper::get_time_system(),
1576 'msg_not_available' => __( 'Not Available', 'latepoint' ),
1577 'msg_addon_activated' => __( 'Active', 'latepoint' ),
1578 'datepicker_timeslot_selected_label' => __( 'Selected', 'latepoint' ),
1579 'string_minutes' => __( 'minutes', 'latepoint' ),
1580 'single_space_message' => __( 'Space Available', 'latepoint' ),
1581 'many_spaces_message' => __( 'Spaces Available', 'latepoint' ),
1582 'currency_symbol_before' => OsSettingsHelper::get_settings_value( 'currency_symbol_before', '' ),
1583 'currency_symbol_after' => OsSettingsHelper::get_settings_value( 'currency_symbol_after', '' ),
1584 'thousand_separator' => OsSettingsHelper::get_settings_value( 'thousand_separator', ',' ),
1585 'decimal_separator' => OsSettingsHelper::get_settings_value( 'decimal_separator', '.' ),
1586 'number_of_decimals' => OsSettingsHelper::get_settings_value( 'number_of_decimals', '2' ),
1587 'included_phone_countries' => wp_json_encode( OsSettingsHelper::get_included_phone_countries() ),
1588 'default_phone_country' => OsSettingsHelper::get_default_phone_country(),
1589 'date_format' => OsSettingsHelper::get_date_format(),
1590 'date_format_for_js' => OsSettingsHelper::get_date_format_for_js(),
1591 'is_enabled_show_dial_code_with_flag' => OsSettingsHelper::is_enabled_show_dial_code_with_flag(),
1592 'mask_phone_number_fields' => OsSettingsHelper::is_on( 'mask_phone_number_fields', LATEPOINT_VALUE_ON ),
1593 'msg_validation_presence' => __( 'can not be blank', 'latepoint' ),
1594 'msg_validation_presence_checkbox' => __( 'has to be checked', 'latepoint' ),
1595 'msg_validation_invalid' => __( 'is invalid', 'latepoint' ),
1596 'msg_minutes_suffix' => __( ' minutes', 'latepoint' ),
1597 'order_item_variant_booking' => LATEPOINT_ITEM_VARIANT_BOOKING,
1598 'order_item_variant_bundle' => LATEPOINT_ITEM_VARIANT_BUNDLE,
1599 ];
1600
1601 // Add block related variables
1602 $localized_vars = array_merge( $localized_vars, OsBlockHelper::localized_vars_for_blocks() );
1603
1604 /**
1605 * Array of localized variables to be available in latepoint_helper object in admin
1606 *
1607 * @param {array} $localized_vars The default array being filtered
1608 * @returns {array} The filtered array of localized variables
1609 *
1610 * @since 5.0.0
1611 * @hook latepoint_localized_vars_admin
1612 *
1613 */
1614 $localized_vars = apply_filters( 'latepoint_localized_vars_admin', $localized_vars );
1615
1616 wp_localize_script( 'latepoint-main-admin', 'latepoint_helper', $localized_vars );
1617
1618
1619 $latepoint_css_variables = OsStylesHelper::generate_css_variables();
1620 wp_add_inline_style( 'latepoint-main-admin', $latepoint_css_variables );
1621 }
1622 }
1623 endif;
1624
1625
1626 $LATEPOINT = new LatePoint();
1627