src/CoreBundle/Component/FormManager.php line 351

Open in your IDE?
  1. <?php
  2. namespace CoreBundle\Component;
  3. use DcSiteBundle\Entity\Accessories;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  6. use Symfony\Component\Mailer\Mailer;
  7. use Symfony\Component\Mime\Address;
  8. use Symfony\Component\Mime\Email;
  9. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  10. use Throwable;
  11. use Doctrine\ORM\NonUniqueResultException;
  12. use ApiBundle\Model\CallMeFormModel;
  13. use ApiBundle\Model\LeasingFormModel;
  14. use CoreBundle\Entity\Dealer;
  15. use CoreBundle\Entity\Forms;
  16. use CoreBundle\Entity\User;
  17. use CoreBundle\Entity\Vehicles\InStock;
  18. use CoreBundle\Entity\Vehicles\Vehicle;
  19. use CoreBundle\Services\FileUploader;
  20. use DateTime;
  21. use DcSiteBundle\Entity\Vacancy;
  22. use DcSiteBundle\Entity\VacancyForm;
  23. use Doctrine\ORM\OptimisticLockException;
  24. use InsuranceBundle\Form\OrderInsuranceType;
  25. use Symfony\Component\Form\FormError;
  26. use Symfony\Component\Form\FormInterface;
  27. use Symfony\Component\HttpFoundation\JsonResponse;
  28. use Symfony\Component\HttpFoundation\Request;
  29. use Symfony\Component\HttpFoundation\Session\Session;
  30. use Symfony\Component\Validator\ConstraintViolationListInterface;
  31. use Twig\Environment;
  32. use Twig\Error\Error;
  33. use CoreBundle\Services\Mail\VacancyMail;
  34. class FormManager
  35. {
  36.     const TYPE_COMMON_FORM 1;
  37.     const TYPE_SERVICE_FORM 2;
  38.     const TYPE_TEST_DRIVE_FORM 3;
  39.     const TYPE_CREDIT_FORM 4;
  40.     const TYPE_ORDER_FORM 5;
  41.     const TYPE_TRADE_IN_FORM 6;
  42.     const TYPE_ESTIMATE_FORM 7;
  43.     const TYPE_BUY_PARTS_FORM 8;
  44.     const TYPE_VACANCY_FORM 9;
  45.     const TYPE_BUY_IN_SCTOCK_FORM 10;
  46.     const TYPE_CONFIGURATOR_OFFER 11;
  47.     const TYPE_ORDER_CALL 12;
  48.     const TYPE_SERVICES_ORDER 13;
  49.     const TYPE_ORDER_INSURANCE_FORM 14;
  50.     const TYPE_REPAIR_CALC 15;
  51.     const TYPE_REPAIR_PHOTO 16;
  52.     const TYPE_SUPPORT 17;
  53.     const TYPE_RENT 18;
  54.     const TYPE_PERSONAL 19;
  55.     const TYPE_FIND_PART 20;
  56.     const TYPE_GOODS_ORDER 21;
  57.     const TYPE_INSURANCE_EXTEND 22;
  58.     const TYPE_COMMISSION_TECHNOLOGY 23;
  59.     const TYPE_BUY_SPARE_PARTS 24;
  60.     const TYPE_TIRES_CONFIGURATOR 25;
  61.     const TYPE_INSURANCE 26;
  62.     const TYPE_CORP_SALE 27;
  63.     const TYPE_EXTENDED_WARRANTY 28;
  64.     const TYPE_BUY_USED_CAR 29;
  65.     const TYPE_LEASING_CALCULATOR 30;
  66.     const TYPE_OIL_TO 31;
  67.     const TYPE_ONLINE_CONSULTANTS 32;
  68.     const TYPE_MOTO_TEST_DRIVE 33;
  69.     const TYPE_QUALITY_CONTROL 34;
  70.     const TYPE_SERVICE_CAMPAING_CAR 35;
  71.     const TYPE_BUY_USED_PREORDER_FORM 36;
  72.     const TYPE_WATER_TEST_DRIVE 37;
  73.     const TYPE_SAVE_DESIGN 38;
  74.     const TYPE_SEND_QUESTION 39;
  75.     const TYPE_ONLINE_SERVICE_REGISTRATION 40;
  76.     const TYPE_WITHOUT_PAY_ORDER 41;
  77.     const TYPE_SMS_LEAD 42;
  78.     const TYPE_UNICOMMERCE_FLEET_UPDATING 43;
  79.     const TYPE_CASCO_CALC 44;
  80.     const TYPE_APPLICATION_FOR_SETTLEMENT 45;
  81.     const TYPE_TIRES_HOTEL_CALL 47;
  82.     const TYPE_TIRES_HOTEL_ORDER 48;
  83.     const TYPE_REDEMPTION 49;
  84.     const TYPE_REPLACEMENT_CAR 50;
  85.     const TYPE_LANDING_PAGE 51;
  86.     const TYPE_UNICOMMERCE_CONSULT 55;
  87.     const TYPE_INSURANCE_CONSULT 56;
  88.     const GA_EVENT_COMMON 'ask-question';
  89.     const GA_EVENT_TD 'test-drive';
  90.     const GA_EVENT_CREDIT 'calc-credit-sum';
  91.     const GA_EVENT_TRADE_IN 'trade-in';
  92.     const GA_EVENT_SERVICE 'record-sto';
  93.     const GA_EVENT_BUY_PARTS 'order-accessory';
  94.     const GA_EVENT_BUY_CAR 'order-car';
  95.     const GA_EVENT_ORDER_CALL 'order-call';
  96.     const GA_EVENT_SERVICES_ORDER 'services-order';
  97.     const GA_EVENT_ORDER_IN_STOCK 'in-stock';
  98.     const GA_EVENT_CONFIGURATOR 'configurator-offer';
  99.     const GA_EVENT_ESTIMATE 'estimate-form';
  100.     const GA_EVENT_INSURANCE_ORDER 'insurance-order-form';
  101.     const GA_EVENT_RENT_ORDER 'rent-order-form';
  102.     private EntityManagerInterface $entityManager;
  103.     /**
  104.      * CoreFormFactory
  105.      */
  106.     private $formFactory;
  107.     private SessionInterface $session;
  108.     /**
  109.      * @var FileUploader
  110.      */
  111.     private $fileUploader;
  112.     private Environment $twig;
  113.     /**
  114.      * @var Mailer
  115.      */
  116.     private $mailer;
  117.     /** @var TokenStorageInterface */
  118.     private $tokenStorage;
  119.     public function __construct(
  120.         EntityManagerInterface   $entityManager,
  121.         CoreFormFactory $formFactory,
  122.         SessionInterface         $session,
  123.         FileUploader    $fileUploader,
  124.         Environment      $twig,
  125.         Mailer   $mailer,
  126.         TokenStorageInterface $tokenStorage,
  127.         VacancyMail     $vacancyMail
  128.     )
  129.     {
  130.         $this->formFactory $formFactory;
  131.         $this->entityManager $entityManager;
  132.         $this->session $session;
  133.         $this->fileUploader $fileUploader;
  134.         $this->twig $twig;
  135.         $this->mailer $mailer;
  136.         $this->tokenStorage $tokenStorage;
  137.         $this->vacancyMail $vacancyMail;
  138.     }
  139.     public static function getTypeName($type)
  140.     {
  141.         switch ($type) {
  142.             case self::TYPE_COMMON_FORM:
  143.                 $title 'Обратная связь';
  144.                 break;
  145.             case self::TYPE_ONLINE_CONSULTANTS:
  146.                 $title 'Онлайн консультація / тест драйв';
  147.                 break;
  148.             case self::TYPE_SERVICE_FORM:
  149.                 $title 'Запись на сервис';
  150.                 break;
  151.             case self::TYPE_TEST_DRIVE_FORM:
  152.                 $title 'Тест драйв';
  153.                 break;
  154.             case self::TYPE_CREDIT_FORM:
  155.                 $title 'Кредит';
  156.                 break;
  157.             case self::TYPE_ORDER_FORM:
  158.                 $title 'Заказ авто';
  159.                 break;
  160.             case self::TYPE_TRADE_IN_FORM:
  161.                 $title 'Трейдин';
  162.                 break;
  163.             case self::TYPE_ESTIMATE_FORM:
  164.                 $title 'Оценка авто';
  165.                 break;
  166.             case self::TYPE_BUY_PARTS_FORM:
  167.                 $title 'Заказ запчастей';
  168.                 break;
  169.             case self::TYPE_VACANCY_FORM:
  170.                 $title 'Вакансии';
  171.                 break;
  172.             case self::TYPE_BUY_IN_SCTOCK_FORM:
  173.                 $title 'Заказ авто в наличии';
  174.                 break;
  175.             case self::TYPE_CONFIGURATOR_OFFER:
  176.                 $title 'Конфигуратор';
  177.                 break;
  178.             case self::TYPE_ORDER_CALL:
  179.                 $title 'Заказ звонка';
  180.                 break;
  181.             case self::TYPE_SERVICES_ORDER:
  182.                 $title 'Заказ услуг';
  183.                 break;
  184.             case self::TYPE_ORDER_INSURANCE_FORM:
  185.                 $title 'Заказ страховки';
  186.                 break;
  187.             case self::TYPE_REPAIR_CALC:
  188.                 $title 'Кузовной';
  189.                 break;
  190.             case self::TYPE_REPAIR_PHOTO:
  191.                 $title 'Кузовной по фото ';
  192.                 break;
  193.             case self::TYPE_SUPPORT:
  194.                 $title 'Поддержка';
  195.                 break;
  196.             case self::TYPE_RENT:
  197.                 $title 'Заказ аренды техники';
  198.                 break;
  199.             case self::TYPE_PERSONAL:
  200.                 $title 'Персональное предложение';
  201.                 break;
  202.             case self::TYPE_FIND_PART:
  203.                 $title 'Запчасти';
  204.                 break;
  205.             case self::TYPE_INSURANCE_EXTEND:
  206.                 $title 'Стоимость продленная гарантия';
  207.                 break;
  208.             case self::TYPE_COMMISSION_TECHNOLOGY:
  209.                 $title 'Техника на комиссию';
  210.                 break;
  211.             case self::TYPE_BUY_SPARE_PARTS:
  212.                 $title 'Заказ новых запчастей';
  213.                 break;
  214.             case self::TYPE_TIRES_CONFIGURATOR:
  215.                 $title 'Конфигуратор шин';
  216.                 break;
  217.             case self::TYPE_INSURANCE:
  218.                 $title 'Страхование';
  219.                 break;
  220.             case self::TYPE_CORP_SALE:
  221.                 $title 'Корпоративные продажи';
  222.                 break;
  223.             case self::TYPE_EXTENDED_WARRANTY:
  224.                 $title 'Продление гарантии';
  225.                 break;
  226.             case self::TYPE_BUY_USED_CAR:
  227.                 $title 'Авто с пробегом';
  228.                 break;
  229.             case self::TYPE_BUY_USED_PREORDER_FORM:
  230.                 $title 'Предзаказ авто с пробегом';
  231.                 break;
  232.             case self::TYPE_LEASING_CALCULATOR:
  233.                 $title 'Лизинговый калькулятор';
  234.                 break;
  235.             case self::TYPE_SERVICE_CAMPAING_CAR:
  236.                 $title 'Наявність сервісних кампаній';
  237.                 break;
  238.             case self::TYPE_SAVE_DESIGN:
  239.                 $title 'Сохранить дизайн выбранной модели';
  240.                 break;
  241.             case self::TYPE_SEND_QUESTION:
  242.                 $title 'Отправить запрос';
  243.                 break;
  244.             case self::TYPE_ONLINE_SERVICE_REGISTRATION:
  245.                 $title 'Онлайн запись на сервис';
  246.                 break;
  247.             case self::TYPE_WITHOUT_PAY_ORDER:
  248.                 $title 'Замовлення без оплати';
  249.                 break;
  250.             case self::TYPE_APPLICATION_FOR_SETTLEMENT:
  251.                 $title 'Заявка на розрахунок';
  252.                 break;
  253.             case self::TYPE_TIRES_HOTEL_CALL:
  254.                 $title 'Отрмати консультацію по зберіганню шин';
  255.                 break;
  256.             case self::TYPE_TIRES_HOTEL_ORDER:
  257.                 $title 'Заявка по зберіганню шин';
  258.                 break;
  259.             case self::TYPE_REPLACEMENT_CAR:
  260.                 $title 'Заявка на підмінне авто';
  261.                 break;
  262.             default:
  263.                 $title 'Не определена';
  264.                 break;
  265.         }
  266.         return $title;
  267.     }
  268.     public static function getGaEventByFormType($type)
  269.     {
  270.         $events = [
  271.             self::TYPE_COMMON_FORM => self::GA_EVENT_COMMON,
  272.             self::TYPE_TEST_DRIVE_FORM => self::GA_EVENT_TD,
  273.             self::TYPE_CREDIT_FORM => self::GA_EVENT_CREDIT,
  274.             self::TYPE_TRADE_IN_FORM => self::GA_EVENT_TRADE_IN,
  275.             self::TYPE_SERVICE_FORM => self::GA_EVENT_SERVICE,
  276.             self::TYPE_BUY_PARTS_FORM => self::GA_EVENT_BUY_PARTS,
  277.             self::TYPE_ORDER_FORM => self::GA_EVENT_BUY_CAR,
  278.             self::TYPE_ORDER_CALL => self::GA_EVENT_ORDER_CALL,
  279.             self::TYPE_SERVICES_ORDER => self::GA_EVENT_SERVICES_ORDER,
  280.             self::TYPE_BUY_IN_SCTOCK_FORM => self::GA_EVENT_ORDER_IN_STOCK,
  281.             self::TYPE_CONFIGURATOR_OFFER => self::GA_EVENT_CONFIGURATOR,
  282.             self::TYPE_RENT => self::GA_EVENT_RENT_ORDER,
  283.         ];
  284.         return $events[$type] ?? null;
  285.     }
  286.     /**
  287.      * @param $typeId
  288.      * @param bool $translate
  289.      * @return mixed
  290.      */
  291.     public static function getFormTypeName($typeId null$translate false)
  292.     {
  293.         $types = [
  294.             self::TYPE_COMMON_FORM => $translate 'Обратная связь' 'Feedback',
  295.             self::TYPE_SERVICE_FORM => $translate 'Сервис' 'Service',
  296.             self::TYPE_TEST_DRIVE_FORM => $translate 'Тест-драйв' 'Test-drive',
  297.             self::TYPE_CREDIT_FORM => $translate 'Кредит' 'Credit',
  298.             self::TYPE_ORDER_FORM => $translate 'Заказ авто' 'Buy',
  299.             self::TYPE_TRADE_IN_FORM => $translate 'Трейд-ин' 'Trade-in',
  300.             self::TYPE_ESTIMATE_FORM => $translate 'Оценка автомобиля' 'Estimate',
  301.             self::TYPE_BUY_PARTS_FORM => $translate 'Заказ запчастей и аксессуаров' 'Buy accessories (parts)',
  302.             self::TYPE_VACANCY_FORM => $translate 'Вакансии' 'Vacancy',
  303.             self::TYPE_ORDER_CALL => $translate 'Заказ обратного звонка' 'Callback order',
  304.             self::TYPE_SERVICES_ORDER => $translate 'Обратная связь' 'Services order',
  305.             self::TYPE_ORDER_INSURANCE_FORM => $translate 'Страхование' 'Insurance form',
  306.             self::TYPE_SUPPORT => $translate 'Поддержка пользователей' 'Support form',
  307.             self::TYPE_RENT => $translate 'Аренда техники' 'Rent form',
  308.             self::TYPE_REPAIR_CALC => $translate 'Подсчет ремонта' 'Repair calc',
  309.             self::TYPE_REPAIR_PHOTO => $translate 'Подсчет ремонта по фото' 'Repair photo',
  310.         ];
  311.         if ($typeId) {
  312.             return $types[$typeId];
  313.         }
  314.         return $types;
  315.     }
  316.     /**
  317.      * @param $data
  318.      * @return bool
  319.      */
  320.     private function validateCaptcha($data): bool
  321.     {
  322.         $sToken $token $key false;
  323.         $captchaData = [];
  324.         if (isset($data['captcha'])) {
  325.             $captcha $data['captcha'];
  326.             $captchaData explode('#'$captcha);
  327.         }
  328.         if ($captchaData && count($captchaData) == 2) {
  329.             $key $captchaData[0];
  330.             $token $captchaData[1];
  331.             $sToken $this->session->get($key);
  332.         }
  333.         if (!$token || !$sToken || !$key) {
  334.             return false;
  335.         }
  336.         if ($sToken != $token) {
  337.             return false;
  338.         }
  339.         $this->session->remove($key);
  340.         return true;
  341.     }
  342.     private function hasPrivacy($data): bool
  343.     {
  344.         if (isset($data['privacy']) && !(boolean)$data['privacy']) {
  345.             return false;
  346.         }
  347.         return true;
  348.     }
  349.     private function validateTireConfigures(FormInterface $form$data$locale)
  350.     {
  351.         if (empty($data['diameter']) && empty($data['width']) && empty($data['profile'])) {
  352.             return true;
  353.         } else if (!empty($data['diameter']) && !empty($data['width']) && !empty($data['profile'])) {
  354.             return true;
  355.         }
  356.         $errors = [];
  357.         if (empty($data['diameter'])) {
  358.             $error $locale == 'ua' 'Заповніть поле "Діаметр"' 'Заполните поле "Диаметр"';
  359.             $errors['diameter'] = [$error];
  360.         }
  361.         if (empty($data['width'])) {
  362.             $error $locale == 'ua' 'Заповніть поле "Ширина"' 'Заполните поле "Ширина"';
  363.             $errors['width'] = [$error];
  364.         }
  365.         if (empty($data['profile'])) {
  366.             $error $locale == 'ua' 'Заповніть поле "Висота профілю"' 'Заполните поле "Высота профилю"';
  367.             $errors['profile'] = [$error];
  368.         }
  369.         return ['errors' => $errors];
  370.     }
  371.     /**
  372.      * @param $form
  373.      * @return bool
  374.      */
  375.     private function validateForm($form)
  376.     {
  377.         $isValid $form->isValid();
  378.         if (!$isValid) {
  379.             foreach ($form->getErrors() as $error) {
  380.                 if ($error->getOrigin()->getName() == 'captcha' && count($form->getErrors()) == 1) {
  381.                     $isValid true;
  382.                 }
  383.             }
  384.         }
  385.         return $isValid;
  386.     }
  387.     /**
  388.      * @param Request $request
  389.      * @param Dealer|null $dealer
  390.      * @return JsonResponse
  391.      * @throws OptimisticLockException
  392.      */
  393.     public function saveFeedbackForm(Request $requestDealer $dealer null)
  394.     {
  395.         $feedbackEntity = new Forms();
  396.         $feedbackEntity->setDomain($request->getHost());
  397.         $feedbackEntity->setDateCreate(new DateTime());
  398.         $feedbackEntity->setType(self::TYPE_COMMON_FORM);
  399.         $form $this->formFactory->feedbackQuestionForm($feedbackEntity);
  400.         $data $request->request->all($form->getName());
  401.         if (!$this->hasPrivacy($data)) {
  402.             return new JsonResponse(['success' => false'error' => 'privacy']);
  403.         }
  404.         if (!$this->validateCaptcha($data)) {
  405.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  406.         }
  407.         $form->handleRequest($request);
  408.         // Спосіб зв'язку для Тойота Бориспіль
  409.         if ($dealer && $dealer->getId() == 43) {
  410.             $formData json_decode($feedbackEntity->getData());
  411.             $formData->connectionType $request->request->get('communication');
  412.             $feedbackEntity->setData(json_encode($formData));
  413.         }
  414.         $isValid $this->validateForm($form);
  415.         if ($form->isSubmitted() && $isValid) {
  416.             $feedbackEntity->setDealer($dealer);
  417.             $this->entityManager->persist($feedbackEntity);
  418.             $this->entityManager->flush();
  419.             return new JsonResponse(['success' => true]);
  420.         }
  421.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  422.     }
  423.     /**
  424.      * @param Request $request
  425.      * @param Dealer $dealer
  426.      * @param string $name
  427.      * @param string $phone
  428.      * @param array $data
  429.      * @return void
  430.      * @throws OptimisticLockException
  431.      */
  432.     public function saveSmsLeadForm(Request $requestDealer $dealerstring $namestring $phone, array $data): void
  433.     {
  434.         try {
  435.             $this->entityManager->beginTransaction();
  436.             $checkSameForm $this->entityManager
  437.                 ->getRepository(Forms::class)
  438.                 ->getByTypeDateAndPhone(self::TYPE_SMS_LEAD, new DateTime('now - 3 day'), $phone$data['vin']);
  439.             if (count($checkSameForm) !== 0) {
  440.                 $this->entityManager->rollback();
  441.                 return;
  442.             }
  443.             $form = (new Forms())
  444.                 ->setDomain($request->getHost())
  445.                 ->setDealer($dealer)
  446.                 ->setDateCreate(new DateTime())
  447.                 ->setType(self::TYPE_SMS_LEAD)
  448.                 ->setName($name)
  449.                 ->setPhone($phone)
  450.                 ->setData(json_encode($data));
  451.             $this->entityManager->persist($form);
  452.             $this->entityManager->flush();
  453.             $this->entityManager->commit();
  454.         } catch (Throwable $e) {
  455.             $this->entityManager->rollback();
  456.         }
  457.     }
  458.     /**
  459.      * @param Request $request
  460.      * @param Dealer|null $dealer
  461.      * @return JsonResponse
  462.      * @throws OptimisticLockException
  463.      * @throws NonUniqueResultException
  464.      */
  465.     public function saveCallbackForm(Request $requestDealer $dealer null)
  466.     {
  467.         $requestData $request->request->get('call_order', []);
  468.         if ($requestData['second_name']) {
  469.             $requestData['name'] = sprintf("%s %s"$requestData['name'], $requestData['second_name']);
  470.             $request->request->set('call_order'$requestData);
  471.         }
  472.         $feedbackEntity = new Forms();
  473.         $feedbackEntity->setDomain($request->getHost());
  474.         $feedbackEntity->setDateCreate(new DateTime());
  475.         $feedbackEntity->setType(self::TYPE_ORDER_CALL);
  476.         $form $this->formFactory->orderCallForm($feedbackEntity$dealer);
  477.         $data $request->request->all($form->getName());
  478.         if (!$this->validateCaptcha($data)) {
  479.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  480.         }
  481.         $form->handleRequest($request);
  482.         $isValid $this->validateForm($form);
  483.         if ($form->isSubmitted() && $isValid) {
  484.             $feedbackEntity->setDealer($dealer);
  485.             $this->entityManager->persist($feedbackEntity);
  486.             $this->entityManager->flush();
  487.             return new JsonResponse(['success' => true]);
  488.         }
  489.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  490.     }
  491.     public function saveExtendedWarrantyForm(Request $requestDealer $dealer null)
  492.     {
  493.         $formEntity = new Forms();
  494.         $formEntity->setDomain($request->getHost());
  495.         $formEntity->setDateCreate(new DateTime());
  496.         $formEntity->setType(self::TYPE_EXTENDED_WARRANTY);
  497.         $form $this->formFactory->extendedWarrantyForm($formEntity$dealer);
  498.         $data $request->request->all($form->getName());
  499.         if (!$this->validateCaptcha($data)) {
  500.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  501.         }
  502.         $form->handleRequest($request);
  503.         $isValid $this->validateForm($form);
  504.         if ($form->isSubmitted() && $isValid) {
  505.             $formEntity->setDealer($dealer);
  506.             $this->entityManager->persist($formEntity);
  507.             $this->entityManager->flush();
  508.             return new JsonResponse(['success' => true]);
  509.         }
  510.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  511.     }
  512.     /**
  513.      * @param Request $request
  514.      * @param Dealer|null $dealer
  515.      * @return JsonResponse
  516.      * @throws OptimisticLockException
  517.      */
  518.     public function saveBuyCarForm(Request $requestDealer $dealer null)
  519.     {
  520.         $buyForm = new Forms();
  521.         $buyForm->setDomain($request->getHost());
  522.         $buyForm->setDateCreate(new DateTime());
  523.         $buyForm->setType(self::TYPE_ORDER_FORM);
  524.         if (isset($request->request->all('buy')['message_type'])) {
  525.             $buyForm->setData(json_encode(
  526.                 [
  527.                     'message_type' => $request->request->all('buy')['message_type'],
  528.                     'comment' => $request->request->all('buy')['comment'],
  529.                 ]
  530.             ));
  531.         }
  532.         $form $this->formFactory->buyForm($buyForm);
  533.         $data $request->request->all($form->getName());
  534.         if (!$this->hasPrivacy($data)) {
  535.             return new JsonResponse(['success' => false'error' => 'privacy']);
  536.         }
  537.         if (!$this->validateCaptcha($data)) {
  538.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  539.         }
  540.         $form->handleRequest($request);
  541.         if (!$dealer) {
  542.             $dealer $buyForm->getVehicle()->getDealer();
  543.         }
  544.         $buyForm->setDealer($dealer);
  545.         $isValid $this->validateForm($form);
  546.         if ($form->isSubmitted() && $isValid) {
  547.             if ($buyForm->getVehicle()->getIsNotFilled()) {
  548.                 $buyForm->setIsPreorder(1);
  549.             }
  550.             $this->entityManager->persist($buyForm);
  551.             $this->entityManager->flush();
  552.             return new JsonResponse([
  553.                 'success' => true,
  554.                 'name' => $buyForm->getName(),
  555.                 'phone' => $buyForm->getPhone()
  556.             ]);
  557.         }
  558.         return new JsonResponse([
  559.             'success' => false,
  560.             'errors' => $this->getErrorsFromForm($form)
  561.         ]);
  562.     }
  563.     /**
  564.      * @param Request $request
  565.      * @param Dealer|null $dealer
  566.      * @return JsonResponse
  567.      * @throws OptimisticLockException
  568.      */
  569.     public function savePreorderCarForm(Request $requestDealer $dealer null)
  570.     {
  571.         $preorderForm = new Forms();
  572.         $preorderForm->setDomain($request->getHost());
  573.         $preorderForm->setDateCreate(new DateTime());
  574.         $preorderForm->setType(self::TYPE_ORDER_FORM);
  575.         $form $this->formFactory->preorderForm($preorderForm);
  576.         $data $request->request->all($form->getName());
  577.         if (!$this->hasPrivacy($data)) {
  578.             return new JsonResponse(['success' => false'error' => 'privacy']);
  579.         }
  580.         if (!$this->validateCaptcha($data)) {
  581.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  582.         }
  583.         $form->handleRequest($request);
  584.         if (!$dealer) {
  585.             $preorderForm->setDealer($preorderForm->getVehicle()->getDealer());
  586.         } else {
  587.             $preorderForm->setDealer($dealer);
  588.         }
  589.         $isValid $this->validateForm($form);
  590.         if ($form->isSubmitted() && $isValid) {
  591.             return new JsonResponse([
  592.                 'success' => true,
  593.                 'name' => $preorderForm->getName(),
  594.                 'phone' => $preorderForm->getPhone()
  595.             ]);
  596.         }
  597.         return new JsonResponse([
  598.             'success' => false,
  599.             'errors' => $this->getErrorsFromForm($form)
  600.         ]);
  601.     }
  602.     /**
  603.      * @param Request $request
  604.      * @param Dealer|null $dealer
  605.      * @param InStock $vehicle
  606.      * @return JsonResponse
  607.      * @throws OptimisticLockException
  608.      */
  609.     public function saveBuyInStockCarForm(Request $requestDealer $dealer null$vehicle null)
  610.     {
  611.         $buyForm = new Forms();
  612.         $buyForm->setDomain($request->getHost());
  613.         $buyForm->setDateCreate(new DateTime());
  614.         $buyForm->setType(self::TYPE_BUY_IN_SCTOCK_FORM);
  615.         $form $this->formFactory->buyInStockForm($buyForm);
  616.         $data $request->request->all($form->getName());
  617.         if (!$this->validateCaptcha($data)) {
  618.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  619.         }
  620.         $form->handleRequest($request);
  621.         if ($vehicle instanceof InStock) {
  622.             $buyForm->setVehicleInStock($vehicle);
  623.         }
  624.         if ($vehicle instanceof Vehicle) {
  625.             $buyForm->setVehicle($vehicle);
  626.         }
  627.         $buyForm->setDealer($dealer);
  628.         $isValid $this->validateForm($form);
  629.         if ($form->isSubmitted() && $isValid) {
  630.             $this->entityManager->persist($buyForm);
  631.             $this->entityManager->flush();
  632.             return new JsonResponse([
  633.                 'success' => true,
  634.                 'name' => $buyForm->getName(),
  635.                 'phone' => $buyForm->getPhone()
  636.             ]);
  637.         }
  638.         return new JsonResponse([
  639.             'success' => false,
  640.             'errors' => $this->getErrorsFromForm($form)
  641.         ]);
  642.     }
  643.     /**
  644.      * @param Request $request
  645.      * @param Dealer|null $dealer
  646.      * @return JsonResponse
  647.      * @throws OptimisticLockException
  648.      */
  649.     public function saveCreditForm(Request $requestDealer $dealer null)
  650.     {
  651.         $creditForm = new Forms();
  652.         $creditForm->setDomain($request->getHost());
  653.         $creditForm->setDateCreate(new DateTime());
  654.         $creditForm->setType(self::TYPE_CREDIT_FORM);
  655.         $form $this->formFactory->creditForm($dealer$creditForm);
  656.         $data $request->request->all($form->getName());
  657.         if (!$this->validateCaptcha($data)) {
  658.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  659.         }
  660.         $form->handleRequest($request);
  661.         $isValid $this->validateForm($form);
  662.         if ($form->isSubmitted() && $isValid) {
  663.             $creditForm->setDealer($dealer);
  664.             $this->entityManager->persist($creditForm);
  665.             $this->entityManager->flush();
  666.             return new JsonResponse([
  667.                 'success' => true,
  668.                 'name' => $creditForm->getName(),
  669.                 'phone' => $creditForm->getPhone(),
  670.             ]);
  671.         }
  672.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  673.     }
  674.     /**
  675.      * @param Request $request
  676.      * @param Dealer|null $dealer
  677.      * @return JsonResponse
  678.      * @throws OptimisticLockException
  679.      */
  680.     public function saveServiceForm(Request $requestDealer $dealer null)
  681.     {
  682.         $serviceForm = new Forms();
  683.         $serviceForm->setDomain($request->getHost());
  684.         $serviceForm->setDateCreate(new DateTime());
  685.         $serviceForm->setType(self::TYPE_SERVICE_FORM);
  686.         if (isset($request->request->get('service')['vin_gos_nomer'])) {
  687.             $form $this->formFactory->serviceForm($serviceFormtruenulltrue);
  688.         } else {
  689.             $form $this->formFactory->serviceForm($serviceFormtrue);
  690.         }
  691.         $data $request->request->all($form->getName());
  692.         if (!$dealer && isset($data['dealer'])) {
  693.             $dealer $this->entityManager->getRepository(Dealer::class)->find($data['dealer']);
  694.         }
  695.         if (!$this->validateCaptcha($data)) {
  696.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  697.         }
  698.         $form->handleRequest($request);
  699.         $isValid $this->validateForm($form);
  700.         if ($form->isSubmitted() && $isValid) {
  701.             if ($dealer) {
  702.                 $serviceForm->setDealer($dealer);
  703.             }
  704.             $this->entityManager->persist($serviceForm);
  705.             $this->entityManager->flush();
  706.             return new JsonResponse(['success' => true]);
  707.         }
  708.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  709.     }
  710.     /**
  711.      * @param Request $request
  712.      * @param Dealer|null $dealer
  713.      * @return JsonResponse
  714.      * @throws OptimisticLockException
  715.      * @throws Error
  716.      */
  717.     public function saveTestDriveForm(Request $requestDealer $dealer null)
  718.     {
  719.         $vehicle null;
  720.         $tdForm = new Forms();
  721.         $tdForm->setDomain($request->getHost());
  722.         $Token $this->tokenStorage->getToken();
  723.         $User $Token->getUser() && $Token->getUser() != 'anon.' $Token->getUser() : null;
  724.         if ($User) {
  725.             $tdForm->setUser($User);
  726.         }
  727.         $tdForm->setDateCreate(new DateTime());
  728.         $tdForm->setType(self::TYPE_TEST_DRIVE_FORM);
  729.         $carId null;
  730.         if (isset($request->request->get('test_drive')['vehicle'])) {
  731.             $carId $request->request->get('test_drive')['vehicle'];
  732.         }
  733.         if ($carId) {
  734.             $vehicle $this->entityManager->getRepository(Vehicle::class)->find($carId);
  735.             $tdForm->setVehicle($vehicle);
  736.         }
  737.         if (!$dealer && $vehicle) {
  738.             $dealer $vehicle->getDealer();
  739.         }
  740.         if (!$dealer && !$vehicle) {
  741.             $dId null;
  742.             if (isset($request->request->get('test_drive')['dealer'])) {
  743.                 $dId $request->request->get('test_drive')['dealer'];
  744.             }
  745.             if ($dId) {
  746.                 $dealer $this->entityManager->getRepository(Dealer::class)->find($dId);
  747.             }
  748.         }
  749.         if (
  750.             isset($request->request->get('test_drive')['tdCars']) &&
  751.             !empty($request->request->get('test_drive')['tdCars'])
  752.         ) {
  753.             $dataToSave = [
  754.                 'cars' => $request->request->get('test_drive')['tdCars'],
  755.                 'route' => $request->request->get('test_drive')['route'],
  756.                 'callback' => $request->request->get('test_drive')['callback'],
  757.             ];
  758.             if (isset($request->request->get('test_drive')['communication'])) {
  759.                 $dataToSave['communication'] = $request->request->get('test_drive')['communication'];
  760.             }
  761.             $tdForm->setData(json_encode($dataToSave));
  762.         }
  763.         $form $this->formFactory->testDriveForm($dealer$tdForm, ['child' => true'communication' => true]);
  764.         $data $request->request->all($form->getName());
  765.         //TODO need some documentation
  766.         if (strpos($data['phone'], '+7495') !== false) {
  767.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  768.         }
  769.         if (!$this->hasPrivacy($data)) {
  770.             return new JsonResponse(['success' => false'error' => 'privacy']);
  771.         }
  772.         if (!$this->validateCaptcha($data)) {
  773.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  774.         }
  775.         $form->handleRequest($request);
  776.         $isValid $this->validateForm($form);
  777.         if ($form->isSubmitted() && $isValid) {
  778.             $cars = isset($dataToSave['cars']) ? json_decode($dataToSave['cars']) : null;
  779.             $tdForm->setDealer($dealer);
  780.             $this->entityManager->persist($tdForm);
  781.             $this->entityManager->flush();
  782.             $this->sendTestDriveMail($tdForm$dealer$cars);
  783.             return new JsonResponse(['success' => true'name' => $tdForm->getName(), 'phone' => $tdForm->getPhone()]);
  784.         }
  785.         $errors = [];
  786.         foreach ($form->getErrors() as $error) {
  787.             $errors[] = $error->getMessage();
  788.         }
  789.         return new JsonResponse(['success' => false'errors' => $errors]);
  790.     }
  791.     /**
  792.      * @param Forms $form
  793.      * @param Dealer $dealer
  794.      * @param $cars
  795.      * @return int
  796.      * @throws Error
  797.      */
  798.     private function sendTestDriveMail(Forms $formDealer $dealer$cars)
  799.     {
  800.         $dealerName $dealer->getName();
  801.         $mailTo $form->getEmail();
  802.         $carName '';
  803.         if (!$mailTo) {
  804.             //TODO return int
  805.             return false;
  806.         }
  807.         $Car $form->getVehicle();
  808.         $contactName $form->getName();
  809.         if ($Car) {
  810.             $carB $Car->getModel()->getBrand()->getName();
  811.             $carM $Car->getModel()->getTitle();
  812.             $carName $carB ' ' $carM;
  813.         }
  814.         if ($cars) {
  815.             $carName '';
  816.             foreach ($cars as $row) {
  817.                 $carName .= $row->brand ' ' $row->carName ' ' $row->testDriveConfigurationName ' | ';
  818.             }
  819.         }
  820.         $additionalData $this->getAdditionalData($dealer);
  821.         if (!$additionalData) {
  822.             //TODO return int
  823.             return;
  824.         }
  825.         $body $this->twig->render('DcSiteBundle:Lexus/Mail:client.test-drive.message.html.twig', [
  826.             'car' => $carName,
  827.             'contactName' => $contactName,
  828.             'map' => $additionalData['map'],
  829.             'siteLink' => $additionalData['siteLink'],
  830.             'address' => $additionalData['address'],
  831.             'dealerNameUkr' => $dealerName,
  832.         ]);
  833.         $massage = (new Email())
  834.             ->subject("Заявка на проведення тест-драйву")
  835.             ->to($mailTo)
  836.             ->from(new Address($additionalData['mailFrom'], $dealer))
  837.             ->html($body);
  838.         return $this->mailer->send($massage);
  839.     }
  840.     /**
  841.      * @param Dealer $dealer
  842.      * @return array | boolean
  843.      */
  844.     private function getAdditionalData(Dealer $dealer)
  845.     {
  846.         switch ($dealer->getId()) {
  847.             case 'ДЦ "ВІДІ Авеню"':
  848.                 return [
  849.                     'dealerNameUkr' => 'ВІДІ Авеню',
  850.                     'mailFrom' => 'sales.avenue@vidi.ua',
  851.                     'map' => 'https://goo.gl/maps/Zi5bcU6Mf5E2',
  852.                     'siteLink' => 'http://peugeot-vidi.com.ua/',
  853.                     'address' => 'вул. Велика Кільцева, 60',
  854.                 ];
  855.             case 'ДЦ "ВІДІ Автострада"':
  856.                 return [
  857.                     'dealerNameUkr' => 'ВІДІ Автострада',
  858.                     'mailFrom' => 'sales.avtostrada@vidi.ua',
  859.                     'map' => 'https://goo.gl/maps/mAjTe8MJbaD2',
  860.                     'siteLink' => 'https://toyota-ua.com/',
  861.                     'address' => 'вул. Велика Кільцева, 56',
  862.                 ];
  863.             case 'ДЦ "ВІДІ Армада"':
  864.                 return [
  865.                     'dealerNameUkr' => 'ВІДІ Армада',
  866.                     'mailFrom' => 'sales.armada@vidi.ua',
  867.                     'map' => 'https://goo.gl/maps/VSQy9zVXN882',
  868.                     'siteLink' => 'http://nissan-kyiv.com.ua/',
  869.                     'address' => 'вул. Київська, 49, с. Чубинське',
  870.                 ];
  871.             case 'ДЦ "ВІДІ Гранд"':
  872.                 return [
  873.                     'dealerNameUkr' => 'ВІДІ Гранд',
  874.                     'mailFrom' => 'sales.grand@vidi.ua',
  875.                     'map' => 'https://goo.gl/maps/Qvddq1uSSJu',
  876.                     'siteLink' => 'http://suzuki-vidi.com.ua/',
  877.                     'address' => 'вул. Велика Кільцева, 60',
  878.                 ];
  879.             case 'ДЦ "ВІДІ Елеганс"':
  880.                 return [
  881.                     'dealerNameUkr' => 'ВІДІ Елеганс',
  882.                     'mailFrom' => 'sales.elegance@vidi.ua',
  883.                     'map' => 'https://goo.gl/maps/q7cjTUJSWBF2',
  884.                     'siteLink' => 'http://citroen-vidi.com.ua/',
  885.                     'address' => 'вул. Велика Кільцева, 60',
  886.                 ];
  887.             case 14:
  888.                 return [
  889.                     'mailFrom' => 'sales.elite@vidi.ua',
  890.                     'map' => 'https://goo.gl/maps/2JkVXQ8N5uB2',
  891.                     'siteLink' => 'http://kyiv-west.lexus.ua/',
  892.                     'address' => 'вул. Велика Кільцева, 60',
  893.                 ];
  894.             case 'ДЦ "ВІДІ Інсайт"':
  895.                 return [
  896.                     'dealerNameUkr' => 'ВІДІ Інсайт',
  897.                     'mailFrom' => 'sales.insight@vidi.ua',
  898.                     'map' => 'https://goo.gl/maps/VNYWzsJWY662',
  899.                     'siteLink' => 'http://honda-kiev.com.ua/',
  900.                     'address' => 'вул. Київська, 55, с. Чубинське',
  901.                 ];
  902.             case 'ДЦ "ВІДІ Край"':
  903.                 return [
  904.                     'dealerNameUkr' => 'ВІДІ Край Моторз',
  905.                     'mailFrom' => 'sales.cry-motors@vidi.ua',
  906.                     'map' => 'https://goo.gl/maps/h98ifFpm5352',
  907.                     'siteLink' => 'http://ford-vidi.com.ua/',
  908.                     'address' => 'вул. Велика Кільцева, 60а',
  909.                 ];
  910.             case 'ДЦ "ВІДІ Ліберті""':
  911.                 return [
  912.                     'dealerNameUkr' => 'ВІДІ Ліберті',
  913.                     'mailFrom' => 'sales.liberty@vidi.ua',
  914.                     'map' => 'https://goo.gl/maps/b2tZ7YkhgiF2',
  915.                     'siteLink' => 'http://infiniti-vidi.com.ua/',
  916.                     'address' => 'вул. Київська, 51, с. Чубинське',
  917.                 ];
  918.             case 'ДЦ "ВІДІ Нордвей"':
  919.                 return [
  920.                     'dealerNameUkr' => 'ВІДІ Нордвей',
  921.                     'mailFrom' => 'sales.nordway@vidi.ua',
  922.                     'map' => 'https://goo.gl/maps/bVeQ4Uiz4uM2',
  923.                     'siteLink' => 'http://airport.volvocarsdealer.com/',
  924.                     'address' => 'вул. Київська, 51, с. Чубинське',
  925.                 ];
  926.             case 'ДЦ "ВІДІ Пальміра"':
  927.                 return [
  928.                     'dealerNameUkr' => 'ВІДІ Пальміра',
  929.                     'mailFrom' => 'sales.palmira@vidi.ua',
  930.                     'map' => 'https://goo.gl/maps/zQX8uwd3qv72',
  931.                     'siteLink' => 'http://toyota-odessa.com.ua/',
  932.                     'address' => 'м. Одеса, вул. Балківська, 22а',
  933.                 ];
  934.             case 'ДЦ "ВІДІ Санрайз"':
  935.                 return [
  936.                     'dealerNameUkr' => 'ВІДІ Санрайз',
  937.                     'mailFrom' => 'sales.sunrise-motors@vidi.ua',
  938.                     'map' => 'https://goo.gl/maps/kGb4HsGdz2R2',
  939.                     'siteLink' => 'http://nissan-vidi.com.ua/',
  940.                     'address' => 'вул. Велика Кільцева, 60а',
  941.                 ];
  942.             case 'ДЦ "ВІДІ Скай"':
  943.                 return [
  944.                     'dealerNameUkr' => 'ВІДІ Скай',
  945.                     'mailFrom' => 'sales.sky-motors@vidi.ua',
  946.                     'map' => 'https://goo.gl/maps/ZXthrvGPRe52',
  947.                     'siteLink' => 'http://mazda-vidi.com.ua/',
  948.                     'address' => 'вул. Велика Кільцева, 60а',
  949.                 ];
  950.             case 'ДЦ "ВІДІ Стар"':
  951.                 return [
  952.                     'dealerNameUkr' => 'ВІДІ Стар',
  953.                     'mailFrom' => 'sales.star-motors@vidi.ua',
  954.                     'map' => 'https://goo.gl/maps/qYK6zrCUbS82',
  955.                     'siteLink' => 'http://subaru-vidi.com.ua/',
  956.                     'address' => 'вул. Велика Кільцева, 60а',
  957.                 ];
  958.         }
  959.         return false;
  960.     }
  961.     /**
  962.      * @param Request $request
  963.      * @param Dealer|null $dealer
  964.      * @return JsonResponse
  965.      * @throws OptimisticLockException
  966.      */
  967.     public function saveTradeInForm(Request $requestDealer $dealer null)
  968.     {
  969.         $tdForm = new Forms();
  970.         $tdForm->setDomain($request->getHost());
  971.         $tdForm->setDateCreate(new DateTime());
  972.         $tdForm->setType(self::TYPE_TRADE_IN_FORM);
  973.         $form $this->formFactory->tradeInFrom($dealer$tdForm);
  974.         $model $request->request->get('trade_in')['model'];
  975.         $vehicle $this->entityManager->getRepository(Vehicle::class)->findOneBy(['id' => $model]);
  976.         $tdForm->setVehicle($vehicle);
  977.         $data $request->request->all($form->getName());
  978.         if (!$this->hasPrivacy($data)) {
  979.             return new JsonResponse(['success' => false'error' => 'privacy']);
  980.         }
  981.         if (!$this->validateCaptcha($data)) {
  982.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  983.         }
  984.         $form->handleRequest($request);
  985.         $isValid $this->validateForm($form);
  986.         if ($form->isSubmitted() && $isValid) {
  987.             $tdForm->setDealer($dealer);
  988.             $this->entityManager->persist($tdForm);
  989.             $this->entityManager->flush();
  990.             return new JsonResponse(['success' => true'name' => $tdForm->getName(), 'phone' => $tdForm->getPhone()]);
  991.         }
  992.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  993.     }
  994.     /**
  995.      * @param Request $request
  996.      * @param Dealer|null $dealer
  997.      * @return JsonResponse
  998.      * @throws OptimisticLockException
  999.      */
  1000.     public function saveOrderInsuranceForm(Request $requestDealer $dealer null)
  1001.     {
  1002.         $orderInsurance = new Forms();
  1003.         $orderInsurance->setDomain($request->getHost());
  1004.         $orderInsurance->setType(self::TYPE_ORDER_INSURANCE_FORM);
  1005.         $orderInsurance->setDateCreate(new DateTime());
  1006.         $post $request->request->get('order_insurance');
  1007.         $type $post['type'];
  1008.         $form false;
  1009.         switch ($type) {
  1010.             case OrderInsuranceType::CASCO_ORDER_INSURANCE:
  1011.                 $form $this->formFactory->orderCascoForm($orderInsurance);
  1012.                 break;
  1013.             case OrderInsuranceType::MANDATORY_ORDER_INSURANCE:
  1014.                 $form $this->formFactory->orderMandatoryForm($orderInsurance);
  1015.                 break;
  1016.             case OrderInsuranceType::VOLUNTARY_ORDER_INSURANCE:
  1017.                 $form $this->formFactory->orderVoluntaryForm($orderInsurance);
  1018.                 break;
  1019.             case OrderInsuranceType::REGISTRATION_AUTO_CIVILIAN:
  1020.                 $form $this->formFactory->orderCivilianForm($orderInsurance);
  1021.                 break;
  1022.             case OrderInsuranceType::HOME_INSURANCE:
  1023.                 $form $this->formFactory->orderHomeInsuranceForm($orderInsurance);
  1024.                 break;
  1025.         }
  1026.         $data $request->request->all($form->getName());
  1027.         if (!$this->validateCaptcha($data)) {
  1028.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1029.         }
  1030.         $form->handleRequest($request);
  1031.         if ($request->request->get('client-status')) {
  1032.             $extraData = ['clientStatus' => $request->request->get('client-status'),
  1033.                 'carStatus' => $request->request->get('car-status'),
  1034.                 'bankName' => $request->request->get('bank-name')];
  1035.             $currentlyData json_decode($orderInsurance->getData(), true);
  1036.             $orderInsurance->setData(json_encode(array_merge($currentlyData$extraData)));
  1037.         }
  1038.         $isValid $this->validateForm($form);
  1039.         if ($form->isSubmitted() && $isValid) {
  1040.             $orderInsurance->setDealer($dealer);
  1041.             $this->entityManager->persist($orderInsurance);
  1042.             $this->entityManager->flush();
  1043.             return JsonResponse::create(['success' => true]);
  1044.         }
  1045.         return JsonResponse::create(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1046.     }
  1047.     /**
  1048.      * @param Request $request
  1049.      * @param Dealer $dealer
  1050.      * @return JsonResponse
  1051.      * @throws OptimisticLockException
  1052.      */
  1053.     public function saveBuyPartsForm(Request $requestDealer $dealer): JsonResponse
  1054.     {
  1055.         $buyPartsFormEntity = new Forms();
  1056.         $buyPartsFormEntity->setDomain($request->getHost());
  1057.         $buyPartsFormEntity->setType(self::TYPE_BUY_PARTS_FORM);
  1058.         $buyPartsFormEntity->setDateCreate(new DateTime());
  1059.         $accessoriesRepo $this->entityManager->getRepository(Accessories::class);
  1060.         $partId $request->get('buy_parts')['accessory'];
  1061.         $accessory $accessoriesRepo->findOneBy(['id' => $partId]);
  1062.         if (!$accessory) {
  1063.             $data = ['part' => $partId];
  1064.             $buyPartsFormEntity->setData(json_encode($data));
  1065.             $requestData $request->get('buy_parts');
  1066.             $requestData['accessory'] = null;
  1067.             $request->request->set('buy_parts'$requestData);
  1068.         }
  1069.         $form $this->formFactory->buyPartsForm($dealer$buyPartsFormEntity);
  1070.         $data $request->request->all($form->getName());
  1071.         if (!$this->hasPrivacy($data)) {
  1072.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1073.         }
  1074.         if (!$this->validateCaptcha($data)) {
  1075.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1076.         }
  1077.         $form->handleRequest($request);
  1078.         $isValid $this->validateForm($form);
  1079.         if ($form->isSubmitted() && $isValid) {
  1080.             $buyPartsFormEntity->setAccessory($accessory);
  1081.             $buyPartsFormEntity->setDealer($dealer);
  1082.             $this->entityManager->persist($buyPartsFormEntity);
  1083.             $this->entityManager->flush();
  1084.             return new JsonResponse(['success' => true]);
  1085.         }
  1086.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1087.     }
  1088.     /**
  1089.      * @param Request $request
  1090.      * @param Dealer $dealer
  1091.      * @return JsonResponse
  1092.      * @throws OptimisticLockException
  1093.      */
  1094.     public function saveVacancyForm(Request $requestDealer $dealer null)
  1095.     {
  1096.         /** @var Vacancy $vacancy */
  1097.         $vacancy $this->entityManager
  1098.             ->getRepository(Vacancy::class)
  1099.             ->find($request->get('vacancy')['vacancy']);
  1100.         $vacancyForm = new VacancyForm();
  1101.         $vacancyForm->setDateCreate(new DateTime());
  1102.         $vacancyForm->setFormType(self::TYPE_VACANCY_FORM);
  1103.         if ($dealer) {
  1104.             $vacancyForm->setDealer($dealer);
  1105.         }
  1106.         $form $this->formFactory->vacancyForm($dealer$vacancy$vacancyForm);
  1107.         $form->handleRequest($request);
  1108.         $isValid $this->validateForm($form);
  1109.         if ($form->isSubmitted() && $isValid) {
  1110.             $file $vacancyForm->getCv();
  1111.             $fileName $this->fileUploader->upload($file);
  1112.             $vacancyForm->setCv($fileName);
  1113.             $this->entityManager->persist($vacancyForm);
  1114.             $this->entityManager->flush();
  1115.             if ($request->getHost() == 'vidi.ua') {
  1116.                 $this->vacancyMail->sendEmailToCandidate($request->request->get('vacancy')['email']);
  1117.             }
  1118.             return new JsonResponse(['success' => true]);
  1119.         }
  1120.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1121.     }
  1122.     /**
  1123.      * @param ConstraintViolationListInterface $errors
  1124.      * @return array
  1125.      */
  1126.     public function getErrorsFromValidator(ConstraintViolationListInterface $errors)
  1127.     {
  1128.         $formattedErrors = [];
  1129.         foreach ($errors as $error) {
  1130.             $formattedErrors[$error->getPropertyPath()] = $error->getMessage();
  1131.         }
  1132.         return $formattedErrors;
  1133.     }
  1134.     /**
  1135.      * @param FormInterface $form
  1136.      * @return array
  1137.      */
  1138.     private function getErrorsFromForm(FormInterface $form)
  1139.     {
  1140.         $errors = [];
  1141.         /** @var FormError $error */
  1142.         foreach ($form->getErrors() as $error) {
  1143.             $errors[] = $error->getMessage();
  1144.         }
  1145.         foreach ($form->all() as $childForm) {
  1146.             if ($childForm instanceof FormInterface) {
  1147.                 if ($childErrors $this->getErrorsFromForm($childForm)) {
  1148.                     $errors[$childForm->getName()] = $childErrors;
  1149.                 }
  1150.             }
  1151.         }
  1152.         return $errors;
  1153.     }
  1154.     /**
  1155.      * @param Request $request
  1156.      * @param Dealer $dealer
  1157.      * @return JsonResponse
  1158.      * @throws OptimisticLockException
  1159.      */
  1160.     public function saveRepairPhoto(Request $requestDealer $dealer)
  1161.     {
  1162.         $Form = new Forms();
  1163.         $Form->setDomain($request->getHost());
  1164.         $Form->setType(self::TYPE_REPAIR_PHOTO);
  1165.         $Form->setDateCreate(new DateTime());
  1166.         $form $this->formFactory->repairPhotoForm($dealer$Form);
  1167.         $data $request->request->all($form->getName());
  1168.         if (!$this->hasPrivacy($data)) {
  1169.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1170.         }
  1171.         if (!$this->validateCaptcha($data)) {
  1172.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1173.         }
  1174.         $form->handleRequest($request);
  1175.         $isValid $this->validateForm($form);
  1176.         if ($form->isSubmitted() && $isValid) {
  1177.             $dataField = [
  1178.                 'files' => [],
  1179.                 'comment' => $data['comment'],
  1180.                 'brand' => $data['brand'],
  1181.                 'model' => $data['model'],
  1182.                 'carNumber' => $data['car_number'],
  1183.             ];
  1184.             foreach ($form['files']->getData() as $file) {
  1185.                 $fileName $this->fileUploader->upload($file);
  1186.                 $dataField['files'][] = $fileName;
  1187.             }
  1188.             $Form->setDealer($dealer);
  1189.             $Form->setData(json_encode($dataField));
  1190.             $this->entityManager->persist($Form);
  1191.             $this->entityManager->flush();
  1192.             return new JsonResponse(['success' => true]);
  1193.         }
  1194.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1195.     }
  1196.     /**
  1197.      * @param Request $request
  1198.      * @param Dealer $dealer
  1199.      * @param null $services_type
  1200.      * @return JsonResponse
  1201.      * @throws OptimisticLockException
  1202.      */
  1203.     public function saveServiceOrderForm(Request $requestDealer $dealer$services_type null)
  1204.     {
  1205.         $servicesOrderFormEntity = new Forms();
  1206.         $servicesOrderFormEntity->setDomain($request->getHost());
  1207.         $servicesOrderFormEntity->setType(self::TYPE_SERVICES_ORDER);
  1208.         $servicesOrderFormEntity->setDateCreate(new DateTime());
  1209.         $form $this->formFactory->servicesOrderForm($services_type$request->getLocale(), $servicesOrderFormEntity);
  1210.         $data $request->request->all($form->getName());
  1211.         if (!$this->hasPrivacy($data)) {
  1212.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1213.         }
  1214.         if (!$this->validateCaptcha($data)) {
  1215.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1216.         }
  1217.         $form->handleRequest($request);
  1218.         $isValid $this->validateForm($form);
  1219.         if ($request->request->get('model')) {
  1220.             $formData json_decode($servicesOrderFormEntity->getData());
  1221.             $formData->model $request->request->get('model');
  1222.             $servicesOrderFormEntity->setData(json_encode($formData));
  1223.         }
  1224.         if ($request->request->get('to')) {
  1225.             $formData json_decode($servicesOrderFormEntity->getData());
  1226.             $formData->to $request->request->get('to');
  1227.             $servicesOrderFormEntity->setData(json_encode($formData));
  1228.         }
  1229.         if ($form->isSubmitted() && $isValid) {
  1230.             $servicesOrderFormEntity->setDealer($dealer);
  1231.             $this->entityManager->persist($servicesOrderFormEntity);
  1232.             $this->entityManager->flush();
  1233.             return new JsonResponse(['success' => true]);
  1234.         }
  1235.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1236.     }
  1237.     /**
  1238.      * @param Request $request
  1239.      * @return JsonResponse
  1240.      * @throws OptimisticLockException
  1241.      */
  1242.     public function saveSupportForm(Request $request)
  1243.     {
  1244.         $supportForm = new Forms();
  1245.         $supportForm->setDomain($request->getHost());
  1246.         $supportForm->setDateCreate(new DateTime());
  1247.         $supportForm->setType(self::TYPE_SUPPORT);
  1248.         $form $this->formFactory->supportForm($supportForm$request->getLocale());
  1249.         $data $request->request->all($form->getName());
  1250.         $dataField = ['support_type' => $data['support_type']];
  1251.         if (!$this->validateCaptcha($data)) {
  1252.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1253.         }
  1254.         $form->handleRequest($request);
  1255.         $isValid $this->validateForm($form);
  1256.         if ($form->isSubmitted() && $isValid) {
  1257.             $supportForm->setData(json_encode($dataField));
  1258.             $this->entityManager->persist($supportForm);
  1259.             $this->entityManager->flush();
  1260.             return new JsonResponse([
  1261.                     'success' => true,
  1262.                     'name' => $supportForm->getName(),
  1263.                     'phone' => $supportForm->getPhone()
  1264.                 ]
  1265.             );
  1266.         }
  1267.         $errors = [];
  1268.         foreach ($form->getErrors() as $error) {
  1269.             $errors[] = $error->getMessage();
  1270.         }
  1271.         return new JsonResponse(['success' => false'errors' => $errors]);
  1272.     }
  1273.     public function saveRentForm(Request $request$dealer null)
  1274.     {
  1275.         $rentForm = new Forms();
  1276.         $rentForm->setDomain($request->getHost());
  1277.         $rentForm->setDateCreate(new DateTime());
  1278.         $rentForm->setType(self::TYPE_RENT);
  1279.         $form $this->formFactory->rentForm($dealer$rentForm);
  1280.         $form->handleRequest($request);
  1281.         $isValid $this->validateForm($form);
  1282.         if ($form->isSubmitted() && $isValid) {
  1283.             $rentForm->setDealer($dealer);
  1284.             $this->entityManager->persist($rentForm);
  1285.             $this->entityManager->flush();
  1286.             return new JsonResponse(
  1287.                 [
  1288.                     'success' => true,
  1289.                     'name' => $rentForm->getName(),
  1290.                     'phone' => $rentForm->getPhone()
  1291.                 ]
  1292.             );
  1293.         }
  1294.         $errors = [];
  1295.         foreach ($form->getErrors() as $error) {
  1296.             $errors[] = $error->getMessage();
  1297.         }
  1298.         return new JsonResponse(['success' => false'errors' => $errors]);
  1299.     }
  1300.     public function savePersonal(Request $request$dealer null)
  1301.     {
  1302.         $Form = new Forms();
  1303.         $Form->setDealer($dealer);
  1304.         $Form->setDomain($request->getHost());
  1305.         $Form->setDateCreate(new DateTime());
  1306.         $Form->setType(self::TYPE_PERSONAL);
  1307.         $Form->setName($request->get('name'));
  1308.         $Form->setEmail($request->get('email'));
  1309.         $Form->setPhone($request->get('phone'));
  1310.         $Form->setData(json_encode([
  1311.             'cars' => $request->get('cars'),
  1312.             'services' => $request->get('services')
  1313.         ]));
  1314.         $this->entityManager->persist($Form);
  1315.         $this->entityManager->flush();
  1316.         return new JsonResponse(['success' => true'name' => $Form->getName(), 'phone' => $Form->getPhone()]);
  1317.     }
  1318.     public function saveFindPart(Request $request$dealer null)
  1319.     {
  1320.         $partForm = new Forms();
  1321.         $partForm->setDomain($request->getHost());
  1322.         $partForm->setDateCreate(new DateTime());
  1323.         $partForm->setType(self::TYPE_FIND_PART);
  1324.         $form $this->formFactory->findPartForm($dealer$partForm);
  1325.         $data $request->request->all($form->getName());
  1326.         if (!$this->hasPrivacy($data)) {
  1327.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1328.         }
  1329.         if (!$this->validateCaptcha($data)) {
  1330.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1331.         }
  1332.         $form->handleRequest($request);
  1333.         $dataField = [
  1334.             'vin' => $data['vin'],
  1335.             'part' => $data['part'],
  1336.         ];
  1337.         $isValid $this->validateForm($form);
  1338.         if ($form->isSubmitted() && $isValid) {
  1339.             $partForm->setDealer($dealer);
  1340.             $partForm->setData(json_encode($dataField));
  1341.             $this->entityManager->persist($partForm);
  1342.             $this->entityManager->flush();
  1343.             return new JsonResponse(
  1344.                 [
  1345.                     'success' => true,
  1346.                     'name' => $partForm->getName(),
  1347.                     'phone' => $partForm->getPhone()
  1348.                 ]
  1349.             );
  1350.         }
  1351.         $errors = [];
  1352.         foreach ($form->getErrors() as $error) {
  1353.             $errors[] = $error->getMessage();
  1354.         }
  1355.         return new JsonResponse(['success' => false'errors' => $errors]);
  1356.     }
  1357.     public function saveOrderGoodsForm(Request $request$dealer null)
  1358.     {
  1359.         $goodsForm = new Forms();
  1360.         $goodsForm->setDomain($request->getHost());
  1361.         $goodsForm->setDateCreate(new DateTime());
  1362.         $goodsForm->setType(self::TYPE_GOODS_ORDER);
  1363.         $form $this->formFactory->orderGoodsForm($dealer$goodsForm);
  1364.         $formData $request->request->all($form->getName());
  1365.         $data $request->request->all($form->getName());
  1366.         if (!$this->hasPrivacy($data)) {
  1367.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1368.         }
  1369.         if (!$this->validateCaptcha($data)) {
  1370.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1371.         }
  1372.         $form->handleRequest($request);
  1373.         $isValid $this->validateForm($form);
  1374.         if ($form->isSubmitted() && $isValid) {
  1375.             $goodsForm->setDealer($dealer);
  1376.             $goodsForm->setData(json_encode([
  1377.                 'goods_id' => $formData['id']
  1378.             ]));
  1379.             $this->entityManager->persist($goodsForm);
  1380.             $this->entityManager->flush();
  1381.             return new JsonResponse(
  1382.                 [
  1383.                     'success' => true,
  1384.                     'name' => $goodsForm->getName(),
  1385.                     'phone' => $goodsForm->getPhone()
  1386.                 ]
  1387.             );
  1388.         }
  1389.         $errors = [];
  1390.         foreach ($form->getErrors() as $error) {
  1391.             $errors[] = $error->getMessage();
  1392.         }
  1393.         return new JsonResponse(['success' => false'errors' => $errors]);
  1394.     }
  1395.     public function saveInsuranceExtend(Request $requestDealer $dealer null)
  1396.     {
  1397.         $insuranceForm = new Forms();
  1398.         $insuranceForm->setDomain($request->getHost());
  1399.         $insuranceForm->setDateCreate(new DateTime());
  1400.         $insuranceForm->setType(self::TYPE_INSURANCE_EXTEND);
  1401.         $form $this->formFactory->insuranceExtendForm($dealer$insuranceForm);
  1402.         $data $request->request->all($form->getName());
  1403.         if (!$this->hasPrivacy($data)) {
  1404.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1405.         }
  1406.         if (!$this->validateCaptcha($data)) {
  1407.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1408.         }
  1409.         $form->handleRequest($request);
  1410.         $isValid $this->validateForm($form);
  1411.         if ($form->isSubmitted() && $isValid) {
  1412.             $insuranceForm->setDealer($dealer);
  1413.             $insuranceForm->setData(
  1414.                 json_encode(
  1415.                     [
  1416.                         'brand' => $data['brand'],
  1417.                         'year' => $data['year'],
  1418.                     ]
  1419.                 )
  1420.             );
  1421.             $this->entityManager->persist($insuranceForm);
  1422.             $this->entityManager->flush();
  1423.             return new JsonResponse(
  1424.                 [
  1425.                     'success' => true,
  1426.                     'name' => $insuranceForm->getName(),
  1427.                     'phone' => $insuranceForm->getPhone()
  1428.                 ]
  1429.             );
  1430.         }
  1431.         $errors = [];
  1432.         foreach ($form->getErrors() as $error) {
  1433.             $errors[] = $error->getMessage();
  1434.         }
  1435.         return new JsonResponse(['success' => false'errors' => $errors]);
  1436.     }
  1437.     public function saveCommissionTechnology(Request $requestDealer $dealer null)
  1438.     {
  1439.         $commissionForm = new Forms();
  1440.         $commissionForm->setDomain($request->getHost());
  1441.         $commissionForm->setDateCreate(new DateTime());
  1442.         $commissionForm->setType(self::TYPE_COMMISSION_TECHNOLOGY);
  1443.         $form $this->formFactory->commissionTechnologyForm($dealer$commissionForm);
  1444.         $data $request->request->all($form->getName());
  1445.         if (!$this->hasPrivacy($data)) {
  1446.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1447.         }
  1448.         if (!$this->validateCaptcha($data)) {
  1449.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1450.         }
  1451.         $form->handleRequest($request);
  1452.         $isValid $this->validateForm($form);
  1453.         if ($form->isSubmitted() && $isValid) {
  1454.             $commissionForm->setDealer($dealer);
  1455.             $commissionForm->setData(json_encode([
  1456.                 'model' => $data['model'],
  1457.                 'price' => $data['price'],
  1458.             ]));
  1459.             $this->entityManager->persist($commissionForm);
  1460.             $this->entityManager->flush();
  1461.             return new JsonResponse(
  1462.                 [
  1463.                     'success' => true,
  1464.                     'name' => $commissionForm->getName(),
  1465.                     'phone' => $commissionForm->getPhone()
  1466.                 ]
  1467.             );
  1468.         }
  1469.         $errors = [];
  1470.         foreach ($form->getErrors() as $error) {
  1471.             $errors[] = $error->getMessage();
  1472.         }
  1473.         return new JsonResponse(['success' => false'errors' => $errors]);
  1474.     }
  1475.     public function saveCorpSalesForm(Request $requestDealer $dealer null)
  1476.     {
  1477.         $corpSaleForm = new Forms();
  1478.         $corpSaleForm->setDomain($request->getHost());
  1479.         $corpSaleForm->setDateCreate(new DateTime());
  1480.         $corpSaleForm->setType(self::TYPE_CORP_SALE);
  1481.         $form $this->formFactory->corpSalesForm($dealer$request->getLocale(), $corpSaleForm);
  1482.         $data $request->request->all($form->getName());
  1483.         if (!$this->hasPrivacy($data)) {
  1484.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1485.         }
  1486.         if (!$this->validateCaptcha($data)) {
  1487.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1488.         }
  1489.         $form->handleRequest($request);
  1490.         $isValid $this->validateForm($form);
  1491.         if ($form->isSubmitted() && $isValid) {
  1492.             $corpSaleForm->setDealer($dealer);
  1493.             $corpSaleForm->setData(json_encode([
  1494.                 'company_name' => $data['company_name'],
  1495.                 'comment' => $data['comment'],
  1496.                 'department' => $data['department'],
  1497.             ]));
  1498.             $this->entityManager->persist($corpSaleForm);
  1499.             $this->entityManager->flush();
  1500.             return new JsonResponse(
  1501.                 [
  1502.                     'success' => true,
  1503.                     'name' => $corpSaleForm->getName(),
  1504.                     'phone' => $corpSaleForm->getPhone()
  1505.                 ]
  1506.             );
  1507.         }
  1508.         $errors = [];
  1509.         foreach ($form->getErrors() as $error) {
  1510.             $errors[] = $error->getMessage();
  1511.         }
  1512.         return new JsonResponse(['success' => false'errors' => $errors]);
  1513.     }
  1514.     public function saveBuySpareParts(Request $requestDealer $dealer null)
  1515.     {
  1516.         $spareForm = new Forms();
  1517.         $spareForm->setDomain($request->getHost());
  1518.         $spareForm->setDateCreate(new DateTime());
  1519.         $spareForm->setType(self::TYPE_BUY_SPARE_PARTS);
  1520.         $form $this->formFactory->buySparePartsForm($dealer$spareForm);
  1521.         $data $request->request->all($form->getName());
  1522.         if (!$this->hasPrivacy($data)) {
  1523.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1524.         }
  1525.         if (!$this->validateCaptcha($data)) {
  1526.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1527.         }
  1528.         $form->handleRequest($request);
  1529.         $isValid $this->validateForm($form);
  1530.         if ($form->isSubmitted() && $isValid) {
  1531.             $spareForm->setDealer($dealer);
  1532.             $spareForm->setData(json_encode([
  1533.                 'spare_part' => $data['sparePart'],
  1534.                 'count' => $data['count'],
  1535.                 'price' => $data['price'],
  1536.             ]));
  1537.             $this->entityManager->persist($spareForm);
  1538.             $this->entityManager->flush();
  1539.             return new JsonResponse(
  1540.                 [
  1541.                     'success' => true,
  1542.                     'name' => $spareForm->getName(),
  1543.                     'phone' => $spareForm->getPhone()
  1544.                 ]
  1545.             );
  1546.         }
  1547.         $errors = [];
  1548.         foreach ($form->getErrors() as $error) {
  1549.             $errors[] = $error->getMessage();
  1550.         }
  1551.         return new JsonResponse(['success' => false'errors' => $errors]);
  1552.     }
  1553.     public function saveTiresConfigurator(Request $requestDealer $dealer null)
  1554.     {
  1555.         $tireForm = new Forms();
  1556.         $tireForm->setDomain($request->getHost());
  1557.         $tireForm->setDateCreate(new DateTime());
  1558.         $tireForm->setType(self::TYPE_TIRES_CONFIGURATOR);
  1559.         $form $this->formFactory->tiresConfiguratorForm($tireForm);
  1560.         $data $request->request->all($form->getName());
  1561.         if (!$this->hasPrivacy($data)) {
  1562.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1563.         }
  1564.         if (!$this->validateCaptcha($data)) {
  1565.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1566.         }
  1567.         $validConfigures $this->validateTireConfigures($form$data$request->getLocale());
  1568.         if ($validConfigures !== true) {
  1569.             return new JsonResponse(['success' => false'errors' => $validConfigures['errors']]);
  1570.         }
  1571.         $form->handleRequest($request);
  1572.         $isValid $this->validateForm($form);
  1573.         if ($form->isSubmitted() && $isValid) {
  1574.             $tireForm->setDealer($dealer);
  1575.             $tireForm->setData(json_encode([
  1576.                 'tiresType' => $data['tiresType'],
  1577.                 'vin' => $data['vin'],
  1578.                 'diameter' => $data['diameter'],
  1579.                 'width' => $data['width'],
  1580.                 'profile' => $data['profile'],
  1581.             ]));
  1582.             $this->entityManager->persist($tireForm);
  1583.             $this->entityManager->flush();
  1584.             return new JsonResponse(
  1585.                 ['success' => true,
  1586.                     'name' => $tireForm->getName(),
  1587.                     'phone' => $tireForm->getPhone()
  1588.                 ]
  1589.             );
  1590.         }
  1591.         $errors = [];
  1592.         foreach ($form->getErrors() as $error) {
  1593.             $errors[] = $error->getMessage();
  1594.         }
  1595.         return new JsonResponse(['success' => false'errors' => $errors]);
  1596.     }
  1597.     public function saveBuyUsedCarForm(Request $requestDealer $dealer null)
  1598.     {
  1599.         $buyForm = new Forms();
  1600.         $buyForm->setDomain($request->getHost());
  1601.         $buyForm->setDateCreate(new DateTime());
  1602.         $buyForm->setType(self::TYPE_BUY_USED_CAR);
  1603.         $form $this->formFactory->buyForm($buyForm);
  1604.         $data $request->request->all($form->getName());
  1605.         if (!$this->hasPrivacy($data)) {
  1606.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1607.         }
  1608.         if (!$this->validateCaptcha($data)) {
  1609.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1610.         }
  1611.         $form->handleRequest($request);
  1612.         if (!$dealer) {
  1613.             $buyForm->setDealer($buyForm->getVehicle()->getDealer());
  1614.         } else {
  1615.             $buyForm->setDealer($dealer);
  1616.         }
  1617.         $isValid $this->validateForm($form);
  1618.         if ($form->isSubmitted() && $isValid) {
  1619.             $this->entityManager->persist($buyForm);
  1620.             $this->entityManager->flush();
  1621.             return new JsonResponse([
  1622.                 'success' => true,
  1623.                 'name' => $buyForm->getName(),
  1624.                 'phone' => $buyForm->getPhone()
  1625.             ]);
  1626.         }
  1627.         return new JsonResponse([
  1628.             'success' => false,
  1629.             'errors' => $this->getErrorsFromForm($form)
  1630.         ]);
  1631.     }
  1632.     public function saveSubServiceForm(Request $request\ImporterBundle\Entity\Dealer $dealer null)
  1633.     {
  1634.         $entityForm = new \ImporterBundle\Entity\Forms();
  1635.         $entityForm->setDomain($request->getHost());
  1636.         $entityForm->setDateCreate(new DateTime());
  1637.         $entityForm->setType(self::TYPE_SERVICE_FORM);
  1638.         $form $this->formFactory->subServiceForm($entityFormtrue);
  1639.         $data $request->request->all($form->getName());
  1640.         if (!$dealer && isset($data['dealer'])) {
  1641.             $dealer $this->entityManager->getRepository(\ImporterBundle\Entity\Dealer::class)->find($data['dealer']);
  1642.         }
  1643.         if (!$this->hasPrivacy($data)) {
  1644.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1645.         }
  1646.         if (!$this->validateCaptcha($data)) {
  1647.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1648.         }
  1649.         $form->handleRequest($request);
  1650.         $isValid $this->validateForm($form);
  1651.         if ($form->isSubmitted() && $isValid) {
  1652.             if ($dealer) {
  1653.                 $entityForm->setDealer($dealer);
  1654.             }
  1655.             $this->entityManager->persist($entityForm);
  1656.             $this->entityManager->flush();
  1657.             return new JsonResponse(['success' => true]);
  1658.         }
  1659.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1660.     }
  1661.     public function saveSubSparePartsForm(Request $request\ImporterBundle\Entity\Dealer $dealer null)
  1662.     {
  1663.         $entityForm = new \ImporterBundle\Entity\Forms();
  1664.         $entityForm->setDomain($request->getHost());
  1665.         $entityForm->setDateCreate(new DateTime());
  1666.         $entityForm->setType(self::TYPE_BUY_SPARE_PARTS);
  1667.         $form $this->formFactory->subSparePartsForm($entityForm);
  1668.         $data $request->request->all($form->getName());
  1669.         if (!$this->hasPrivacy($data)) {
  1670.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1671.         }
  1672.         if (!$this->validateCaptcha($data)) {
  1673.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1674.         }
  1675.         $form->handleRequest($request);
  1676.         $isValid $this->validateForm($form);
  1677.         if ($form->isSubmitted() && $isValid) {
  1678.             $entityForm->setDealer($dealer);
  1679.             $entityForm->setData(json_encode([
  1680.                 'vin' => $data['vin'],
  1681.                 'model' => $data['model'],
  1682.                 'parts' => $data['parts'],
  1683.             ]));
  1684.             $this->entityManager->persist($entityForm);
  1685.             $this->entityManager->flush();
  1686.             return new JsonResponse(['success' => true]);
  1687.         }
  1688.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1689.     }
  1690.     public function saveSubOrderForm(Request $request\ImporterBundle\Entity\Dealer $dealer null)
  1691.     {
  1692.         $entityForm = new \ImporterBundle\Entity\Forms();
  1693.         $entityForm->setDomain($request->getHost());
  1694.         $entityForm->setDateCreate(new DateTime());
  1695.         $entityForm->setType(self::TYPE_ORDER_FORM);
  1696.         $form $this->formFactory->subOrderForm(null$entityForm);
  1697.         $data $request->request->all($form->getName());
  1698.         if (!$this->hasPrivacy($data)) {
  1699.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1700.         }
  1701.         if (!$this->validateCaptcha($data)) {
  1702.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1703.         }
  1704.         $form->handleRequest($request);
  1705.         $isValid $this->validateForm($form);
  1706.         if ($form->isSubmitted() && $isValid) {
  1707.             $entityForm->setDealer($dealer);
  1708.             $entityForm->setData(json_encode([
  1709.                 'item' => $data['item'],
  1710.             ]));
  1711.             $this->entityManager->persist($entityForm);
  1712.             $this->entityManager->flush();
  1713.             return new JsonResponse(['success' => true]);
  1714.         }
  1715.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1716.     }
  1717.     public function saveSubOrderVehicleForm(Request $request\ImporterBundle\Entity\Dealer $dealer null)
  1718.     {
  1719.         $entityForm = new \ImporterBundle\Entity\Forms();
  1720.         $entityForm->setDomain($request->getHost());
  1721.         $entityForm->setDateCreate(new DateTime());
  1722.         $entityForm->setType(self::TYPE_ORDER_FORM);
  1723.         $form $this->formFactory->subOrderVehicleForm($entityForm);
  1724.         $data $request->request->all($form->getName());
  1725.         if (!$this->hasPrivacy($data)) {
  1726.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1727.         }
  1728.         if (!$this->validateCaptcha($data)) {
  1729.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1730.         }
  1731.         $form->handleRequest($request);
  1732.         $isValid $this->validateForm($form);
  1733.         if ($form->isSubmitted() && $isValid) {
  1734.             $entityForm->setDealer($dealer);
  1735.             $this->entityManager->persist($entityForm);
  1736.             $this->entityManager->flush();
  1737.             return new JsonResponse(['success' => true]);
  1738.         }
  1739.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1740.     }
  1741.     public function saveSubCommissionTechnologyForm(Request $request\ImporterBundle\Entity\Dealer $dealer null)
  1742.     {
  1743.         $commissionForm = new \ImporterBundle\Entity\Forms();
  1744.         $commissionForm->setDomain($request->getHost());
  1745.         $commissionForm->setDateCreate(new DateTime());
  1746.         $commissionForm->setType(self::TYPE_COMMISSION_TECHNOLOGY);
  1747.         $form $this->formFactory->subCommissionTechnologyForm($commissionForm);
  1748.         $data $request->request->all($form->getName());
  1749.         if (!$this->hasPrivacy($data)) {
  1750.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1751.         }
  1752.         if (!$this->validateCaptcha($data)) {
  1753.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1754.         }
  1755.         $form->handleRequest($request);
  1756.         $isValid $this->validateForm($form);
  1757.         if ($form->isSubmitted() && $isValid) {
  1758.             $commissionForm->setDealer($dealer);
  1759.             $commissionForm->setData(json_encode([
  1760.                 'model' => $data['model'],
  1761.                 'price' => $data['price'],
  1762.             ]));
  1763.             $this->entityManager->persist($commissionForm);
  1764.             $this->entityManager->flush();
  1765.             return new JsonResponse(
  1766.                 [
  1767.                     'success' => true,
  1768.                     'name' => $commissionForm->getName(),
  1769.                     'phone' => $commissionForm->getPhone()
  1770.                 ]
  1771.             );
  1772.         }
  1773.         $errors = [];
  1774.         foreach ($form->getErrors() as $error) {
  1775.             $errors[] = $error->getMessage();
  1776.         }
  1777.         return new JsonResponse(['success' => false'errors' => $errors]);
  1778.     }
  1779.     /**
  1780.      * @param Request $request
  1781.      * @param \ImporterBundle\Entity\Dealer|null $dealer
  1782.      * @return JsonResponse
  1783.      * @throws OptimisticLockException
  1784.      */
  1785.     public function saveSubBuyCarForm(Request $request\ImporterBundle\Entity\Dealer $dealer null)
  1786.     {
  1787.         $buyForm = new \ImporterBundle\Entity\Forms();
  1788.         $buyForm->setDomain($request->getHost());
  1789.         $buyForm->setDateCreate(new DateTime());
  1790.         $buyForm->setType(self::TYPE_ORDER_FORM);
  1791.         $form $this->formFactory->subBuyForm($buyForm);
  1792.         $data $request->request->all($form->getName());
  1793.         if (!$this->hasPrivacy($data)) {
  1794.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1795.         }
  1796.         if (!$this->validateCaptcha($data)) {
  1797.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1798.         }
  1799.         $form->handleRequest($request);
  1800.         if (!$dealer) {
  1801.             $buyForm->setDealer($buyForm->getSubDealerVehicle()->getDealer());
  1802.         } else {
  1803.             $buyForm->setDealer($dealer);
  1804.         }
  1805.         $isValid $this->validateForm($form);
  1806.         if ($form->isSubmitted() && $isValid) {
  1807.             $this->entityManager->persist($buyForm);
  1808.             $this->entityManager->flush();
  1809.             return new JsonResponse([
  1810.                 'success' => true,
  1811.                 'name' => $buyForm->getName(),
  1812.                 'phone' => $buyForm->getPhone()
  1813.             ]);
  1814.         }
  1815.         return new JsonResponse([
  1816.             'success' => false,
  1817.             'errors' => $this->getErrorsFromForm($form)
  1818.         ]);
  1819.     }
  1820.     public function saveSubBuyPartsForm(Request $request\ImporterBundle\Entity\Dealer $dealer)
  1821.     {
  1822.         $buyPartsFormEntity = new \ImporterBundle\Entity\Forms();
  1823.         $buyPartsFormEntity->setDomain($request->getHost());
  1824.         $buyPartsFormEntity->setType(self::TYPE_BUY_PARTS_FORM);
  1825.         $buyPartsFormEntity->setDateCreate(new DateTime());
  1826.         $accessoriesRepo $this->entityManager->getRepository(\ImporterBundle\Entity\Accessories::class);
  1827.         $partId $request->get('buy_parts')['accessory'];
  1828.         $accessory $accessoriesRepo->findOneBy(['id' => $partId]);
  1829.         if (!$accessory) {
  1830.             $data = ['part' => $partId];
  1831.             $buyPartsFormEntity->setData(json_encode($data));
  1832.             $requestData $request->get('buy_parts');
  1833.             $requestData['accessory'] = null;
  1834.             $request->request->set('buy_parts'$requestData);
  1835.         }
  1836.         $form $this->formFactory->buySubPartsForm($dealer$buyPartsFormEntity);
  1837.         $data $request->request->all($form->getName());
  1838.         if (!$this->hasPrivacy($data)) {
  1839.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1840.         }
  1841.         if (!$this->validateCaptcha($data)) {
  1842.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1843.         }
  1844.         $form->handleRequest($request);
  1845.         $isValid $this->validateForm($form);
  1846.         if ($form->isSubmitted() && $isValid) {
  1847.             $buyPartsFormEntity->setAccessory($accessory);
  1848.             $buyPartsFormEntity->setDealer($dealer);
  1849.             $this->entityManager->persist($buyPartsFormEntity);
  1850.             $this->entityManager->flush();
  1851.             return new JsonResponse(['success' => true]);
  1852.         }
  1853.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1854.     }
  1855.     public function saveSubQuestionForm(Request $request\ImporterBundle\Entity\Dealer $dealer null)
  1856.     {
  1857.         $entityForm = new \ImporterBundle\Entity\Forms();
  1858.         $entityForm->setDomain($request->getHost());
  1859.         $entityForm->setDateCreate(new DateTime());
  1860.         $entityForm->setType(self::TYPE_COMMON_FORM);
  1861.         $form $this->formFactory->subFeedbackQuestionForm($entityForm);
  1862.         $data $request->request->all($form->getName());
  1863.         if (!$this->hasPrivacy($data)) {
  1864.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1865.         }
  1866.         if (!$this->validateCaptcha($data)) {
  1867.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1868.         }
  1869.         $form->handleRequest($request);
  1870.         $isValid $this->validateForm($form);
  1871.         if ($form->isSubmitted() && $isValid) {
  1872.             $entityForm->setDealer($dealer);
  1873.             $entityForm->setData(json_encode([
  1874.                 'question' => $data['question'],
  1875.             ]));
  1876.             $this->entityManager->persist($entityForm);
  1877.             $this->entityManager->flush();
  1878.             return new JsonResponse(['success' => true]);
  1879.         }
  1880.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1881.     }
  1882.     public function saveSubCreditForm(Request $request\ImporterBundle\Entity\Dealer $dealer null)
  1883.     {
  1884.         $entityForm = new \ImporterBundle\Entity\Forms();
  1885.         $entityForm->setDomain($request->getHost());
  1886.         $entityForm->setDateCreate(new DateTime());
  1887.         $entityForm->setType(self::TYPE_CREDIT_FORM);
  1888.         $form $this->formFactory->subCreditForm($entityForm);
  1889.         $data $request->request->all($form->getName());
  1890.         if (!$this->hasPrivacy($data)) {
  1891.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1892.         }
  1893.         if (!$this->validateCaptcha($data)) {
  1894.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1895.         }
  1896.         $form->handleRequest($request);
  1897.         $isValid $this->validateForm($form);
  1898.         if ($form->isSubmitted() && $isValid) {
  1899.             $entityForm->setDealer($dealer);
  1900.             $entityForm->setData(json_encode([
  1901.                 'text' => $data['text'],
  1902.             ]));
  1903.             $this->entityManager->persist($entityForm);
  1904.             $this->entityManager->flush();
  1905.             return new JsonResponse(['success' => true]);
  1906.         }
  1907.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1908.     }
  1909.     public function saveSubInsuranceForm(Request $request\ImporterBundle\Entity\Dealer $dealer null)
  1910.     {
  1911.         $entityForm = new \ImporterBundle\Entity\Forms();
  1912.         $entityForm->setDomain($request->getHost());
  1913.         $entityForm->setDateCreate(new DateTime());
  1914.         $entityForm->setType(self::TYPE_INSURANCE);
  1915.         $form $this->formFactory->subInsuranceForm($entityForm);
  1916.         $data $request->request->all($form->getName());
  1917.         if (!$this->hasPrivacy($data)) {
  1918.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1919.         }
  1920.         if (!$this->validateCaptcha($data)) {
  1921.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1922.         }
  1923.         $form->handleRequest($request);
  1924.         $isValid $this->validateForm($form);
  1925.         if ($form->isSubmitted() && $isValid) {
  1926.             $entityForm->setDealer($dealer);
  1927.             $this->entityManager->persist($entityForm);
  1928.             $this->entityManager->flush();
  1929.             return new JsonResponse(['success' => true]);
  1930.         }
  1931.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1932.     }
  1933.     public function saveSubTestDriveForm(Request $request\ImporterBundle\Entity\Dealer $dealer null)
  1934.     {
  1935.         $entityForm = new \ImporterBundle\Entity\Forms();
  1936.         $entityForm->setDomain($request->getHost());
  1937.         $entityForm->setDateCreate(new DateTime());
  1938.         $entityForm->setType(self::TYPE_TEST_DRIVE_FORM);
  1939.         $form $this->formFactory->subTestDriveForm($entityForm);
  1940.         $data $request->request->all($form->getName());
  1941.         if (!$this->hasPrivacy($data)) {
  1942.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1943.         }
  1944.         if (!$this->validateCaptcha($data)) {
  1945.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1946.         }
  1947.         $form->handleRequest($request);
  1948.         $isValid $this->validateForm($form);
  1949.         if ($form->isSubmitted() && $isValid) {
  1950.             $entityForm->setDealer($dealer);
  1951.             $this->entityManager->persist($entityForm);
  1952.             $this->entityManager->flush();
  1953.             return new JsonResponse(['success' => true]);
  1954.         }
  1955.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1956.     }
  1957.     public function saveLeasingForm(Request $requestDealer $dealer)
  1958.     {
  1959.         $leasingFormEntity = new Forms();
  1960.         $leasingFormEntity->setDomain($request->getHost());
  1961.         $leasingFormEntity->setType(self::TYPE_LEASING_CALCULATOR);
  1962.         $leasingFormEntity->setDateCreate(new DateTime());
  1963.         $form $this->formFactory->leasingForm($dealer$leasingFormEntity);
  1964.         $data $request->request->all($form->getName());
  1965.         if (!$this->hasPrivacy($data)) {
  1966.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1967.         }
  1968.         if (!$this->validateCaptcha($data)) {
  1969.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1970.         }
  1971.         $form->handleRequest($request);
  1972.         $isValid $this->validateForm($form);
  1973.         if ($form->isSubmitted() && $isValid) {
  1974.             $leasingFormEntity->setDealer($dealer);
  1975.             $data array_merge(json_decode($data['data'], true), ['edrpou' => $data['edrpou']]);
  1976.             $leasingFormEntity->setData(json_encode($data));
  1977.             $leasingFormEntity->setUtm($request->get('utm') ?? $request->cookies->get('ViDiTrackUTM'));
  1978.             $this->entityManager->persist($leasingFormEntity);
  1979.             $this->entityManager->flush();
  1980.             return new JsonResponse(['success' => true'form_id' => $leasingFormEntity->getId()]);
  1981.         }
  1982.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  1983.     }
  1984.     public function saveFleetUpdate(Request $requestDealer $dealer)
  1985.     {
  1986.         $fleetUpdateForm = new Forms();
  1987.         $fleetUpdateForm->setDomain($request->getHost());
  1988.         $fleetUpdateForm->setDateCreate(new DateTime());
  1989.         $fleetUpdateForm->setType(self::TYPE_UNICOMMERCE_FLEET_UPDATING);
  1990.         $form $this->formFactory->UnicommerceFleetUpdate($dealer$fleetUpdateForm);
  1991.         $data $request->request->all($form->getName());
  1992.         if (!$this->hasPrivacy($data)) {
  1993.             return new JsonResponse(['success' => false'error' => 'privacy']);
  1994.         }
  1995.         if (!$this->validateCaptcha($data)) {
  1996.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  1997.         }
  1998.         $form->handleRequest($request);
  1999.         $isValid $this->validateForm($form);
  2000.         if ($form->isSubmitted() && $isValid) {
  2001.             $fleetUpdateForm->setDealer($dealer);
  2002.             $fleetUpdateForm->setData(
  2003.                 json_encode(
  2004.                     ['brand' => $data['brand'],
  2005.                         'appointment' => $data['appointment'],
  2006.                         'mileage' => $data['mileage'],
  2007.                         'year' => $data['year'],
  2008.                     ]
  2009.                 )
  2010.             );
  2011.             $this->entityManager->persist($fleetUpdateForm);
  2012.             $this->entityManager->flush();
  2013.             return new JsonResponse(
  2014.                 [
  2015.                     'success' => true,
  2016.                     'name' => $fleetUpdateForm->getName(),
  2017.                     'phone' => $fleetUpdateForm->getPhone()
  2018.                 ]
  2019.             );
  2020.         }
  2021.         $errors = [];
  2022.         foreach ($form->getErrors() as $error) {
  2023.             $errors[] = $error->getMessage();
  2024.         }
  2025.         return new JsonResponse(['success' => false'errors' => $errors]);
  2026.     }
  2027.     public function saveMotoTestDriveForm(Request $requestDealer $dealer)
  2028.     {
  2029.         $testDriveForm = new Forms();
  2030.         $testDriveForm->setDomain($request->getHost());
  2031.         $testDriveForm->setDateCreate(new DateTime());
  2032.         $testDriveForm->setType(self::TYPE_MOTO_TEST_DRIVE);
  2033.         $form $this->formFactory->motoTestDriveForm($dealer$testDriveForm);
  2034.         $data $request->request->all($form->getName());
  2035.         if (!$this->hasPrivacy($data)) {
  2036.             return new JsonResponse(['success' => false'error' => 'privacy']);
  2037.         }
  2038.         if (!$this->validateCaptcha($data)) {
  2039.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  2040.         }
  2041.         $form->handleRequest($request);
  2042.         $isValid $this->validateForm($form);
  2043.         if ($form->isSubmitted() && $isValid) {
  2044.             $testDriveForm->setDealer($dealer);
  2045.             $this->entityManager->persist($testDriveForm);
  2046.             $this->entityManager->flush();
  2047.             return new JsonResponse(['success' => true]);
  2048.         }
  2049.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  2050.     }
  2051.     public function saveWaterTestDriveForm(Request $requestDealer $dealer$vehicle null)
  2052.     {
  2053.         $testDriveForm = new Forms();
  2054.         $testDriveForm->setDomain($request->getHost());
  2055.         $testDriveForm->setDateCreate(new DateTime());
  2056.         $testDriveForm->setType(self::TYPE_WATER_TEST_DRIVE);
  2057.         $form $this->formFactory->waterTestDriveForm($dealer$testDriveForm);
  2058.         $data $request->request->all($form->getName());
  2059.         if (!$this->hasPrivacy($data)) {
  2060.             return new JsonResponse(['success' => false'error' => 'privacy']);
  2061.         }
  2062.         if (!$this->validateCaptcha($data)) {
  2063.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  2064.         }
  2065.         $form->handleRequest($request);
  2066.         if ($vehicle instanceof Vehicle) {
  2067.             $testDriveForm->setVehicle($vehicle);
  2068.         }
  2069.         $isValid $this->validateForm($form);
  2070.         if ($form->isSubmitted() && $isValid) {
  2071.             $testDriveForm->setDealer($dealer);
  2072.             $testDriveForm->setData(
  2073.                 [
  2074.                     'vehicle' => $data['vehicle'],
  2075.                     'test_drive' => $data['test_drive'],
  2076.                     'comment' => $data['comment'],
  2077.                 ]
  2078.             );
  2079.             $this->entityManager->persist($testDriveForm);
  2080.             $this->entityManager->flush();
  2081.             return new JsonResponse(['success' => true]);
  2082.         }
  2083.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  2084.     }
  2085.     public function saveOilTOForm(Request $requestDealer $dealer)
  2086.     {
  2087.         $oilTOEntity = new Forms();
  2088.         $oilTOEntity->setDomain($request->getHost());
  2089.         $oilTOEntity->setType(self::TYPE_OIL_TO);
  2090.         $oilTOEntity->setDateCreate(new DateTime());
  2091.         $form $this->formFactory->oilTOForm($oilTOEntity);
  2092.         $data $request->request->all($form->getName());
  2093.         if (!$this->hasPrivacy($data)) {
  2094.             return new JsonResponse(['success' => false'error' => 'privacy']);
  2095.         }
  2096.         if (!$this->validateCaptcha($data)) {
  2097.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  2098.         }
  2099.         $form->handleRequest($request);
  2100.         $isValid $this->validateForm($form);
  2101.         if ($form->isSubmitted() && $isValid) {
  2102.             $oilTOEntity->setDealer($dealer);
  2103.             $oilTOEntity->setData(
  2104.                 [
  2105.                     'service' => $data['service'],
  2106.                     'price' => $data['price'],
  2107.                 ]
  2108.             );
  2109.             $this->entityManager->persist($oilTOEntity);
  2110.             $this->entityManager->flush();
  2111.             return new JsonResponse(['success' => true]);
  2112.         }
  2113.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  2114.     }
  2115.     public function saveServiceCampaingCarForm(Request $requestDealer $dealer)
  2116.     {
  2117.         $entityForm = new Forms();
  2118.         $entityForm->setDomain($request->getHost());
  2119.         $entityForm->setDateCreate(new DateTime());
  2120.         $entityForm->setType(self::TYPE_SERVICE_CAMPAING_CAR);
  2121.         $form $this->formFactory->serviceCampaingCarForm($entityForm);
  2122.         $data $request->request->all($form->getName());
  2123.         if (!$this->hasPrivacy($data)) {
  2124.             return new JsonResponse(['success' => false'error' => 'privacy']);
  2125.         }
  2126.         if (!$this->validateCaptcha($data)) {
  2127.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  2128.         }
  2129.         $form->handleRequest($request);
  2130.         $isValid $this->validateForm($form);
  2131.         if ($form->isSubmitted() && $isValid) {
  2132.             $entityForm->setDealer($dealer);
  2133.             $entityForm->setData(json_encode([
  2134.                 'brand' => $data['brand'],
  2135.                 'model' => $data['model'],
  2136.                 'vin' => $data['vin'],
  2137.                 'comment' => $data['comment'],
  2138.             ]));
  2139.             $this->entityManager->persist($entityForm);
  2140.             $this->entityManager->flush();
  2141.             return new JsonResponse(['success' => true]);
  2142.         }
  2143.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  2144.     }
  2145.     public function saveSaveDesignForm(Request $requestDealer $dealer$vehicle null)
  2146.     {
  2147.         $entityForm = new Forms();
  2148.         $entityForm->setDomain($request->getHost());
  2149.         $entityForm->setDateCreate(new DateTime());
  2150.         $entityForm->setType(self::TYPE_SAVE_DESIGN);
  2151.         $form $this->formFactory->saveDesignForm($entityForm);
  2152.         $data $request->request->all($form->getName());
  2153.         if (!$this->hasPrivacy($data)) {
  2154.             return new JsonResponse(['success' => false'error' => 'privacy']);
  2155.         }
  2156.         if (!$this->validateCaptcha($data)) {
  2157.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  2158.         }
  2159.         if ($vehicle instanceof Vehicle) {
  2160.             $entityForm->setVehicle($vehicle);
  2161.         }
  2162.         $form->handleRequest($request);
  2163.         $isValid $this->validateForm($form);
  2164.         if ($form->isSubmitted() && $isValid) {
  2165.             $entityForm->setDealer($dealer);
  2166.             $entityForm->setData(json_encode([
  2167.                 'vehicle' => $data['vehicle'],
  2168.             ]));
  2169.             $this->entityManager->persist($entityForm);
  2170.             $this->entityManager->flush();
  2171.             return new JsonResponse(['success' => true]);
  2172.         }
  2173.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  2174.     }
  2175.     public function saveSendQuestionForm(Request $requestDealer $dealer)
  2176.     {
  2177.         $entityForm = new Forms();
  2178.         $entityForm->setDomain($request->getHost());
  2179.         $entityForm->setDateCreate(new DateTime());
  2180.         $entityForm->setType(self::TYPE_SEND_QUESTION);
  2181.         $form $this->formFactory->sendQuestionForm($entityForm);
  2182.         $data $request->request->all($form->getName());
  2183.         if (!$this->hasPrivacy($data)) {
  2184.             return new JsonResponse(['success' => false'error' => 'privacy']);
  2185.         }
  2186.         if (!$this->validateCaptcha($data)) {
  2187.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  2188.         }
  2189.         $form->handleRequest($request);
  2190.         $isValid $this->validateForm($form);
  2191.         if ($form->isSubmitted() && $isValid) {
  2192.             $entityForm->setDealer($dealer);
  2193.             $entityForm->setData(json_encode([
  2194.                 'select_subject_question' => $data['select_subject_question'],
  2195.                 'select_dealer' => $data['select_dealer'],
  2196.                 'comment' => $data['comment'],
  2197.             ]));
  2198.             $this->entityManager->persist($entityForm);
  2199.             $this->entityManager->flush();
  2200.             return new JsonResponse(['success' => true]);
  2201.         }
  2202.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  2203.     }
  2204.     public function saveOnlineServiceRegistrationForm(Request $requestDealer $dealer)
  2205.     {
  2206.         $entityForm = new Forms();
  2207.         $entityForm->setDomain($request->getHost());
  2208.         $entityForm->setDateCreate(new DateTime());
  2209.         $entityForm->setType(self::TYPE_ONLINE_SERVICE_REGISTRATION);
  2210.         $form $this->formFactory->onlineServiceRegistrationForm($entityForm);
  2211.         $data $request->request->all($form->getName());
  2212.         if (!$this->hasPrivacy($data)) {
  2213.             return new JsonResponse(['success' => false'error' => 'privacy']);
  2214.         }
  2215.         if (!$this->validateCaptcha($data)) {
  2216.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  2217.         }
  2218.         $form->handleRequest($request);
  2219.         $isValid $this->validateForm($form);
  2220.         if ($form->isSubmitted() && $isValid) {
  2221.             $entityForm->setDealer($dealer);
  2222.             $entityForm->setData(json_encode([
  2223.                 'date_visit' => $data['date_visit'],
  2224.                 'model' => $data['model'],
  2225.                 'comment' => $data['comment'],
  2226.                 'select_dealer' => $data['select_dealer'],
  2227.             ]));
  2228.             $this->entityManager->persist($entityForm);
  2229.             $this->entityManager->flush();
  2230.             return new JsonResponse(['success' => true]);
  2231.         }
  2232.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  2233.     }
  2234.     public function saveWithoutPayOrderForm(Request $requestDealer $dealerUser $user): JsonResponse
  2235.     {
  2236.         $entityForm = new Forms();
  2237.         $entityForm->setDomain($request->getHost());
  2238.         $entityForm->setDateCreate(new DateTime());
  2239.         $entityForm->setType(self::TYPE_WITHOUT_PAY_ORDER);
  2240.         $form $this->formFactory->withoutPayOrderForm($entityForm);
  2241.         $data $request->request->all($form->getName());
  2242.         if (!$this->hasPrivacy($data)) {
  2243.             return new JsonResponse(['success' => false'error' => 'privacy']);
  2244.         }
  2245.         if (!$this->validateCaptcha($data)) {
  2246.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  2247.         }
  2248.         $form->handleRequest($request);
  2249.         $isValid $this->validateForm($form);
  2250.         if ($form->isSubmitted() && $isValid) {
  2251.             $entityForm->setDealer($dealer);
  2252.             $entityForm->setUser($user);
  2253.             $entityForm->setData(json_encode([
  2254.                 'comment' => $data['comment'],
  2255.                 'select_dealer' => $data['select_dealer'],
  2256.             ]));
  2257.             $this->entityManager->persist($entityForm);
  2258.             $this->entityManager->flush();
  2259.             return new JsonResponse(['success' => true]);
  2260.         }
  2261.         return new JsonResponse(['success' => false'errors' => $this->getErrorsFromForm($form)]);
  2262.     }
  2263.     /**
  2264.      * @param Request $request
  2265.      * @return JsonResponse
  2266.      * @throws OptimisticLockException
  2267.      */
  2268.     public function saveCallMeForm(Request $requestint $formType self::TYPE_COMMON_FORM): JsonResponse
  2269.     {
  2270.         $callMeForm = new Forms();
  2271.         $callMeForm->setDomain($request->getHost())
  2272.             ->setDateCreate(new DateTime())
  2273.             ->setType($formType);
  2274.         if (isset($request->request->all('call_me')['message_type'])) {
  2275.             $callMeForm->setData(json_encode(
  2276.                 [
  2277.                     'message_type' => $request->request->all('call_me')['message_type'],
  2278.                 ]
  2279.             ));
  2280.         }
  2281.         $form $this->formFactory->callMeForm($callMeForm, isset($request->request->all('call_me')['dealer']));
  2282.         $data $request->request->all($form->getName());
  2283.         if (!$this->hasPrivacy($data)) {
  2284.             return new JsonResponse(['success' => false'error' => 'privacy']);
  2285.         }
  2286.         if (!$this->validateCaptcha($data)) {
  2287.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  2288.         }
  2289.         $form->handleRequest($request);
  2290.         $isValid $this->validateForm($form);
  2291.         if ($form->isSubmitted() && $isValid) {
  2292.             $this->entityManager->persist($callMeForm);
  2293.             $this->entityManager->flush();
  2294.             return new JsonResponse([
  2295.                 'success' => true,
  2296.                 'name' => $callMeForm->getName(),
  2297.                 'phone' => $callMeForm->getPhone()
  2298.             ]);
  2299.         }
  2300.         return new JsonResponse([
  2301.             'success' => false,
  2302.             'errors' => $this->getErrorsFromForm($form)
  2303.         ]);
  2304.     }
  2305.     public function saveCallMeFormWithDealers(Request $requestint $formType self::TYPE_TIRES_HOTEL_CALL): JsonResponse
  2306.     {
  2307.         $callMeForm = new Forms();
  2308.         $callMeForm->setDomain($request->getHost())
  2309.             ->setDateCreate(new DateTime())
  2310.             ->setType($formType);
  2311.         $setData = [];
  2312.         if (isset($request->request->all('call_me_with_dealers')['message_type'])) {
  2313.             $setData['message_type'] = $request->request->all('call_me_with_dealers')['message_type'];
  2314.         }
  2315.         if (isset($request->request->all('call_me_with_dealers')['dealers'])) {
  2316.             $setData['dealers'] = $request->request->all('call_me_with_dealers')['dealers'];
  2317.         }
  2318.         $callMeForm->setData(json_encode($setData));
  2319.         $form $this->formFactory->callMeFormWithDealers($callMeForm);
  2320.         $data $request->request->all($form->getName());
  2321.         if (!$this->hasPrivacy($data)) {
  2322.             return new JsonResponse(['success' => false'error' => 'privacy']);
  2323.         }
  2324.         if (!$this->validateCaptcha($data)) {
  2325.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  2326.         }
  2327.         $form->handleRequest($request);
  2328.         $isValid $this->validateForm($form);
  2329.         if ($form->isSubmitted() && $isValid) {
  2330.             $this->entityManager->persist($callMeForm);
  2331.             $this->entityManager->flush();
  2332.             return new JsonResponse([
  2333.                 'success' => true,
  2334.                 'name' => $callMeForm->getName(),
  2335.                 'phone' => $callMeForm->getPhone()
  2336.             ]);
  2337.         }
  2338.         return new JsonResponse([
  2339.             'success' => false,
  2340.             'errors' => $this->getErrorsFromForm($form)
  2341.         ]);
  2342.     }
  2343.     public function saveTiresHotelForm(Request $request$dealerint $formType self::TYPE_TIRES_HOTEL_ORDER)
  2344.     {
  2345.         $tiresHotelForm = (new Forms())->setDomain($request->getHost())
  2346.             ->setDateCreate(new DateTime())
  2347.             ->setType($formType);
  2348.         $tiresHotelForm->setData(json_encode(
  2349.             [
  2350.                 'message_type' => $request->get('tires_hotel')['message_type'],
  2351.                 'selected_categories' => $request->get('selectedCategories'),
  2352.                 'dealers' => $dealer->getName(),
  2353.             ]
  2354.         ));
  2355.         $tiresHotelForm->setDealer($dealer);
  2356.         $form $this->formFactory->tiresHotelForm($tiresHotelForm);
  2357.         $data $request->get($form->getName());
  2358.         if (!$this->hasPrivacy($data)) {
  2359.             return new JsonResponse(['success' => false'error' => 'privacy']);
  2360.         }
  2361.         if (!$this->validateCaptcha($data)) {
  2362.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  2363.         }
  2364.         $form->handleRequest($request);
  2365.         $isValid $this->validateForm($form);
  2366.         if ($form->isSubmitted() && $isValid) {
  2367.             $this->entityManager->persist($tiresHotelForm);
  2368.             $this->entityManager->flush();
  2369.             return new JsonResponse([
  2370.                 'success' => true,
  2371.                 'name' => $tiresHotelForm->getName(),
  2372.                 'phone' => $tiresHotelForm->getPhone()
  2373.             ]);
  2374.         }
  2375.         return new JsonResponse([
  2376.             'success' => false,
  2377.             'errors' => $this->getErrorsFromForm($form)
  2378.         ]);
  2379.     }
  2380.     public function saveServiceConsultForm(Request $requestint $formType self::TYPE_COMMON_FORMDealer $dealer null): JsonResponse
  2381.     {
  2382.         $serviceConsultForm = (new Forms())->setDomain($request->getHost())
  2383.             ->setDateCreate(new DateTime())
  2384.             ->setType($formType);
  2385.         if ($dealer){
  2386.             $serviceConsultForm->setDealer($dealer);
  2387.         }
  2388.         $serviceConsultForm->setData(json_encode(
  2389.             [
  2390.                 'message_type' => $request->request->all('service_consult')['message_type'],
  2391.                 'commentary' => $request->get('commentary'),
  2392.                 'selected_service' => $request->request->all('service_consult')['services'],
  2393.             ]
  2394.         ));
  2395.         $form $this->formFactory->serviceConsultForm($serviceConsultForm);
  2396.         $data $request->request->all($form->getName());
  2397.         if (!$this->hasPrivacy($data)) {
  2398.             return new JsonResponse(['success' => false'error' => 'privacy']);
  2399.         }
  2400.         if (!$this->validateCaptcha($data)) {
  2401.             return new JsonResponse(['success' => false'error' => 'captcha token']);
  2402.         }
  2403.         $form->handleRequest($request);
  2404.         $isValid $this->validateForm($form);
  2405.         if ($form->isSubmitted() && $isValid) {
  2406.             $this->entityManager->persist($serviceConsultForm);
  2407.             $this->entityManager->flush();
  2408.             return new JsonResponse([
  2409.                 'success' => true,
  2410.                 'name' => $serviceConsultForm->getName(),
  2411.                 'phone' => $serviceConsultForm->getPhone()
  2412.             ]);
  2413.         }
  2414.         return new JsonResponse([
  2415.             'success' => false,
  2416.             'errors' => $this->getErrorsFromForm($form)
  2417.         ]);
  2418.     }
  2419.     public function saveUnicommerceWithPhoto(Dealer $dealerFormInterface $formstring $host,
  2420.                                              string $name 'UnicommerceLeasing',
  2421.                                              int $type self::TYPE_UNICOMMERCE_CONSULT): JsonResponse
  2422.     {
  2423.         if (!$form->isValid()) {
  2424.             return new JsonResponse([
  2425.                 'success' => false,
  2426.                 'errors' => $this->getErrorsFromForm($form)
  2427.             ], 400);
  2428.         }
  2429.         /** @var LeasingFormModel $leasingFormModel */
  2430.         $leasingFormModel $form->getData();
  2431.         $leasingForm = new Forms();
  2432.         $leasingForm->setPhone($leasingFormModel->getPhone())
  2433.             ->setDomain($host)
  2434.             ->setDealer($dealer)
  2435.             ->setName($name)
  2436.             ->setDateCreate(new DateTime())
  2437.             ->setType($type);
  2438.         $data = [];
  2439.         foreach ($leasingFormModel->getPhotos() as $file) {
  2440.             $fileName $this->fileUploader->upload($file);
  2441.             $data['photos'][] = $fileName;
  2442.         }
  2443.         $leasingForm->setData(json_encode($data));
  2444.         $this->entityManager->persist($leasingForm);
  2445.         $this->entityManager->flush();
  2446.         return new JsonResponse([
  2447.             'success' => true
  2448.         ], 201);
  2449.     }
  2450.     public function saveOrderCall(Dealer $dealerFormInterface $formstring $host): JsonResponse
  2451.     {
  2452.         if (!$form->isValid()) {
  2453.             return new JsonResponse([
  2454.                 'success' => false,
  2455.                 'errors' => $this->getErrorsFromForm($form)
  2456.             ], 400);
  2457.         }
  2458.         /** @var CallMeFormModel $callMeFormModel */
  2459.         $callMeFormModel $form->getData();
  2460.         $callMeForm = new Forms();
  2461.         $callMeForm->setPhone($callMeFormModel->getPhone())
  2462.             ->setDomain($host)
  2463.             ->setDealer($dealer)
  2464.             ->setName($callMeFormModel->getName())
  2465.             ->setData(json_encode(['connectionType' => $callMeFormModel->getType()]))
  2466.             ->setDateCreate(new DateTime())
  2467.             ->setType($callMeFormModel->getFormType());
  2468.         $this->entityManager->persist($callMeForm);
  2469.         $this->entityManager->flush();
  2470.         return new JsonResponse([
  2471.             'success' => true
  2472.         ], 201);
  2473.     }
  2474. }