src/DcSiteBundle/Controller/TradeInController.php line 266

Open in your IDE?
  1. <?php
  2. namespace DcSiteBundle\Controller;
  3. use AutomarketBundle\Component\EstimateCaptcha;
  4. use CoreBundle\Component\CoreFormFactory;
  5. use CoreBundle\Component\FormManager;
  6. use CoreBundle\Entity\Brand;
  7. use CoreBundle\Entity\Dealer;
  8. use CoreBundle\Entity\Forms;
  9. use CoreBundle\Entity\UserCar;
  10. use CoreBundle\Entity\VehicleEstimate;
  11. use CoreBundle\Entity\Vehicles\Equipment;
  12. use CoreBundle\Entity\Vehicles\Vehicle;
  13. use CoreBundle\Entity\Vehicles\VehicleItem;
  14. use CoreBundle\Factory\Vehicle as VehicleFactory;
  15. use CoreBundle\Model\Api\AutoRia\AutoRia;
  16. use CoreBundle\Model\Api\MVD\MvdServer;
  17. use CoreBundle\Model\Api\OnlineService\ApiServer1C;
  18. use CoreBundle\Model\DealerModel;
  19. use CoreBundle\Model\OnlineEstimateModel;
  20. use CoreBundle\Model\Vehicles\Repository;
  21. use CoreBundle\Services\MediaExtensionVidi;
  22. use DateTime;
  23. use Doctrine\ORM\EntityManagerInterface;
  24. use Doctrine\ORM\OptimisticLockException;
  25. use Exception;
  26. use MyBundle\Component\InfobipSmsSender;
  27. use PDOException;
  28. use PortalBundle\Model\SeoMetaTag;
  29. use Symfony\Component\Filesystem\Filesystem;
  30. use Symfony\Component\HttpFoundation\JsonResponse;
  31. use Symfony\Component\HttpFoundation\Request;
  32. use Symfony\Component\HttpFoundation\RequestStack;
  33. use Symfony\Component\HttpFoundation\Response;
  34. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  35. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  36. use Symfony\Component\Routing\RouterInterface;
  37. use Symfony\Contracts\Translation\TranslatorInterface;
  38. use Twig\Environment;
  39. class TradeInController extends BaseDcController
  40. {
  41.     private AutoRia $autoRia;
  42.     public function __construct(AutoRia $autoRiaCoreFormFactory $coreFormFactorySeoMetaTag $seoMetaTagRequestStack $requestStackRouterInterface $routerFormManager $formManagerEntityManagerInterface $emApiServer1C $apiServer1CSessionInterface $sessionFilesystem $filesystemMediaExtensionVidi $mediaExtensionVidiRepository $vehicleRepositoryVehicleFactory $vehicleFactoryEnvironment $twig)
  43.     {
  44.         $this->autoRia $autoRia;
  45.         parent::__construct($coreFormFactory$seoMetaTag$requestStack$router$formManager$em$apiServer1C$session$filesystem$mediaExtensionVidi$vehicleRepository$vehicleFactory$twig);
  46.     }
  47.     const UNSET_MODEL = [
  48.         '64089',
  49.         '64090',
  50.         '64091',
  51.         '64092',
  52.         '64093',
  53.         '64094'
  54.     ];
  55.     public function history(Request $request): JsonResponse
  56.     {
  57.         $hash $request->request->all('hash');
  58.         if (!$hash) {
  59.             return new JsonResponse(['success' => false]);
  60.         }
  61.         $data = [];
  62.         foreach ($hash as $oneHash) {
  63.             $estimate $this->em->getRepository(VehicleEstimate::class)->findOneBy(['hash' => $oneHash]);
  64.             if (!$estimate) {
  65.                 continue;
  66.             }
  67.             $estimateData json_decode($estimate->getData());
  68.             $data[] = [
  69.                 'hash' => $oneHash,
  70.                 'vehicle' => $estimateData->request->brand->title ' ' $estimateData->request->model->title,
  71.                 'year' => $estimateData->request->year,
  72.                 'mileage' => $estimateData->request->mileage,
  73.             ];
  74.         }
  75.         return new JsonResponse(['success' => true'data' => $data]);
  76.     }
  77.     public function loadTemplate(): Response
  78.     {
  79.         return new Response($this->renderView('@DcSite/Modules/n-trade-in-tpl.html.twig'));
  80.     }
  81.     public function init(Request $requestEstimateCaptcha $estimateCaptcha): JsonResponse
  82.     {
  83.         $minYear = (new DateTime())->format('Y') - 15;
  84.         $token $estimateCaptcha->generateToken();
  85.         $vehicleType $request->request->get('vehicleType');
  86.         $brands $this->autoRia->getBrands($vehicleType);
  87.         $mileage $this->autoRia->getOdometerIntervals();
  88.         if ($vehicleType != 2) {
  89.             $fuel $this->autoRia->getFuelTypes();
  90.             $transmission $this->autoRia->getTransmissionTypes();
  91.         } else {
  92.             $mileage $this->autoRia->getOdometerIntervalsMoto();
  93.             $fuel false;
  94.             $transmission false;
  95.         }
  96.         $userCarId $request->request->get('userCarId');
  97.         $userCarData false;
  98.         $User $this->getUser();
  99.         if ($userCarId && $User) {
  100.             $userCar $this->em->getRepository(UserCar::class)->find($userCarId);
  101.             if ($userCar && $userCar->getUser()->getId() == $User->getId()) {
  102.                 $userCarData = [
  103.                     'id' => $userCarId,
  104.                     'number' => $userCar->getNumber(),
  105.                 ];
  106.             }
  107.         }
  108.         $userData false;
  109.         if ($User) {
  110.             $userData = [
  111.                 'name' => $User->getName(),
  112.                 'email' => $User->getEmail(),
  113.                 'phone' => $User->getPhone(),
  114.             ];
  115.         }
  116.         return new JsonResponse([
  117.             'token' => $token,
  118.             'userCarData' => $userCarData,
  119.             'userData' => $userData,
  120.             'minYear' => $minYear,
  121.             'brands' => $brands,
  122.             'fuel' => $fuel,
  123.             'mileage' => $mileage,
  124.             'transmission' => $transmission,
  125.             'templateUrl' => $this->router->generate('dc_ti_load_tpl'),
  126.             'options' => [
  127.                 'historyUrl' => $this->router->generate('dc_ti_history'),
  128.                 'infoUrl' => $this->router->generate('dc_ti_estimate_info'),
  129.                 'modelsUrl' => $this->router->generate('dc_ti_models'),
  130.                 'estimateUrl' => $this->router->generate('dc_ti_estimate'),
  131.                 'saveFormUrl' => $this->router->generate('dc_ti_save'),
  132.                 'vehiclesUrl' => $this->router->generate('dc_ti_vehicles'),
  133.                 'searchUrl' => $this->router->generate('dc_ti_search_car'),
  134.             ]
  135.         ]);
  136.     }
  137.     public function search(Request $requestMvdServer $mvdServer): JsonResponse
  138.     {
  139.         $num $request->get('number');
  140.         $vehicleType $request->get('vehicleType');
  141.         $kind $vehicleType == 'МОТОЦИКЛ' null;
  142.         $carData $mvdServer->getCarInfoByNumber($num$kind$request->getLocale());
  143.         if (!$carData) {
  144.             return new JsonResponse(['result' => false]);
  145.         }
  146.         $vehicleType $request->request->get('vehicleType');
  147.         $brands $this->autoRia->getBrands($vehicleType);
  148.         $userBrand $carData['Brand'];
  149.         $userModel $carData['Model'];
  150.         $userYear $carData['MakeYear'];
  151.         $userFuel $carData['Fuel'];
  152.         $riaBrand false;
  153.         $riaModel false;
  154.         foreach ($brands as $brand) {
  155.             if (strtolower($userBrand) == strtolower($brand['title'])) {
  156.                 $riaBrand $brand['id'];
  157.                 break;
  158.             }
  159.         }
  160.         $typesMatches = [
  161.             'ДИЗЕЛЬНЕ ПАЛИВО' => 2,
  162.             'БЕНЗИН' => 1,
  163.             'ЕЛЕКТРО' => 6,
  164.             'ЕЛЕКТРО АБО ДИЗЕЛЬНЕ ПАЛИВО' => 5,
  165.             'ЕЛЕКТРО АБО БЕНЗИН' => 5,
  166.             'ГАЗ' => 3,
  167.             'БЕНЗИН АБО ГАЗ' => 4,
  168.             'ДИЗЕЛЬНЕ ПАЛИВО АБО ГАЗ' => 4,
  169.         ];
  170.         $riaFuel $typesMatches[$userFuel] ?? false;
  171.         if ($riaBrand) {
  172.             $models $this->autoRia->getModels($riaBrand$vehicleType);
  173.             foreach ($models as $model) {
  174.                 $riaFModel strtolower($model['title']);
  175.                 $riaFModel str_replace('-'''$riaFModel);
  176.                 $riaFModel str_replace(' '''$riaFModel);
  177.                 $userModel strtolower($userModel);
  178.                 $userModel str_replace('-'''$userModel);
  179.                 $userModel str_replace(' '''$userModel);
  180.                 if ($userModel == $riaFModel) {
  181.                     $riaModel $model['id'];
  182.                     break;
  183.                 }
  184.             }
  185.         }
  186.         $carData = (array)$carData;
  187.         $carData['ria'] = [
  188.             'brand' => $riaBrand,
  189.             'model' => $riaModel,
  190.             'year' => $userYear,
  191.             'fuel' => $riaFuel,
  192.         ];
  193.         return $this->json(['result' => $carData]);
  194.     }
  195.     public function getBrands(): JsonResponse
  196.     {
  197.         $brands $this->autoRia->getBrands();
  198.         return $this->json(['brands' => $brands]);
  199.     }
  200.     public function getModels(Request $request): JsonResponse
  201.     {
  202.         $brandId $request->get('brandId');
  203.         $vehicleType $request->request->get('vehicleType');
  204.         $models $this->autoRia->getModels($brandId$vehicleType);
  205.         $models $this->filterModels($models);
  206.         return new JsonResponse(['success' => $models !== false'data' => $models]);
  207.     }
  208.     public function getEstimate(Request $requestOnlineEstimateModel $onlineEstimateModel): JsonResponse
  209.     {
  210.         $hash $request->request->get('hash');
  211.         $estimate $this->em->getRepository(VehicleEstimate::class)->findOneBy(['hash' => $hash]);
  212.         if (!$estimate) {
  213.             return new JsonResponse(['success' => false]);
  214.         }
  215.         $isPortal false;
  216.         $dealerId $request->request->get('dealer');
  217.         if ($dealerId) {
  218.             $dealer $this->em->getRepository(Dealer::class)->find($dealerId);
  219.         } else {
  220.             try {
  221.                 $dealer $this->getDealer();
  222.             } catch (NotFoundHttpException $e) {
  223.                 $isPortal true;
  224.                 $dealer $this->em->getRepository(Dealer::class)->find(6);
  225.             }
  226.         }
  227.         $result $onlineEstimateModel->processEstimateEntity($estimate);
  228.         $result['estimateId'] = $estimate->getId();
  229.         $vehicleId $request->request->get('vehicleId');
  230.         if ($vehicleId) {
  231.             $result['vehicleData'] = $this->buildVehicleData($vehicleId$request->getLocale());
  232.         } else {
  233.             $result['testVehicles'] = $this->buildTestDriveVehicles($dealer$isPortal);
  234.         }
  235.         return new JsonResponse($result);
  236.     }
  237.     public function estimate(Request $requestTranslatorInterface $translatorOnlineEstimateModel $onlineEstimateModel,
  238.                              EstimateCaptcha $estimateCaptchaInfobipSmsSender $infobipSmsSender): JsonResponse
  239.     {
  240.         // Проверяем валидность формы
  241.         $hash $request->request->get('hash');
  242.         $token $request->request->get('token');
  243.         if ($hash) {
  244.             $estimateInst $this->em->getRepository(VehicleEstimate::class)->findOneBy(['hash' => $hash]);
  245.             if (!$estimateInst) {
  246.                 return new JsonResponse(['success' => false]);
  247.             }
  248.         } else {
  249.             if (!$estimateCaptcha->validateToken($token)) {
  250.                 return new JsonResponse(['success' => false,
  251.                     'error' => [
  252.                         'description' => 'token is not valid',
  253.                     ]
  254.                 ]);
  255.             }
  256.         }
  257.         $isPortal false;
  258.         $isAutomarket false;
  259.         $dealerId $request->request->get('dealer');
  260.         if ($dealerId) {
  261.             $dealer $this->em->getRepository(Dealer::class)->find($dealerId);
  262.         } else {
  263.             try {
  264.                 $dealer $this->getDealer();
  265.                 if ($dealer->getId() === DealerModel::SECOND_HAND_DEALER) {
  266.                     $isAutomarket true;
  267.                 }
  268.             } catch (NotFoundHttpException $e) {
  269.                 $isPortal true;
  270.                 $dealer $this->em->getRepository(Dealer::class)->find(6);
  271.             }
  272.         }
  273.         if ($hash) {
  274.             $estimateData json_decode($estimateInst->getData(), true);
  275.             $params $estimateData['request'];
  276.         } else {
  277.             $params $request->request->all();
  278.         }
  279.         $mileage explode('-'$params['mileage']);
  280.         if (count($mileage) == 2) {
  281.             $mileageFrom $mileage[0];
  282.             $mileageTo $mileage[1];
  283.         } else {
  284.             $mileage $params['mileage'] < 1000 $params['mileage'] : ceil($params['mileage'] / 1000);
  285.             $mileageFrom $mileage - ($mileage 0.60);
  286.             $mileageTo $mileage + ($mileage 0.60);
  287.         }
  288.         if (!is_array($params['transmission'])) {
  289.             if ($params['transmission'] == 2) {
  290.                 $params['transmission'] = [2345];
  291.             } else {
  292.                 $params['transmission'] = [$params['transmission']];
  293.             }
  294.         }
  295.         $data = [
  296.             'marka_id' => [$params['brand']['id']],
  297.             'model_id' => [$params['model']['id']],
  298.             's_yers' => [$params['year'] - 1],
  299.             'po_yers' => [$params['year'] + 1],
  300.             //'raceInt' => [$mileageFrom, $mileageTo], //Пробег
  301.             'gearbox' => $params['transmission'], //Коробка передач
  302.             'type' => [$params['fuel']], //Топливо
  303.             'abroad' => 2//Не отображать авто которые находяться не в Украине
  304.             'custom' => 1//Не отображать нерастаможенные авто
  305.             //'top' => 5, //Период подачи 5-3месяца, 6-6-месяцев
  306.             'countpage' => 50,
  307.         ];
  308.         if (in_array($params['fuel'], [1234])) {
  309.             unset($data['type']);
  310.         }
  311.         $vType $request->get('vehicleType');
  312.         if ($vType) {
  313.             $data['category_id'] = $vType;
  314.         }
  315.         try {
  316.             $estimate $this->autoRia->newEstimate($data);
  317.         } catch (Exception $e) {
  318.             return new JsonResponse(['errorMess' => $translator->trans('auto_ria.error', [], 'portal_base')], Response::HTTP_INTERNAL_SERVER_ERROR);
  319.         }
  320.         //IF request from vidi.ua, and it is our brand - select dealer by brand
  321.         if ($isPortal || $isAutomarket) {
  322.             $BrandByRia $this->em->getRepository(Brand::class)->findOneBy(['ria_id' => $params['brand']['id']]);
  323.             if ($BrandByRia) {
  324.                 $Dealers $this->em->getRepository(Dealer::class)->findBy(['brand' => $BrandByRia]);
  325.                 $dealer $dealer && count($Dealers) > $Dealers[0] : $dealer;
  326.             }
  327.         }
  328.         $result $onlineEstimateModel->processEstimateResultNew($estimate$params$dealer);
  329. //  закоментував, тому що з vidi.ua повинні потрапляти на профільні
  330. //        if($isPortal && !$result['isSelect']) {
  331. //            $dealer = $this->em->getRepository(Dealer::class)->find(6);
  332. //        }
  333.         if ($isAutomarket && !$result['isSelect'] && !in_array($dealer->getId(), DealerModel::TOYOTA_GROUP)) {
  334.             $dealer $this->em->getRepository(Dealer::class)->find(6);
  335.         }
  336.         if (!$request->request->get('isEstimateForCreditCalc')) {
  337.             $userCarId $request->request->get('userCarId');
  338.             $userCar $userCarId $this->em->getRepository(UserCar::class)->find($userCarId) : null;
  339.             $result['estimateId'] = $onlineEstimateModel->saveEstimateResult($params$result$dealer$this->getUser(), $userCar);
  340.         }
  341.         $result['total'] = $estimate->result->search_result->count;
  342.         if ($hash) {
  343.             $result['userData'] = [
  344.                 'name' => $estimateInst->getName(),
  345.                 'email' => $estimateInst->getEmail(),
  346.                 'phone' => $estimateInst->getPhone(),
  347.             ];
  348.         } else {
  349.             $estimateCaptcha->removeToken($token);
  350.             $result['token'] = $estimateCaptcha->generateToken();
  351.         }
  352.         $vehicleId $request->request->get('vehicleId');
  353.         if ($vehicleId) {
  354.             $result['vehicleData'] = $this->buildVehicleData($vehicleId$request->getLocale());
  355.         } else {
  356.             $result['testVehicles'] = $this->buildTestDriveVehicles($dealer$isPortal);
  357.         }
  358.         if ($result['isSelect'] === true && !$request->request->get('isEstimateForCreditCalc')) {
  359.             $this->sendSms($params['phone'], $dealer->getPhone(), $infobipSmsSender);
  360.         }
  361.         return new JsonResponse($result);
  362.     }
  363.     public function loadTradeInVehicles(Request $request): JsonResponse
  364.     {
  365.         $dealerId $request->request->get('dealer');
  366.         $isPortal false;
  367.         if ($dealerId) {
  368.             $dealer $this->em->getRepository(Dealer::class)->find($dealerId);
  369.         } else {
  370.             try {
  371.                 $dealer $this->getDealer();
  372.             } catch (NotFoundHttpException $e) {
  373.                 $isPortal true;
  374.                 $dealer $this->em->getRepository(Dealer::class)->find(6);
  375.             }
  376.         }
  377.         $locale $request->getLocale();
  378.         if ($dealer->getId() == && !$isPortal) {
  379.             $vehicles $this->vehicleRepository->getUsedVehicles();
  380.         } else {
  381.             $vehicles $this->vehicleRepository->getNewByDealer(($isPortal null $dealer));
  382.         }
  383.         $result = [];
  384.         $brands = [];
  385.         foreach ($vehicles as $item) {
  386.             $vehicle $this->vehicleFactory->createByEntity($item);
  387.             if (!$vehicle) {
  388.                 continue;
  389.             }
  390.             $brands[$vehicle->getBrand()->getId()] = [
  391.                 'id' => $vehicle->getBrand()->getId(),
  392.                 'title' => $vehicle->getBrand()->getName(),
  393.             ];
  394.             $vehicleData = [
  395.                 'id' => $vehicle->getVehicleId(),
  396.                 'brand' => $vehicle->getBrand()->getId(),
  397.                 'title' => $vehicle->isUsed() ? $vehicle->getFullName() : $vehicle->getFullName(),
  398.                 'image' => $vehicle->getPreviewPath(),
  399.                 'price' => $vehicle->price(),
  400.                 'isUsed' => $vehicle->isUsed(),
  401.                 'equipment' => null,
  402.                 'item' => null,
  403.                 'equipments' => [],
  404.             ];
  405.             $hasEquipmentThatNotSoldAndNotReserved false;
  406.             /** @var Equipment $equipment */
  407.             foreach ($vehicle->getAvailEquipments() as $equipment) {
  408.                 $equipmentInfo = [
  409.                     'id' => $equipment->getId(),
  410.                     'title' => $equipment->getTitle(),
  411.                     'minPrice' => $equipment->minPrice(),
  412.                     'items' => [],
  413.                 ];
  414.                 /** @var VehicleItem $vItem */
  415.                 foreach ($equipment->getVehicleItems() as $vItem) {
  416.                     if (!$vItem->getState() || $vItem->getSold() || $vItem->getDeposit() || $vItem->getIsReserved()) {
  417.                         continue;
  418.                     }
  419.                     $hasEquipmentThatNotSoldAndNotReserved true;
  420.                     $vModel $this->vehicleFactory->createByVehicleItem($vItem);
  421.                     $equipmentInfo['items'][] = [
  422.                         'id' => $vItem->getId(),
  423.                         'year' => $vModel->getYear(),
  424.                         'engineName' => $vModel->getEngineName($locale) ?: '-',
  425.                         'body' => $vModel->getBodyTypeName($locale),
  426.                         'drive' => $vModel->getDriveUnitTypeName($locale),
  427.                         'fuelType' => $vModel->getFuelTypeName($locale),
  428.                         'trans' => $vModel->getTransmissionTypeName($locale),
  429.                         'power' => $vModel->getEnginePower($locale),
  430.                         'price' => $vModel->price(),
  431.                     ];
  432.                 }
  433.                 $vehicleData['equipments'][] = $equipmentInfo;
  434.             }
  435.             if ($hasEquipmentThatNotSoldAndNotReserved) {
  436.                 $result[] = $vehicleData;
  437.             }
  438.         }
  439.         usort($brands, fn($a$b) => $a['title'] <=> $b['title']);
  440.         return $this->json(['vehicles' => $result'brands' => $brands]);
  441.     }
  442.     private function buildTestDriveVehicles($dealer$isPortal): array
  443.     {
  444.         $isUsed $dealer->getId() == && !$isPortal 0;
  445.         $vehicles $this->vehicleRepository->getCarsToTestDrive(($isPortal null $dealer), $isUsed);
  446.         $result = [];
  447.         $brands = [];
  448.         foreach ($vehicles as $vehicle) {
  449.             $vModel $this->vehicleFactory->createByEntity($vehicle);
  450.             if (!$vModel) {
  451.                 continue;
  452.             }
  453.             $result[] = [
  454.                 'id' => $vModel->getVehicleId(),
  455.                 'brand' => $vModel->getBrand()->getId(),
  456.                 'price' => $vModel->price(),
  457.                 'title' => $vModel->getFullName(),
  458.                 'src' => $vModel->getPreviewPath(),
  459.             ];
  460.             $brands[$vModel->getBrand()->getId()] = [
  461.                 'id' => $vModel->getBrand()->getId(),
  462.                 'title' => $vModel->getBrand()->getName(),
  463.             ];
  464.         }
  465.         usort($brands, fn($a$b) => $a['title'] <=> $b['title']);
  466.         return [
  467.             'vehicles' => $result,
  468.             'brands' => $brands,
  469.         ];
  470.     }
  471.     private function buildVehicleData($vehicleId$locale)
  472.     {
  473.         $vehicle $this->vehicleFactory->createById($vehicleId);
  474.         if (!$vehicle) {
  475.             return false;
  476.         }
  477.         $vehicleData = [
  478.             'id' => $vehicle->getVehicleId(),
  479.             'title' => $vehicle->getFullName(),
  480.             'image' => $vehicle->getPreviewPath(),
  481.             'price' => $vehicle->price(),
  482.             'isUsed' => $vehicle->isUsed(),
  483.             'equipment' => null,
  484.             'item' => null,
  485.             'equipments' => [],
  486.         ];
  487.         /** @var Equipment $equipment */
  488.         foreach ($vehicle->getAvailEquipments() as $equipment) {
  489.             $equipmentInfo = [
  490.                 'id' => $equipment->getId(),
  491.                 'title' => $equipment->getTitle(),
  492.                 'minPrice' => $equipment->minPrice(),
  493.                 'items' => [],
  494.             ];
  495.             /** @var VehicleItem $vItem */
  496.             foreach ($equipment->getVehicleItems() as $vItem) {
  497.                 if (!$vItem->getState()) {
  498.                     continue;
  499.                 }
  500.                 $vModel $this->vehicleFactory->createByVehicleItem($vItem);
  501.                 $equipmentInfo['items'][] = [
  502.                     'id' => $vItem->getId(),
  503.                     'year' => $vModel->getYear(),
  504.                     'engineName' => $vModel->getEngineName($locale) ?: '-',
  505.                     'fuelType' => $vModel->getFuelTypeName($locale),
  506.                     'power' => $vModel->getEnginePower($locale),
  507.                     'price' => $vModel->price(),
  508.                 ];
  509.             }
  510.             $vehicleData['equipments'][] = $equipmentInfo;
  511.         }
  512.         return $vehicleData;
  513.     }
  514.     public function save(Request $request): JsonResponse
  515.     {
  516.         $testDrive $request->request->all('testDrive');
  517.         $tradeIn $request->request->all('tradeIn');
  518.         $estimateId $request->request->get('estimateId');
  519.         $isPortal false;
  520.         $estimate $this->em->getRepository(VehicleEstimate::class)->find($estimateId);
  521.         if (!$estimate) {
  522.             return $this->json(['success' => false]);
  523.         }
  524.         $isAutomarket false;
  525.         $dealerId $request->request->get('dealer');
  526.         if ($dealerId) {
  527.             $dealer $this->em->getRepository(Dealer::class)->find($dealerId);
  528.         } else {
  529.             try {
  530.                 $dealer $this->getDealer();
  531.                 if ($dealer->getId() === DealerModel::SECOND_HAND_DEALER) {
  532.                     $isAutomarket true;
  533.                 }
  534.             } catch (NotFoundHttpException $e) {
  535.                 $isPortal true;
  536.                 $dealer $this->em->getRepository(Dealer::class)->find(6);
  537.             }
  538.         }
  539.         $estimate->setIsFinish(1);
  540.         $formData = [
  541.             'testDrive' => $testDrive,
  542.         ];
  543.         $estimateForm = new Forms();
  544.         $estimateData json_decode($estimate->getData());
  545.         $formData['result'] = $estimateData->result;
  546.         if (isset($tradeIn['id'])) {
  547.             if (isset($tradeIn['item']) && isset($tradeIn['item']['id'])) {
  548.                 $formData['tradeIn'] = [
  549.                     'itemId' => $tradeIn['item']['id'],
  550.                 ];
  551.             }
  552.             $vehicle $this->em->getRepository(Vehicle::class)->find($tradeIn['id']);
  553.             $estimateForm->setVehicle($vehicle);
  554.             $estimateForm->setType(FormManager::TYPE_TRADE_IN_FORM);
  555.             //IF request from vidi.ua, and it is our brand - select dealer by brand
  556.             if ($isPortal) {
  557.                 $vidiBrand $this->em->getRepository(Brand::class)->findOneBy(['id' => $tradeIn['brand']]);
  558.                 if ($vidiBrand) {
  559.                     $Dealers $this->em->getRepository(Dealer::class)->findBy(['brand' => $vidiBrand]);
  560.                     $dealer $dealer && count($Dealers) > $Dealers[0] : $dealer;
  561.                 }
  562.             }
  563.         } else {
  564.             //Если просто выкуп и не автострада  - то диллер всегда Автомаркет
  565.             if ($dealer->getId() != '16' && !in_array($dealer->getId(), [471443]) && !$estimateData->result->isSelect) {
  566.                 $dealer $this->em->getRepository(Dealer::class)->find(6);
  567.             }
  568.             if (($isAutomarket || $isPortal) && isset($estimateData->request->brand->id) && ($estimateData->result->isSelect || in_array($estimateData->request->brand->idDealerModel::TOYOTA_GROUP_ID_RIA))) {
  569.                 $vidiBrand $this->em->getRepository(Brand::class)->findOneBy(['ria_id' => $estimateData->request->brand->id]);
  570.                 if ($vidiBrand) {
  571.                     $Dealers $this->em->getRepository(Dealer::class)->findBy(['brand' => $vidiBrand]);
  572.                     $dealer $dealer && count($Dealers) > $Dealers[0] : $dealer;
  573.                 }
  574.             }
  575.             $estimateForm->setType(FormManager::TYPE_ESTIMATE_FORM);
  576.         }
  577.         $estimateForm->setDealer($dealer);
  578.         $estimateForm->setDateCreate(new DateTime());
  579.         $estimateForm->setReferrer($request->get('referrer'));
  580.         $estimateForm->setHref($request->get('href'));
  581.         $estimateForm->setUtm($request->get('utm'));
  582.         $estimateForm->setGclId($request->get('gcl_id'));
  583.         $estimateForm->setEmail($estimate->getEmail());
  584.         $estimateForm->setPhone($estimate->getPhone());
  585.         $estimateForm->setName($estimate->getName());
  586.         $estimateForm->setIsSend(0);
  587.         $estimateForm->setInCrm(0);
  588.         // Спосіб зв'язку для Тойота Бориспіль
  589.         if ($dealer->getId() == 43) {
  590.             $formData['result']->connectionType $request->request->get('connectionType');
  591.         }
  592.         $estimateForm->setData(json_encode($formData));
  593.         $this->em->persist($estimateForm);
  594.         $estimate->setForm($estimateForm);
  595.         try {
  596.             $this->em->persist($estimate);
  597.             $this->em->flush();
  598.         } catch (PDOException $exception) {
  599.             return new JsonResponse(['success' => false'error' => $exception->getMessage()]);
  600.         }
  601.         return new JsonResponse(['success' => true]);
  602.     }
  603.     public function saveBuyMoto(Request $request): JsonResponse
  604.     {
  605.         $estimateId $request->request->get('estimateId');
  606.         $formType $request->request->get('formType');
  607.         $estimate $this->em->getRepository(VehicleEstimate::class)->find($estimateId);
  608.         if (!$estimate) {
  609.             return $this->json(['success' => false]);
  610.         }
  611.         $dealerId $request->request->get('dealer');
  612.         if ($dealerId) {
  613.             $dealer $this->em->getRepository(Dealer::class)->find($dealerId);
  614.         } else {
  615.             try {
  616.                 $dealer $this->getDealer();
  617.             } catch (NotFoundHttpException $e) {
  618.                 $dealer $this->em->getRepository(Dealer::class)->find(6);
  619.             }
  620.         }
  621.         $estimate->setIsFinish(1);
  622.         $estimateForm = new Forms();
  623.         $estimateData json_decode($estimate->getData());
  624.         $formData['result'] = $estimateData->result;
  625.         $estimateForm->setType($formType ?? FormManager::TYPE_ESTIMATE_FORM);
  626.         $estimateForm->setDealer($dealer);
  627.         $estimateForm->setDateCreate(new DateTime());
  628.         $estimateForm->setReferrer($request->get('referrer'));
  629.         $estimateForm->setHref($request->get('href'));
  630.         $estimateForm->setUtm($request->get('utm'));
  631.         $estimateForm->setGclId($request->get('gcl_id'));
  632.         $estimateForm->setEmail($estimate->getEmail());
  633.         $estimateForm->setPhone($estimate->getPhone());
  634.         $estimateForm->setName($estimate->getName());
  635.         $estimateForm->setIsSend(0);
  636.         $estimateForm->setInCrm(0);
  637.         $estimateForm->setData(json_encode($formData));
  638.         $this->em->persist($estimateForm);
  639.         $estimate->setForm($estimateForm);
  640.         try {
  641.             $this->em->persist($estimate);
  642.             $this->em->flush();
  643.         } catch (PDOException $exception) {
  644.             return new JsonResponse(['success' => false'error' => $exception->getMessage()]);
  645.         }
  646.         return new JsonResponse(['success' => true]);
  647.     }
  648.     private function sendSms($userPhone$dealerPhoneInfobipSmsSender $infobipSmsSender)
  649.     {
  650.         $message "Вітаємо! Автомобіль, який ви оцінювали підпадає під категорію Select, яка дає можливість обміняти авто на нове на більш вигідних умовах! Деталі по телефону: {$dealerPhone}";
  651.         $infobipSmsSender->sendSms($userPhone$message);
  652.     }
  653.     private function filterModels($models)
  654.     {
  655.         // remove model car in response AvtoRia
  656.         foreach ($models as $key => $value) {
  657.             if (in_array($value['id'], self::UNSET_MODEL)) {
  658.                 unset($models[$key]);
  659.             }
  660.         }
  661.         return $models;
  662.     }
  663. }