src/Controller/ApplicationController.php line 491

Open in your IDE?
  1. <?php
  2.     namespace App\Controller;
  3.     use App\Entity;
  4.     use App\Model\Catapulto\BasicResponse;
  5.     use App\Model\Catapulto\Logger as CatapultoLogger;
  6.     use App\Services;
  7.     use App\Services\Catapulto\Package;
  8.     use Doctrine\Common\Collections\Collection;
  9.     use Doctrine\ORM\EntityManagerInterface;
  10.     use Ipol\Catapulto\Catapulto\CatapultoApplication;
  11.     use Ipol\Catapulto\Core\Entity\Money;
  12.     use Ipol\Catapulto\Core\Order\Address;
  13.     use Ipol\Catapulto\Core\Order\Buyer;
  14.     use Ipol\Catapulto\Core\Order\BuyerCollection;
  15.     use Ipol\Catapulto\Core\Order\Item;
  16.     use Ipol\Catapulto\Core\Order\ItemCollection;
  17.     use Ipol\Catapulto\Core\Order\Order;
  18.     use Ipol\Catapulto\Core\Order\Payment;
  19.     use Ipol\Catapulto\Core\Order\ReceiverCollection;
  20.     use Psr\Log\LoggerInterface;
  21.     use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  22.     use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  23.     use Symfony\Component\HttpClient\CurlHttpClient;
  24.     use Symfony\Component\HttpFoundation\Request;
  25.     use Symfony\Component\HttpFoundation\Response;
  26.     use Symfony\Component\Routing\Annotation\Route;
  27.     use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  28.     use Symfony\Component\Routing\RouterInterface;
  29.     use Symfony\Contracts\Translation\TranslatorInterface;
  30.     /**
  31.      * Class ApplicationController
  32.      * @package App\Controller
  33.      */
  34.     class ApplicationController extends BaseController
  35.     {
  36.         /**
  37.          * @Route(path="/app/configuration/{insalesId}", name="app.configuration")
  38.          * @ParamConverter(name="shop", options={"mapping" : {"insalesId" = "insalesId"}, "repository_method" = "getByInsalesIdEx"})
  39.          * @param Services\Insales\User $user
  40.          * @param Entity\Shop $shop
  41.          * @return Response
  42.          */
  43.         public function configuration(Services\Insales\User $userEntity\Shop $shop)
  44.         {
  45.             if(!$user->checkShopAuthorize($shop))
  46.                 return $this->redirectToRoute('session.end');
  47.             return $this->redirectToRoute(
  48.                 'app.configuration.connection',
  49.                 [
  50.                     'insalesId' => $shop->getInsalesId()
  51.                 ]
  52.             );
  53.         }
  54.         /**
  55.          * Виджет отправки заявки в карточке заказа
  56.          * @Route(path="/app/order/widget/{insalesId}/{widgetPassword}/{orderId}", name="app.order.widget", defaults={"orderId" : ""})
  57.          * @ParamConverter(name="shop", options={"mapping" : {"insalesId" = "insalesId"}, "repository_method" = "getByInsalesIdEx"})
  58.          * @param Entity\Shop $shop
  59.          * @param $orderId
  60.          * @param $widgetPassword
  61.          * @param Services\Insales\Client $insales
  62.          * @param Package $package
  63.          * @param Services\Catapulto\Order $catapultoOrder
  64.          * @param Request $request
  65.          * @return Response|\Symfony\Component\Security\Core\Exception\AccessDeniedException
  66.          * @throws \Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface
  67.          * @throws \Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface
  68.          * @throws \Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface
  69.          * @throws \Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface
  70.          * @throws \Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface
  71.          */
  72.         public function orderWidget(
  73.             Entity\Shop $shop,
  74.             $orderId,
  75.             $widgetPassword,
  76.             Services\Insales\Client $insales,
  77.             Services\Catapulto\Package $package,
  78.             Services\Catapulto\Order $catapultoOrder,
  79.             ParameterBagInterface $parameterBag,
  80.             RouterInterface $router,
  81.             Request $request
  82.         )
  83.         {
  84.             /** @var array $errors */
  85.             $errors = [];
  86.             /** @var Entity\Order $order */
  87.             $order $insales->setShop($shop)->getByOrderId($orderIdtrue);
  88.             if(
  89.                 !$order instanceof Entity\Order
  90.                 || $order->getShop() !== $shop
  91.                 || $shop->getWidgetPassword() !== $widgetPassword
  92.             )
  93.                 return $this->render('application/widget/order-error.html.twig');
  94.             $connection $shop->getConnection();
  95.             $arDelivery = [
  96.                 $shop->getDeliveryId()
  97.             ];
  98.             if(
  99.                 /*!in_array($order->getDeliveryInformation()['outlet']['source_id'], array_keys($arDelivery))
  100.                 &&*/ $order->getDeliveryInformation()['delivery_variant_id'] != $shop->getDeliveryId()
  101.             )
  102.                 return $this->render('application/widget/other-delivery-variant.html.twig');
  103.             $package->setShop($shop)->setOrder($order);
  104.             $package->getPackageEntity();
  105.             $calculation $shop->getCalculation();
  106.             // получаем служебные данные о доставке из свойств заказа и передаём в twig
  107.             $arRateResultProp array_filter($order->getFieldValues(), function ($val) use ($shop) {
  108.                 return $val['field_id'] === $shop->getRateResultPropertyId();
  109.             });
  110.             if (empty($arRateResultProp)) {
  111.                 return $this->render('application/widget/empty-rate-result.html.twig',array_merge($this->prepareOrderParams($order),[
  112.                     'service_path'=>$router->generate('widget',['insalesId'=>$shop->getInsalesId()],UrlGeneratorInterface::ABSOLUTE_PATH),
  113.                     'protocol' => $parameterBag->get('router.request_context.scheme'),
  114.                     'host' => $parameterBag->get('router.request_context.host'),
  115.                 ]));
  116.             }
  117.             $arRateResultProp array_shift($arRateResultProp);
  118.             if (!empty($arRateResultProp) && !empty($arRateResultProp['value'])) {
  119.                 $rateResultPropValue preg_replace("/&amp;/",'&',$arRateResultProp['value']);
  120.                 $rateResultPropValue preg_replace("/&quot;/",'"',$rateResultPropValue);
  121.                 $rateResult json_decode(htmlspecialchars_decode($rateResultPropValue), true);
  122.             } else {
  123.                 return $this->render('application/widget/empty-rate-result.html.twig',array_merge($this->prepareOrderParams($order),[
  124.                     'service_path'=>$router->generate('widget',['insalesId'=>$shop->getInsalesId()],UrlGeneratorInterface::ABSOLUTE_PATH),
  125.                     'protocol' => $parameterBag->get('router.request_context.scheme'),
  126.                     'host' => $parameterBag->get('router.request_context.host'),
  127.                 ]));
  128.             }
  129.             $orderPackage $package->getPackageEntity() ?? null;
  130.             if (!empty($rateResult['dadata'])) {
  131.                 $rateResult['dadata'] = json_decode(htmlspecialchars_decode($rateResult['dadata']), true);
  132.                 if (is_array($rateResult)) {
  133.                     $strLine '';
  134.                     $newShippingAddress $order->getShippingAddress();
  135.                     $newShippingAddress['isDadata'] = true;
  136.                     $newShippingAddress['location']['kladr_zip'] = '';
  137.                     $newShippingAddress['city'] = '';
  138.                     $newShippingAddress['location']['street'] = '';
  139.                     $newShippingAddress['location']['house'] = '';
  140.                     $newShippingAddress['location']['flat'] = '';
  141.                     $newShippingAddress['address_for_gis'] = '';
  142.                     if ($rateResult['dadata']['zip']) {
  143.                         $strLine $rateResult['dadata']['zip'];
  144.                         $newShippingAddress['location']['kladr_zip'] = $rateResult['dadata']['zip'];
  145.                     }
  146.                     if (!$rateResult['dadata']['city']) {
  147.                         if ($rateResult['dadata']['settlement']) $newShippingAddress['city'] = $rateResult['dadata']['settlement'];
  148.                     } else $newShippingAddress['city'] = $rateResult['dadata']['city'];
  149.                     if ($rateResult['dadata']['street']) {
  150.                         $newShippingAddress['location']['street'] = $rateResult['dadata']['street'];
  151.                         $strLine .= (!empty($strLine)?', ':'') . $rateResult['dadata']['street'];
  152.                     }
  153.                     if ($rateResult['dadata']['house']) {
  154.                         $strLine .= (!empty($strLine)?', ':'') . $rateResult['dadata']['house'];
  155.                         if ($rateResult['dadata']['block']) {
  156.                             if ($rateResult['dadata']['blockt']) $rateResult['dadata']['block'] = $rateResult['dadata']['blockt'] . ' ' $rateResult['dadata']['block'];
  157.                             $strLine .= (!empty($strLine)?', ':'') . $rateResult['dadata']['block'];
  158.                             $rateResult['dadata']['house'] .= ', ' $rateResult['dadata']['block'];
  159.                         }
  160.                         $newShippingAddress['location']['house'] = $rateResult['dadata']['house'];
  161.                     }
  162.                     if ($rateResult['dadata']['flat']) {
  163.                         $newShippingAddress['location']['flat'] = $rateResult['dadata']['flat'];
  164.                         $strLine .= (!empty($strLine)?', ':'') . $rateResult['dadata']['flat'];
  165.                     }
  166.                     $newShippingAddress['address_for_gis'] = $strLine;
  167.                     if ($rateResult['rate_result']['pvz']) {
  168.                         $dadataKey $shop->getCalculation()->getDadataApikey();
  169.                         $queryString $rateResult['dadata']['region'];
  170.                         $queryString .= (!empty($queryString)?', ':'') . $rateResult['dadata']['city'] . ', ' $rateResult['rate_result']['pvz']['address'];
  171.                         $data = ['query'=>$queryString,'count'=>1];
  172.                         $httpClient = new CurlHttpClient();
  173.                         $response $httpClient->request('POST','https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address',[
  174.                             'headers'=>[
  175.                                 'Content-Type'=>'application/json; charset=utf-8',
  176.                                 'Accept'=>'application/json',
  177.                                 'Authorization'=>'Token '.$dadataKey
  178.                             ],
  179.                             'body'=>json_encode($data)
  180.                         ]);
  181.                         $content $response->getContent();
  182.                         if ($suggest = @json_decode($content,true)) {
  183.                             if (!empty($suggest['suggestions'])) {
  184.                                 $result $suggest['suggestions'][0]['data'];
  185.                                 $strLine '';
  186.                                 if ($result['postal_code']) {
  187.                                     $strLine $result['postal_code'];
  188.                                     $newShippingAddress['location']['kladr_zip'] = $result['postal_code'];
  189.                                 }
  190.                                 if ($result['settlement']) $newShippingAddress['city'] = $result['settlement'];
  191.                                 else $newShippingAddress['city'] = $result['city'];
  192.                                 $strLine .= (!empty($strLine)?', ':'') . $newShippingAddress['city'];
  193.                                 if ($result['street']) {
  194.                                     $newShippingAddress['location']['street'] = $result['street'];
  195.                                     $strLine .= (!empty($strLine)?', ':'') . $result['street'];
  196.                                 }
  197.                                 if ($result['house']) {
  198.                                     $strLine .= (!empty($strLine)?', ':'') . $result['house'];
  199.                                     if ($result['block']) {
  200.                                         if ($result['block_type']) $result['block'] = $result['block_type'] . ' ' $result['block'];
  201.                                         $strLine .= (!empty($strLine)?', ':'') . $result['block'];
  202.                                         $result['house'] .= ', ' $result['block'];
  203.                                     }
  204.                                     $newShippingAddress['location']['house'] = $result['house'];
  205.                                 }
  206.                                 if ($result['flat']) {
  207.                                     $newShippingAddress['location']['flat'] = $result['flat'];
  208.                                     $strLine .= (!empty($strLine)?', ':'') . $result['flat'];
  209.                                 }
  210.                                 $newShippingAddress['address_for_gis'] = $strLine;
  211.                             }
  212.                         }
  213.                     }
  214.                     $newPackageAddress = [
  215.                         'address_line_1'=>$newShippingAddress['address_for_gis'], //fulladdr
  216.                         'address_line_2'=>'',
  217.                         'building'=>$newShippingAddress['location']['house'], //house
  218.                         'comment'=>'',
  219.                         'country'=>'',
  220.                         'door_number'=>$newShippingAddress['location']['flat'],//flat
  221.                         'id'=>'',
  222.                         'locality'=>$newShippingAddress['city'],//city
  223.                         'locality_type'=>'',
  224.                         'region1'=>'',
  225.                         'region1_type'=>'',
  226.                         'region2'=>'',
  227.                         'region2_type'=>'',
  228.                         'region3'=>'',
  229.                         'region3_type'=>'',
  230.                         'state_province'=>'',
  231.                         'street'=>$newShippingAddress['location']['street'],//street
  232.                         'street_type'=>'',
  233.                         'zip'=>$newShippingAddress['location']['kladr_zip'//zip
  234.                     ];
  235.                     if ($orderPackage) {
  236.                         $orderPackage->setReceiverLocality($newShippingAddress['city']); //city
  237.                         $orderPackage->setReceiverAddress($newPackageAddress);
  238.                     }
  239.                     $order->setShippingAddress($newShippingAddress);
  240.                 }
  241.             }
  242.             if($request->getMethod() === $request::METHOD_POST)
  243.             {
  244.                 $action $request->request->get('ctdlv_action','');
  245.                 if ($action == 'send') {
  246.                     /** @var BasicResponse $sendOrder */
  247.                     $sendOrder $catapultoOrder->sendOrder($request$package$rateResult);
  248.                     if (!$sendOrder->isSuccess()) {
  249.                         // ошибка отправки заказа
  250.                         $errors[] = ['ErrorMessage' => $sendOrder->getErrorText()];
  251.                     } else {
  252.                         return $this->redirectToRoute(
  253.                             'app.order.widget',
  254.                             [
  255.                                 'insalesId' => $shop->getInsalesId(),
  256.                                 'widgetPassword' => $shop->getWidgetPassword(),
  257.                                 'orderId' => $order->getOrderId()
  258.                             ]
  259.                         );
  260.                     }
  261.                 }
  262.                 if ($action == 'clear') {
  263.                     $insales->updateOrderField(intval($orderId),$parameterBag->get('app.insales.property.rate.result.handle'),'');
  264.                     return $this->render('application/widget/empty-rate-result.html.twig',array_merge($this->prepareOrderParams($order),[
  265.                         'service_path'=>$router->generate('widget',['insalesId'=>$shop->getInsalesId()],UrlGeneratorInterface::ABSOLUTE_PATH),
  266.                         'protocol' => $parameterBag->get('router.request_context.scheme'),
  267.                         'host' => $parameterBag->get('router.request_context.host'),
  268.                     ]));
  269.                 }
  270.             }
  271.             // Инициализируем класс money для корректной работы getAmount() внутри twig
  272.             $obMoney = new Money(0);
  273.             //dump($order);
  274.             //parse Phone Number
  275.             $phoneNumber preg_replace("/^8/",'+7',$order->getClient()['phone']);
  276.             return $this->render(
  277.                 'application/widget/widget.html.twig',
  278.                 [
  279.                     'calculation' => $calculation,
  280.                     'shop' => $shop,
  281.                     'order' => $order,
  282.                     'errors' => $errors,
  283.                     'package' => $orderPackage// если данные уже вводились и записались в бд - выводим их
  284.                     'rateResult' => $rateResult ?? null,
  285.                     'parsedPhoneNumber' => $phoneNumber
  286.                 ]
  287.             );
  288.         }
  289.         /**
  290.          * Открытие виджета выбора варианта доставки в новом окне: защита при помощи manageToken со сроком действия
  291.          * @Route(path="/app/order/reselectrate/{insalesId}/{manageToken}/{orderId}", name="app.order.reselectrate", defaults={"orderId" : ""})
  292.          * @ParamConverter(name="shop", options={"mapping" : {"insalesId" = "insalesId"}, "repository_method" = "getByInsalesIdEx"})
  293.          * @param Entity\Shop $shop
  294.          * @param $orderId
  295.          * @param $manageToken
  296.          * @param Services\Insales\Client $insales
  297.          * @param Package $package
  298.          * @param Services\Catapulto\Order $catapultoOrder
  299.          * @param ParameterBagInterface $parameterBag
  300.          * @param RouterInterface $router
  301.          * @param Request $request
  302.          * @return Response|\Symfony\Component\Security\Core\Exception\AccessDeniedException
  303.          */
  304.         public function reselectRateInNewWindow(
  305.             Entity\Shop $shop,
  306.                         $orderId,
  307.                         $manageToken,
  308.             Services\Insales\Client $insales,
  309.             Services\Catapulto\Package $package,
  310.             ParameterBagInterface $parameterBag,
  311.             RouterInterface $router
  312.         )
  313.         {
  314.             /** @var Entity\Order $order */
  315.             $order $insales->setShop($shop)->getByOrderId($orderId);
  316.             $insalesOrderLink 'https://'.$order->getShop()->getShop().'/admin2/orders/'.$order->getOrderId();
  317.             if(
  318.                 !$order instanceof Entity\Order
  319.                 || $order->getShop() !== $shop
  320.             )
  321.                 return $this->render('publicpage/order-error.html.twig');
  322.             if( $order->getDeliveryInformation()['delivery_variant_id'] != $shop->getDeliveryId() )
  323.                 return $this->render('publicpage/other-delivery-variant.html.twig');
  324.             //CheckToken
  325.             if ($manageToken != $order->getManageToken()) {
  326.                 return $this->render('publicpage/order-error.html.twig');
  327.             }
  328.             if ( (new \DateTime()) > $order->getManageTokenExpire() ) {
  329.                 return $this->render('publicpage/tokenexpire.html.twig');
  330.             }
  331.             $package->setShop($shop)->setOrder($order);
  332.             $package->getPackageEntity();
  333.             $arRateResultProp array_filter($order->getFieldValues(), function ($val) use ($shop) {
  334.                 return $val['field_id'] === $shop->getRateResultPropertyId();
  335.             });
  336.             if (!empty($arRateResultProp) && is_array($arRateResultProp))
  337.                 $arRateResultProp array_shift($arRateResultProp);
  338.             if (!empty($arRateResultProp) && !empty($arRateResultProp['value'])) {
  339.                 return $this->render('publicpage/dataexist.html.twig',[
  340.                     'manageOrderLink'=>$insalesOrderLink
  341.                 ]);
  342.             }
  343.             return $this->render('publicpage/empty-rate-result.html.twig',array_merge($this->prepareOrderParams($order),[
  344.                 'service_path'=>$router->generate('widget',['insalesId'=>$shop->getInsalesId()],UrlGeneratorInterface::ABSOLUTE_PATH),
  345.                 'protocol' => $parameterBag->get('router.request_context.scheme'),
  346.                 'host' => $parameterBag->get('router.request_context.host'),
  347.                 'manageOrderLink' => $insalesOrderLink
  348.             ]));
  349.         }
  350.         /**
  351.          * @Route(path="/app/order/widget/{insalesId}/{widgetPassword}/{orderId}/ratesave", name="app.order.widget.ratesave", defaults={"orderId" : ""})
  352.          * @ParamConverter(name="shop", options={"mapping" : {"insalesId" = "insalesId"}, "repository_method" = "getByInsalesIdEx"})
  353.          * @param Entity\Shop $shop
  354.          * @param $orderId
  355.          * @param $widgetPassword
  356.          * @param Services\Insales\Client $insales
  357.          * @param ParameterBagInterface $parameterBag
  358.          * @param Request $request
  359.          * @return Response
  360.          */
  361.         public function updateOrderRateFromAdmin(
  362.             Entity\Shop $shop,
  363.             $orderId,
  364.             $widgetPassword,
  365.             Services\Insales\Client $insales,
  366.             ParameterBagInterface $parameterBag,
  367.             EntityManagerInterface $em,
  368.             Request $request
  369.         ):Response
  370.         {
  371.             /** @var Entity\Order $order */
  372.             $order $insales->setShop($shop)->getByOrderId($orderId);
  373.             if(
  374.                 !$order instanceof Entity\Order
  375.                 || $order->getShop() !== $shop
  376.                 || $shop->getWidgetPassword() !== $widgetPassword
  377.             )
  378.                 return $this->render('application/widget/order-error.html.twig');
  379.             $rateResult $request->request->get('result');
  380.             $rateResultData json_decode($rateResult,true);
  381.             //saving...
  382.             $operators $this->getOperators($em);
  383.             $result $insales->updateOrderField(intval($orderId),$parameterBag->get('app.insales.property.rate.result.handle'), $rateResult);
  384.             if (($result->getMessage() != 'OK') || ($result->getHttpCode() != Response::HTTP_OK)) {
  385.                 $errorCode $result->getHttpCode();
  386.                 $errorMessage $result->getMessage();
  387.                 return $this->json(['r'=>false,'code'=>$result->getHttpCode(),'mes'=>$result->getMessage()]);
  388.             }
  389.             //update Delivery Information
  390.             $description "{$operators[$rateResultData['rate_result']['operator']]} ({$rateResultData['rate_result']['rate']})".(($rateResultData['rate_result']['pvz'])?" <br>".$rateResultData['rate_result']['pvz']['address']." #".$rateResultData['rate_result']['pvz']['code']:"")." <br>Дата доставки: {$rateResultData['rate_result']['delivery_day']}";
  391.             $result $insales->updateOrder(intval($orderId),[
  392.                 'delivery_price'=>$rateResultData['rate_cost'],
  393.                 'full_delivery_price'=>$rateResultData['rate_cost'],
  394.                 'delivery_description'=>$description
  395.             ]);
  396.             if (($result->getMessage() != 'OK') || ($result->getHttpCode() != Response::HTTP_OK)) {
  397.                 $errorCode $result->getHttpCode();
  398.                 $errorMessage $result->getMessage();
  399.                 return $this->json(['r'=>false,'code'=>$result->getHttpCode(),'mes'=>$result->getMessage()]);
  400.             }
  401.             return $this->json(['r'=>true]);
  402.         }
  403.         /** Обновление статуса заказа озон
  404.          * @Route(path="/app/order/widget/{insalesId}/{widgetPassword}/{orderId}/refresh", name="app.order.widget.refresh", defaults={"orderId" : ""})
  405.          * @ParamConverter(name="shop", options={"mapping" : {"insalesId" = "insalesId"}, "repository_method" = "getByInsalesIdEx"})
  406.          * @param Entity\Shop $shop
  407.          * @param $orderId
  408.          * @param $widgetPassword
  409.          * @param Services\Insales\Client $insales
  410.          * @param Services\Catapulto\Package $package
  411.          * @param Services\Catapulto\Order $catapultoOrder
  412.          * @return Response
  413.          * @throws \Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface
  414.          * @throws \Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface
  415.          * @throws \Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface
  416.          * @throws \Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface
  417.          * @throws \Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface
  418.          */
  419.         public function orderWidgetRefresh(
  420.             Entity\Shop $shop,
  421.             $orderId,
  422.             $widgetPassword,
  423.             Services\Insales\Client $insales,
  424.             Services\Catapulto\Package $package,
  425.             Services\Catapulto\Order $catapultoOrder
  426.         )
  427.         {
  428.             /** @var array $errors */
  429.             $errors = [];
  430.             /** @var Entity\Order $order */
  431.             $order $insales->setShop($shop)->getByOrderId($orderId);
  432.             if(
  433.                 !$order instanceof Entity\Order
  434.                 || $order->getShop() !== $shop
  435.                 || $shop->getWidgetPassword() !== $widgetPassword
  436.             )
  437.                 return $this->render('application/widget/order-error.html.twig');
  438.             $arDelivery = [
  439.                 $shop->getDeliveryId()
  440.             ];
  441.             if(
  442.                 !in_array($order->getDeliveryInformation()['outlet']['source_id'], array_keys($arDelivery))
  443.                 && $order->getDeliveryInformation()['delivery_variant_id'] != $shop->getDeliveryId()
  444.             )
  445.                 return $this->render('application/widget/other-delivery-variant.html.twig');
  446.             $package->setShop($shop)->setOrder($order);
  447.             $package->getPackageEntity();
  448.             /** @var BasicResponse $sendOrder */
  449.             $sendOrder $catapultoOrder->refreshOrder($package);
  450.             if (!$sendOrder->isSuccess()) {
  451.                 // ошибка отправки заказа
  452.                 $errors[] = ['ErrorMessage' => $sendOrder->getErrorText()];
  453.             } else {
  454.                 return $this->redirectToRoute(
  455.                     'app.order.widget',
  456.                     [
  457.                         'insalesId' => $shop->getInsalesId(),
  458.                         'widgetPassword' => $shop->getWidgetPassword(),
  459.                         'orderId' => $order->getOrderId()
  460.                     ]
  461.                 );
  462.             }
  463.             return $this->redirectToRoute(
  464.                 'app.order.widget',
  465.                 [
  466.                     'insalesId' => $shop->getInsalesId(),
  467.                     'widgetPassword' => $shop->getWidgetPassword(),
  468.                     'orderId' => $order->getOrderId()
  469.                 ]
  470.             );
  471.         }
  472.         /** Обновление статуса заказа озон
  473.          * @Route(path="/app/order/widget/{insalesId}/{widgetPassword}/{orderId}/cancel", name="app.order.widget.cancel", defaults={"orderId" : ""})
  474.          * @ParamConverter(name="shop", options={"mapping" : {"insalesId" = "insalesId"}, "repository_method" = "getByInsalesIdEx"})
  475.          * @param Entity\Shop $shop
  476.          * @param $orderId
  477.          * @param $widgetPassword
  478.          * @param Services\Insales\Client $insales
  479.          * @param Services\Catapulto\Package $package
  480.          * @param Services\Catapulto\Order $catapultoOrder
  481.          * @return Response
  482.          */
  483.         public function cancelOrder(
  484.             Entity\Shop $shop,
  485.                         $orderId,
  486.                         $widgetPassword,
  487.             Services\Insales\Client $insales,
  488.             Services\Catapulto\Package $package,
  489.             Services\Catapulto\Order $catapultoOrder
  490.         ): Response
  491.         {
  492.             /** @var Entity\Order $order */
  493.             $order $insales->setShop($shop)->getByOrderId($orderId);
  494.             if(
  495.                 !$order instanceof Entity\Order
  496.                 || $order->getShop() !== $shop
  497.                 || $shop->getWidgetPassword() !== $widgetPassword
  498.             )
  499.                 return $this->render('application/widget/order-error.html.twig');
  500.             $arDelivery = [
  501.                 $shop->getDeliveryId()
  502.             ];
  503.             if(
  504.                 !in_array($order->getDeliveryInformation()['outlet']['source_id'], array_keys($arDelivery))
  505.                 && $order->getDeliveryInformation()['delivery_variant_id'] != $shop->getDeliveryId()
  506.             )
  507.                 return $this->render('application/widget/other-delivery-variant.html.twig');
  508.             $package->setShop($shop)->setOrder($order);
  509.             $package->getPackageEntity();
  510.             /** @var BasicResponse $cancelOrder */
  511.             $cancelOrder $catapultoOrder->cancelOrder($package);
  512.             if (!$cancelOrder->isSuccess()) {
  513.                 // errors...
  514.             }
  515.             return $this->redirectToRoute(
  516.                 'app.order.widget',
  517.                 [
  518.                     'insalesId' => $shop->getInsalesId(),
  519.                     'widgetPassword' => $shop->getWidgetPassword(),
  520.                     'orderId' => $order->getOrderId()
  521.                 ]
  522.             );
  523.         }
  524.         /**
  525.          * @Route(path="/session-end", name="session.end")
  526.          */
  527.         public function sessionEnd()
  528.         {
  529.             return $this->render('application/session-end.html.twig');
  530.         }
  531.         private function prepareOrderParams(Entity\Order $order):array
  532.         {
  533.             $shop $order->getShop();
  534.             $cargoParams = [
  535.                 'width' => $order->getWidth(),
  536.                 'length' => $order->getLength(),
  537.                 'height' => $order->getHeight(),
  538.                 'weight' => $order->getWeight(),
  539.                 'cargo_comment'  => ''
  540.             ];
  541.             foreach ($order->getProducts() as $product) {
  542.                 $cargoParams['cargo_comment'] .= $product['title'] . '(' $product['quantity'] . ');';
  543.             }
  544.             $location $order->getShippingAddress()['location']['state'].' '.$order->getShippingAddress()['location']['state_type'].' '.$order->getShippingAddress()['location']['city_type'].' '.$order->getShippingAddress()['location']['city'];
  545.             if ($order->getShippingAddress()['location']['settlement']) {
  546.                 if ($order->getShippingAddress()['location']['settlement_type']) $location.=' '.$order->getShippingAddress()['location']['settlement_type'];
  547.                 $location.=' '.$order->getShippingAddress()['location']['settlement'];
  548.             }
  549.             $isCard in_array($order->getPaymentGatewayId(),$shop->getCalculation()->getCard());
  550.             $isCash in_array($order->getPaymentGatewayId(),$shop->getCalculation()->getCash());
  551.             $serviceFilter '';
  552.             if ($isCash || $isCard$serviceFilter 'NP,COD';
  553.             $defaultSendType $shop->getCalculation()->getWidgetDeliveryFrom();
  554.             $invTKSendTypes = [];
  555.             $tkSTypes $shop->getCalculation()->getCalculationDeliveryOperators();
  556.             foreach ($tkSTypes as $tk) {
  557.                 if (empty($tk->getSendType())) continue;
  558.                 if ($tk->getSendType() === $defaultSendType) continue;
  559.                 $invTKSendTypes[] = $tk->getDeliveryOperator()->getOperatorId();
  560.             }
  561.             return [
  562.                 'sender_locality_id'=>$shop->getCalculation()->getSenderLocalityId(),
  563.                 'sender_zip'=>$shop->getCalculation()->getSenderZip(),
  564.                 'sender_city_from'=>$shop->getCalculation()->getSenderCity(),
  565.                 'startTabMap'=>$shop->getCalculation()->getMapOpenMode() === 'map',
  566.                 'dadata_token'=>$shop->getCalculation()->getDadataApikey(),
  567.                 'cargo'=>$cargoParams,
  568.                 'insured_value'=>floatval($order->getPrice()),//Стоимость заказа!
  569.                 'need_insurance'=>($shop->getCalculation()->getMindEnsurance()===true)?'true':'false',
  570.                 'services_filter'=>$serviceFilter,
  571.                 'filter_card'=>($isCard===true)?'true':'false',
  572.                 'filter_cash'=>($isCash===true)?'true':'false',
  573.                 'location_address'=>$location,
  574.                 'only_delivery_type'=> ($shop->getCalculation()->getWidgetDeliveryTypes()=='All')?'':$shop->getCalculation()->getWidgetDeliveryTypes(),
  575.                 'delivery_type'=>$shop->getCalculation()->getWidgetDeliveryFrom(),
  576.                 'day_shift'=>$shop->getCalculation()->getAppendDeliveryDay(),
  577.                 'widgetPassword'=>$shop->getWidgetPassword(),
  578.                 'orderId'=>$order->getOrderId(),
  579.                 'insalesId'=>$shop->getInsalesId(),
  580.                 'manageToken'=>$order->getManageToken(),
  581.                 'termSendTypes' => $invTKSendTypes,
  582.             ];
  583.         }
  584.         private function getOperators(EntityManagerInterface $em)
  585.         {
  586.             $deliveryOperatorsRepository $em->getRepository(Entity\Catapulto\DeliveryOperators::class);
  587.             $allOperators $deliveryOperatorsRepository->findAll();
  588.             $operators = [];
  589.             array_map(function($val) use (&$operators){
  590.                 $operators[$val->getOperatorId()] = $val->getOperatorDisplay();
  591.             },$allOperators);
  592.             return $operators;
  593.         }
  594.     }