src/Controller/WidgetController.php line 156

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity;
  4. use App\Model\Calculator\DimensionsCalculator;
  5. use App\Model\Catapulto\Encoder;
  6. use App\Model\Catapulto\ErrorCollector;
  7. use App\Repository\Catapulto\DeliveryOperatorsRepository;
  8. use App\Services;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Ipol\Catapulto\Catapulto\CatapultoApplication;
  11. use Ipol\Catapulto\Catapulto\ErrorResponseException;
  12. use Ipol\Catapulto\Core\Order\Address;
  13. use Ipol\Catapulto\Core\Order\Item;
  14. use Ipol\Catapulto\Core\Order\ItemCollection;
  15. use Ipol\Catapulto\Core\Order\Order;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  21. use Symfony\Component\Routing\RouterInterface;
  22. use Symfony\Component\Uid\Uuid;
  23. /**
  24.  * Class WidgetController
  25.  * @package App\Controller
  26.  */
  27. class WidgetController extends BaseController
  28. {
  29.     /** @var CatapultoApplication */
  30.     private CatapultoApplication $catapulto;
  31.     /** @var Entity\Shop */
  32.     private Entity\Shop $shop;
  33.     /** @var RouterInterface */
  34.     protected $router;
  35.     /** @var EntityManagerInterface */
  36.     protected $em;
  37.     /** @var array Заголовки ответа */
  38.     const RESPONSE_HEADERS = [
  39.         'Access-Control-Allow-Headers' => 'Accept, Accept-Language, Content-Language, Content-Type',
  40.         'Access-Control-Allow-Origin' => '*',
  41.     ];
  42.     /** @var array Заголовки ответа */
  43.     const RESPONSE_HEADERS_JS = [
  44.         'Content-Type' => 'text/javascript; charset=UTF-8',
  45.         'Access-Control-Allow-Origin' => '*',
  46.         'Cache-Control' => 'no-cache'
  47.     ];
  48.     public function __construct(RouterInterface $routerEntityManagerInterface $entityManager)
  49.     {
  50.         $this->router $router;
  51.         $this->em $entityManager;
  52.     }
  53.     /**
  54.      * @Route(path="/app/js/{insalesId}/script.js", name="app.js", schemes={"https"})
  55.      * @ParamConverter(name="shop", options={"mapping" : {"insalesId" = "insalesId"}, "repository_method" = "getByInsalesIdEx"})
  56.      * @param Entity\Shop $shop
  57.      * @return Response
  58.      */
  59.     public function getAppJs(Entity\Shop $shop)
  60.     {
  61.         $widgetParams $this->getWidgetParams($shop);
  62.         $markupOperators = [];
  63.         $allOperators $shop->getCalculation()->getCalculationDeliveryOperators()->toArray();
  64.         foreach ($allOperators as $operator) {
  65.             $markupOperators[] = [
  66.                 'id'=>$operator->getDeliveryOperator()->getOperatorId(),
  67.                 'mktp'=>$operator->getMarkupType(),
  68.                 'mkvl'=>$operator->getMarkupVal()
  69.             ];
  70.         }
  71.         $js $this->render(
  72.             'js/script.js.twig',
  73.             [
  74.                 'shop' => $shop,
  75.                 'widgetParams' => $widgetParams,
  76.                 'operatorsMarkups' => $markupOperators,
  77.                 'defaultMarkup' => [
  78.                     'tp'=>$shop->getCalculation()->getDefaultMarkupType(),
  79.                     'vl'=>$shop->getCalculation()->getDefaultMarkupVal()
  80.                 ],
  81.                 'addDadataScript' => $shop->getCalculation()->getEnableDadataInInsales()?'true':'false',
  82.                 'free_delivery_from' => $shop->getCalculation()->getFreeDeliveryFrom(),
  83.             ]
  84.         );
  85.         return new Response($js->getContent(), Response::HTTP_OKself::RESPONSE_HEADERS_JS);
  86.     }
  87.     /**
  88.      * @Route(path="/widget/ajax/{insalesId}/cargo/", name="getCargo", schemes={"https"})
  89.      * @ParamConverter(name="shop", options={"mapping" : {"insalesId" = "insalesId"}, "repository_method" = "getByInsalesIdEx"})
  90.      * @param Request $request
  91.      * @param Entity\Shop $shop
  92.      * @return Response
  93.      */
  94.     public function getCargo(Request $requestEntity\Shop $shop)
  95.     {
  96.         if ($request->getMethod() != $request::METHOD_POST) {
  97.             return new Response(nullResponse::HTTP_OK);
  98.         }
  99.         /** @var array $fields */
  100.         $fields = \json_decode($request->getContent(), true);
  101.         if (!$shop instanceof Entity\Shop)
  102.             return new Response(nullResponse::HTTP_OK);
  103.         $order = (new Entity\Order())->setShop($shop)->setProducts($fields['order_lines']);
  104.         $cargoComment '';
  105.         foreach ($fields['order_lines'] as $item) {
  106.             $cargoComment .= $item['title'] . '(' $item['quantity'] . ');';
  107.         }
  108.         // габариты в см и кг для виджета
  109.         $result = [
  110.             'width' => $order->getWidth(),
  111.             'length' => $order->getLength(),
  112.             'height' => $order->getHeight(),
  113.             'quantity' => 1// always 1
  114.             'weight' => $order->getWeight(),
  115.             'cargo_comment' => $cargoComment
  116.         ];
  117.         return $this->json($resultResponse::HTTP_OKself::RESPONSE_HEADERS);
  118.     }
  119.     /**
  120.      * @Route (path="/widget/ajax/{insalesId}/", name="widget")
  121.      * @ParamConverter(name="shop", options={"mapping" : {"insalesId" = "insalesId"}, "repository_method" = "getByInsalesIdEx"})
  122.      * @param Services\Insales\User $user
  123.      * @param Entity\Shop $shop
  124.      * @param Request $request
  125.      * @param Encoder $encoder
  126.      * @return Response
  127.      */
  128.     public function widget(Services\Insales\User $userEntity\Shop $shopRequest $requestEncoder $encoder)
  129.     {
  130.         if (!$request->request->get('METHOD') || !$request->request->get('PARAMS')) {
  131.             return $this->json(['error' => 'METHOD_PARAMS_NOT_FOUND'], Response::HTTP_OKself::RESPONSE_HEADERS);
  132.         }
  133.         $this->catapulto = new CatapultoApplication(
  134.             $shop->getConnection()->getApikey(),
  135.             $shop->getConnection()->getCustomBaseApiUrl(),
  136.             $shop->getConnection()->getConnectionTimeout() ?? 6,
  137.             $encoder
  138.         );
  139.         $this->shop $shop;
  140.         $params json_decode($request->request->get('PARAMS'), true);
  141.         // Проброс между методами
  142.         $method explode('_'$request->request->get('METHOD'));
  143.         $method implode(array_map('ucfirst'$method));
  144.         $method 'widget' $method 'Response';
  145.         if (method_exists(__CLASS__$method)) {
  146.             $response $this->{$method}($params);
  147.         } else {
  148.             $response $this->json(['error' => 'METHOD_NOT_EXISTS'], Response::HTTP_OKself::RESPONSE_HEADERS);
  149.         }
  150.         return $response;
  151.     }
  152.     /**
  153.      * @param array $data
  154.      *
  155.      * @return Response
  156.      */
  157.     protected function widgetCreateRateResponse(array $data): Response
  158.     {
  159.         if (empty($data['location']['term']) || empty($data['location']['iso'])) {
  160.             return $this->json(['error' => 'GEO_DATA_EMPTY'], Response::HTTP_OKself::RESPONSE_HEADERS);
  161.         }
  162.         if (!isset($data['pickup_days_shift'])) $data['pickup_days_shift'] = 0;
  163.         $cOrder = new Order();
  164.         // контакт отправителя
  165.         $contactSender $this->shop->getCalculation()->getSenderId();
  166.         if ((int)$contactSender === 0) {
  167.             return $this->json(['error' => 'EMPTY_SENDER_ID'], Response::HTTP_OKself::RESPONSE_HEADERS);
  168.         }
  169.         // отправитель из настроек модуля
  170.         $sender = new Address();
  171.         $sender->setZip($this->shop->getCalculation()->getSenderZip())
  172.             ->setField('locality_id'$this->shop->getCalculation()->getSenderLocalityId());;
  173.         if (isset($data['sender_contact_data']['cityFrom'])) {
  174.             $sender->setField('cityFrom'$data['sender_contact_data']['cityFrom']);
  175.         }
  176.         $cOrder->setAddressFrom($sender);
  177.         if (empty($sender->getField('locality_id')) || empty($sender->getZip())) {
  178.             return $this->json(['error' => 'WRONG_SENDER_CONTACT_DATA'], Response::HTTP_OKself::RESPONSE_HEADERS);
  179.         }
  180.         // получаем информацию о городе получателя
  181.         $geoData $this->catapulto->geo($data['location']['term'], $data['location']['city_name'], 'ru'1);
  182.         if ($geoData->isError() || $geoData->getResponse()->getGeo()->getQuantity() === 0) {
  183.             $errorCollector = new ErrorCollector($geoData);
  184.             return $this->json(['error' => 'R' $errorCollector->getErrorCode() . ': NOT_EXISTING_ADDRESS''message' => $errorCollector->getErrorText()], Response::HTTP_OKself::RESPONSE_HEADERS);
  185.         }
  186.         // получатель
  187.         $receiver = new Address();
  188.         $receiver->setField('locality_id'$geoData->getResponse()->getGeo()->getFirst()->getId())
  189.             ->setZip($geoData->getResponse()->getGeo()->getFirst()->getZip())
  190.             ->setField('cityFrom'$data['location']['term']);
  191.         $cOrder->setAddressTo($receiver);
  192.         // создаем контакт получателя
  193.         /*$contactData = $this->catapulto->contactCreate($cOrder);
  194.         if ($contactData->isError() || empty($contactData->getResponse()->getId())) {
  195.             $errorCollector = new ErrorCollector($contactData);
  196.             return $this->json(['error' => 'CANNOT_CREATE_CONTACT', 'message' => $errorCollector->getErrorText()], Response::HTTP_OK, self::RESPONSE_HEADERS);
  197.         }*/
  198.         // данные отгрузки
  199.         $itemCollection = new ItemCollection();
  200.         $cargoSubDataNames = ['cargo_comment''height''length''width''quantity''weight'];
  201.         $cargoRequestArrayData $data['cargo_data'];
  202.         foreach ($cargoSubDataNames as $name) {
  203.             if (isset($cargoRequestArrayData[$name]) && !empty($cargoRequestArrayData[$name])) {
  204.                 $item = new Item();
  205.                 $item->setWidth((int)$cargoRequestArrayData['width']) // мм
  206.                 ->setHeight((int)$cargoRequestArrayData['height']) // мм
  207.                 ->setLength((int)$cargoRequestArrayData['length']) // мм
  208.                 ->setWeight((int)$cargoRequestArrayData['weight']) // грамм
  209.                 ->setQuantity((int)$cargoRequestArrayData['quantity'])
  210.                     ->setField('comment'$cargoRequestArrayData['cargo_comment'] ?? 'empty')
  211.                     ->setField('type'$data['delivery_type'] ?? 'parcel');// тип отправления ['docs', 'parcel']
  212.                 $itemCollection->add($item);
  213.             }
  214.         }
  215.         $cOrder->setItems($itemCollection);
  216.         // создаем отгрузку
  217.         $cargoData $this->catapulto->cargoCreate($cOrder);
  218.         if ($cargoData->isError() || empty($cargoData->getResponse()->getId())) {
  219.             $errorCollector = new ErrorCollector($cargoData);
  220.             return $this->json(['error' => 'R' $errorCollector->getErrorCode() . ': CANNOT_CREATE_CARGO''message' => $errorCollector->getErrorText()], Response::HTTP_OKself::RESPONSE_HEADERS);
  221.         }
  222.         $cOrder->setField('cargoes', [$cargoData->getResponse()->getId()]);
  223.         $cOrder->setField('dadata_variant'$data['dadata_selected_choice']);
  224.         $cOrder->setField('sender_contact_id'intval($contactSender));
  225.         $cOrder->setField('pickup_days_shift'intval($data['pickup_days_shift']));
  226.         // получаем иконки и доставки
  227.         $iconData = [];
  228.         $iconResponse $this->catapulto->companyIcon();
  229.         while ($item $iconResponse->getResponse()->getCompanies()->getNext()) {
  230.             $iconData[$item->getOperatorId()] = $item->getAllFields();
  231.         }
  232.         // создаем рассчет доставки
  233.         $rateData $this->catapulto->rateCreate($cOrder);
  234.         if ($rateData->isError() || empty($rateData->getResponse()->getKey())) {
  235.             $errorCollector = new ErrorCollector($rateData);
  236.             return $this->json(['error' => 'R' $errorCollector->getErrorCode() . ': CANNOT_CREATE_RATES''message' => $errorCollector->getErrorText()], Response::HTTP_OKself::RESPONSE_HEADERS);
  237.         }
  238.         $result = [
  239.             'key' => $rateData->getResponse()->getKey(),
  240.             'locations' => [
  241.                 'sender' => [
  242.                     'locality_id' => $this->shop->getCalculation()->getSenderLocalityId(),
  243.                     'zip' => $this->shop->getCalculation()->getSenderZip()
  244.                 ],
  245.                 'contact' => [
  246.                     'locality_id' => $cOrder->getAddressTo()->getField('locality_id'),
  247.                     'zip' => $cOrder->getAddressTo()->getZip()
  248.                 ],
  249.             ],
  250.             'params' => [
  251.                 'sender_locality_id' => $this->shop->getCalculation()->getSenderLocalityId(),
  252.                 'receiver_locality_id' => $cOrder->getAddressTo()->getField('locality_id'),
  253.                 'cargoes' => [$cargoData->getResponse()->getId()]
  254.             ],
  255.             'icons' => $iconData
  256.         ];
  257.         return $this->json($resultResponse::HTTP_OKself::RESPONSE_HEADERS);
  258.     }
  259.     /**
  260.      * @param $data
  261.      *
  262.      * @return Response
  263.      */
  264.     public function widgetGetRateResponse($data): Response
  265.     {
  266.         if (empty($data['rate_id']) || !is_string($data['rate_id'])) {
  267.             return $this->json(['error' => 'RATE_ID_IS_EMPTY'], Response::HTTP_OKself::RESPONSE_HEADERS);
  268.         }
  269.         $rateId $data['rate_id'];
  270.         $filter = [
  271.             'shipping_type_filter' => $data['shipping_type_filter'] ?: 'd2d',
  272.             'pickup_days_shift' => 0
  273.         ];
  274.         if ($data['pickup_days_shift'] > && $data['pickup_days_shift'] <= 365) {
  275.             $filter['pickup_days_shift'] = (int)$data['pickup_days_shift'];
  276.         }
  277.         $filter['services_filter'] = null;
  278.         if (isset($data['services_filter']) && in_array($data['services_filter'], ['NP''COD''NP,COD'])) {
  279.             $filter['services_filter'] = $data['services_filter'];
  280.         }
  281.         if (!isset($data['need_insurance'])) {
  282.             $data['need_insurance'] = false;
  283.         }
  284.         if (!isset($data['insured_value'])) {
  285.             $data['insured_value'] = 0;
  286.         }
  287.         $rate $this->catapulto->rateRead(
  288.             $rateId,
  289.             $filter['pickup_days_shift'],
  290.             [$filter['shipping_type_filter']],
  291.             [$filter['services_filter']],
  292.             ($data['need_insurance'] === true),
  293.             $data['insured_value']
  294.         );
  295.         if ($rate->isError()) {
  296.             $errorObj = new ErrorCollector($rate);
  297.             return $this->json(['error' => 'R' $errorObj->getErrorCode() . ': CANNOT_GET_RATE''message' => $errorObj->getErrorText()], Response::HTTP_OKself::RESPONSE_HEADERS);
  298.         }
  299.         $result = [
  300.             'count' => $rate->getResponse()->getCount(),
  301.             'rate_completed' => $rate->getResponse()->isRateCompleted(),
  302.             'results' => []
  303.         ];
  304.         while ($item $rate->getResponse()->getResults()->getNext()) {
  305.             /*
  306.              * Модификаторы цены
  307.              */
  308.             $price $item->getPrice();
  309.             // Увеличение стоимости доставки (%)
  310.             if ($this->shop->getCalculation()->getAppendDeliveryPricePercent() > 0) {
  311.                 $price $price + ($price 100 $this->shop->getCalculation()->getAppendDeliveryPricePercent());
  312.             }
  313.             // Увеличение стоимости доставки (фиксированная)
  314.             if ($this->shop->getCalculation()->getAppendDeliveryPriceFixed() > 0) {
  315.                 $price += $this->shop->getCalculation()->getAppendDeliveryPriceFixed();
  316.             }
  317.             // Округление стоимости доставки
  318.             if ($this->shop->getCalculation()->getRoundPrice() > 0) {
  319.                 $price $this->shop->getCalculation()->roundPrice($price);
  320.             }
  321.             // Бесплатная доставка от
  322.             if ($this->shop->getCalculation()->getFreeDeliveryFrom() < floatval($data['insured_value'])//$item->getPrice()
  323.                 && $this->shop->getCalculation()->getFreeDeliveryFrom() > 0) {
  324.                 $price 0;
  325.             }
  326.             $item->setPrice((int)$price);
  327.             $result['results'][] = $item->getAllFields();
  328.         }
  329.         return $this->json($resultResponse::HTTP_OKself::RESPONSE_HEADERS);
  330.     }
  331.     /**
  332.      * @param $data
  333.      *
  334.      * @return Response
  335.      */
  336.     public function widgetGetTerminalsResponse($data): Response
  337.     {
  338.         $terminalRequestData $data['terminal_request_data'];
  339.         if (empty($terminalRequestData['sender_locality_id']) || empty($terminalRequestData['receiver_locality_id'])) {
  340.             return $this->json(['error' => 'EMPTY_TERMINAL_DATA'], Response::HTTP_OKself::RESPONSE_HEADERS);
  341.         }
  342.         $cOrder = new Order();
  343.         // sender
  344.         $addressFrom = new \Ipol\Catapulto\Core\Order\Address();
  345.         $addressFrom->setField('locality_id', (int)$terminalRequestData['sender_locality_id']);
  346.         $cOrder->setAddressFrom($addressFrom);
  347.         // receiver
  348.         $addressTo = new \Ipol\Catapulto\Core\Order\Address();
  349.         $addressTo->setField('locality_id', (int)$terminalRequestData['receiver_locality_id']);
  350.         $cOrder->setAddressTo($addressTo);
  351.         // add fields
  352.         $cOrder->setField('limit'300)
  353.             ->setField('page', isset($data['page']) ? (int)$data['page'] : 1);
  354.         if ($terminalRequestData['company']) {
  355.             $cOrder->setField('company'$terminalRequestData['company']);
  356.         }
  357.         if (isset($data['services_filter']) && !empty($data['services_filter'])) {
  358.             $cOrder->setField('services_filter'$data['services_filter']);
  359.         }
  360.         if (isset($terminalRequestData['cargoes']) && is_array($terminalRequestData['cargoes']) && !empty($terminalRequestData['cargoes']))
  361.             $cOrder->setField('cargoes'$terminalRequestData['cargoes']);
  362.         $terminals $this->catapulto->terminalList($cOrder);
  363.         if ($terminals->isError() || $terminals->getResponse()->getStatus() !== 'ok') {
  364.             $errorObj = new ErrorCollector($terminals);
  365.             return $this->json(['error' => 'R' $errorObj->getErrorCode() . ': CANNOT_GET_TARIFF''message' => $errorObj->getErrorText()], Response::HTTP_OKself::RESPONSE_HEADERS);
  366.         }
  367.         $result = [
  368.             'data' => $terminals->getResponse()->getData()->getAllFields(),
  369.             'status' => $terminals->getResponse()->getStatus()
  370.         ];
  371.         foreach ($result['data']['data'] as &$point) {
  372.             $point['point-type'] = $point['point_type'];
  373.             unset($point['point_type']);
  374.         }
  375.         unset($point);
  376.         return $this->json($resultResponse::HTTP_OKself::RESPONSE_HEADERS);
  377.     }
  378.     /**
  379.      * @param $data
  380.      *
  381.      * @return Response
  382.      */
  383.     public function widgetGetTerminalResponse($data): Response
  384.     {
  385.         if (empty($data['terminal_id'])) {
  386.             return $this->json(['error' => 'TERMINAL_ID_IS_EMPTY'], Response::HTTP_OKself::RESPONSE_HEADERS);
  387.         }
  388.         $terminal $this->catapulto->terminalRead((int)$data['terminal_id']);
  389.         if ($terminal->isError()) {
  390.             $errorObj = new ErrorCollector($terminal);
  391.             return $this->json(['error' => 'R' $errorObj->getErrorCode() . ': CANNOT_GET_TERMINAL''message' => $errorObj->getErrorText()], Response::HTTP_OKself::RESPONSE_HEADERS);
  392.         }
  393.         $result = [
  394.             'status' => $terminal->getResponse()->getStatus() ?? null,
  395.             'data' => []
  396.         ];
  397.         while ($item $terminal->getResponse()->getData()->getNext()) {
  398.             $point $item->getAllFields();
  399.             $point['point-type'] = $point['point_type'];
  400.             unset($point['point_type']);
  401.             $result['data'][] = $point;
  402.         }
  403.         return $this->json($resultResponse::HTTP_OKself::RESPONSE_HEADERS);
  404.     }
  405.     /**
  406.      * @param $data
  407.      *
  408.      * @return Response
  409.      */
  410.     public function widgetGetTariffResponse($data): Response
  411.     {
  412.         if (empty($data['tariff_id'])) {
  413.             return $this->json(['error' => 'TARIFF_ID_IS_EMPTY'], Response::HTTP_OKself::RESPONSE_HEADERS);
  414.         }
  415.         $tariffId $data['tariff_id'];
  416.         $filter = [
  417.             'pickup_days_shift' => 0,
  418.         ];
  419.         if ($data['pickup_days_shift'] > && $data['pickup_days_shift'] <= 365) {
  420.             $filter['pickup_days_shift'] = (int)$data['pickup_days_shift'];
  421.         }
  422.         $tariff $this->catapulto->tariffRead($tariffId$filter['pickup_days_shift']);
  423.         if ($tariff->isError()) {
  424.             $errorObj = new ErrorCollector($tariff);
  425.             return $this->json(['error' => 'R' $errorObj->getErrorCode() . ': CANNOT_GET_TARIFF''message' => $errorObj->getErrorText()], Response::HTTP_OKself::RESPONSE_HEADERS);
  426.         }
  427.         $result = [
  428.             [
  429.                 'id' => $tariff->getResponse()->getId(),
  430.                 'time-slots' => $tariff->getResponse()->getTimeSlots()
  431.             ]
  432.         ];
  433.         return $this->json($resultResponse::HTTP_OKself::RESPONSE_HEADERS);
  434.     }
  435.     /**
  436.      * Возвращает массив настроек для подключения виджета Catapulto
  437.      *
  438.      * @return array
  439.      */
  440.     public function getWidgetParams(Entity\Shop $shop)
  441.     {
  442.         $defaultSendType $shop->getCalculation()->getWidgetDeliveryFrom();
  443.         $invTKSendTypes = [];
  444.         $tkSTypes $shop->getCalculation()->getCalculationDeliveryOperators();
  445.         foreach ($tkSTypes as $tk) {
  446.             if (empty($tk->getSendType())) continue;
  447.             if ($tk->getSendType() === $defaultSendType) continue;
  448.             $invTKSendTypes[] = $tk->getDeliveryOperator()->getOperatorId();
  449.         }
  450.         $arParams = [
  451.             'popup_mode' => true,
  452.             //'default_city' => self::$city,
  453.             'location' => [
  454.                 //'city' => self::$city,
  455.                 'address' => '',
  456.             ],
  457.             'service_path' => $this->router->generate('widget',
  458.                 [
  459.                     'insalesId' => $shop->getInsalesId()
  460.                 ],
  461.                 UrlGeneratorInterface::ABSOLUTE_URL
  462.             ),
  463.             'cargo' => [], // TODO габариты по умолчанию
  464.             'sender_contact_params' => [
  465.                 'locality_id' => $shop->getCalculation()->getSenderLocalityId(),
  466.                 'zip' => $shop->getCalculation()->getSenderZip(),
  467.                 'cityFrom' => $shop->getCalculation()->getSenderCity()
  468.             ],
  469.             'dadata_token' => $shop->getCalculation()->getDadataApikey(),
  470.             'only_delivery_type' => $this->getParamDeliveryType($shop),
  471.             'services_filter' => '',
  472.             'startTabMap' => $shop->getCalculation()->getMapOpenMode() === 'map',
  473.             'delivery_type' => $shop->getCalculation()->getWidgetDeliveryFrom(),
  474.             'need_insurance' => $shop->getCalculation()->getMindEnsurance(),
  475.             'insured_value' => ''// TODO стоимость запрашивается и устанавливается через JS
  476.             'day_shift' => (int)$shop->getCalculation()->getAppendDeliveryDay(),
  477.             'operators' => $this->prepareOperatorsName(),
  478.             'paysystems' => $this->getPaymentCorresponds($shop),
  479.             'inverse_delivery_type_for_operators' => $invTKSendTypes,
  480.         ];
  481.         if ($shop->getConnection()->isTestMode()) {
  482.             $customWSSUrl $shop->getConnection()->getCustomBaseWsUrl();
  483.             if (!empty($customWSSUrl)) $arParams['ws_api_domain'] = $customWSSUrl;
  484.         }
  485.         return $arParams;
  486.     }
  487.     /**
  488.      * @param Entity\Shop $shop
  489.      *
  490.      * @return string|null
  491.      */
  492.     public function getParamDeliveryType(Entity\Shop $shop)
  493.     {
  494.         $deliveryType $shop->getCalculation()->getWidgetDeliveryTypes();
  495.         return $deliveryType == 'All' '' $deliveryType;
  496.     }
  497.     /**
  498.      * Подготавливает информацию о операторах в виде массива [operator_id => operator_display]
  499.      * @return array
  500.      */
  501.     private function prepareOperatorsName()
  502.     {
  503.         $deliveryOperatorsRepository $this->em->getRepository(Entity\Catapulto\DeliveryOperators::class);
  504.         $arOperators $deliveryOperatorsRepository->findAll();
  505.         $result = [];
  506.         array_map(function ($val) use (&$result) {
  507.             /** @var Entity\Catapulto\DeliveryOperators $val */
  508.             $result[$val->getOperatorId()] = $val->getOperatorDisplay();
  509.         }, $arOperators);
  510.         return $result;
  511.     }
  512.     /**
  513.      * Маппинг платежных систем
  514.      * @param Entity\Shop $shop
  515.      *
  516.      * @return array
  517.      */
  518.     public function getPaymentCorresponds(Entity\Shop $shop)
  519.     {
  520.         $cash $shop->getCalculation()->getCash() ?? [];
  521.         $card $shop->getCalculation()->getCard() ?? [];
  522.         $arPayments = [];
  523.         foreach ($cash as $ps$arPayments[$ps] = "CASH";
  524.         foreach ($card as $ps) {
  525.             if (!empty($arPayments[$ps])) $arPayments[$ps] .= ",CARD";
  526.             else $arPayments[$ps] = "CARD";
  527.         }
  528.         return $arPayments;
  529.     }
  530.     /**
  531.      * Получение WS токена для виджета
  532.      * @return \Symfony\Component\HttpFoundation\JsonResponse
  533.      */
  534.     public function widgetGetWsResponse()
  535.     {
  536.         $token $this->catapulto->getWSToken();
  537.         if ($token->isError()) {
  538.             $errorObj = new ErrorCollector($token);
  539.             return $this->json(['error' => 'R' $errorObj->getErrorCode() . ': CANNOT_GET_TERMINAL''message' => $errorObj->getErrorText()], Response::HTTP_OKself::RESPONSE_HEADERS);
  540.         }
  541.         $token $token->getResponse()->getWsToken();
  542.         return $this->json((['ws_token'=>$token] ?? []), Response::HTTP_OKself::RESPONSE_HEADERS);
  543.     }
  544. }