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