Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/sale/handlers/delivery/yandextaxi/ |
Upload File : |
<?php namespace Sale\Handlers\Delivery\YandexTaxi; use Bitrix\Location\Entity\Address; use Bitrix\Sale\Shipment; use Sale\Handlers\Delivery\YandexTaxi\Api\Api; use Sale\Handlers\Delivery\YandexTaxi\Api\ApiResult\TariffsResult; use Sale\Handlers\Delivery\YandexTaxi\Api\RequestEntity\TariffsOptions; /** * Class TariffsChecker * @package Sale\Handlers\Delivery * @internal */ final class TariffsChecker { /** @var Api */ protected $api; /** @var array */ private $results = []; /** * TariffsChecker constructor. * @param Api $api */ public function __construct(Api $api) { $this->api = $api; } /** * @param array $coordinates * @return TariffsResult */ private function getTariffsResult(array $coordinates): TariffsResult { $resultHash = $this->getCoordinatesHash($coordinates); if (isset($this->results[$resultHash])) { return $this->results[$resultHash]; } $this->results[$resultHash] = $this->api->getTariffs( (new TariffsOptions)->setStartPoint( array_map('floatval', $coordinates) ) ); return $this->results[$resultHash]; } /** * @param array $coordinates * @return array|null */ public function getAvailableTariffs(array $coordinates): ?array { $tariffsResult = $this->getTariffsResult($coordinates); if (!$tariffsResult->isSuccess()) { return null; } return array_map( function ($tariff) { return $tariff->getCode(); }, $tariffsResult->getTariffs() ); } /** * @param string $tariffCode * @param Shipment $shipment * @return array */ public function getSupportedRequirementsByTariff(string $tariffCode, Shipment $shipment): array { $result = []; $coordinates = $this->getSourceCoordinatesByShipment($shipment); if (!$coordinates) { return $result; } $tariffsResult = $this->getTariffsResult($coordinates); if (!$tariffsResult->isSuccess()) { return $result; } $tariffs = $tariffsResult->getTariffs(); foreach ($tariffs as $tariff) { if ($tariff->getCode() === $tariffCode) { $supportedRequirements = $tariff->getSupportedRequirements(); foreach ($supportedRequirements as $supportedRequirement) { $result[] = $supportedRequirement; } break; } } return $result; } /** * @param string $tariff * @param Shipment $shipment * @return bool|null */ public function isTariffAvailableByShipment(string $tariff, Shipment $shipment): ?bool { $coordinates = $this->getSourceCoordinatesByShipment($shipment); if (!$coordinates) { return null; } $tariffs = $this->getAvailableTariffs($coordinates); if (is_null($tariffs)) { return null; } return in_array($tariff, $tariffs, true); } /** * @param Shipment $shipment * @return array|null */ private function getSourceCoordinatesByShipment(Shipment $shipment): ?array { $addressFrom = $shipment->getPropertyCollection()->getAddressFrom(); if (!$addressFrom) { return null; } $addressFromValue = $addressFrom->getValue(); if (!$addressFromValue) { return null; } $address = Address::fromArray($addressFromValue); if (!$address->getLatitude() || !$address->getLongitude()) { return null; } return [ $address->getLongitude(), $address->getLatitude(), ]; } /** * @param array $coordinates * @return string */ private function getCoordinatesHash(array $coordinates): string { return md5(implode(';', $coordinates)); } }