PluginProbe ʕ •ᴥ•ʔ
CommerceBird – AI Command Center, ERP Integrations & B2B for WooCommerce (Zoho, Exact Online). / 2.3.12
CommerceBird – AI Command Center, ERP Integrations & B2B for WooCommerce (Zoho, Exact Online). v2.3.12
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
235 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 ( is_string( $zoho_inventory_access_token ) && trim( $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 ( is_string( $zoho_crm_access_token ) && trim( $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 * Sync order when its scheduled via the Action Scheduler.
60 *
61 * @param int $order_id Order ID.
62 * @return void
63 */
64 public function cmbird_orders_prepare_sync() {
65 $args = func_get_args();
66 $order_id = $args[0];
67 if ( get_option( 'cmbird_zoho_inventory_access_token' ) && $order_id ) {
68 $zi_order_class = new CMBIRD_Order_Sync_ZI();
69 $zi_order_class->zi_order_sync( $order_id );
70 }
71 if ( get_option( 'cmbird_zoho_crm_access_token' ) && $order_id ) {
72 $zcrm_order_class = new CMBIRD_ZCRM_SalesOrder();
73 // Sync the order to Zoho CRM
74 $zcrm_order_class->cmbird_zcrm_order_sync( $order_id );
75 }
76 }
77
78 /**
79 * Sync order when it's created via the WC API.
80 *
81 * @param WC_Data $object Inserted object.
82 * @param WP_REST_Request $request Request object.
83 * @param boolean $creating True when creating object, false when updating.
84 */
85 public function cmbird_on_insert_rest_api( $object, $request, $is_creating ) {
86 // $fd = fopen(__DIR__ . '/on_insert_rest_api.txt', 'w+');
87 $request_body = $request->get_body();
88 $request_body_array = json_decode( $request_body, true );
89 $order_status = $request_body_array['status'];
90 $order_id = $object->get_id();
91
92 if ( get_option( 'cmbird_zoho_inventory_access_token' ) ) {
93 $zi_order_class = new CMBIRD_Order_Sync_ZI();
94 // 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.
95 if ( count( $request_body_array ) === 2 ) {
96 if ( in_array( $order_status, array( 'cancelled', 'wc-merged' ) ) ) {
97 $zi_order_class->salesorder_void( $order_id );
98 }
99 } else {
100 $zi_order_class->zi_order_sync( $order_id );
101 }
102 }
103 // same for Zoho CRM
104 if ( get_option( 'cmbird_zoho_crm_access_token' ) ) {
105 $zcrm_order_class = new CMBIRD_ZCRM_SalesOrder();
106 // 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.
107 if ( count( $request_body_array ) === 2 ) {
108 if ( in_array( $order_status, array( 'cancelled', 'wc-merged' ) ) ) {
109 // $zcrm_order_class->zcrm_salesorder_void( $order_id );
110 }
111 } else {
112 $zcrm_order_class->cmbird_zcrm_order_sync( $order_id );
113 }
114 }
115
116 // fclose($fd);
117 }
118
119 /**
120 * Sync Renewal Order to Zoho once it's created.
121 */
122 public function cmbird_zi_sync_renewal_order( $renewal_order, $subscription ) {
123 if ( empty( get_option( 'cmbird_zoho_inventory_access_token' ) ) ) {
124 return $renewal_order;
125 }
126
127 $order_id = $renewal_order->get_id();
128 // Sync the order to Zoho CRM
129 $zcrm_order_class = new CMBIRD_ZCRM_SalesOrder();
130 $zcrm_order_class->cmbird_zcrm_order_sync( $order_id );
131
132 // Sync the order to Zoho Inventory
133 $zi_order_class = new CMBIRD_Order_Sync_ZI();
134 $zi_order_class->zi_order_sync( $order_id );
135
136 return $renewal_order;
137 }
138
139 public function cmbird_zoho_order_sync( $order_id ) {
140 if ( ! $order_id && isset( $_POST['nonce'], $_POST['arg_order_data'] ) ) {
141 if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'zoho_admin_order_sync' ) ) {
142 wp_send_json_error( 'Nonce verification failed' );
143 }
144 $order_id = sanitize_text_field( wp_unslash( $_POST['arg_order_data'] ) );
145 }
146
147 if ( $order_id <= 0 ) {
148 wp_send_json_error( 'Invalid order ID.' );
149 }
150
151 // Sync the order to Zoho CRM
152 $zcrm_order_class = new CMBIRD_ZCRM_SalesOrder();
153 $zcrm_order_class->cmbird_zcrm_order_sync( $order_id );
154
155 // Sync the order to Zoho Inventory
156 $zi_order_class = new CMBIRD_Order_Sync_ZI();
157 $zi_order_class->zi_order_sync( $order_id );
158
159 wp_send_json_success( 'Order synced successfully.' );
160 }
161
162 /**
163 * Function to clear all orphan data.
164 */
165 public function clear_orphan_data() {
166 global $wpdb;
167 // Delete orphaned product variations
168 $deleted_variations = absint(
169 $wpdb->query(
170 "DELETE products
171 FROM {$wpdb->posts} products
172 LEFT JOIN {$wpdb->posts} wp ON wp.ID = products.post_parent
173 WHERE wp.ID IS NULL AND products.post_type = 'product_variation';"
174 )
175 );
176 // Delete orphaned postmeta
177 $deleted_postmeta = absint(
178 $wpdb->query(
179 "DELETE pm
180 FROM {$wpdb->postmeta} pm
181 LEFT JOIN {$wpdb->posts} wp ON wp.ID = pm.post_id
182 WHERE wp.ID IS NULL;"
183 )
184 );
185 // Return the number of deleted entries (orphaned variations + orphaned postmeta)
186 return $deleted_variations + $deleted_postmeta;
187 }
188
189 /**
190 * Get the tax class based on the tax percentage.
191 *
192 * @param float $percentage The tax percentage.
193 * @return string|false The tax class if found, or standard if not found.
194 */
195 public function get_tax_class_by_percentage( $percentage ) {
196 // $fd = fopen( __DIR__ . '/get_tax_class_by_percentage.txt', 'a+' );
197
198 global $wpdb;
199 // Determine the number of decimal places in the provided percentage
200 $decimal_places = strlen( substr( strrchr( $percentage, '.' ), 1 ) );
201
202 // Round the percentage to the determined number of decimal places
203 $rounded_percentage = round( $percentage, $decimal_places );
204 $tax_rates = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates WHERE ROUND(tax_rate, %d) = %f", $decimal_places, $rounded_percentage ) );
205
206 // If tax rates are found
207 if ( $tax_rates ) {
208 // Get the tax class from the first matching tax rate
209 $tax_class = $tax_rates[0]->tax_rate_class;
210 return $tax_class;
211 } else {
212 // Return null if no tax rates match the provided percentage
213 return 'standard';
214 }
215 }
216
217 /**
218 * Send email to admin.
219 *
220 * @param string $subject The subject of the email.
221 * @param string $message The message body of the email.
222 *
223 * @return void
224 */
225 public function send_email( $subject, $message ) {
226 $admin_email = get_option( 'admin_email' );
227 $headers = array( 'Content-Type: text/html; charset=UTF-8' );
228
229 // Send the email
230 wp_mail( $admin_email, $subject, $message, $headers );
231 }
232 }
233 }
234 $cmbird_common_functions = new CMBIRD_Common_Functions();
235