diff --git a/src/include/class-wc-retailcrm-history.php b/src/include/class-wc-retailcrm-history.php index de8508a..77c4318 100644 --- a/src/include/class-wc-retailcrm-history.php +++ b/src/include/class-wc-retailcrm-history.php @@ -341,12 +341,12 @@ if (!class_exists('WC_Retailcrm_History')) : $shipping->set_method_id($options[$order['delivery']['code']]); } - if (isset($order['delivery']['cost']) && !wc_tax_enabled()) { - $shipping->set_total($order['delivery']['cost']); - } + if (wc_tax_enabled()) { + $rate = getShippingRates(); - if (!empty($order['delivery']['netCost']) && wc_tax_enabled()) { - $shipping->set_total($order['delivery']['netCost']); + $shipping->set_total($this->getDeliveryCost($order, $rate)); + } else { + $shipping->set_total($this->getDeliveryCost($order)); } if (isset($order['delivery']['service']['code'])) { @@ -881,15 +881,17 @@ if (!class_exists('WC_Retailcrm_History')) : } } - if (isset($order['delivery']['cost']) && !wc_tax_enabled()) { - $shipping->set_total($order['delivery']['cost']); - } elseif (isset($order['delivery']['netCost'])) { - $shipping->set_total($order['delivery']['netCost']); + if (wc_tax_enabled()) { + $rate = getShippingRates(); + + $shipping->set_total($this->getDeliveryCost($order, $rate)); + } else { + $shipping->set_total($this->getDeliveryCost($order)); } $shipping->set_order_id($wcOrder->get_id()); - $shipping->save(); + $wcOrder->add_item($shipping); } } @@ -1134,6 +1136,26 @@ if (!class_exists('WC_Retailcrm_History')) : return $handled; } + /** + * Get delivery cost for WC order + * + * @param array $order + * + * @return double + */ + private function getDeliveryCost($order, $rate = null) + { + $deliveryCost = $order['delivery']['cost'] ?? 0.0; + + if (empty($rate) || empty($deliveryCost)) { + return $deliveryCost; + } + + $decimalPlaces = wc_get_price_decimals(); + + return round($deliveryCost / (1 + $rate / 100), $decimalPlaces); + } + /** * Get custom fields mapping with settings. * diff --git a/src/include/class-wc-retailcrm-orders.php b/src/include/class-wc-retailcrm-orders.php index f3beb65..fc43baf 100644 --- a/src/include/class-wc-retailcrm-orders.php +++ b/src/include/class-wc-retailcrm-orders.php @@ -375,9 +375,14 @@ if (!class_exists('WC_Retailcrm_Orders')) : if (isset($shipping['total'])) { $orderData['delivery']['netCost'] = $shipping['total']; + $orderData['delivery']['cost'] = isset($shipping['total_tax']) + ? $shipping['total'] + $shipping['total_tax'] + : $shipping['total']; - if (isset($shipping['total_tax'])) { - $orderData['delivery']['cost'] = $shipping['total'] + $shipping['total_tax']; + $rate = getShippingRates(); + + if (!empty($rate)) { + $orderData['delivery']['vatRate'] = $rate; } } } diff --git a/src/include/functions.php b/src/include/functions.php index 1cedb1e..d56b1a0 100644 --- a/src/include/functions.php +++ b/src/include/functions.php @@ -150,3 +150,19 @@ function validateUrl(string $url) return (preg_match("/https:\/\/(.*).(retailcrm.(pro|ru|es)|simla.com)/", $url)) ? $url : ''; } +/** + * Get shipping rate. + * + * @return mixed + */ +function getShippingRates() +{ + $shippingRates = WC_Tax::get_shipping_tax_rates(); + + // Only one tax can be selected for shipping + if (is_array($shippingRates)) { + $shippingRates = array_shift($shippingRates); + } + + return $shippingRates['rate'] ?? $shippingRates; +} diff --git a/tests/test-wc-retailcrm-orders.php b/tests/test-wc-retailcrm-orders.php index c6d649e..3e98e7f 100644 --- a/tests/test-wc-retailcrm-orders.php +++ b/tests/test-wc-retailcrm-orders.php @@ -338,6 +338,21 @@ class WC_Retailcrm_Orders_Test extends WC_Retailcrm_Test_Case_Helper $this->assertEquals(false, WC_Retailcrm_Orders::isCorporateOrder($this->order)); } + public function test_get_shipping_rates() + { + $rate = getShippingRates(); + + $this->assertEquals(null, $rate); + } + + public function test_validate_url() + { + $this->assertEquals('https://test.simla.com', validateUrl('https://test.simla.com')); + + // Not valid url + $this->assertEquals('', validateUrl('https://test.com')); + } + public function test_is_corporate_crm_order() { $this->assertEquals(