1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
ratecalculator.php
См. документацию.
1<?php
2
3namespace Sale\Handlers\Delivery\YandexTaxi;
4
5use Bitrix\Main\Error;
6use Bitrix\Main\Localization\Loc;
7use Bitrix\Sale\Delivery\CalculationResult;
8use Bitrix\Sale\Shipment;
9use Sale\Handlers\Delivery\YandexTaxi\Api\Api;
10use Sale\Handlers\Delivery\YandexTaxi\Api\RequestEntity\Address;
11use Sale\Handlers\Delivery\YandexTaxi\Api\RequestEntity\ClientRequirements;
12use Sale\Handlers\Delivery\YandexTaxi\Api\RequestEntity\Estimation;
13use Sale\Handlers\Delivery\YandexTaxi\Api\RequestEntity\OfferEstimation;
14use Sale\Handlers\Delivery\YandexTaxi\Api\RequestEntity\TransportClassification;
15use Sale\Handlers\Delivery\YandexTaxi\ClaimBuilder\ClaimBuilder;
16
22final class RateCalculator
23{
24 private const ERROR_CODE = 'DELIVERY_CALCULATION';
25
27 protected $api;
28
30 protected $claimBuilder;
31
33 protected $tariffsChecker;
34
41 public function __construct(Api $api, ClaimBuilder $claimBuilder, TariffsChecker $tariffsChecker)
42 {
43 $this->api = $api;
44 $this->claimBuilder = $claimBuilder;
45 $this->tariffsChecker = $tariffsChecker;
46 }
47
56 public function calculateRate(Shipment $shipment): CalculationResult
57 {
58 $result = new CalculationResult();
59
60 $addressFromResult = $this->claimBuilder->buildAddressFrom($shipment);
61 if (!$addressFromResult->isSuccess())
62 {
63 return $result->addErrors(
64 $this->getFormattedErrors($addressFromResult->getErrors())
65 );
66 }
68 $addressFrom = $addressFromResult->getData()['ADDRESS'];
69
70 $addressToResult = $this->claimBuilder->buildAddressTo($shipment);
71 if (!$addressToResult->isSuccess())
72 {
73 return $result->addErrors(
74 $this->getFormattedErrors($addressToResult->getErrors())
75 );
76 }
78 $addressTo = $addressToResult->getData()['ADDRESS'];
79
80 $tariffResult = $this->claimBuilder->getTaxiClass($shipment);
81
82 if (!$tariffResult->isSuccess())
83 {
84 return $result->addErrors(
85 $this->getFormattedErrors($tariffResult->getErrors())
86 );
87 }
88
89 $taxiClass = $tariffResult->getData()['tariff']['name'];
90
91 if (ClaimBuilder::isOffersCalculateMethod($taxiClass))
92 {
93 $buildClientReqResult = $this->claimBuilder->buildClientRequirements($shipment);
94 }
95 else
96 {
97 $buildClientReqResult = $this->claimBuilder->buildTransportClassification($shipment);
98 }
99
100 if (!$buildClientReqResult->isSuccess())
101 {
102 return $result->addErrors($buildClientReqResult->getErrors());
103 }
105 $clientRequirements = $buildClientReqResult->getData()['REQUIREMENTS'];
106
107 $isTariffAvailable = $this->tariffsChecker->isTariffAvailableByShipment(
108 $taxiClass,
109 $shipment
110 );
111
112 if (is_null($isTariffAvailable))
113 {
114 return $result->addError(
115 new Error(Loc::getMessage('SALE_YANDEX_TAXI_INVALID_TOKEN'), static::ERROR_CODE)
116 );
117 }
118
119 if ($isTariffAvailable === false)
120 {
121 return $result->addError(
122 new Error(Loc::getMessage('SALE_YANDEX_TAXI_TARIFF_NOT_SUPPORTED'), static::ERROR_CODE)
123 );
124 }
125
126 $shippingItemCollection = $this->claimBuilder->getShippingItemCollection($shipment);
127 $validationResult = $shippingItemCollection->isValid();
128 if (!$validationResult->isSuccess())
129 {
130 return $result->addErrors(
131 $this->getFormattedErrors($validationResult->getErrors())
132 );
133 }
134
135 if ($clientRequirements instanceof ClientRequirements)
136 {
137 $estimationRequest = new OfferEstimation();
138 }
139 else
140 {
141 $estimationRequest = new Estimation();
142 }
143
144 $estimationRequest
145 ->addRoutePoint($addressFrom->setId(ClaimBuilder::SOURCE_ROUTE_POINT_ID))
146 ->addRoutePoint($addressTo->setId(ClaimBuilder::DESTINATION_ROUTE_POINT_ID))
147 ;
148
149 foreach ($shippingItemCollection as $shippingItem)
150 {
151 $estimationRequest->addItem($shippingItem);
152 }
153
154 if ($clientRequirements instanceof ClientRequirements)
155 {
156 $estimationRequest->setRequirements($clientRequirements);
157 $priceResult = $this->api->offersCalculate($estimationRequest);
158 }
159 else
160 {
161 $estimationRequest->setSkipDoorToDoor(!$this->claimBuilder->isDoorDeliveryRequired($shipment));
162 $estimationRequest->setRequirements($clientRequirements);
163 $priceResult = $this->api->checkPrice($estimationRequest);
164 }
165
166 if (!$priceResult->isSuccess())
167 {
168 return $result->addError(
169 new Error(Loc::getMessage('SALE_YANDEX_TAXI_RATE_CALCULATE_ERROR'), static::ERROR_CODE)
170 );
171 }
172
173 if ($priceResult->getCurrency() !== $shipment->getCollection()->getOrder()->getCurrency())
174 {
175 return $result->addError(
176 new Error(
177 Loc::getMessage('SALE_YANDEX_TAXI_RATE_CALCULATE_CURRENCY_MISMATCH_ERROR'),
178 static::ERROR_CODE
179 )
180 );
181 }
182
183 $result->setDeliveryPrice($priceResult->getPrice());
184 $resultData = $priceResult->getData();
185 if (isset($resultData))
186 {
187 $result->setData($resultData);
188 }
189
190 return $result;
191 }
192
197 private function getFormattedErrors(array $errors)
198 {
199 $result = [];
200
201 foreach ($errors as $error)
202 {
203 $result[] = new Error($error->getMessage(), static::ERROR_CODE);
204 }
205
206 return $result;
207 }
208}
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$errors
Определения iblock_catalog_edit.php:74
trait Error
Определения error.php:11
$error
Определения subscription_card_product.php:20