src/WebBundle/Service/OrderOneCService.php line 137

Open in your IDE?
  1. <?php
  2. namespace WebBundle\Service;
  3. use Exception;
  4. use FlexApp\Service\RedisCachePool;
  5. use SoapClient;
  6. use SoapFault;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use WebBundle\Entity\BuyOrder;
  11. use WebBundle\Entity\OrderPayment;
  12. use WebBundle\Enum\BuyOrderStatusEnum;
  13. use WebBundle\Enum\OneCFuncNameEnum;
  14. use WebBundle\Filler\OneCFiller;
  15. use WebBundle\Helper\App;
  16. use WebBundle\Helper\OrderHelper;
  17. use WebBundle\Helper\RequestHelper;
  18. use WebBundle\Helper\SoapHelper;
  19. use WebBundle\Helper\UserHelper;
  20. use WebBundle\Repository\VisitRepository;
  21. use WebBundle\Scenario\SendToOneCQueueScenario;
  22. class OrderOneCService
  23. {
  24.     private const MAX_TRY_TO_SEND_1C 1;
  25.     /** @required */
  26.     public RedisCachePool $redisCachePool;
  27.     protected LocationService $locationService;
  28.     private VisitRepository $visitRepository;
  29.     public function __construct(
  30.         LocationService $locationService,
  31.         VisitRepository $visitRepository
  32.     ) {
  33.         $this->locationService $locationService;
  34.         $this->visitRepository $visitRepository;
  35.     }
  36.     /**
  37.      * Подключается к сервису обмена с "1С"
  38.      *
  39.      * @param string|null $data - строка запроса
  40.      * @return Object|SoapClient
  41.      * @throws Exception
  42.      */
  43.     public function getClient(?string $data null)
  44.     {
  45.         return SoapHelper::client(App::getContainer()->getParameter('orderApi_wsdl'), $data);
  46.     }
  47.     /**
  48.      * Проверяет готов ли заказ к запросу ручного расчета доставки
  49.      *
  50.      * @param BuyOrder $order
  51.      * @return bool
  52.      * @throws Exception
  53.      */
  54.     public function readyRequestDelivery(BuyOrder $order): bool
  55.     {
  56.         // запросить ручной расчет можно только если статус заказа черновик 1
  57.         if ($order->getSendCreate1C() && $order->getStatus() == BuyOrderStatusEnum::REQUEST_DELIVERY) {
  58.             return true;
  59.         }
  60.         return false;
  61.     }
  62.     /**
  63.      * @throws SoapFault|Exception
  64.      */
  65.     public function requestBalanceItem($order$item, ?string $action null)
  66.     {
  67.         if (is_array($item)) {
  68.             App::dumpExit($item);
  69.         }
  70.         return $this->send(OneCFuncNameEnum::REQUEST_BALANCE_FACTORY$order, [
  71.             'code' => $item->chooseCode(),
  72.             'amount' => $item->getAmount(),
  73.             'action' => $action,
  74.         ], false);
  75.     }
  76.     /**
  77.      * @param BuyOrder $order
  78.      * @return mixed
  79.      * @throws SoapFault
  80.      * @throws Exception
  81.      */
  82.     public function bankTransfer(BuyOrder $order)
  83.     {
  84.         return $this->send(OneCFuncNameEnum::GET_FILE_CONTRACT_TE$orderOrderHelper::arrayData($order), false);
  85.     }
  86.     public function sendOrResendOrderToOneC(BuyOrder $order): void
  87.     {
  88.         if (!OrderHelper::isAddressAvailableInOrder($order)) {
  89.             return;
  90.         }
  91.         if ($order->getStatus() > BuyOrderStatusEnum::PARTIALLY_PAID) {
  92.             return;
  93.         }
  94.         if ($order->getSendCreate1C()) {
  95.             $this->resetOrderOneC($order);
  96.         }
  97.         $this->createOrderOneC(App::getRequest(), $order);
  98.     }
  99.     /**
  100.      * Отправка данных заказа в "1С"
  101.      *
  102.      * @param Request $request
  103.      * @param BuyOrder $order
  104.      * @param ?bool $auto Если true – то будет выполнен авто расчет доставки иначе просто запишет изменения в заказ
  105.      * @param ?bool $timer
  106.      * @return mixed
  107.      * @throws SoapFault
  108.      * @throws Exception
  109.      */
  110.     public function createOrderOneC(Request $requestBuyOrder $order, ?bool $auto false, ?bool $timer false): array
  111.     {
  112.         $pageCount $this->visitRepository->getVisitCount($order->getToken());
  113.         $referer $request->headers->get('referer');
  114.         $ip $request->getClientIp();
  115.         $record $this->locationService->getCityRecordByRequest($request);
  116.         $orderOneCFiller = new OneCFiller();
  117.         $oneCData $orderOneCFiller->fillOrderDataForCreateOrder($order$pageCount$ip$referer$record$auto$timer);
  118.         $queue = new SendToOneCQueueScenario($this->redisCachePool->getPool(), $order->getHash(), 'create');
  119.         $queue->checkForStart();
  120.         $result $this->send(OneCFuncNameEnum::CREATE_ORDER_TE$order$oneCData);
  121.         $queue->setFinish();
  122.         if (empty($result['Result'])) {
  123.             return [];
  124.         }
  125.         $order->setSendCreate1C(true);
  126.         return $result;
  127.     }
  128.     /**
  129.      * Удаляет заказ из "1С"
  130.      *
  131.      * @param BuyOrder $order
  132.      * @return mixed
  133.      * @throws SoapFault
  134.      * @throws Exception
  135.      */
  136.     public function delete(BuyOrder $order)
  137.     {
  138.         return $this->send(OneCFuncNameEnum::DEL_ORDER$order);
  139.     }
  140.     /**
  141.      * Отправляет запрос на сброс заказа в "1С"
  142.      *
  143.      * @param BuyOrder $order
  144.      * @param string $info
  145.      * @param ?bool $timer
  146.      * @return mixed
  147.      * @throws SoapFault
  148.      * @throws Exception
  149.      */
  150.     public function resetOrderOneC(BuyOrder $orderstring $info 'Order has been changed', ?bool $timer false)
  151.     {
  152.         $oneCData array_merge(OrderHelper::arrayData($order), ['info' => $info'timer' => $timer 0]);
  153.         return $this->send(OneCFuncNameEnum::RESET_ORDER$order$oneCData);
  154.     }
  155.     /**
  156.      * Запрос расчета доставки
  157.      *
  158.      * @param BuyOrder $order
  159.      * @return mixed
  160.      * @throws Exception
  161.      */
  162.     public function delivery(BuyOrder $order)
  163.     {
  164.         return $this->send(OneCFuncNameEnum::GET_DELIVERY_ORDER$orderOrderHelper::arrayData($order));
  165.     }
  166.     /**
  167.      * Подтверждение или отклонение сроков
  168.      *
  169.      * @param BuyOrder $order
  170.      * @param boolean $val
  171.      * @return mixed
  172.      * @throws Exception
  173.      */
  174.     public function confirm(BuyOrder $orderbool $val)
  175.     {
  176.         $oneCData = [
  177.             'confirmed' => $val '1' '0',
  178.             'timeConfirmMin' => $order->getDeliveryTimeConfirmMin() ? $order->getDeliveryTimeConfirmMin()->format('Ymd') : '-',
  179.             'timeConfirmMax' => $order->getDeliveryTimeConfirmMax() ? $order->getDeliveryTimeConfirmMax()->format('Ymd') : '-',
  180.         ];
  181.         return $this->send(OneCFuncNameEnum::CONFIRMATION_TERMS$order$oneCData);
  182.     }
  183.     /**
  184.      * Получение pdf файла счета от "1С"
  185.      * @param BuyOrder $order
  186.      * @return RedirectResponse|Response
  187.      * @throws Exception
  188.      */
  189.     public function invoice(BuyOrder $order)
  190.     {
  191.         $buffer $this->send(OneCFuncNameEnum::GET_FILE_CONTRACT_TE$order, [], false);
  192.         if (empty($buffer)) {
  193.             file_put_contents(__DIR__ '/../../../web/pdf/' $order->getNumber() . '.txt'$buffer);
  194.             $response = new RedirectResponse(App::generateUrl('app_buy_order', ['hash' => $order->getHash()]), 302);
  195.         } else {
  196.             $response = new Response();
  197.             $response->headers->set('Content-Description''File Transfer');
  198.             $response->headers->set('Cache-Control''public, must-revalidate, max-age=0');
  199.             $response->headers->set('Pragma''public');
  200.             $response->headers->set('Content-Type''application/pdf');
  201.             $response->headers->set('Content-Transfer-Encoding''binary');
  202.             $response->headers->set('Content-Length'strlen($buffer));
  203.         }
  204.         return $response;
  205.     }
  206.     /**
  207.      * Отправка оплаты
  208.      *
  209.      * @param OrderPayment $payment
  210.      * @return mixed
  211.      * @throws Exception
  212.      */
  213.     public function sendPaymentToOneC(OrderPayment $payment)
  214.     {
  215.         $order $payment->getBuyOrder();
  216.         $data = [
  217.             'transactionid' => $payment->getHash(),
  218.             'pay' => [
  219.                 'type' => $payment->getPaySys(),
  220.                 'data' => $payment->getData(),
  221.                 'sum' => $payment->getAmount(),
  222.                 'curRate' => $payment->getCurRate(),
  223.                 'sumCurrency' => $payment->getCurrency(),
  224.                 'paymentDate' => $payment->getDate()->format('Y-m-d H:i:s'),
  225.             ],
  226.             'paymentSys' => $payment->getPaySysName(),
  227.         ];
  228.         App::getLogger()->error('payment' json_encode(OrderHelper::arrayData($order), JSON_UNESCAPED_UNICODE));
  229.         App::getLogger()->error('payment' json_encode($dataJSON_UNESCAPED_UNICODE));
  230.         return $this->send(OneCFuncNameEnum::SET_PAY_TE$orderarray_merge(OrderHelper::arrayData($order), $data));
  231.     }
  232.     /**
  233.      * Отправка оплаты
  234.      *
  235.      * @param BuyOrder $order
  236.      * @param ?string $type
  237.      * @param bool $decode
  238.      * @return mixed
  239.      * @throws Exception
  240.      */
  241.     public function refund(BuyOrder $order, ?string $type 'compensation'bool $decode true)
  242.     {
  243.         return $this->send(OneCFuncNameEnum::RETURN_AMOUNT$order, ['requisites' => $order->getBankDetails()], $decode$type);
  244.     }
  245.     /**
  246.      * @param BuyOrder $order
  247.      * @return array|mixed|null
  248.      * @throws Exception
  249.      */
  250.     public function additionalDeliveryGoods(BuyOrder $order)
  251.     {
  252.         return $this->send(OneCFuncNameEnum::ADDITIONAL_DELIVERY_GOODS$order);
  253.     }
  254.     /**
  255.      * @param string $hash
  256.      * @return mixed
  257.      * @throws SoapFault
  258.      * @throws Exception
  259.      */
  260.     public function getOrder(string $hash)
  261.     {
  262.         $data json_encode([
  263.             'id' => $hash,
  264.             'mirror' => App::getContainer()->hasParameter('mirror') ? App::getParameter('mirror') : 1,
  265.         ]);
  266.         if ($this->getClient()) {
  267.             try {
  268.                 App::getLogger()->error(OneCFuncNameEnum::GET_ORDER()->toUpper() . '[' $hash '] request: ' $data);
  269.                 $response $this->getClient()->getOrder(['Request' => $data]);
  270.                 App::getLogger()->error(OneCFuncNameEnum::GET_ORDER()->toUpper() . '[' $hash '] response: ' .
  271.                     preg_replace('#\s+#'' '$response->return));
  272.                 return json_decode(preg_replace('#"Error": ".*",#isUu'''$response->return), true);
  273.             } catch (Exception $e) {
  274.                 OrderHelper::Alert([
  275.                     'Exception' => $e->getMessage(),
  276.                     'Trace' => $e->getTraceAsString(),
  277.                     'Request' => $data,
  278.                     'func' => OneCFuncNameEnum::GET_ORDER()->getValue(),
  279.                     'LastRequestHeaders' => $this->getClient()->__getLastRequestHeaders(),
  280.                     'LastRequest' => $this->getClient()->__getLastRequest(),
  281.                     'LastResponseHeaders' => $this->getClient()->__getLastResponseHeaders(),
  282.                     'LastResponse' => $this->getClient()->__getLastResponse(),
  283.                 ]);
  284.                 throw new Exception($e->getMessage(), $e->getCode(), $e);
  285.             }
  286.         }
  287.         return null;
  288.     }
  289.     /**
  290.      * @param string $hash
  291.      * @return mixed
  292.      * @throws SoapFault
  293.      * @throws Exception
  294.      */
  295.     public function getPaymentDate(string $hash)
  296.     {
  297.         $data json_encode([
  298.             'id' => $hash,
  299.             'mirror' => App::getContainer()->hasParameter('mirror') ? App::getParameter('mirror') : 1,
  300.         ]);
  301.         if ($this->getClient()) {
  302.             try {
  303.                 App::getLogger()->error(OneCFuncNameEnum::GET_PAYMENT_DATE()->toUpper() . '[' $hash '] request: ' $data);
  304.                 $response $this->getClient()->getPaymentDate(['Request' => $data]);
  305.                 App::getLogger()->error(OneCFuncNameEnum::GET_PAYMENT_DATE()->toUpper() . '[' $hash '] response: ' preg_replace('#[\s]+#'' '$response->return));
  306.                 return json_decode(preg_replace('#"Error": ".*",#isUu'''$response->return), true);
  307.             } catch (Exception $e) {
  308.                 OrderHelper::Alert([
  309.                     'Exception' => $e->getMessage(),
  310.                     'Trace' => $e->getTraceAsString(),
  311.                     'Request' => $data,
  312.                     'func' => OneCFuncNameEnum::GET_PAYMENT_DATE()->getValue(),
  313.                     'LastRequestHeaders' => $this->getClient()->__getLastRequestHeaders(),
  314.                     'LastRequest' => $this->getClient()->__getLastRequest(),
  315.                     'LastResponseHeaders' => $this->getClient()->__getLastResponseHeaders(),
  316.                     'LastResponse' => $this->getClient()->__getLastResponse(),
  317.                 ]);
  318.                 throw new Exception($e->getMessage(), $e->getCode(), $e);
  319.             }
  320.         }
  321.         return null;
  322.     }
  323.     /**
  324.      * Отправка данных в "1С"
  325.      *
  326.      * @param string $func
  327.      * @param BuyOrder $order
  328.      * @param array $data
  329.      * @param bool $decode
  330.      * @param string|null $type
  331.      * @param int $maxTryToSend сделаем несколько попыток отправить в 1С инфо
  332.      * @return mixed
  333.      * @throws Exception
  334.      * @internal param string $hash
  335.      */
  336.     private function send(string $funcBuyOrder $order, array $data = [], bool $decode true, ?string $type nullint $maxTryToSend self::MAX_TRY_TO_SEND_1C)
  337.     {
  338.         $dataForSend $this->getDataForSend($data$order$funcself::MAX_TRY_TO_SEND_1C $maxTryToSend);
  339.         $dataForSend json_encode($dataForSendJSON_UNESCAPED_UNICODE);
  340.         if (null === $this->getClient($dataForSend)) {
  341.             App::getLogger()->error('SOAP client is null, request: ' $dataForSend);
  342.             if (OneCFuncNameEnum::SET_PAY_TE === $func) {
  343.                 OrderHelper::Alert([
  344.                     'Request' => $dataForSend,
  345.                     'func' => $func,
  346.                     'subject' => 'ОШИБКА ПЕРЕДАЧИ ОПЛАТЫ В 1С',
  347.                     'err' => 'SOAP client is null',
  348.                 ]);
  349.             }
  350.             return null;
  351.         }
  352.         $funcNameForLog strtoupper($func);
  353.         try {
  354.             App::getLogger()->error($funcNameForLog '[' $order->getHash() . '] request: ' $dataForSend);
  355.             $response $this->getClient()->{$func}(['Request' => $dataForSend'type' => $type]);
  356.             // читать логи, когда в них бинарник сохранён очень сложно
  357.             $responseForLog 'success';
  358.             if (OneCFuncNameEnum::GET_FILE_CONTRACT_TE !== $func) {
  359.                 $responseForLog preg_replace('#\s+#'' '$response->return);
  360.             }
  361.             App::getLogger()->error($funcNameForLog '[' $order->getHash() . '] response: ' $responseForLog);
  362.             if (!$decode) {
  363.                 return $response->return;
  364.             }
  365.             // нормализуем данные, полученные от "1C"
  366.             $result $this->normalizeData(
  367.                 json_decode(
  368.                     preg_replace(['#"false"#i''#"true"#i'], ['false''true'], $response->return),
  369.                     true
  370.                 ) ?? []
  371.             );
  372.             if (!empty($result['Error'])) {
  373.                 $params = [
  374.                     'subject' => 'ОШИБКА 1С В ОТВЕТЕ НА ЗАПРОС',
  375.                     'Error' => $result['Error'],
  376.                     'Request' => $dataForSend,
  377.                     'func' => $func,
  378.                 ];
  379.                 OrderHelper::Alert($params);
  380.             }
  381.             return $result;
  382.         } catch (Exception $e) {
  383.             // попытаемся отправить повторно
  384.             if ($maxTryToSend 0) {
  385.                 usleep(random_int(1001000)); // перед повторной отправкой - чуть поспим
  386.                 $this->send($func$order$data$decode$type$maxTryToSend 1);
  387.                 return null;
  388.             }
  389.             $params = [
  390.                 'Exception' => $e->getMessage(),
  391.                 'Trace' => $e->getTraceAsString(),
  392.                 'Request' => $dataForSend,
  393.                 'func' => $func,
  394.                 'LastRequestHeaders' => $this->getClient()->__getLastRequestHeaders(),
  395.                 'LastRequest' => $this->getClient()->__getLastRequest(),
  396.                 'LastResponseHeaders' => $this->getClient()->__getLastResponseHeaders(),
  397.                 'LastResponse' => $this->getClient()->__getLastResponse(),
  398.             ];
  399.             if (OneCFuncNameEnum::SET_PAY_TE === $func) {
  400.                 $params['subject'] = 'ОШИБКА ПЕРЕДАЧИ ОПЛАТЫ В 1С';
  401.             }
  402.             OrderHelper::Alert($params);
  403.             throw new Exception($e->getMessage(), $e->getCode(), $e);
  404.         }
  405.     }
  406.     /**
  407.      * Нормализует данные переданные "1С"
  408.      * @param array $data
  409.      * @param bool $noTime
  410.      * @return array
  411.      */
  412.     public function normalizeData(array $databool $noTime false): array
  413.     {
  414.         // 1C передает hash в id, поэтому меняем ключ на hash, а id удаляем
  415.         if (isset($data['id']) && mb_strlen($data['id']) > 10) {
  416.             $data['hash'] = $data['id'];
  417.             unset($data['id']);
  418.         }
  419.         if (isset($data['Articles'])) {
  420.             if (!empty($data['items'])) {
  421.                 foreach ($data['items'] as $key => $item) {
  422.                     if (isset($data['Articles'][$key])) {
  423.                         $data['items'][$key] = array_merge($item$data['Articles'][$key]);
  424.                         unset($data['Articles'][$key]);
  425.                     }
  426.                 }
  427.                 if (count($data['Articles']) > 0) {
  428.                     $data['items'] = array_merge($data['items'], $data['Articles']);
  429.                 }
  430.             } else {
  431.                 $data['items'] = $data['Articles'];
  432.             }
  433.             unset($data['Articles']);
  434.         }
  435.         if (isset($data['articles'])) {
  436.             if (!empty($data['items'])) {
  437.                 foreach ($data['items'] as $key => $item) {
  438.                     if (isset($data['articles'][$key])) {
  439.                         $data['items'][$key] = array_merge($item$data['articles'][$key]);
  440.                         unset($data['articles'][$key]);
  441.                     }
  442.                 }
  443.                 if (count($data['articles']) > 0) {
  444.                     $data['items'] = array_merge($data['items'], $data['articles']);
  445.                 }
  446.             } else {
  447.                 $data['items'] = $data['articles'];
  448.             }
  449.             unset($data['articles']);
  450.         }
  451.         // правка на случай если статус криво передали
  452.         $data $this->refactorInvalidKey($data'Status''status'true);
  453.         // Номер заказа в "1С"
  454.         $data $this->refactorInvalidKey($data'NumberOrder''number');
  455.         // Номер заказа донора в "1С"
  456.         $data $this->refactorInvalidKey($data'OrdReduct''numberDonor');
  457.         $data $this->refactorInvalidKey($data'sale''specPrice');
  458.         $data $this->refactorInvalidKey($data'ReserveCreated''reserveCreated'true);
  459.         $data $this->refactorInvalidKey($data'ReDelivery''reDelivery'true);
  460.         $data $this->refactorInvalidKey($data'DateCalc''dateCalc');
  461.         $data $this->refactorInvalidKey($data'DateCancel''dateCancel');
  462.         $data $this->refactorInvalidKey($data'ProposedDate''proposedDate');
  463.         $data $this->refactorInvalidKey($data'ProposedDateEx''proposedDateEx');
  464.         $data $this->refactorInvalidKey($data'DateCalcReason''dateCalcReason'true);
  465.         $data $this->refactorInvalidKey($data'Stage''stage');
  466.         $data $this->refactorInvalidKey($data'SumCurrency''sumCurrency');
  467.         if (isset($data['delivery']['lift'])) {
  468.             $data['delivery']['lift'] = (int) ($data['delivery']['lift'] ?? 2);
  469.         }
  470.         if ($noTime) {
  471.             $data['delivery']['timeMin'] = '';
  472.             $data['delivery']['timeMax'] = '';
  473.             $data['delivery']['timeFastPayMin'] = '';
  474.             $data['delivery']['timeFastPayMax'] = '';
  475.             $data['delivery']['timeAlternateMin'] = '';
  476.             $data['delivery']['timeAlternateMax'] = '';
  477.             $data['status'] = 1;
  478.         }
  479.         if (isset($data['delivery']['msg'])) {
  480.             $data['showMSG'] = !empty($data['delivery']['msg']);
  481.             unset($data['delivery']['msg']);
  482.         }
  483.         if (isset($data['delivery']['courier'])) {
  484.             unset($data['delivery']['courier']);
  485.         }
  486.         if (isset($data['carrier']['carrierName'])) {
  487.             $data['carrier']['name'] = empty($data['carrier']['carrierName']) ? '' $data['carrier']['carrierName'];
  488.         }
  489.         if (isset($data['carrier']['carrierContactData'])) {
  490.             $data['carrier']['contactData'] = empty($data['carrier']['carrierContactData']) ? '' $data['carrier']['carrierContactData'];
  491.         }
  492.         if (isset($data['delivery']['status'])) {
  493.             $data['delivery']['status'] = !empty($data['delivery']['status']);
  494.         }
  495.         if (isset($data['delivery']['customsPayment'])) {
  496.             $data['customsPayment'] = empty($data['delivery']['customsPayment']) ? '' $data['delivery']['customsPayment'];
  497.             unset($data['delivery']['customsPayment']);
  498.         }
  499.         if (!empty($data['delivery']['fee'])) {
  500.             $data['fee'] = $data['delivery']['fee'];
  501.             unset($data['delivery']['fee']);
  502.         }
  503.         if (isset($data['payType'])) {
  504.             $data['payment']['type'] = $data['payType'];
  505.             unset($data['payType']);
  506.         }
  507.         if (isset($data['carrier']['contactDate'])) {//@deprecated after 22.09.2021
  508.             $data['carrier']['contactData'] = $data['carrier']['contactDate'];
  509.             unset($data['carrier']['contactDate']);
  510.         }
  511.         if (isset($data['SumComp'])) {
  512.             $data['sumComp'] = str_replace(',''.'$data['SumComp']) ?? '';
  513.             unset($data['SumComp']);
  514.         }
  515.         // todo временно пока идет переход на заказ 2.0
  516.         if (empty($data['recipient']) && !empty($data['delivery'])) {
  517.             $data['recipient']['id'] = 0// todo временно для старого заказа
  518.             if (isset($data['delivery']['index'])) {
  519.                 $data['recipient']['zipCode'] = $data['delivery']['index'];
  520.             }
  521.             if (isset($data['sex'])) {
  522.                 $data['recipient']['sex'] = $data['sex'];
  523.             }
  524.             if (isset($data['clientName'])) {
  525.                 $data['recipient']['name'] = $data['clientName'];
  526.             }
  527.             if (isset($data['clientSurname'])) {
  528.                 $data['recipient']['surname'] = $data['clientSurname'];
  529.             }
  530.             if (isset($data['delivery']['phoneCode'][0])) {
  531.                 $data['recipient']['phoneCode'] = $data['delivery']['phoneCode'][0];
  532.             }
  533.             if (isset($data['delivery']['phone'])) {
  534.                 $data['recipient']['phone'] = $data['delivery']['phone'];
  535.             }
  536.             if (isset($data['email'])) {
  537.                 $data['recipient']['email'] = $data['email'];
  538.             }
  539.             if (isset($data['delivery']['taxNumber'])) {
  540.                 $data['recipient']['taxNumber'] = $data['delivery']['taxNumber'];
  541.             }
  542.             if (isset($data['taxNumber'])) {
  543.                 $data['recipient']['taxNumber'] = $data['taxNumber'];
  544.             }
  545.             if (isset($data['delivery']['region'][0])) {
  546.                 $data['recipient']['region'] = $data['delivery']['region'][0];
  547.             }
  548.             if (isset($data['delivery']['city'])) {
  549.                 $data['recipient']['city'] = $data['delivery']['city'];
  550.             }
  551.             if (isset($data['delivery']['street'])) {
  552.                 $data['recipient']['street'] = $data['delivery']['street'];
  553.             }
  554.             if (isset($data['delivery']['building'])) {
  555.                 $data['recipient']['building'] = $data['delivery']['building'];
  556.             }
  557.             if (isset($data['delivery']['description'])) {
  558.                 $data['recipient']['description'] = $data['delivery']['description'];
  559.             }
  560.             if (isset($data['vat']['type'])) {
  561.                 $data['recipient']['vatType'] = $data['vat']['type'];
  562.             }
  563.             if (isset($data['vat']['number'])) {
  564.                 $data['recipient']['vatNumber'] = $data['vat']['number'];
  565.             }
  566.             if (isset($data['companyName'])) {
  567.                 $data['recipient']['companyName'] = $data['companyName'];
  568.             }
  569.             if (isset($data['delivery']['country'])) {
  570.                 $data['recipient']['country'] = ['id' => (int) $data['delivery']['country']];
  571.             }
  572.             if (isset($data['description'])) {
  573.                 $data['recipient']['description'] = strip_tags($data['description']);
  574.             }
  575.         } elseif (!empty($data['recipient'])) { //todo на время перехода
  576.             if (isset($data['recipient']['email'])) {
  577.                 $data['email'] = $data['recipient']['email'];
  578.             }
  579.             if (isset($data['recipient']['zipCode'])) {
  580.                 $data['delivery']['index'] = $data['recipient']['zipCode'];
  581.             }
  582.             if (isset($data['recipient']['sex'])) {
  583.                 $data['sex'] = $data['recipient']['sex'];
  584.             }
  585.             if (isset($data['recipient']['name'])) {
  586.                 $data['clientName'] = $data['recipient']['name'];
  587.             }
  588.             if (isset($data['recipient']['surname'])) {
  589.                 $data['clientSurname'] = $data['recipient']['surname'];
  590.             }
  591.             if (isset($data['recipient']['phoneCode'][0])) {
  592.                 $data['delivery']['phoneCode'][0] = $data['recipient']['phoneCode'];
  593.             }
  594.             if (isset($data['recipient']['phone'])) {
  595.                 $data['delivery']['phone'] = $data['recipient']['phone'];
  596.             }
  597.             if (isset($data['recipient']['taxNumber'])) {
  598.                 $data['delivery']['taxNumber'] = $data['recipient']['taxNumber'];
  599.             }
  600.             if (isset($data['recipient']['region'])) {
  601.                 $data['delivery']['region'][0] = $data['recipient']['region'];
  602.             }
  603.             if (isset($data['recipient']['city'])) {
  604.                 $data['delivery']['city'] = $data['recipient']['city'];
  605.             }
  606.             if (isset($data['recipient']['street'])) {
  607.                 $data['delivery']['street'] = $data['recipient']['street'];
  608.             }
  609.             if (isset($data['recipient']['building'])) {
  610.                 $data['delivery']['building'] = $data['recipient']['building'];
  611.             }
  612.             if (isset($data['recipient']['description'])) {
  613.                 $data['delivery']['description'] = $data['recipient']['description'];
  614.             }
  615.             if (isset($data['recipient']['vatType'])) {
  616.                 $data['vat']['type'] = $data['recipient']['vatType'];
  617.             }
  618.             if (isset($data['recipient']['number'])) {
  619.                 $data['vat']['number'] = $data['recipient']['vatNumber'];
  620.             }
  621.             if (isset($data['recipient']['companyName'])) {
  622.                 $data['companyName'] = $data['recipient']['companyName'];
  623.             }
  624.             if (isset($data['recipient']['country'])) {
  625.                 $data['delivery']['country'] = (int) $data['recipient']['country']['id'];
  626.             }
  627.             if (isset($data['recipient']['description'])) {
  628.                 $data['delivery']['description'] = strip_tags($data['recipient']['description']);
  629.             }
  630.         }
  631.         return $data;
  632.     }
  633.     private function refactorInvalidKey(array $datastring $invalidKeystring $normalizationKey, ?bool $needCastToInt false): array
  634.     {
  635.         if (isset($data[$invalidKey])) {
  636.             if ($needCastToInt) {
  637.                 $data[$invalidKey] = (int) $data[$invalidKey];
  638.             }
  639.             $data[$normalizationKey] = $data[$invalidKey];
  640.             unset($data[$invalidKey]);
  641.         }
  642.         return $data;
  643.     }
  644.     /**
  645.      * @param array $data
  646.      * @param BuyOrder $order
  647.      * @param string $func
  648.      * @param int $maxTryToSend
  649.      * @return array
  650.      */
  651.     private function getDataForSend(array $dataBuyOrder $orderstring $funcint $maxTryToSend): array
  652.     {
  653.         $additionalData = [
  654.             'id' => $order->getHash(),
  655.             'ip' => RequestHelper::getHumanIp(),
  656.             'timeRequest' => date('Y-m-d H:i:s'),
  657.             'tryToSend' => $maxTryToSend,
  658.         ];
  659.         // если true это тестовый заказ
  660.         $additionalData['markerTest'] = $order->getMarkerTest() == true || UserHelper::isEmployee($order->getEmail());
  661.         $orderId $order->getHash();
  662.         // тут без hash заказа так как "1С" ещё не знает его
  663.         if (OneCFuncNameEnum::CREATE_ORDER_TE === $func) {
  664.             $orderId '';
  665.         }
  666.         $additionalData['checkHash'] = OrderHelper::getMarker($orderId);
  667.         // маркер автоматического теста для которого используется спец ответ
  668.         $additionalData['autotest'] = (int) in_array($order->getEmail(), ['proved@tile.expert''robot@tile.expert']);
  669.         $additionalData['mirror'] = 1;
  670.         if (App::getContainer()->hasParameter('mirror')) {
  671.             $additionalData['mirror'] = App::getParameter('mirror');
  672.         }
  673.         if ($order->getNumber()) {
  674.             $additionalData['number'] = $order->getNumber();
  675.         }
  676.         return array_merge($data$additionalData);
  677.     }
  678. }