3namespace Sale\Handlers\Delivery\YandexTaxi;
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;
22final class RateCalculator
24 private const ERROR_CODE =
'DELIVERY_CALCULATION';
30 protected $claimBuilder;
33 protected $tariffsChecker;
41 public function __construct(Api $api, ClaimBuilder $claimBuilder, TariffsChecker $tariffsChecker)
44 $this->claimBuilder = $claimBuilder;
45 $this->tariffsChecker = $tariffsChecker;
56 public function calculateRate(Shipment $shipment): CalculationResult
58 $result =
new CalculationResult();
60 $addressFromResult = $this->claimBuilder->buildAddressFrom($shipment);
61 if (!$addressFromResult->isSuccess())
64 $this->getFormattedErrors($addressFromResult->getErrors())
68 $addressFrom = $addressFromResult->getData()[
'ADDRESS'];
70 $addressToResult = $this->claimBuilder->buildAddressTo($shipment);
71 if (!$addressToResult->isSuccess())
74 $this->getFormattedErrors($addressToResult->getErrors())
78 $addressTo = $addressToResult->getData()[
'ADDRESS'];
80 $tariffResult = $this->claimBuilder->getTaxiClass($shipment);
82 if (!$tariffResult->isSuccess())
85 $this->getFormattedErrors($tariffResult->getErrors())
89 $taxiClass = $tariffResult->getData()[
'tariff'][
'name'];
91 if (ClaimBuilder::isOffersCalculateMethod($taxiClass))
93 $buildClientReqResult = $this->claimBuilder->buildClientRequirements($shipment);
97 $buildClientReqResult = $this->claimBuilder->buildTransportClassification($shipment);
100 if (!$buildClientReqResult->isSuccess())
102 return $result->addErrors($buildClientReqResult->getErrors());
105 $clientRequirements = $buildClientReqResult->getData()[
'REQUIREMENTS'];
107 $isTariffAvailable = $this->tariffsChecker->isTariffAvailableByShipment(
112 if (is_null($isTariffAvailable))
115 new Error(Loc::getMessage(
'SALE_YANDEX_TAXI_INVALID_TOKEN'), static::ERROR_CODE)
119 if ($isTariffAvailable ===
false)
122 new Error(Loc::getMessage(
'SALE_YANDEX_TAXI_TARIFF_NOT_SUPPORTED'), static::ERROR_CODE)
126 $shippingItemCollection = $this->claimBuilder->getShippingItemCollection($shipment);
127 $validationResult = $shippingItemCollection->isValid();
128 if (!$validationResult->isSuccess())
131 $this->getFormattedErrors($validationResult->getErrors())
135 if ($clientRequirements instanceof ClientRequirements)
137 $estimationRequest =
new OfferEstimation();
141 $estimationRequest =
new Estimation();
145 ->addRoutePoint($addressFrom->setId(ClaimBuilder::SOURCE_ROUTE_POINT_ID))
146 ->addRoutePoint($addressTo->setId(ClaimBuilder::DESTINATION_ROUTE_POINT_ID))
149 foreach ($shippingItemCollection as $shippingItem)
151 $estimationRequest->addItem($shippingItem);
154 if ($clientRequirements instanceof ClientRequirements)
156 $estimationRequest->setRequirements($clientRequirements);
157 $priceResult = $this->api->offersCalculate($estimationRequest);
161 $estimationRequest->setSkipDoorToDoor(!$this->claimBuilder->isDoorDeliveryRequired($shipment));
162 $estimationRequest->setRequirements($clientRequirements);
163 $priceResult = $this->api->checkPrice($estimationRequest);
166 if (!$priceResult->isSuccess())
169 new Error(Loc::getMessage(
'SALE_YANDEX_TAXI_RATE_CALCULATE_ERROR'), static::ERROR_CODE)
173 if ($priceResult->getCurrency() !== $shipment->getCollection()->getOrder()->getCurrency())
177 Loc::getMessage(
'SALE_YANDEX_TAXI_RATE_CALCULATE_CURRENCY_MISMATCH_ERROR'),
183 $result->setDeliveryPrice($priceResult->getPrice());
184 $resultData = $priceResult->getData();
185 if (isset($resultData))
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)