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
0 commit comments