PluginProbe
Route ‑ Shipping Protection / 2.2.6
Route ‑ Shipping Protection v2.2.6
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 / trunk / includes / class-routeapp-admin-route-fee.php

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

222 lines 7.8 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 if ( class_exists('Automattic\WooCommerce\Utilities\OrderUtil')
71 && OrderUtil::custom_orders_table_usage_is_enabled() ) {
72 // HPOS usage is enabled.
73 $order->update_meta_data(self::ROUTE_CHARGE_POST_META, $route_insurance_amount );
74 $order->update_meta_data(self::ROUTE_PROTECTION_POST_META, true );
75 $order->save();
76 } else {
77 // Traditional CPT-based orders are in use.
78 update_post_meta( $order->get_id(), self::ROUTE_CHARGE_POST_META, $route_insurance_amount );
79 update_post_meta( $order->get_id(), self::ROUTE_PROTECTION_POST_META, true );
80 }
81 return true;
82 }
83 }else {
84 if ($this->has_route_fee_applied($order)) {
85 $this->routeapp_remove_route_fee($order);
86 }
87 }
88
89 return false;
90 }
91
92 private function routeapp_create_fee($order, $fee_amount) {
93 $routeapp_public = self::get_route_public_instance();
94 if (!$this->has_route_fee_applied($order)) {
95 $item_fee = new WC_Order_Item_Fee();
96 $item_fee->set_name( Routeapp_Public::ROUTE_LABEL );
97 $item_fee->set_tax_class( $routeapp_public->routeapp_get_taxable_class() );
98 $item_fee->set_tax_status( $routeapp_public->routeapp_get_fee_taxable() ? 'taxable' : 'none' );
99 $item_fee->set_amount( $fee_amount );
100 $item_fee->set_total( $fee_amount );
101 $order->add_item( $item_fee );
102 } else {
103 $fees = $this->get_route_fees($order);
104 foreach($fees as $fee_id => $fee) {
105 if ($fee) {
106 $fee->set_amount($fee_amount);
107 $fee->set_total($fee_amount);
108 $fee->save();
109 }
110 }
111 }
112 }
113
114 public function routeapp_add_admin_fee()
115 {
116 check_ajax_referer( 'order-item', 'security' );
117
118 if (!isset($_POST) || !$_POST['order_id']) {
119 wp_send_json_error('its missing order id on the request');
120 return;
121 }
122
123 $order_id = isset($_POST['order_id']) ? $_POST['order_id'] : 0;
124 $order = wc_get_order( $order_id );
125
126 $response = $this->routeapp_handle_admin_fee($order);
127
128 if ($response) {
129 wp_send_json_success( 'order updated!' );
130 return;
131 }
132
133 wp_send_json_error('error while adding route fee to the order');
134 }
135
136 function routeapp_remove_admin_fee()
137 {
138 check_ajax_referer( 'order-item', 'security' );
139
140 if (!isset($_POST) || !$_POST['order_id']) {
141 wp_send_json_error('its missing order id on the request');
142 return;
143 }
144
145 $order_id = isset($_POST['order_id']) ? $_POST['order_id'] : 0;
146 $order = wc_get_order( $order_id );
147
148 if ($this->has_route_fee_applied($order)) {
149 $this->routeapp_remove_route_fee($order);
150 }
151
152 wp_send_json_success('route fee removed from the order');
153 }
154
155 private function routeapp_remove_route_fee($order)
156 {
157 $fees = $this->get_route_fees($order);
158
159 foreach($fees as $fee_id => $fee) {
160 if ($fee) {
161 wc_delete_order_item($fee_id);
162 }
163 }
164 delete_post_meta( $order->get_id(), self::ROUTE_CHARGE_POST_META );
165 delete_post_meta( $order->get_id(), self::ROUTE_PROTECTION_POST_META );
166 }
167
168 public function recalculate_route_fee($order_id)
169 {
170 $order = wc_get_order( $order_id );
171
172 if ($this->has_route_fee_applied($order)) {
173 $this->routeapp_handle_admin_fee($order);
174 }
175 }
176
177 private function get_quote_from_api($order_total)
178 {
179 $response = Routeapp_API_Client::getInstance()->get_quote($order_total, get_woocommerce_currency());
180
181 if (is_wp_error($response)) {
182 return false;
183 } else {
184 if ($response['response']['code'] == 401) {
185 return false;
186 }
187 $price_data = json_decode($response['body']);
188 return $price_data;
189 }
190 }
191
192 private function get_route_fees($order)
193 {
194 if (!$order) {
195 return [];
196 }
197
198 $fees = $order->get_fees();
199 $route_fees = [];
200 foreach($fees as $fee_id => $fee) {
201 if($fee['name'] == Routeapp_Public::ROUTE_LABEL) {
202 $route_fees[$fee_id] = $fee;
203 }
204 }
205 return $route_fees;
206 }
207
208 public function can_add_fee($order)
209 {
210 return $order && count($order->get_items()) > 0 && $order->get_status() == 'auto-draft';
211 }
212
213 private function has_route_fee_applied($order)
214 {
215 $routeFees = $this->get_route_fees($order);
216 if (is_array($routeFees) || $routeFees instanceof Countable) {
217 return count($routeFees) > 0;
218 }
219 return false;
220 }
221 }
222