PluginProbe
Route ‑ Shipping Protection / 2.4.5
Route ‑ Shipping Protection v2.4.5
2.4.19 2.4.18 2.4.17 2.4.16 2.4.15 2.4.14 2.4.13 2.4.12 2.4.11 2.4.10 2.4.9 2.4.8 2.4.7 2.4.6 2.4.5 2.4.4 2.4.3 2.4.2 2.2.4 2.2.5 2.2.6 2.2.8 2.2.9 2.3.0 2.3.1 All 153 releases
routeapp / includes / class-routeapp-admin-route-fee.php

class-routeapp-admin-route-fee.php in Route ‑ Shipping Protection 2.4.5, at includes/class-routeapp-admin-route-fee.php

234 lines 8.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 use Automattic\WooCommerce\Utilities\OrderUtil;
4
5 class Routeapp_Admin_Route_Fee {
6
7 const ROUTE_CHARGE_POST_META = '_routeapp_route_charge';
8 const ROUTE_PROTECTION_POST_META = '_routeapp_route_protection';
9
10 public function __construct()
11 {
12 if (!is_admin()) {
13 return false;
14 }
15 $this->init();
16 }
17
18 public function init()
19 {
20 add_action('woocommerce_order_item_add_action_buttons', array($this, 'routeapp_custom_admin_button'), 10, 1);
21 add_action('woocommerce_new_order_item', array($this, 'recalculate_route_fee'), 10, 1);
22 add_action('woocommerce_add_order_tax', array($this, 'recalculate_route_fee'), 10, 1);
23 add_action('woocommerce_saved_order_items', array($this, 'recalculate_route_fee'), 10, 1);
24 add_action('woocommerce_delete_order_item', array($this, 'recalculate_route_fee'), 10, 1);
25 }
26
27 public static function get_route_public_instance(){
28 global $routeapp_public;
29 return $routeapp_public;
30 }
31
32 public function routeapp_custom_admin_button($order)
33 {
34 if (!$this->can_add_fee($order)) {
35 return false;
36 }
37
38 if ( is_admin() && in_array($order->get_status(), ['pending', 'on-hold', 'auto-draft']) ) {
39 if ($this->has_route_fee_applied($order)) {
40 echo '<button type="button" id="remove-route-fee" class="button generate-items">' . __( 'Remove Route Fee') . '</button>';
41 } else {
42 echo '<button type="button" id="add-route-fee" class="button generate-items">' . __( 'Add Route Fee') . '</button>';
43 }
44 }
45 }
46
47 private function routeapp_handle_admin_fee($order)
48 {
49 if (!$this->can_add_fee($order)) {
50 return false;
51 }
52 $routeapp_public = self::get_route_public_instance();
53 //order doesn't have a hash, we use time to auto-generate one
54 $cartRef = time();
55 $cartTotal = round($routeapp_public->get_cart_subtotal_with_only_shippable_items($order, 'order'), 2);
56 $currency = get_woocommerce_currency();
57 $cartItems = $routeapp_public->get_cart_shippable_items($order, 'order');
58 $route_insurance_quote = $routeapp_public->routeapp_get_quote_from_api($cartRef, $cartTotal, $currency, $cartItems);
59
60 $route_insurance_amount = false;
61 //only add fee if the quote is covered by customer and has a valid amount
62 if (isset($route_insurance_quote->premium->amount) &&
63 (isset($route_insurance_quote->payment_responsible->type)) && $route_insurance_quote->payment_responsible->type==$routeapp_public->get_allowed_quote_type()) {
64 $route_insurance_amount = $route_insurance_quote->premium->amount;
65 }
66 if ($route_insurance_amount > 0) {
67 $this->routeapp_create_fee($order, $route_insurance_amount);
68 $order->calculate_totals();
69 if ($order->save()) {
70
71 $acceptedOrderStatuses = get_option('routeapp_included_order_statuses') ? get_option('routeapp_included_order_statuses') : [];
72 $acceptedCanceledStatuses = get_option('routeapp_cancel_order_statuses') ? get_option('routeapp_cancel_order_statuses') : [];
73
74 if ( class_exists('Automattic\WooCommerce\Utilities\OrderUtil')
75 && OrderUtil::custom_orders_table_usage_is_enabled() ) {
76 // HPOS usage is enabled.
77 $order->update_meta_data(self::ROUTE_CHARGE_POST_META, $route_insurance_amount );
78 $order->update_meta_data(self::ROUTE_PROTECTION_POST_META, true );
79
80 $order->update_meta_data('_routeapp_included_order_statuses', json_encode($acceptedOrderStatuses));
81 $order->update_meta_data( '_routeapp_cancel_order_statuses', json_encode($acceptedCanceledStatuses));
82
83 $order->save();
84 } else {
85 // Traditional CPT-based orders are in use.
86 update_post_meta( $order->get_id(), self::ROUTE_CHARGE_POST_META, $route_insurance_amount );
87 update_post_meta( $order->get_id(), self::ROUTE_PROTECTION_POST_META, true );
88
89 update_post_meta( $order->get_id(), '_routeapp_included_order_statuses', json_encode($acceptedOrderStatuses));
90 update_post_meta( $order->get_id(), '_routeapp_cancel_order_statuses', json_encode($acceptedCanceledStatuses));
91
92 }
93 return true;
94 }
95 }else {
96 if ($this->has_route_fee_applied($order)) {
97 $this->routeapp_remove_route_fee($order);
98 }
99 }
100
101 return false;
102 }
103
104 private function routeapp_create_fee($order, $fee_amount) {
105 $routeapp_public = self::get_route_public_instance();
106 if (!$this->has_route_fee_applied($order)) {
107 $item_fee = new WC_Order_Item_Fee();
108 $item_fee->set_name( Routeapp_Public::ROUTE_LABEL );
109 $item_fee->set_tax_class( $routeapp_public->routeapp_get_taxable_class() );
110 $item_fee->set_tax_status( $routeapp_public->routeapp_get_fee_taxable() ? 'taxable' : 'none' );
111 $item_fee->set_amount( $fee_amount );
112 $item_fee->set_total( $fee_amount );
113 $order->add_item( $item_fee );
114 } else {
115 $fees = $this->get_route_fees($order);
116 foreach($fees as $fee_id => $fee) {
117 if ($fee) {
118 $fee->set_amount($fee_amount);
119 $fee->set_total($fee_amount);
120 $fee->save();
121 }
122 }
123 }
124 }
125
126 public function routeapp_add_admin_fee()
127 {
128 check_ajax_referer( 'order-item', 'security' );
129
130 if (!isset($_POST) || !$_POST['order_id']) {
131 wp_send_json_error('its missing order id on the request');
132 return;
133 }
134
135 $order_id = isset($_POST['order_id']) ? $_POST['order_id'] : 0;
136 $order = wc_get_order( $order_id );
137
138 $response = $this->routeapp_handle_admin_fee($order);
139
140 if ($response) {
141 wp_send_json_success( 'order updated!' );
142 return;
143 }
144
145 wp_send_json_error('error while adding route fee to the order');
146 }
147
148 function routeapp_remove_admin_fee()
149 {
150 check_ajax_referer( 'order-item', 'security' );
151
152 if (!isset($_POST) || !$_POST['order_id']) {
153 wp_send_json_error('its missing order id on the request');
154 return;
155 }
156
157 $order_id = isset($_POST['order_id']) ? $_POST['order_id'] : 0;
158 $order = wc_get_order( $order_id );
159
160 if ($this->has_route_fee_applied($order)) {
161 $this->routeapp_remove_route_fee($order);
162 }
163
164 wp_send_json_success('route fee removed from the order');
165 }
166
167 private function routeapp_remove_route_fee($order)
168 {
169 $fees = $this->get_route_fees($order);
170
171 foreach($fees as $fee_id => $fee) {
172 if ($fee) {
173 wc_delete_order_item($fee_id);
174 }
175 }
176 delete_post_meta( $order->get_id(), self::ROUTE_CHARGE_POST_META );
177 delete_post_meta( $order->get_id(), self::ROUTE_PROTECTION_POST_META );
178 }
179
180 public function recalculate_route_fee($order_id)
181 {
182 $order = wc_get_order( $order_id );
183
184 if ($this->has_route_fee_applied($order)) {
185 $this->routeapp_handle_admin_fee($order);
186 }
187 }
188
189 private function get_quote_from_api($order_total)
190 {
191 $response = Routeapp_API_Client::getInstance()->get_quote($order_total, get_woocommerce_currency());
192
193 if (is_wp_error($response)) {
194 return false;
195 } else {
196 if ($response['response']['code'] == 401) {
197 return false;
198 }
199 $price_data = json_decode($response['body']);
200 return $price_data;
201 }
202 }
203
204 private function get_route_fees($order)
205 {
206 if (!$order) {
207 return [];
208 }
209
210 $fees = $order->get_fees();
211 $route_fees = [];
212 foreach($fees as $fee_id => $fee) {
213 if($fee['name'] == Routeapp_Public::ROUTE_LABEL) {
214 $route_fees[$fee_id] = $fee;
215 }
216 }
217 return $route_fees;
218 }
219
220 public function can_add_fee($order)
221 {
222 return $order && count($order->get_items()) > 0 && $order->get_status() == 'auto-draft';
223 }
224
225 private function has_route_fee_applied($order)
226 {
227 $routeFees = $this->get_route_fees($order);
228 if (is_array($routeFees) || $routeFees instanceof Countable) {
229 return count($routeFees) > 0;
230 }
231 return false;
232 }
233 }
234