PluginProbe ʕ •ᴥ•ʔ
CommerceBird – AI Command Center, ERP Integrations & B2B for WooCommerce (Zoho, Exact Online). / 2.3.9
CommerceBird – AI Command Center, ERP Integrations & B2B for WooCommerce (Zoho, Exact Online). v2.3.9
3.0.3 3.0.2 3.0.1 trunk 2.2.14 2.2.15 2.2.16 2.2.17 2.2.18 2.2.19 2.3.0 2.3.1 2.3.10 2.3.11 2.3.12 2.3.13 2.3.14 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 2.3.7 2.3.8 2.3.9 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 2.7.8 2.7.9 2.7.91 2.7.92 2.7.93 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.8.5 2.9.0 2.9.1 2.9.2 2.9.3 3.0.0
commercebird / includes / classes / class-common.php
commercebird / includes / classes Last commit date
apis 1 year ago purchase-orders 1 year ago zoho-crm 1 year ago zoho-inventory 1 year ago class-api-handler-zoho.php 1 year ago class-auth-zoho.php 1 year ago class-common.php 1 year ago class-plugin.php 1 year ago class-wc-api.php 1 year ago index.php 1 year ago
class-common.php
236 lines
1 <?php
2 /**
3 * Common class function.
4 */
5 if ( ! defined( 'ABSPATH' ) ) {
6 exit;
7 }
8
9 if ( ! class_exists( 'CMBIRD_Common_Functions' ) ) {
10 class CMBIRD_Common_Functions {
11
12
13 public function __construct() {
14 add_action( 'woocommerce_thankyou', array( $this, 'cmbird_sync_frontend_order' ) );
15 add_action( 'woocommerce_rest_insert_shop_order_object', array( $this, 'cmbird_on_insert_rest_api' ), 20, 3 );
16 add_filter( 'wcs_renewal_order_created', array( $this, 'cmbird_zi_sync_renewal_order' ), 10, 2 );
17 add_action( 'wp_ajax_zoho_admin_order_sync', array( $this, 'cmbird_zoho_order_sync' ) );
18 }
19
20 /**
21 * Sync order when it's created via the checkout.
22 */
23 public function cmbird_sync_frontend_order( $order_id ) {
24 // return if the order is not coming via thank you page
25 if ( ! is_wc_endpoint_url( 'order-received' ) ) {
26 return;
27 }
28 // Check if the transient flag is set
29 if ( get_transient( 'cmbird_thankyou_callback_executed_' . $order_id ) ) {
30 return;
31 }
32 $zoho_inventory_access_token = get_option( 'cmbird_zoho_inventory_access_token' );
33 // First sync the customer to Zoho Inventory if the access token is set
34 if ( ! empty( $zoho_inventory_access_token ) ) {
35 $zi_order_class = new CMBIRD_Order_Sync_ZI();
36 $zi_order_class->cmbird_zi_sync_customer_checkout( $order_id );
37 // Use WC Action Scheduler to sync the order to Zoho Inventory
38 $existing_schedule = as_has_scheduled_action( 'sync_zi_order', array( $order_id ) );
39 if ( ! $existing_schedule ) {
40 as_schedule_single_action( time(), 'sync_zi_order', array( $order_id ) );
41 // Set the transient flag to prevent multiple executions
42 set_transient( 'cmbird_thankyou_callback_executed_' . $order_id, true, 60 );
43 }
44 }
45 $zoho_crm_access_token = get_option( 'cmbird_zoho_crm_access_token' );
46 // If the access token is set, sync the order to Zoho CRM
47 if ( ! empty( $zoho_crm_access_token ) ) {
48 // Use WC Action Scheduler to sync the order to Zoho CRM
49 $existing_schedule = as_has_scheduled_action( 'sync_zcrm_order', array( $order_id ) );
50 if ( ! $existing_schedule ) {
51 as_schedule_single_action( time(), 'sync_zcrm_order', array( $order_id ) );
52 // Set the transient flag to prevent multiple executions
53 set_transient( 'cmbird_thankyou_callback_executed_' . $order_id, true, 60 );
54 }
55 }
56
57 }
58
59 /**
60 * Sync order when its scheduled via the Action Scheduler.
61 *
62 * @param int $order_id Order ID.
63 * @return void
64 */
65 public function cmbird_orders_prepare_sync() {
66 $args = func_get_args();
67 $order_id = $args[0];
68 if ( get_option( 'cmbird_zoho_inventory_access_token' ) && $order_id ) {
69 $zi_order_class = new CMBIRD_Order_Sync_ZI();
70 $zi_order_class->zi_order_sync( $order_id );
71 }
72 if ( get_option( 'cmbird_zoho_crm_access_token' ) && $order_id ) {
73 $zcrm_order_class = new CMBIRD_ZCRM_SalesOrder();
74 // Sync the order to Zoho CRM
75 $zcrm_order_class->cmbird_zcrm_order_sync( $order_id );
76 }
77 }
78
79 /**
80 * Sync order when it's created via the WC API.
81 *
82 * @param WC_Data $object Inserted object.
83 * @param WP_REST_Request $request Request object.
84 * @param boolean $creating True when creating object, false when updating.
85 */
86 public function cmbird_on_insert_rest_api( $object, $request, $is_creating ) {
87 // $fd = fopen(__DIR__ . '/on_insert_rest_api.txt', 'w+');
88 $request_body = $request->get_body();
89 $request_body_array = json_decode( $request_body, true );
90 $order_status = $request_body_array['status'];
91 $order_id = $object->get_id();
92
93 if ( get_option( 'cmbird_zoho_inventory_access_token' ) ) {
94 $zi_order_class = new CMBIRD_Order_Sync_ZI();
95 // Check how many keys there are in the request body array. If there are only two keys then we don't need to do anything.
96 if ( count( $request_body_array ) === 2 ) {
97 if ( in_array( $order_status, array( 'cancelled', 'wc-merged' ) ) ) {
98 $zi_order_class->salesorder_void( $order_id );
99 }
100 } else {
101 $zi_order_class->zi_order_sync( $order_id );
102 }
103 }
104 // same for Zoho CRM
105 if ( get_option( 'cmbird_zoho_crm_access_token' ) ) {
106 $zcrm_order_class = new CMBIRD_ZCRM_SalesOrder();
107 // Check how many keys there are in the request body array. If there are only two keys then we don't need to do anything.
108 if ( count( $request_body_array ) === 2 ) {
109 if ( in_array( $order_status, array( 'cancelled', 'wc-merged' ) ) ) {
110 // $zcrm_order_class->zcrm_salesorder_void( $order_id );
111 }
112 } else {
113 $zcrm_order_class->cmbird_zcrm_order_sync( $order_id );
114 }
115 }
116
117 // fclose($fd);
118 }
119
120 /**
121 * Sync Renewal Order to Zoho once it's created.
122 */
123 public function cmbird_zi_sync_renewal_order( $renewal_order, $subscription ) {
124 if ( empty( get_option( 'cmbird_zoho_inventory_access_token' ) ) ) {
125 return $renewal_order;
126 }
127
128 $order_id = $renewal_order->get_id();
129 // Sync the order to Zoho CRM
130 $zcrm_order_class = new CMBIRD_ZCRM_SalesOrder();
131 $zcrm_order_class->cmbird_zcrm_order_sync( $order_id );
132
133 // Sync the order to Zoho Inventory
134 $zi_order_class = new CMBIRD_Order_Sync_ZI();
135 $zi_order_class->zi_order_sync( $order_id );
136
137 return $renewal_order;
138 }
139
140 public function cmbird_zoho_order_sync($order_id) {
141 if ( ! $order_id && isset( $_POST['nonce'], $_POST['arg_order_data'] ) ) {
142 if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'zoho_admin_order_sync' ) ) {
143 wp_send_json_error( 'Nonce verification failed' );
144 }
145 $order_id = sanitize_text_field( wp_unslash( $_POST['arg_order_data'] ) );
146 }
147
148 if ( $order_id <= 0 ) {
149 wp_send_json_error( 'Invalid order ID.' );
150 }
151
152 // Sync the order to Zoho CRM
153 $zcrm_order_class = new CMBIRD_ZCRM_SalesOrder();
154 $zcrm_order_class->cmbird_zcrm_order_sync( $order_id );
155
156 // Sync the order to Zoho Inventory
157 $zi_order_class = new CMBIRD_Order_Sync_ZI();
158 $zi_order_class->zi_order_sync( $order_id );
159
160 wp_send_json_success( 'Order synced successfully.' );
161 }
162
163 /**
164 * Function to clear all orphan data.
165 */
166 public function clear_orphan_data() {
167 global $wpdb;
168 // Delete orphaned product variations
169 $deleted_variations = absint(
170 $wpdb->query(
171 "DELETE products
172 FROM {$wpdb->posts} products
173 LEFT JOIN {$wpdb->posts} wp ON wp.ID = products.post_parent
174 WHERE wp.ID IS NULL AND products.post_type = 'product_variation';"
175 )
176 );
177 // Delete orphaned postmeta
178 $deleted_postmeta = absint(
179 $wpdb->query(
180 "DELETE pm
181 FROM {$wpdb->postmeta} pm
182 LEFT JOIN {$wpdb->posts} wp ON wp.ID = pm.post_id
183 WHERE wp.ID IS NULL;"
184 )
185 );
186 // Return the number of deleted entries (orphaned variations + orphaned postmeta)
187 return $deleted_variations + $deleted_postmeta;
188 }
189
190 /**
191 * Get the tax class based on the tax percentage.
192 *
193 * @param float $percentage The tax percentage.
194 * @return string|false The tax class if found, or standard if not found.
195 */
196 public function get_tax_class_by_percentage( $percentage ) {
197 // $fd = fopen( __DIR__ . '/get_tax_class_by_percentage.txt', 'a+' );
198
199 global $wpdb;
200 // Determine the number of decimal places in the provided percentage
201 $decimal_places = strlen( substr( strrchr( $percentage, '.' ), 1 ) );
202
203 // Round the percentage to the determined number of decimal places
204 $rounded_percentage = round( $percentage, $decimal_places );
205 $tax_rates = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates WHERE ROUND(tax_rate, %d) = %f", $decimal_places, $rounded_percentage ) );
206
207 // If tax rates are found
208 if ( $tax_rates ) {
209 // Get the tax class from the first matching tax rate
210 $tax_class = $tax_rates[0]->tax_rate_class;
211 return $tax_class;
212 } else {
213 // Return null if no tax rates match the provided percentage
214 return 'standard';
215 }
216 }
217
218 /**
219 * Send email to admin.
220 *
221 * @param string $subject The subject of the email.
222 * @param string $message The message body of the email.
223 *
224 * @return void
225 */
226 public function send_email( $subject, $message ) {
227 $admin_email = get_option( 'admin_email' );
228 $headers = array( 'Content-Type: text/html; charset=UTF-8' );
229
230 // Send the email
231 wp_mail( $admin_email, $subject, $message, $headers );
232 }
233 }
234 }
235 $cmbird_common_functions = new CMBIRD_Common_Functions();
236