Skip to content

Commit a28e08d

Browse files
committed
Merge branch 'WP-201'
2 parents 151ef33 + f719e87 commit a28e08d

17 files changed

Lines changed: 350 additions & 340 deletions

src/Actions/CalculateDeliveryAction.php

Lines changed: 72 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
use Cdek\CdekApi;
1414
use Cdek\Config;
15+
use Cdek\Exceptions\External\ApiException;
16+
use Cdek\Exceptions\External\LegacyAuthException;
1517
use Cdek\Helpers\Logger;
1618
use Cdek\Helpers\WeightConverter;
1719
use Cdek\MetaKeys;
@@ -29,12 +31,12 @@ class CalculateDeliveryAction
2931
private array $rates = [];
3032

3133
/**
32-
* @throws \Cdek\Exceptions\External\ApiException
33-
* @throws \Cdek\Exceptions\External\LegacyAuthException
34+
* @throws ApiException
35+
* @throws LegacyAuthException
3436
*/
35-
public function __invoke(array $package, int $instanceID, bool $addTariffsToOffice = true): array
37+
public function __invoke(array $package, ShippingMethod $method, bool $addTariffsToOffice = true): array
3638
{
37-
$this->method = ShippingMethod::factory($instanceID);
39+
$this->method = $method;
3840
$api = new CdekApi($this->method);
3941

4042
if (empty($this->method->city_code)) {
@@ -43,17 +45,17 @@ public function __invoke(array $package, int $instanceID, bool $addTariffsToOffi
4345
return [];
4446
}
4547

46-
if($api->authGetError() !== null){
48+
if ($api->authGetError() !== null) {
4749
Logger::warning("Calculate: auth error");
4850

4951
return [];
5052
}
5153

5254
$deliveryParam = [
53-
'from' => [
55+
'from' => [
5456
'code' => $this->method->city_code,
5557
],
56-
'to' => [
58+
'to' => [
5759
'postal_code' => trim($package['destination']['postcode']),
5860
'city' => trim($package['destination']['city']),
5961
'address' => trim($package['destination']['city']),
@@ -62,16 +64,6 @@ public function __invoke(array $package, int $instanceID, bool $addTariffsToOffi
6264
'packages' => $this->getPackagesData($package['contents']),
6365
];
6466

65-
try {
66-
WC()->session->set(Config::DELIVERY_NAME.'_postcode', $deliveryParam['to']['postal_code']);
67-
WC()->session->set(Config::DELIVERY_NAME.'_city', $deliveryParam['to']['city']);
68-
} catch (Throwable $e) {
69-
Logger::warning(
70-
"Calculate: could not set data in session",
71-
$e,
72-
);
73-
}
74-
7567
if ($this->method->insurance) {
7668
$deliveryParam['services'][] = [
7769
'code' => 'INSURANCE',
@@ -101,14 +93,14 @@ static function ($carry, $item) use ($package) {
10193
);
10294
}
10395

104-
Logger::debug("Calculate: delivery params before calculate list", $deliveryParam,);
96+
Logger::debug("Calculate: delivery params before calculate list", $deliveryParam);
10597

10698
foreach ([Tariff::SHOP_TYPE, Tariff::DELIVERY_TYPE] as $deliveryType) {
10799
$deliveryParam['type'] = $deliveryType;
108100

109101
$calcResult = $api->calculateList($deliveryParam);
110102

111-
Logger::debug("Calculate: calculate list result", $calcResult,);
103+
Logger::debug("Calculate: calculate list result", $calcResult);
112104

113105
if (empty($calcResult)) {
114106
continue;
@@ -147,93 +139,101 @@ static function ($carry, $item) use ($package) {
147139
'cost' => max($cost, 0),
148140
'meta_data' => [
149141
MetaKeys::ADDRESS_HASH => sha1(
150-
$deliveryParam['to']['postal_code'].
151-
$deliveryParam['to']['city'].
142+
$deliveryParam['to']['postal_code'] .
143+
$deliveryParam['to']['city'] .
152144
$deliveryParam['to']['country_code'],
153145
),
146+
MetaKeys::POSTAL => $deliveryParam['to']['postal_code'],
147+
MetaKeys::CITY => $deliveryParam['to']['city'],
154148
MetaKeys::TARIFF_CODE => $tariff['tariff_code'],
155149
MetaKeys::TARIFF_MODE => $tariff['delivery_mode'],
156150
MetaKeys::WEIGHT => $deliveryParam['packages']['weight'],
157151
MetaKeys::LENGTH => $deliveryParam['packages']['length'],
158152
MetaKeys::WIDTH => $deliveryParam['packages']['width'],
159153
MetaKeys::HEIGHT => $deliveryParam['packages']['height'],
154+
MetaKeys::OFFICE_CODE => $package['destination'][MetaKeys::OFFICE_CODE] ?? null,
160155
],
161156
];
162157
}
163158
}
164159

165160
Logger::debug("Calculate: rates", $this->rates);
166161

167-
return array_map(function ($tariff) use (
168-
$priceRules,
169-
$api,
170-
$deliveryParam
171-
) {
172-
$rule = Tariff::isToOffice((int)$tariff['meta_data'][MetaKeys::TARIFF_CODE]) ? $priceRules['office'] :
173-
$priceRules['door'];
162+
return array_map(
163+
function ($tariff) use (
164+
$priceRules,
165+
$api,
166+
$deliveryParam
167+
) {
168+
$rule = Tariff::isToOffice((int)$tariff['meta_data'][MetaKeys::TARIFF_CODE]) ?
169+
$priceRules['office'] : $priceRules['door'];
174170

175-
if (isset($rule['type'])) {
176-
if ($rule['type'] === 'free') {
177-
$tariff['cost'] = 0;
171+
if (isset($rule['type'])) {
172+
if ($rule['type'] === 'free') {
173+
$tariff['cost'] = 0;
178174

179-
Logger::debug("Calculate: type free", $tariff,);
175+
Logger::debug("Calculate: type free", $tariff);
180176

181-
return $tariff;
182-
}
177+
return $tariff;
178+
}
183179

184-
if ($rule['type'] === 'fixed') {
185-
$tariff['cost'] = max(
186-
function_exists('wcml_get_woocommerce_currency_option') ?
187-
apply_filters('wcml_raw_price_amount', $rule['value'], 'RUB') : $rule['value'],
188-
0,
189-
);
180+
if ($rule['type'] === 'fixed') {
181+
$tariff['cost'] = max(
182+
function_exists('wcml_get_woocommerce_currency_option') ?
183+
apply_filters('wcml_raw_price_amount', $rule['value'], 'RUB') : $rule['value'],
184+
0,
185+
);
190186

191-
Logger::debug("Calculate: type fixed", $tariff,);
187+
Logger::debug("Calculate: type fixed", $tariff);
192188

193-
return $tariff;
189+
return $tariff;
190+
}
194191
}
195-
}
196192

197-
$deliveryParam['tariff_code'] = $tariff['meta_data'][MetaKeys::TARIFF_CODE];
198-
$deliveryParam['type'] = Tariff::getType((int)$deliveryParam['tariff_code']);
193+
$deliveryParam['tariff_code'] = $tariff['meta_data'][MetaKeys::TARIFF_CODE];
194+
$deliveryParam['type'] = Tariff::getType((int)$deliveryParam['tariff_code']);
199195

200-
$serviceList = Service::factory($this->method, $deliveryParam['tariff_code']);
196+
$serviceList = Service::factory($this->method, $deliveryParam['tariff_code']);
201197

202-
if (!empty($serviceList)) {
203-
$deliveryParam['services'] = array_merge($serviceList, $deliveryParam['services'] ?? []);
204-
}
198+
if (!empty($serviceList)) {
199+
$deliveryParam['services'] = array_merge($serviceList, $deliveryParam['services'] ?? []);
200+
}
205201

206-
Logger::debug(
207-
"Calculate: delivery params before tariff calculate",
208-
$deliveryParam,
209-
);
202+
Logger::debug(
203+
"Calculate: delivery params before tariff calculate",
204+
$deliveryParam,
205+
);
210206

211-
if($cost = $api->calculateGet($deliveryParam)){
212-
Logger::debug("Calculate: Got total for tariff {$deliveryParam['tariff_code']}: $cost");
213-
}else{
214-
Logger::debug("Calculate: Got tariff cost total for tariff {$deliveryParam['tariff_code']}: {$tariff['cost']}");
207+
if ($cost = $api->calculateGet($deliveryParam)) {
208+
Logger::debug("Calculate: Got total for tariff {$deliveryParam['tariff_code']}: $cost");
209+
} else {
210+
Logger::debug(
211+
"Calculate: Got tariff cost total for tariff {$deliveryParam['tariff_code']}: {$tariff['cost']}",
212+
);
215213

216-
$cost = $tariff['cost'];
217-
}
214+
$cost = $tariff['cost'];
215+
}
218216

219-
if (isset($rule['type']) && is_numeric($rule['value'])) {
220-
if ($rule['type'] === 'amount') {
221-
$cost += $rule['value'];
222-
} elseif ($rule['type'] === 'percentage') {
223-
$cost *= $rule['value'] / 100;
217+
if (isset($rule['type']) && is_numeric($rule['value'])) {
218+
if ($rule['type'] === 'amount') {
219+
$cost += $rule['value'];
220+
} elseif ($rule['type'] === 'percentage') {
221+
$cost *= $rule['value'] / 100;
222+
}
224223
}
225-
}
226224

227-
if (function_exists('wcml_get_woocommerce_currency_option')) {
228-
$cost /= apply_filters('wcml_raw_price_amount', $cost, 'RUB') / $cost;
229-
}
225+
if (function_exists('wcml_get_woocommerce_currency_option')) {
226+
$cost /= apply_filters('wcml_raw_price_amount', $cost, 'RUB') / $cost;
227+
}
230228

231-
$tariff['cost'] = max(ceil($cost), 0);
229+
$tariff['cost'] = max(ceil($cost), 0);
232230

233-
Logger::debug("Calculate: tariff", $tariff,);
231+
Logger::debug("Calculate: tariff", $tariff);
234232

235-
return $tariff;
236-
}, $this->rates);
233+
return $tariff;
234+
},
235+
$this->rates,
236+
);
237237
}
238238

239239
private function getPackagesData(array $contents): array
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace {
6+
7+
defined('ABSPATH') or exit;
8+
}
9+
10+
namespace Cdek\Actions {
11+
12+
use Cdek\Helpers\CheckoutHelper;
13+
use Cdek\ShippingMethod;
14+
use WC_Cart;
15+
use WC_Product;
16+
17+
class CheckoutItemPriceAction
18+
{
19+
private static bool $mutex = false;
20+
21+
public function __invoke(WC_Cart $cart): void
22+
{
23+
$rate = CheckoutHelper::getSelectedShippingRate($cart);
24+
25+
if(is_null($rate)) {
26+
return;
27+
}
28+
29+
$session = WC()->session;
30+
31+
if (is_null($session)) {
32+
return;
33+
}
34+
35+
if ($session->get('chosen_payment_method') !== 'cod') {
36+
return;
37+
}
38+
39+
$method = ShippingMethod::factory($rate->get_instance_id());
40+
41+
$shouldPay = $method->percentcod;
42+
43+
if (empty($shouldPay) || self::$mutex) {
44+
return;
45+
}
46+
47+
self::$mutex = true;
48+
49+
foreach ( $cart->get_cart() as $cartItem ){
50+
/** @var WC_Product $product */
51+
$product = $cartItem['data'];
52+
53+
$product->set_price(
54+
(float)(($shouldPay / 100) * $product->get_price())
55+
);
56+
}
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)