<?php
namespace WebBundle\Service;
use Exception;
use FlexApp\Service\RedisCachePool;
use SoapClient;
use SoapFault;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use WebBundle\Entity\BuyOrder;
use WebBundle\Entity\OrderPayment;
use WebBundle\Enum\BuyOrderStatusEnum;
use WebBundle\Enum\OneCFuncNameEnum;
use WebBundle\Filler\OneCFiller;
use WebBundle\Helper\App;
use WebBundle\Helper\OrderHelper;
use WebBundle\Helper\RequestHelper;
use WebBundle\Helper\SoapHelper;
use WebBundle\Helper\UserHelper;
use WebBundle\Repository\VisitRepository;
use WebBundle\Scenario\SendToOneCQueueScenario;
class OrderOneCService
{
private const MAX_TRY_TO_SEND_1C = 1;
/** @required */
public RedisCachePool $redisCachePool;
protected LocationService $locationService;
private VisitRepository $visitRepository;
public function __construct(
LocationService $locationService,
VisitRepository $visitRepository
) {
$this->locationService = $locationService;
$this->visitRepository = $visitRepository;
}
/**
* Подключается к сервису обмена с "1С"
*
* @param string|null $data - строка запроса
* @return Object|SoapClient
* @throws Exception
*/
public function getClient(?string $data = null)
{
return SoapHelper::client(App::getContainer()->getParameter('orderApi_wsdl'), $data);
}
/**
* Проверяет готов ли заказ к запросу ручного расчета доставки
*
* @param BuyOrder $order
* @return bool
* @throws Exception
*/
public function readyRequestDelivery(BuyOrder $order): bool
{
// запросить ручной расчет можно только если статус заказа черновик 1
if ($order->getSendCreate1C() && $order->getStatus() == BuyOrderStatusEnum::REQUEST_DELIVERY) {
return true;
}
return false;
}
/**
* @throws SoapFault|Exception
*/
public function requestBalanceItem($order, $item, ?string $action = null)
{
if (is_array($item)) {
App::dumpExit($item);
}
return $this->send(OneCFuncNameEnum::REQUEST_BALANCE_FACTORY, $order, [
'code' => $item->chooseCode(),
'amount' => $item->getAmount(),
'action' => $action,
], false);
}
/**
* @param BuyOrder $order
* @return mixed
* @throws SoapFault
* @throws Exception
*/
public function bankTransfer(BuyOrder $order)
{
return $this->send(OneCFuncNameEnum::GET_FILE_CONTRACT_TE, $order, OrderHelper::arrayData($order), false);
}
public function sendOrResendOrderToOneC(BuyOrder $order): void
{
if (!OrderHelper::isAddressAvailableInOrder($order)) {
return;
}
if ($order->getStatus() > BuyOrderStatusEnum::PARTIALLY_PAID) {
return;
}
if ($order->getSendCreate1C()) {
$this->resetOrderOneC($order);
}
$this->createOrderOneC(App::getRequest(), $order);
}
/**
* Отправка данных заказа в "1С"
*
* @param Request $request
* @param BuyOrder $order
* @param ?bool $auto Если true – то будет выполнен авто расчет доставки иначе просто запишет изменения в заказ
* @param ?bool $timer
* @return mixed
* @throws SoapFault
* @throws Exception
*/
public function createOrderOneC(Request $request, BuyOrder $order, ?bool $auto = false, ?bool $timer = false): array
{
$pageCount = $this->visitRepository->getVisitCount($order->getToken());
$referer = $request->headers->get('referer');
$ip = $request->getClientIp();
$record = $this->locationService->getCityRecordByRequest($request);
$orderOneCFiller = new OneCFiller();
$oneCData = $orderOneCFiller->fillOrderDataForCreateOrder($order, $pageCount, $ip, $referer, $record, $auto, $timer);
$queue = new SendToOneCQueueScenario($this->redisCachePool->getPool(), $order->getHash(), 'create');
$queue->checkForStart();
$result = $this->send(OneCFuncNameEnum::CREATE_ORDER_TE, $order, $oneCData);
$queue->setFinish();
if (empty($result['Result'])) {
return [];
}
$order->setSendCreate1C(true);
return $result;
}
/**
* Удаляет заказ из "1С"
*
* @param BuyOrder $order
* @return mixed
* @throws SoapFault
* @throws Exception
*/
public function delete(BuyOrder $order)
{
return $this->send(OneCFuncNameEnum::DEL_ORDER, $order);
}
/**
* Отправляет запрос на сброс заказа в "1С"
*
* @param BuyOrder $order
* @param string $info
* @param ?bool $timer
* @return mixed
* @throws SoapFault
* @throws Exception
*/
public function resetOrderOneC(BuyOrder $order, string $info = 'Order has been changed', ?bool $timer = false)
{
$oneCData = array_merge(OrderHelper::arrayData($order), ['info' => $info, 'timer' => $timer ? 1 : 0]);
return $this->send(OneCFuncNameEnum::RESET_ORDER, $order, $oneCData);
}
/**
* Запрос расчета доставки
*
* @param BuyOrder $order
* @return mixed
* @throws Exception
*/
public function delivery(BuyOrder $order)
{
return $this->send(OneCFuncNameEnum::GET_DELIVERY_ORDER, $order, OrderHelper::arrayData($order));
}
/**
* Подтверждение или отклонение сроков
*
* @param BuyOrder $order
* @param boolean $val
* @return mixed
* @throws Exception
*/
public function confirm(BuyOrder $order, bool $val)
{
$oneCData = [
'confirmed' => $val ? '1' : '0',
'timeConfirmMin' => $order->getDeliveryTimeConfirmMin() ? $order->getDeliveryTimeConfirmMin()->format('Ymd') : '-',
'timeConfirmMax' => $order->getDeliveryTimeConfirmMax() ? $order->getDeliveryTimeConfirmMax()->format('Ymd') : '-',
];
return $this->send(OneCFuncNameEnum::CONFIRMATION_TERMS, $order, $oneCData);
}
/**
* Получение pdf файла счета от "1С"
* @param BuyOrder $order
* @return RedirectResponse|Response
* @throws Exception
*/
public function invoice(BuyOrder $order)
{
$buffer = $this->send(OneCFuncNameEnum::GET_FILE_CONTRACT_TE, $order, [], false);
if (empty($buffer)) {
file_put_contents(__DIR__ . '/../../../web/pdf/' . $order->getNumber() . '.txt', $buffer);
$response = new RedirectResponse(App::generateUrl('app_buy_order', ['hash' => $order->getHash()]), 302);
} else {
$response = new Response();
$response->headers->set('Content-Description', 'File Transfer');
$response->headers->set('Cache-Control', 'public, must-revalidate, max-age=0');
$response->headers->set('Pragma', 'public');
$response->headers->set('Content-Type', 'application/pdf');
$response->headers->set('Content-Transfer-Encoding', 'binary');
$response->headers->set('Content-Length', strlen($buffer));
}
return $response;
}
/**
* Отправка оплаты
*
* @param OrderPayment $payment
* @return mixed
* @throws Exception
*/
public function sendPaymentToOneC(OrderPayment $payment)
{
$order = $payment->getBuyOrder();
$data = [
'transactionid' => $payment->getHash(),
'pay' => [
'type' => $payment->getPaySys(),
'data' => $payment->getData(),
'sum' => $payment->getAmount(),
'curRate' => $payment->getCurRate(),
'sumCurrency' => $payment->getCurrency(),
'paymentDate' => $payment->getDate()->format('Y-m-d H:i:s'),
],
'paymentSys' => $payment->getPaySysName(),
];
App::getLogger()->error('payment' . json_encode(OrderHelper::arrayData($order), JSON_UNESCAPED_UNICODE));
App::getLogger()->error('payment' . json_encode($data, JSON_UNESCAPED_UNICODE));
return $this->send(OneCFuncNameEnum::SET_PAY_TE, $order, array_merge(OrderHelper::arrayData($order), $data));
}
/**
* Отправка оплаты
*
* @param BuyOrder $order
* @param ?string $type
* @param bool $decode
* @return mixed
* @throws Exception
*/
public function refund(BuyOrder $order, ?string $type = 'compensation', bool $decode = true)
{
return $this->send(OneCFuncNameEnum::RETURN_AMOUNT, $order, ['requisites' => $order->getBankDetails()], $decode, $type);
}
/**
* @param BuyOrder $order
* @return array|mixed|null
* @throws Exception
*/
public function additionalDeliveryGoods(BuyOrder $order)
{
return $this->send(OneCFuncNameEnum::ADDITIONAL_DELIVERY_GOODS, $order);
}
/**
* @param string $hash
* @return mixed
* @throws SoapFault
* @throws Exception
*/
public function getOrder(string $hash)
{
$data = json_encode([
'id' => $hash,
'mirror' => App::getContainer()->hasParameter('mirror') ? App::getParameter('mirror') : 1,
]);
if ($this->getClient()) {
try {
App::getLogger()->error(OneCFuncNameEnum::GET_ORDER()->toUpper() . '[' . $hash . '] request: ' . $data);
$response = $this->getClient()->getOrder(['Request' => $data]);
App::getLogger()->error(OneCFuncNameEnum::GET_ORDER()->toUpper() . '[' . $hash . '] response: ' .
preg_replace('#\s+#', ' ', $response->return));
return json_decode(preg_replace('#"Error": ".*",#isUu', '', $response->return), true);
} catch (Exception $e) {
OrderHelper::Alert([
'Exception' => $e->getMessage(),
'Trace' => $e->getTraceAsString(),
'Request' => $data,
'func' => OneCFuncNameEnum::GET_ORDER()->getValue(),
'LastRequestHeaders' => $this->getClient()->__getLastRequestHeaders(),
'LastRequest' => $this->getClient()->__getLastRequest(),
'LastResponseHeaders' => $this->getClient()->__getLastResponseHeaders(),
'LastResponse' => $this->getClient()->__getLastResponse(),
]);
throw new Exception($e->getMessage(), $e->getCode(), $e);
}
}
return null;
}
/**
* @param string $hash
* @return mixed
* @throws SoapFault
* @throws Exception
*/
public function getPaymentDate(string $hash)
{
$data = json_encode([
'id' => $hash,
'mirror' => App::getContainer()->hasParameter('mirror') ? App::getParameter('mirror') : 1,
]);
if ($this->getClient()) {
try {
App::getLogger()->error(OneCFuncNameEnum::GET_PAYMENT_DATE()->toUpper() . '[' . $hash . '] request: ' . $data);
$response = $this->getClient()->getPaymentDate(['Request' => $data]);
App::getLogger()->error(OneCFuncNameEnum::GET_PAYMENT_DATE()->toUpper() . '[' . $hash . '] response: ' . preg_replace('#[\s]+#', ' ', $response->return));
return json_decode(preg_replace('#"Error": ".*",#isUu', '', $response->return), true);
} catch (Exception $e) {
OrderHelper::Alert([
'Exception' => $e->getMessage(),
'Trace' => $e->getTraceAsString(),
'Request' => $data,
'func' => OneCFuncNameEnum::GET_PAYMENT_DATE()->getValue(),
'LastRequestHeaders' => $this->getClient()->__getLastRequestHeaders(),
'LastRequest' => $this->getClient()->__getLastRequest(),
'LastResponseHeaders' => $this->getClient()->__getLastResponseHeaders(),
'LastResponse' => $this->getClient()->__getLastResponse(),
]);
throw new Exception($e->getMessage(), $e->getCode(), $e);
}
}
return null;
}
/**
* Отправка данных в "1С"
*
* @param string $func
* @param BuyOrder $order
* @param array $data
* @param bool $decode
* @param string|null $type
* @param int $maxTryToSend сделаем несколько попыток отправить в 1С инфо
* @return mixed
* @throws Exception
* @internal param string $hash
*/
private function send(string $func, BuyOrder $order, array $data = [], bool $decode = true, ?string $type = null, int $maxTryToSend = self::MAX_TRY_TO_SEND_1C)
{
$dataForSend = $this->getDataForSend($data, $order, $func, self::MAX_TRY_TO_SEND_1C - $maxTryToSend);
$dataForSend = json_encode($dataForSend, JSON_UNESCAPED_UNICODE);
if (null === $this->getClient($dataForSend)) {
App::getLogger()->error('SOAP client is null, request: ' . $dataForSend);
if (OneCFuncNameEnum::SET_PAY_TE === $func) {
OrderHelper::Alert([
'Request' => $dataForSend,
'func' => $func,
'subject' => 'ОШИБКА ПЕРЕДАЧИ ОПЛАТЫ В 1С',
'err' => 'SOAP client is null',
]);
}
return null;
}
$funcNameForLog = strtoupper($func);
try {
App::getLogger()->error($funcNameForLog . '[' . $order->getHash() . '] request: ' . $dataForSend);
$response = $this->getClient()->{$func}(['Request' => $dataForSend, 'type' => $type]);
// читать логи, когда в них бинарник сохранён очень сложно
$responseForLog = 'success';
if (OneCFuncNameEnum::GET_FILE_CONTRACT_TE !== $func) {
$responseForLog = preg_replace('#\s+#', ' ', $response->return);
}
App::getLogger()->error($funcNameForLog . '[' . $order->getHash() . '] response: ' . $responseForLog);
if (!$decode) {
return $response->return;
}
// нормализуем данные, полученные от "1C"
$result = $this->normalizeData(
json_decode(
preg_replace(['#"false"#i', '#"true"#i'], ['false', 'true'], $response->return),
true
) ?? []
);
if (!empty($result['Error'])) {
$params = [
'subject' => 'ОШИБКА 1С В ОТВЕТЕ НА ЗАПРОС',
'Error' => $result['Error'],
'Request' => $dataForSend,
'func' => $func,
];
OrderHelper::Alert($params);
}
return $result;
} catch (Exception $e) {
// попытаемся отправить повторно
if ($maxTryToSend > 0) {
usleep(random_int(100, 1000)); // перед повторной отправкой - чуть поспим
$this->send($func, $order, $data, $decode, $type, $maxTryToSend - 1);
return null;
}
$params = [
'Exception' => $e->getMessage(),
'Trace' => $e->getTraceAsString(),
'Request' => $dataForSend,
'func' => $func,
'LastRequestHeaders' => $this->getClient()->__getLastRequestHeaders(),
'LastRequest' => $this->getClient()->__getLastRequest(),
'LastResponseHeaders' => $this->getClient()->__getLastResponseHeaders(),
'LastResponse' => $this->getClient()->__getLastResponse(),
];
if (OneCFuncNameEnum::SET_PAY_TE === $func) {
$params['subject'] = 'ОШИБКА ПЕРЕДАЧИ ОПЛАТЫ В 1С';
}
OrderHelper::Alert($params);
throw new Exception($e->getMessage(), $e->getCode(), $e);
}
}
/**
* Нормализует данные переданные "1С"
* @param array $data
* @param bool $noTime
* @return array
*/
public function normalizeData(array $data, bool $noTime = false): array
{
// 1C передает hash в id, поэтому меняем ключ на hash, а id удаляем
if (isset($data['id']) && mb_strlen($data['id']) > 10) {
$data['hash'] = $data['id'];
unset($data['id']);
}
if (isset($data['Articles'])) {
if (!empty($data['items'])) {
foreach ($data['items'] as $key => $item) {
if (isset($data['Articles'][$key])) {
$data['items'][$key] = array_merge($item, $data['Articles'][$key]);
unset($data['Articles'][$key]);
}
}
if (count($data['Articles']) > 0) {
$data['items'] = array_merge($data['items'], $data['Articles']);
}
} else {
$data['items'] = $data['Articles'];
}
unset($data['Articles']);
}
if (isset($data['articles'])) {
if (!empty($data['items'])) {
foreach ($data['items'] as $key => $item) {
if (isset($data['articles'][$key])) {
$data['items'][$key] = array_merge($item, $data['articles'][$key]);
unset($data['articles'][$key]);
}
}
if (count($data['articles']) > 0) {
$data['items'] = array_merge($data['items'], $data['articles']);
}
} else {
$data['items'] = $data['articles'];
}
unset($data['articles']);
}
// правка на случай если статус криво передали
$data = $this->refactorInvalidKey($data, 'Status', 'status', true);
// Номер заказа в "1С"
$data = $this->refactorInvalidKey($data, 'NumberOrder', 'number');
// Номер заказа донора в "1С"
$data = $this->refactorInvalidKey($data, 'OrdReduct', 'numberDonor');
$data = $this->refactorInvalidKey($data, 'sale', 'specPrice');
$data = $this->refactorInvalidKey($data, 'ReserveCreated', 'reserveCreated', true);
$data = $this->refactorInvalidKey($data, 'ReDelivery', 'reDelivery', true);
$data = $this->refactorInvalidKey($data, 'DateCalc', 'dateCalc');
$data = $this->refactorInvalidKey($data, 'DateCancel', 'dateCancel');
$data = $this->refactorInvalidKey($data, 'ProposedDate', 'proposedDate');
$data = $this->refactorInvalidKey($data, 'ProposedDateEx', 'proposedDateEx');
$data = $this->refactorInvalidKey($data, 'DateCalcReason', 'dateCalcReason', true);
$data = $this->refactorInvalidKey($data, 'Stage', 'stage');
$data = $this->refactorInvalidKey($data, 'SumCurrency', 'sumCurrency');
if (isset($data['delivery']['lift'])) {
$data['delivery']['lift'] = (int) ($data['delivery']['lift'] ?? 2);
}
if ($noTime) {
$data['delivery']['timeMin'] = '';
$data['delivery']['timeMax'] = '';
$data['delivery']['timeFastPayMin'] = '';
$data['delivery']['timeFastPayMax'] = '';
$data['delivery']['timeAlternateMin'] = '';
$data['delivery']['timeAlternateMax'] = '';
$data['status'] = 1;
}
if (isset($data['delivery']['msg'])) {
$data['showMSG'] = !empty($data['delivery']['msg']);
unset($data['delivery']['msg']);
}
if (isset($data['delivery']['courier'])) {
unset($data['delivery']['courier']);
}
if (isset($data['carrier']['carrierName'])) {
$data['carrier']['name'] = empty($data['carrier']['carrierName']) ? '' : $data['carrier']['carrierName'];
}
if (isset($data['carrier']['carrierContactData'])) {
$data['carrier']['contactData'] = empty($data['carrier']['carrierContactData']) ? '' : $data['carrier']['carrierContactData'];
}
if (isset($data['delivery']['status'])) {
$data['delivery']['status'] = !empty($data['delivery']['status']);
}
if (isset($data['delivery']['customsPayment'])) {
$data['customsPayment'] = empty($data['delivery']['customsPayment']) ? '' : $data['delivery']['customsPayment'];
unset($data['delivery']['customsPayment']);
}
if (!empty($data['delivery']['fee'])) {
$data['fee'] = $data['delivery']['fee'];
unset($data['delivery']['fee']);
}
if (isset($data['payType'])) {
$data['payment']['type'] = $data['payType'];
unset($data['payType']);
}
if (isset($data['carrier']['contactDate'])) {//@deprecated after 22.09.2021
$data['carrier']['contactData'] = $data['carrier']['contactDate'];
unset($data['carrier']['contactDate']);
}
if (isset($data['SumComp'])) {
$data['sumComp'] = str_replace(',', '.', $data['SumComp']) ?? '';
unset($data['SumComp']);
}
// todo временно пока идет переход на заказ 2.0
if (empty($data['recipient']) && !empty($data['delivery'])) {
$data['recipient']['id'] = 0; // todo временно для старого заказа
if (isset($data['delivery']['index'])) {
$data['recipient']['zipCode'] = $data['delivery']['index'];
}
if (isset($data['sex'])) {
$data['recipient']['sex'] = $data['sex'];
}
if (isset($data['clientName'])) {
$data['recipient']['name'] = $data['clientName'];
}
if (isset($data['clientSurname'])) {
$data['recipient']['surname'] = $data['clientSurname'];
}
if (isset($data['delivery']['phoneCode'][0])) {
$data['recipient']['phoneCode'] = $data['delivery']['phoneCode'][0];
}
if (isset($data['delivery']['phone'])) {
$data['recipient']['phone'] = $data['delivery']['phone'];
}
if (isset($data['email'])) {
$data['recipient']['email'] = $data['email'];
}
if (isset($data['delivery']['taxNumber'])) {
$data['recipient']['taxNumber'] = $data['delivery']['taxNumber'];
}
if (isset($data['taxNumber'])) {
$data['recipient']['taxNumber'] = $data['taxNumber'];
}
if (isset($data['delivery']['region'][0])) {
$data['recipient']['region'] = $data['delivery']['region'][0];
}
if (isset($data['delivery']['city'])) {
$data['recipient']['city'] = $data['delivery']['city'];
}
if (isset($data['delivery']['street'])) {
$data['recipient']['street'] = $data['delivery']['street'];
}
if (isset($data['delivery']['building'])) {
$data['recipient']['building'] = $data['delivery']['building'];
}
if (isset($data['delivery']['description'])) {
$data['recipient']['description'] = $data['delivery']['description'];
}
if (isset($data['vat']['type'])) {
$data['recipient']['vatType'] = $data['vat']['type'];
}
if (isset($data['vat']['number'])) {
$data['recipient']['vatNumber'] = $data['vat']['number'];
}
if (isset($data['companyName'])) {
$data['recipient']['companyName'] = $data['companyName'];
}
if (isset($data['delivery']['country'])) {
$data['recipient']['country'] = ['id' => (int) $data['delivery']['country']];
}
if (isset($data['description'])) {
$data['recipient']['description'] = strip_tags($data['description']);
}
} elseif (!empty($data['recipient'])) { //todo на время перехода
if (isset($data['recipient']['email'])) {
$data['email'] = $data['recipient']['email'];
}
if (isset($data['recipient']['zipCode'])) {
$data['delivery']['index'] = $data['recipient']['zipCode'];
}
if (isset($data['recipient']['sex'])) {
$data['sex'] = $data['recipient']['sex'];
}
if (isset($data['recipient']['name'])) {
$data['clientName'] = $data['recipient']['name'];
}
if (isset($data['recipient']['surname'])) {
$data['clientSurname'] = $data['recipient']['surname'];
}
if (isset($data['recipient']['phoneCode'][0])) {
$data['delivery']['phoneCode'][0] = $data['recipient']['phoneCode'];
}
if (isset($data['recipient']['phone'])) {
$data['delivery']['phone'] = $data['recipient']['phone'];
}
if (isset($data['recipient']['taxNumber'])) {
$data['delivery']['taxNumber'] = $data['recipient']['taxNumber'];
}
if (isset($data['recipient']['region'])) {
$data['delivery']['region'][0] = $data['recipient']['region'];
}
if (isset($data['recipient']['city'])) {
$data['delivery']['city'] = $data['recipient']['city'];
}
if (isset($data['recipient']['street'])) {
$data['delivery']['street'] = $data['recipient']['street'];
}
if (isset($data['recipient']['building'])) {
$data['delivery']['building'] = $data['recipient']['building'];
}
if (isset($data['recipient']['description'])) {
$data['delivery']['description'] = $data['recipient']['description'];
}
if (isset($data['recipient']['vatType'])) {
$data['vat']['type'] = $data['recipient']['vatType'];
}
if (isset($data['recipient']['number'])) {
$data['vat']['number'] = $data['recipient']['vatNumber'];
}
if (isset($data['recipient']['companyName'])) {
$data['companyName'] = $data['recipient']['companyName'];
}
if (isset($data['recipient']['country'])) {
$data['delivery']['country'] = (int) $data['recipient']['country']['id'];
}
if (isset($data['recipient']['description'])) {
$data['delivery']['description'] = strip_tags($data['recipient']['description']);
}
}
return $data;
}
private function refactorInvalidKey(array $data, string $invalidKey, string $normalizationKey, ?bool $needCastToInt = false): array
{
if (isset($data[$invalidKey])) {
if ($needCastToInt) {
$data[$invalidKey] = (int) $data[$invalidKey];
}
$data[$normalizationKey] = $data[$invalidKey];
unset($data[$invalidKey]);
}
return $data;
}
/**
* @param array $data
* @param BuyOrder $order
* @param string $func
* @param int $maxTryToSend
* @return array
*/
private function getDataForSend(array $data, BuyOrder $order, string $func, int $maxTryToSend): array
{
$additionalData = [
'id' => $order->getHash(),
'ip' => RequestHelper::getHumanIp(),
'timeRequest' => date('Y-m-d H:i:s'),
'tryToSend' => $maxTryToSend,
];
// если true это тестовый заказ
$additionalData['markerTest'] = $order->getMarkerTest() == true || UserHelper::isEmployee($order->getEmail());
$orderId = $order->getHash();
// тут без hash заказа так как "1С" ещё не знает его
if (OneCFuncNameEnum::CREATE_ORDER_TE === $func) {
$orderId = '';
}
$additionalData['checkHash'] = OrderHelper::getMarker($orderId);
// маркер автоматического теста для которого используется спец ответ
$additionalData['autotest'] = (int) in_array($order->getEmail(), ['proved@tile.expert', 'robot@tile.expert']);
$additionalData['mirror'] = 1;
if (App::getContainer()->hasParameter('mirror')) {
$additionalData['mirror'] = App::getParameter('mirror');
}
if ($order->getNumber()) {
$additionalData['number'] = $order->getNumber();
}
return array_merge($data, $additionalData);
}
}