PluginProbe ʕ •ᴥ•ʔ
CommerceBird – AI Command Center, ERP Integrations & B2B for WooCommerce (Zoho, Exact Online). / 2.3.8
CommerceBird – AI Command Center, ERP Integrations & B2B for WooCommerce (Zoho, Exact Online). v2.3.8
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
230 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 $this->zi_order_sync( $order_id );
130
131 return $renewal_order;
132 }
133
134 public function cmbird_zoho_order_sync($order_id) {
135 if ( ! $order_id && isset( $_POST['nonce'], $_POST['arg_order_data'] ) ) {
136 if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'zoho_admin_order_sync' ) ) {
137 wp_send_json_error( 'Nonce verification failed' );
138 }
139 $order_id = sanitize_text_field( wp_unslash( $_POST['arg_order_data'] ) );
140 }
141
142 if ( $order_id <= 0 ) {
143 wp_send_json_error( 'Invalid order ID.' );
144 }
145
146 // Sync the order to Zoho CRM
147 $zcrm_order_class = new CMBIRD_ZCRM_SalesOrder();
148 $zcrm_order_class->cmbird_zcrm_order_sync( $order_id );
149
150 // Sync the order to Zoho Inventory
151 $zi_order_class = new CMBIRD_Order_Sync_ZI();
152 $zi_order_class->zi_order_sync( $order_id );
153
154 wp_send_json_success( 'Order synced successfully.' );
155 }
156
157 /**
158 * Function to clear all orphan data.
159 */
160 public function clear_orphan_data() {
161 global $wpdb;
162 // Delete orphaned product variations
163 $deleted_variations = absint(
164 $wpdb->query(
165 "DELETE products
166 FROM {$wpdb->posts} products
167 LEFT JOIN {$wpdb->posts} wp ON wp.ID = products.post_parent
168 WHERE wp.ID IS NULL AND products.post_type = 'product_variation';"
169 )
170 );
171 // Delete orphaned postmeta
172 $deleted_postmeta = absint(
173 $wpdb->query(
174 "DELETE pm
175 FROM {$wpdb->postmeta} pm
176 LEFT JOIN {$wpdb->posts} wp ON wp.ID = pm.post_id
177 WHERE wp.ID IS NULL;"
178 )
179 );
180 // Return the number of deleted entries (orphaned variations + orphaned postmeta)
181 return $deleted_variations + $deleted_postmeta;
182 }
183
184 /**
185 * Get the tax class based on the tax percentage.
186 *
187 * @param float $percentage The tax percentage.
188 * @return string|false The tax class if found, or standard if not found.
189 */
190 public function get_tax_class_by_percentage( $percentage ) {
191 // $fd = fopen( __DIR__ . '/get_tax_class_by_percentage.txt', 'a+' );
192
193 global $wpdb;
194 // Determine the number of decimal places in the provided percentage
195 $decimal_places = strlen( substr( strrchr( $percentage, '.' ), 1 ) );
196
197 // Round the percentage to the determined number of decimal places
198 $rounded_percentage = round( $percentage, $decimal_places );
199 $tax_rates = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates WHERE ROUND(tax_rate, %d) = %f", $decimal_places, $rounded_percentage ) );
200
201 // If tax rates are found
202 if ( $tax_rates ) {
203 // Get the tax class from the first matching tax rate
204 $tax_class = $tax_rates[0]->tax_rate_class;
205 return $tax_class;
206 } else {
207 // Return null if no tax rates match the provided percentage
208 return 'standard';
209 }
210 }
211
212 /**
213 * Send email to admin.
214 *
215 * @param string $subject The subject of the email.
216 * @param string $message The message body of the email.
217 *
218 * @return void
219 */
220 public function send_email( $subject, $message ) {
221 $admin_email = get_option( 'admin_email' );
222 $headers = array( 'Content-Type: text/html; charset=UTF-8' );
223
224 // Send the email
225 wp_mail( $admin_email, $subject, $message, $headers );
226 }
227 }
228 }
229 $cmbird_common_functions = new CMBIRD_Common_Functions();
230