src/DcSiteBundle/Controller/Toyota/CarController.php line 300

Open in your IDE?
  1. <?php
  2. namespace DcSiteBundle\Controller\Toyota;
  3. use BmpGatewayBundle\Entity\VehicleTestDrive;
  4. use CoreBundle\Component\CoreFormFactory;
  5. use CoreBundle\Component\FormManager;
  6. use CoreBundle\Entity\Forms;
  7. use CoreBundle\Entity\Vehicles\Category;
  8. use CoreBundle\Entity\Vehicles\VehicleItem;
  9. use CoreBundle\Factory\InStockVehicle;
  10. use CoreBundle\Factory\Vehicle as VehicleFactory;
  11. use CoreBundle\Model\Api\OnlineService\ApiServer1C;
  12. use CoreBundle\Model\Vehicles\Repository;
  13. use CoreBundle\Services\MediaExtensionVidi;
  14. use DcSiteBundle\Model\CreditModel;
  15. use DcSiteBundle\Services\CarInStockService;
  16. use DcSiteBundle\Services\CatalogService;
  17. use DcSiteBundle\Services\HistoryManager;
  18. use DcSiteBundle\Services\ModelRange\Pages\PagesService;
  19. use DcSiteBundle\Services\UsedVehicleService;
  20. use DcSiteBundle\Services\VehicleService;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use Exception;
  23. use InsuranceBundle\Model\Program;
  24. use PortalBundle\Model\SeoMetaTag;
  25. use Symfony\Component\Filesystem\Filesystem;
  26. use Symfony\Component\HttpFoundation\RedirectResponse;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpFoundation\RequestStack;
  29. use Symfony\Component\HttpFoundation\Response;
  30. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  31. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  32. use Symfony\Component\Routing\RouterInterface;
  33. use Symfony\Contracts\Translation\TranslatorInterface;
  34. use Twig\Environment;
  35. class CarController extends BaseController
  36. {
  37.     const MODEL_FRAME = [
  38.         'yaris',
  39.         'yaris-hybrid',
  40.         'yaris-cross',
  41.         'yaris-cross-hybrid',
  42.         'corolla',
  43.         'corolla-cross',
  44.         'corolla-hybrid',
  45.         'avensis',
  46.         'camry',
  47.         'camry-hybrid',
  48.         'c-hr',
  49.         'c-hr-hybrid',
  50.         'rav4',
  51.         'rav4-hybrid',
  52.         'highlander',
  53.         'highlander-hybrid',
  54.         'land-cruiser-prado',
  55.         'land-cruiser',
  56.         'hilux',
  57.         'proace',
  58.         'proace-city',
  59.         'proace-city-verso',
  60.     ];
  61.     private CarInStockService $carInStockService;
  62.     private UsedVehicleService $usedVehicleService;
  63.     private CatalogService $catalogService;
  64.     public function __construct(CarInStockService $carInStockServiceUsedVehicleService $usedVehicleServiceCatalogService $catalogServiceCoreFormFactory $coreFormFactorySeoMetaTag $seoMetaTagRequestStack $requestStackRouterInterface $routerFormManager $formManagerEntityManagerInterface $emApiServer1C $apiServer1CSessionInterface $sessionFilesystem $filesystemMediaExtensionVidi $mediaExtensionVidiRepository $vehicleRepositoryVehicleFactory $vehicleFactoryEnvironment $twig)
  65.     {
  66.         $this->carInStockService $carInStockService;
  67.         $this->usedVehicleService $usedVehicleService;
  68.         $this->catalogService $catalogService;
  69.         parent::__construct($coreFormFactory$seoMetaTag$requestStack$router$formManager$em$apiServer1C$session$filesystem$mediaExtensionVidi$vehicleRepository$vehicleFactory$twig);
  70.     }
  71.     public function car(Request $requestHistoryManager $historyManagerVehicleService $vehicleServiceCreditModel $creditModel$car): ?Response
  72.     {
  73.         $dealer $this->getDealer();
  74.         $vehicle $this->vehicleFactory->createByUrl($car$dealer);
  75.         if (!$vehicle) {
  76.             throw new NotFoundHttpException();
  77.         }
  78.         $vehicleEm $vehicle->getVehicleEntity();
  79.         $vehicleColor $vehicleService->getVehicleColor($vehicleEm);
  80.         $vehicleFaqs $vehicleService->getVehicleFaqs($vehicleEm);
  81.         $carInStock $this->carInStockService->getCarInStockByModel($this->getDealer(), $request->getLocale(), $vehicleEm->getModel(), 4);
  82.         $carUsed $this->usedVehicleService->getUsedVehicleByModel($this->getDealer(), $request->getLocale(), $vehicleEm->getModel(), 4);
  83.         $historyManager->setUserCarHistory($this->getUser(), $vehicleEm);
  84.         $TdForm = new Forms();
  85.         $TdForm->setVehicle($vehicleEm);
  86.         $vehicleFirstImage null;
  87.         $carGallery $vehicle->getGallery()->getGalleryItems();
  88.         if ($carGallery->count()) {
  89.             $media $this->mediaExtensionVidi;
  90.             $vehicleFirstImage $media->getPath($carGallery->first()->getMedia(), 'small');
  91.             foreach ($carGallery as $value) {
  92.                 $value->img $media->getPath($value->getMedia(), 'slider2');
  93.                 $value->img_mob $media->getPath($value->getMedia(), 'slider2_mob');
  94.                 $value->img_webp $media->pathWebp($value->getMedia(), 'slider2');
  95.                 $value->img_webp_mob $media->pathWebp($value->getMedia(), 'slider2_mob');
  96.                 // img alt (SEO)
  97.                 $value->title $vehicle->getTitle($request->getLocale());
  98.                 // magnific-popup
  99.                 $value->url $media->pathWebp($value->getMedia(), 'hd');
  100.             }
  101.         }
  102.         $vehiclePriceEquipment $vehicleService->getVehiclePriceEquipment($vehicleEm);
  103.         foreach ($vehicle->getVehicleItems() as $item) {
  104.             $vehicleYear[$item->getYear()] = $item->getYear();
  105.         }
  106.         usort($vehiclePriceEquipment, fn($a$b) => $a['position'] <=> $b['position']);
  107.         $form $this->CoreFormFactory()
  108.             ->callMeForm(new Forms(), true);
  109.         $form->get('dealer')->setData($this->getDealer());
  110.         return $this->baseToyotaRender(
  111.             '@DcSiteBundle/Toyota/Car/car-card.html.twig',
  112.             [
  113.                 'slides' => $carGallery,
  114.                 'vehicle' => $vehicle,
  115.                 'vehiclePriceEquipment' => $vehiclePriceEquipment,
  116.                 'vehicleColor' => $vehicleColor,
  117.                 'carInStock' => $carInStock,
  118.                 'carUsed' => $carUsed,
  119.                 'faqs' => $vehicleFaqs,
  120.                 'vehicleFirstImage' => $vehicleFirstImage,
  121.                 'vehicleYear' => array_values($vehicleYear),
  122.                 'creditPayment' => $creditModel->getMinPayment($vehicle),
  123.                 'buyForm' => $this->CoreFormFactory()->buyForm(null$vehicleEm)->createView(),
  124.                 'buyPartsForm' => $this->CoreFormFactory()->buyPartsForm($this->getDealer())->createView(),
  125.                 'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), $TdForm)->createView(),
  126.                 'structuredData' => $this->getCarPageStructuredData($request$vehicle),
  127.                 'hasTestDrive' => $this->em
  128.                     ->getRepository(VehicleTestDrive::class)
  129.                     ->hasTestDrive($dealer$vehicle->getModel()),
  130.                 'leasingCalculatorForm' => $this->CoreFormFactory()->leasingForm()->createView(),
  131.                 'callMeForm' => $form->createView(),
  132.             ]
  133.         );
  134.     }
  135.     public function comparison(Request $request$model): ?Response
  136.     {
  137.         $dealer $this->getDealer();
  138.         $vehicle $this->vehicleFactory->createByUrl($model$dealer);
  139.         if (!$vehicle) {
  140.             throw new NotFoundHttpException();
  141.         }
  142.         $comparison $this->get('portal.comparison.service')->initComparison($request$vehicle);
  143.         if ($comparison['options']) {
  144.             foreach ($comparison['options'] as $key => $option) {
  145.                 if (isset($option['options']) && is_array($option['options'])) {
  146.                     usort($option['options'], fn($a$b) => $a['sort'] <=> $b['sort']);
  147.                 }
  148.                 $comparison['options'][$key]['options'] = $option['options'];
  149.             }
  150.         }
  151.         return $this->baseToyotaRender('@DcSiteBundle/Toyota/Сomparison/comparison.html.twig',
  152.             [
  153.                 'vehicle' => $vehicle,
  154.                 'comparison' => $comparison
  155.             ]
  156.         );
  157.     }
  158.     public function carConfiguraion(VehicleService $vehicleService$car): ?Response
  159.     {
  160.         $Dealer $this->getDealer();
  161.         $Vehicle $this->vehicleFactory->createByUrl($car$Dealer);
  162.         if (!$Vehicle) {
  163.             throw new NotFoundHttpException();
  164.         }
  165.         $vehicleEm $Vehicle->getVehicleEntity();
  166.         $vehicleCharacteristic $vehicleService->getVehicleCharacteristic($vehicleEm);
  167.         return $this->baseToyotaRender('@DcSite/Toyota/Car/configuration.html.twig', [
  168.             'model' => $Vehicle,
  169.             'vehicleCharacteristic' => $vehicleCharacteristic,
  170.         ]);
  171.     }
  172.     public function list(Request $requestPagesService $pagesService): Response
  173.     {
  174.         $catalog $this->catalogService->getCategoryVehicles($this->getDealer());
  175.         $catalogVehicle $this->catalogService->getCatalogVehicleByCategory($this->getDealer());
  176.         return $this->baseToyotaRender('@DcSite/Toyota/Car/catalog.html.twig', [
  177.             'category' => null,
  178.             'catalog' => $catalog,
  179.             'catalogVehicle' => $catalogVehicle,
  180.             'catalogModelRangePages' => $pagesService
  181.                 ->setLang($request->getLocale())
  182.                 ->getPages($this->getDealer())
  183.         ]);
  184.     }
  185.     public function category(Request $requestPagesService $pagesService$category): ?Response
  186.     {
  187.         $vehicleCategory $this->em->getRepository(Category::class)->findOneBy(['url' => $category]);
  188.         if (!$vehicleCategory) {
  189.             throw new NotFoundHttpException();
  190.         }
  191.         $catalog $this->catalogService->getCategoryVehicles($this->getDealer());
  192.         $catalogVehicle $this->catalogService->getCatalogVehicleByCategory($this->getDealer(), $category);
  193.         $category $this->catalogService->getCatalogCategory($catalog$category);
  194.         return $this->baseToyotaRender('@DcSite/Toyota/Car/catalog.html.twig', [
  195.             'category' => $category,
  196.             'catalog' => $catalog,
  197.             'catalogVehicle' => $catalogVehicle,
  198.             'catalogModelRangePages' => $pagesService
  199.                 ->setLang($request->getLocale())
  200.                 ->getPages($this->getDealer())
  201.         ]);
  202.     }
  203.     public function listPage(Request $requestPagesService $pagesServicestring $url): ?Response
  204.     {
  205.         $page $pagesService
  206.             ->setLang($request->getLocale())
  207.             ->getPage($this->getDealer(), $url);
  208.         if (empty($page)) {
  209.             throw new NotFoundHttpException();
  210.         }
  211.         return $this->baseToyotaRender('@DcSite/Toyota/Car/catalog-page.html.twig', ['page' => $page]);
  212.     }
  213.     public function inStockList(Request $request): Response
  214.     {
  215.         $vehicles $this->carInStockService->getCarInStockByDealer(
  216.             $this->getDealer(),
  217.             null,
  218.             $request->getLocale()
  219.         );
  220.         $this->carInStockService->sortVehicleByDealer($vehicles$this->getDealer()->getUniqueId());
  221.         return $this->baseToyotaRender('@DcSite/Toyota/Car/in-stock-catalog.html.twig', ['vehicles' => $vehicles]);
  222.     }
  223.     public function inStockSingle(Request $requestInStockVehicle $inStockVehicleFactory$url): Response
  224.     {
  225.         $car $inStockVehicleFactory->createByUrl($url$this->getDealer());
  226.         if (!$car) {
  227.             $car $inStockVehicleFactory->createByUrl($url$this->getDealer(), false);
  228.             if ($car) {
  229.                 return $this->redirectToRoute('toyota_one_car', ['car' => $car->getVehicle()->getUrl()], 301);
  230.             }
  231.             return $this->redirectToRoute('toyota_in_stock_catalog', [], 301);
  232.         }
  233.         $options $car->getOptions($request->getLocale());
  234.         $carGallery $car->getInStockEntity()
  235.             ->getGallery()
  236.             ->getGalleryItems();
  237.         if ($carGallery->count()) {
  238.             $media $this->mediaExtensionVidi;
  239.             foreach ($carGallery as $value) {
  240.                 $value->image $media->getPath($value->getMedia(), 'reference');
  241.                 $value->image_webp $media->pathWebp($value->getMedia(), 'reference');
  242.             }
  243.         }
  244.         $form $this->CoreFormFactory()->callMeForm(new Forms(), true);
  245.         $form->get('dealer')->setData($this->getDealer());
  246.         return $this->baseToyotaRender(
  247.             '@DcSite/Toyota/Car/in-stock-single.html.twig',
  248.             [
  249.                 'model' => $car,
  250.                 'modelGallery' => $carGallery,
  251.                 'testDrive' => $this->CoreFormFactory()->testDriveForm($this->getDealer())->createView(),
  252.                 'tiForm' => $this->CoreFormFactory()->tradeInFrom($this->getDealer())->createView(),
  253.                 'buyInStockForm' =>
  254.                     $this->CoreFormFactory()->buyInStockForm(null$car->getInStockEntity())->createView(),
  255.                 'creditForm' => $this->CoreFormFactory()->creditForm($this->getDealer())->createView(),
  256.                 'options' => $options,
  257.                 'structuredCarData' => $this->getCarStructuredDataCarInStock($request$car),
  258.                 'callMeForm' => $form->createView(),
  259.             ]
  260.         );
  261.     }
  262.     public function secondhandList(): Response
  263.     {
  264.         return $this->baseToyotaRender('@DcSite/Toyota/Car/car-in-stock-frame.html.twig',
  265.             [
  266.                 'vehicle' => self::MODEL_FRAME,
  267.             ]);
  268.     }
  269.     public function secondhandModel($model): ?Response
  270.     {
  271.         if (substr($model, -7) == '-hybrid') {
  272.             $isHybrid true;
  273.         } else {
  274.             $isHybrid false;
  275.         }
  276.         if (!in_array($modelself::MODEL_FRAME)) {
  277.             throw new NotFoundHttpException();
  278.         }
  279.         return $this->baseToyotaRender('@DcSite/Toyota/Car/car-in-stock-frame-model.html.twig',
  280.             [
  281.                 'model' => $model,
  282.                 'isHybrid' => $isHybrid,
  283.             ]);
  284.     }
  285.     public function accessories(): RedirectResponse
  286.     {
  287.         return $this->redirect('https://shop.toyota-ua.com/'Response::HTTP_MOVED_PERMANENTLY);
  288.     }
  289.     public function configurator(Request $requestTranslatorInterface $translator): Response
  290.     {
  291.         $url $request->get('url');
  292.         $Vehicle false;
  293.         if ($url != 'start') {
  294.             $Vehicle $this->vehicleFactory->createByUrl($url$this->getDealer());
  295.             if (!$Vehicle) {
  296.                 throw new NotFoundHttpException();
  297.             }
  298.         }
  299.         $hash $request->query->get('hash');
  300.         $h1Tag $translator->trans('base.seo.configurator.h1', [], 'dc_toyota');
  301.         //TODO remove magic numbers
  302.         $carId 0;
  303.         if ($Vehicle) {
  304.             $h1Tag =
  305.                 $translator->trans(
  306.                     'base.seo.configurator.h1_car',
  307.                     ['%model%' => $Vehicle->getModel()->getTitle()],
  308.                     'dc_toyota'
  309.                 );
  310.             $carId $Vehicle->getVehicleId();
  311.         }
  312.         return $this->baseToyotaRender('@DcSite/Toyota/Configurator/index.html.twig', [
  313.             'carId' => $carId,
  314.             'car' => $Vehicle,
  315.             'h1Tag' => $h1Tag,
  316.             'baseType' => Program::BASE_COEFFICIENT_TYPE,
  317.             'listType' => Program::LIST_COEFFICIENT_TYPE,
  318.             'optionType' => Program::OPTION_COEFFICIENT_TYPE,
  319.             'hash' => $hash,
  320.         ]);
  321.     }
  322.     public function offerCar(Request $request): Response
  323.     {
  324.         $vehicles $this->vehicleRepository->getActionVehicleItems($this->getDealer());
  325.         $vehicles array_reduce($vehicles, function ($vehiclesVehicleItem $vehicle) use ($request) {
  326.             try {
  327.                 $model $this->vehicleFactory->createByVehicleItem($vehicle);
  328.                 if (empty($model)) {
  329.                     return $vehicles;
  330.                 }
  331.                 $modelVehicleID $model->getVehicleId();
  332.                 $modelVehicle = [
  333.                     'id' => $model->getVehicleId(),
  334.                     'fullName' => $model->getFullName(),
  335.                     'title' => $model->getTitle($request->getLocale()),
  336.                     'url' => $model->getUrl(),
  337.                     'hasHybrid' => $model->hasHybrid(),
  338.                     'price' => round($model->price()),
  339.                     'fullPrice' => round($model->fullPrice()),
  340.                     'image' => $model->getPreviewPath('reference'),
  341.                     'image_webp' => $model->getPreviewPathWebp('reference')
  342.                 ];
  343.                 if (!array_key_exists($modelVehicleID$vehicles)) {
  344.                     $vehicles[$modelVehicleID] = $modelVehicle;
  345.                     return $vehicles;
  346.                 }
  347.                 if ($vehicles[$modelVehicleID]['price'] > $model->price()) {
  348.                     $vehicles[$modelVehicleID] = $modelVehicle;
  349.                 }
  350.                 return $vehicles;
  351.             } catch (Exception $e) {
  352.                 return $vehicles;
  353.             }
  354.         }, []);
  355.         return $this->baseToyotaRender('@DcSite/Toyota/Car/offer-of-the-day.html.twig', ['vehicles' => $vehicles]);
  356.     }
  357.     public function archive(): ?Response
  358.     {
  359.         $vehicles $this->vehicleRepository->getDisabled($this->getDealer());
  360.         $result = [];
  361.         foreach ($vehicles as $vehicle) {
  362.             $model $this->vehicleFactory->createByEntity($vehicle);
  363.             if (!$model) {
  364.                 continue;
  365.             }
  366.             $result[] = $model;
  367.         }
  368.         return $this->baseToyotaRender('@DcSite/Toyota/Car/archive.html.twig', ['cars' => $result]);
  369.     }
  370. }