PluginProbe ʕ •ᴥ•ʔ
OttoKit: All-in-One Automation Platform / 1.1.32
OttoKit: All-in-One Automation Platform v1.1.32
1.1.32 1.1.31 1.1.30 1.1.29 1.1.28 1.1.27 1.1.9 trunk 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 1.0.25 1.0.26 1.0.27 1.0.28 1.0.29 1.0.30 1.0.31 1.0.32 1.0.33 1.0.34 1.0.35 1.0.36 1.0.37 1.0.38 1.0.39 1.0.40 1.0.41 1.0.42 1.0.43 1.0.44 1.0.45 1.0.46 1.0.47 1.0.48 1.0.49 1.0.50 1.0.51 1.0.52 1.0.53 1.0.54 1.0.55 1.0.56 1.0.57 1.0.58 1.0.59 1.0.60 1.0.61 1.0.62 1.0.63 1.0.64 1.0.65 1.0.66 1.0.67 1.0.68 1.0.69 1.0.7 1.0.70 1.0.71 1.0.72 1.0.73 1.0.74 1.0.75 1.0.76 1.0.77 1.0.78 1.0.79 1.0.8 1.0.80 1.0.81 1.0.82 1.0.83 1.0.84 1.0.85 1.0.86 1.0.87 1.0.88 1.0.89 1.0.9 1.0.90 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.20 1.1.21 1.1.22 1.1.23 1.1.24 1.1.25 1.1.26 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8
suretriggers / src / Integrations / bookly / actions / get-appointment-details.php
suretriggers / src / Integrations / bookly / actions Last commit date
get-appointment-details.php 2 months ago update-appointment-status.php 2 months ago
get-appointment-details.php
194 lines
1 <?php
2 /**
3 * GetAppointmentDetails.
4 * php version 5.6
5 *
6 * @category GetAppointmentDetails
7 * @package SureTriggers
8 * @author BSF <username@example.com>
9 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3
10 * @link https://www.brainstormforce.com/
11 * @since 1.0.0
12 */
13
14 namespace SureTriggers\Integrations\Bookly\Actions;
15
16 use Exception;
17 use SureTriggers\Integrations\AutomateAction;
18 use SureTriggers\Traits\SingletonLoader;
19
20 /**
21 * GetAppointmentDetails
22 *
23 * @category GetAppointmentDetails
24 * @package SureTriggers
25 * @author BSF <username@example.com>
26 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3
27 * @link https://www.brainstormforce.com/
28 * @since 1.0.0
29 */
30 class GetAppointmentDetails extends AutomateAction {
31
32 /**
33 * Integration type.
34 *
35 * @var string
36 */
37 public $integration = 'Bookly';
38
39 /**
40 * Action name.
41 *
42 * @var string
43 */
44 public $action = 'bookly_get_appointment_details';
45
46 use SingletonLoader;
47
48 /**
49 * Register a action.
50 *
51 * @param array $actions actions.
52 * @return array
53 */
54 public function register( $actions ) {
55 $actions[ $this->integration ][ $this->action ] = [
56 'label' => __( 'Get Appointment Details', 'suretriggers' ),
57 'action' => $this->action,
58 'function' => [ $this, 'action_listener' ],
59 ];
60
61 return $actions;
62 }
63
64 /**
65 * Action listener.
66 *
67 * @param int $user_id user_id.
68 * @param int $automation_id automation_id.
69 * @param array $fields fields.
70 * @param array $selected_options selected_options.
71 *
72 * @return array|void
73 *
74 * @throws Exception Exception.
75 */
76 public function _action_listener( $user_id, $automation_id, $fields, $selected_options ) {
77
78 if ( ! class_exists( '\Bookly\Lib\Plugin' ) ) {
79 return [
80 'status' => 'error',
81 'message' => __( 'Bookly is not installed or activated.', 'suretriggers' ),
82 ];
83 }
84
85 $appointment_id = isset( $selected_options['customer_appointment_id'] ) ? intval( $selected_options['customer_appointment_id'] ) : 0;
86 $customer_email = isset( $selected_options['customer_email'] ) ? sanitize_email( $selected_options['customer_email'] ) : '';
87 $include_custom_fields = isset( $selected_options['include_custom_fields'] ) ? (bool) $selected_options['include_custom_fields'] : true;
88 $include_customer = isset( $selected_options['include_customer'] ) ? (bool) $selected_options['include_customer'] : true;
89 $include_service_details = isset( $selected_options['include_service_details'] ) ? (bool) $selected_options['include_service_details'] : true;
90 $include_staff_details = isset( $selected_options['include_staff_details'] ) ? (bool) $selected_options['include_staff_details'] : true;
91
92 if ( empty( $appointment_id ) && empty( $customer_email ) ) {
93 return [
94 'status' => 'error',
95 'message' => __( 'Customer Appointment ID or Customer Email is required.', 'suretriggers' ),
96 ];
97 }
98
99 global $wpdb;
100
101 if ( $appointment_id ) {
102 //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
103 $row = $wpdb->get_row(
104 $wpdb->prepare(
105 "SELECT ca.*, a.staff_id, a.service_id, a.start_date, a.end_date, a.location_id, a.internal_note
106 FROM {$wpdb->prefix}bookly_customer_appointments ca
107 LEFT JOIN {$wpdb->prefix}bookly_appointments a ON a.id = ca.appointment_id
108 WHERE ca.id = %d",
109 $appointment_id
110 ),
111 ARRAY_A
112 );
113 } else {
114 //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
115 $row = $wpdb->get_row(
116 $wpdb->prepare(
117 "SELECT ca.*, a.staff_id, a.service_id, a.start_date, a.end_date, a.location_id, a.internal_note
118 FROM {$wpdb->prefix}bookly_customer_appointments ca
119 LEFT JOIN {$wpdb->prefix}bookly_appointments a ON a.id = ca.appointment_id
120 INNER JOIN {$wpdb->prefix}bookly_customers c ON c.id = ca.customer_id
121 WHERE c.email = %s
122 ORDER BY ca.id DESC
123 LIMIT 1",
124 $customer_email
125 ),
126 ARRAY_A
127 );
128 }
129
130 if ( ! $row || ! is_array( $row ) ) {
131 return [
132 'status' => 'error',
133 'message' => __( 'Appointment not found.', 'suretriggers' ),
134 ];
135 }
136
137 $response = [ 'appointment' => $row ];
138
139 if ( $include_custom_fields && ! empty( $row['custom_fields'] ) ) {
140 $decoded = json_decode( (string) $row['custom_fields'], true );
141 $fields = [];
142 if ( is_array( $decoded ) ) {
143 foreach ( $decoded as $field ) {
144 if ( is_array( $field ) && isset( $field['label'] ) ) {
145 $fields[ $field['label'] ] = isset( $field['value'] ) ? $field['value'] : '';
146 }
147 }
148 }
149 $response['custom_fields'] = $fields;
150 }
151
152 if ( $include_customer && ! empty( $row['customer_id'] ) ) {
153 //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
154 $response['customer'] = $wpdb->get_row(
155 $wpdb->prepare(
156 "SELECT id, wp_user_id, full_name, first_name, last_name, email, phone, country, state, postcode, city, street
157 FROM {$wpdb->prefix}bookly_customers WHERE id = %d",
158 (int) $row['customer_id']
159 ),
160 ARRAY_A
161 );
162 }
163
164 if ( $include_service_details && ! empty( $row['service_id'] ) ) {
165 //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
166 $response['service'] = $wpdb->get_row(
167 $wpdb->prepare(
168 "SELECT id, category_id, title, price, duration, info FROM {$wpdb->prefix}bookly_services WHERE id = %d",
169 (int) $row['service_id']
170 ),
171 ARRAY_A
172 );
173 }
174
175 if ( $include_staff_details && ! empty( $row['staff_id'] ) ) {
176 //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
177 $response['staff'] = $wpdb->get_row(
178 $wpdb->prepare(
179 "SELECT id, wp_user_id, full_name, email, phone, info FROM {$wpdb->prefix}bookly_staff WHERE id = %d",
180 (int) $row['staff_id']
181 ),
182 ARRAY_A
183 );
184 }
185
186 $response['success'] = true;
187 $response['message'] = __( 'Appointment details retrieved successfully.', 'suretriggers' );
188
189 return $response;
190 }
191 }
192
193 GetAppointmentDetails::get_instance();
194