src/DcSiteBundle/Controller/Mazda/CarController.php line 143

Open in your IDE?
  1. <?php
  2. namespace DcSiteBundle\Controller\Mazda;
  3. use CoreBundle\Component\CoreFormFactory;
  4. use CoreBundle\Component\FormManager;
  5. use CoreBundle\Entity\Forms;
  6. use CoreBundle\Entity\Vehicles\Category;
  7. use CoreBundle\Entity\Vehicles\Vehicle;
  8. use CoreBundle\Entity\Vehicles\VehicleFile;
  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 DateTime;
  15. use DcSiteBundle\Enum\DealerPathEnum;
  16. use DcSiteBundle\Model\CreditModel;
  17. use DcSiteBundle\Services\AccessoryService;
  18. use DcSiteBundle\Services\CarInStockService;
  19. use DcSiteBundle\Services\CatalogService;
  20. use DcSiteBundle\Services\HistoryManager;
  21. use DcSiteBundle\Services\ModelRange\Pages\PagesService;
  22. use DcSiteBundle\Services\UsedVehicleService;
  23. use DcSiteBundle\Services\VehicleService;
  24. use DcSiteBundle\Services\VehicleViewService;
  25. use Doctrine\ORM\EntityManagerInterface;
  26. use InsuranceBundle\Model\Program;
  27. use PortalBundle\Model\SeoMetaTag;
  28. use Symfony\Component\Filesystem\Filesystem;
  29. use Symfony\Component\HttpFoundation\Request;
  30. use Symfony\Component\HttpFoundation\RequestStack;
  31. use Symfony\Component\HttpFoundation\Response;
  32. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  33. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  34. use Symfony\Component\Routing\RouterInterface;
  35. use Twig\Environment;
  36. class CarController extends BaseController
  37. {
  38.     private CarInStockService $carInStockService;
  39.     private UsedVehicleService $usedVehicleService;
  40.     private CatalogService $catalogService;
  41.     public function __construct(CoreFormFactory $coreFormFactorySeoMetaTag $seoMetaTagRequestStack $requestStackRouterInterface $routerFormManager $formManagerEntityManagerInterface $emApiServer1C $apiServer1CSessionInterface $sessionFilesystem $filesystemMediaExtensionVidi $mediaExtensionVidiRepository $vehicleRepositoryVehicleFactory $vehicleFactoryEnvironment $twigCarInStockService $carInStockServiceUsedVehicleService $usedVehicleServiceCatalogService $catalogService)
  42.     {
  43.         $this->carInStockService $carInStockService;
  44.         $this->usedVehicleService $usedVehicleService;
  45.         $this->catalogService $catalogService;
  46.         parent::__construct($coreFormFactory$seoMetaTag$requestStack$router$formManager$em$apiServer1C$session$filesystem$mediaExtensionVidi$vehicleRepository$vehicleFactory$twig);
  47.     }
  48.     public function car(Request $requestVehicleService $vehicleServiceAccessoryService $accessoryServiceHistoryManager $historyManager$car): Response
  49.     {
  50.         $Dealer $this->getDealer();
  51.         $vehicle $this->vehicleFactory->createByUrl($car$Dealer);
  52.         if (!$vehicle) {
  53.             throw new NotFoundHttpException();
  54.         }
  55.         $VehicleEm $vehicle->getVehicleEntity();
  56.         $vehicleColor $vehicleService->getVehicleColor($VehicleEm);
  57.         $carInStock $this->carInStockService->getCarInStockByModelWithPriority($this->getDealer(), $request->getLocale(), $VehicleEm->getModel(), 4);
  58.         $vehicleFaqs $vehicleService->getVehicleFaqs($VehicleEm);
  59.         $vehicleAccessory $accessoryService->getAccessoriesByDealerVehicleType($Dealer);
  60.         $historyManager->setUserCarHistory($this->getUser(), $vehicle->getVehicleEntity());
  61.         $TdForm = new Forms();
  62.         $TdForm->setVehicle($vehicle->getVehicleEntity());
  63.         $form $this->CoreFormFactory()
  64.             ->callMeForm(new Forms(), true);
  65.         $form->get('dealer')->setData($this->getDealer());
  66.         return $this->baseMazdaRender('@DcSite/Mazda/Car/car-card.html.twig', [
  67.             'model' => $vehicle,
  68.             'vehicleColor' => $vehicleColor,
  69.             'carInStock' => $carInStock,
  70.             'faqs' => $vehicleFaqs,
  71.             'vehicleAccessory' => $vehicleAccessory,
  72.             'buyForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity(), nullnullfalsefalse$vehicle->getPrice())->createView(),
  73.             'buyPartsForm' => $this->CoreFormFactory()->buyPartsForm($this->getDealer())->createView(),
  74.             'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), $TdForm)->createView(),
  75.             'structuredData' => $this->getCarPageStructuredData($request$vehicle),
  76.             'callMeForm' => $form->createView()
  77.         ]);
  78.     }
  79.     public function carConfiguraion(VehicleService $vehicleService$car): Response
  80.     {
  81.         $Dealer $this->getDealer();
  82.         $Vehicle $this->vehicleFactory->createByUrl($car$Dealer);
  83.         if (!$Vehicle) {
  84.             throw new NotFoundHttpException();
  85.         }
  86.         $VehicleEm $Vehicle->getVehicleEntity();
  87.         $vehiclePrice $vehicleService->getVehiclePrice($VehicleEm);
  88.         $vehicleEquipment $vehicleService->getVehicleEquipment($VehicleEm);
  89.         return $this->baseMazdaRender('@DcSite/Mazda/Car/configuration.html.twig', [
  90.             'model' => $Vehicle,
  91.             'vehiclePrice' => $vehiclePrice,
  92.             'vehicleEquipment' => $vehicleEquipment,
  93.         ]);
  94.     }
  95.     public function configurator(Request $request$url): Response
  96.     {
  97.         $url $request->get('url');
  98.         $Vehicle false;
  99.         if ($url != 'start') {
  100.             $Vehicle $this->vehicleFactory->createByUrl($url$this->getDealer());
  101.             if (!$Vehicle) {
  102.                 throw new NotFoundHttpException();
  103.             }
  104.         }
  105.         $hash $request->query->get('hash');
  106.         return $this->baseMazdaRender('@DcSite/Mazda/Configurator/index.html.twig', [
  107.             'carId' => $Vehicle $Vehicle->getVehicleId() : 0,
  108.             'car' => $Vehicle,
  109.             'baseType' => Program::BASE_COEFFICIENT_TYPE,
  110.             'listType' => Program::LIST_COEFFICIENT_TYPE,
  111.             'optionType' => Program::OPTION_COEFFICIENT_TYPE,
  112.             'hash' => $hash,
  113.         ]);
  114.     }
  115.     public function testDrive(): Response
  116.     {
  117.         return $this->baseMazdaRender('@DcSite/Mazda/Car/test-drive.html.twig', [
  118.             'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), null, [
  119.                 'child' => false,
  120.                 'widthTime' => true
  121.             ])->createView(),
  122.         ]);
  123.     }
  124.     public function list(Request $requestPagesService $pagesService): Response
  125.     {
  126.         $catalog $this->catalogService->getCategoryVehicles($this->getDealer());
  127.         $catalogVehicle $this->catalogService->getCatalogVehicleByCategory($this->getDealer());
  128.         return $this->baseMazdaRender('@DcSite/Mazda/Car/catalog.html.twig', [
  129.             'category' => null,
  130.             'catalog' => $catalog,
  131.             'catalogVehicle' => $catalogVehicle,
  132.             'catalogModelRangePages' => $pagesService->setLang($request->getLocale())->getPages($this->getDealer())
  133.         ]);
  134.     }
  135.     public function listPage(Request $requestPagesService $pagesServicestring $url): Response
  136.     {
  137.         $page $pagesService->setLang($request->getLocale())
  138.             ->getPage($this->getDealer(), $url);
  139.         if (empty($page)) {
  140.             throw new NotFoundHttpException();
  141.         }
  142.         return $this->baseMazdaRender('@DcSite/Mazda/Car/catalog-page.html.twig', ['page' => $page]);
  143.     }
  144.     public function category(Request $requestPagesService $pagesService$category): Response
  145.     {
  146.         $vehicleCategory $this->em->getRepository(Category::class)->findOneBy(['url' => $category]);
  147.         if (!$vehicleCategory) {
  148.             throw new NotFoundHttpException();
  149.         }
  150.         $catalog $this->catalogService->getCategoryVehicles($this->getDealer());
  151.         $catalogVehicle $this->catalogService->getCatalogVehicleByCategory($this->getDealer(), $category);
  152.         $category $this->catalogService->getCatalogCategory($catalog$category);
  153.         return $this->baseMazdaRender('@DcSite/Mazda/Car/catalog.html.twig', [
  154.             'category' => $category,
  155.             'catalog' => $catalog,
  156.             'catalogVehicle' => $catalogVehicle,
  157.             'catalogModelRangePages' => $pagesService->setLang($request->getLocale())->getPages($this->getDealer())
  158.         ]);
  159.     }
  160.     public function carInStock(Request $request): Response
  161.     {
  162.         $vehicles $this->carInStockService->getCarInStockByDealer(
  163.             $this->getDealer(),
  164.             null,
  165.             $request->getLocale()
  166.         );
  167.         $this->carInStockService->sortVehicleByDealer($vehicles$this->getDealer()->getUniqueId());
  168.         return $this->baseMazdaRender('@DcSite/Mazda/Car/car-in-stocks.html.twig', ['vehicles' => $vehicles]);
  169.     }
  170.     public function priceList(Request $request): Response
  171.     {
  172.         $vehicles $this->vehicleRepository->getNewByDealer($this->getDealer());
  173.         $result = [];
  174.         /** @var Vehicle $car */
  175.         foreach ($vehicles as $car) {
  176.             $vehicleId $car->getId();
  177.             $files $car->getFiles();
  178.             if (!$files->count()) {
  179.                 continue;
  180.             }
  181.             $item = [
  182.                 'car' => $car,
  183.                 'files' => [],
  184.             ];
  185.             /** @var VehicleFile $file */
  186.             foreach ($files as $file) {
  187.                 $item['files'][] = [
  188.                     'title' => $file->getTitle($request->getLocale()),
  189.                     'href' => $this->router->generate('base_download_file', ['id' => $file->getId()])
  190.                 ];
  191.             }
  192.             $result[$vehicleId] = $item;
  193.             $position[$vehicleId] = $car->getPosition();
  194.         }
  195.         array_multisort($positionSORT_ASC$result);
  196.         return $this->baseMazdaRender('@DcSite/Mazda/Car/price-list-and-catalog.html.twig', ['cars' => $result]);
  197.     }
  198.     public function specialOffers(): Response
  199.     {
  200.         $vehicles $this->vehicleRepository->getActionVehicleItems($this->getDealer());
  201.         $result = [];
  202.         foreach ($vehicles as $vehicle) {
  203.             $model $this->vehicleFactory->createByVehicleItem($vehicle);
  204.             if (!$model) {
  205.                 continue;
  206.             }
  207.             if (!isset($result[$model->getVehicleId()]) || $result[$model->getVehicleId()]->price() > $model->price()) {
  208.                 $result[$model->getVehicleId()] = $model;
  209.             }
  210.         }
  211.         return $this->baseMazdaRender('@DcSite/Mazda/Car/special-offers.html.twig', ['vehicles' => $result,]);
  212.     }
  213.     public function carInStockSingle(Request $requestInStockVehicle $inStockVehicle$url)
  214.     {
  215.         $car $inStockVehicle->createByUrl($url$this->getDealer());
  216.         if (!$car) {
  217.             $car $inStockVehicle->createByUrl($url$this->getDealer(), false);
  218.             if ($car) {
  219.                 return $this->redirectToRoute('mazda_card_car', ['car' => $car->getVehicle()->getUrl()], 301);
  220.             } else {
  221.                 return $this->redirectToRoute('mazda_car_stock', [], 301);
  222.             }
  223.         }
  224.         $options $car->getOptions($request->getLocale());
  225.         $form $this->CoreFormFactory()
  226.             ->callMeForm(new Forms(), true);
  227.         $form->get('dealer')->setData($this->getDealer());
  228.         return $this->baseMazdaRender('@DcSite/Mazda/Car/car-in-stock-card.html.twig', [
  229.             'model' => $car,
  230.             'buyInStockForm' => $this->CoreFormFactory()->buyInStockForm(null$car->getInStockEntity())->createView(),
  231.             'options' => $options,
  232.             'structuredCarData' => $this->getCarStructuredDataCarInStock($request$car),
  233.             'callMeForm' => $form->createView()
  234.         ]);
  235.     }
  236.     public function archive(): Response
  237.     {
  238.         $vehicles $this->vehicleRepository->getDisabled($this->getDealer());
  239.         $result = [];
  240.         foreach ($vehicles as $vehicle) {
  241.             $model $this->vehicleFactory->createByEntity($vehicle);
  242.             if (!$model) {
  243.                 continue;
  244.             }
  245.             $result[] = $model;
  246.         }
  247.         return $this->baseMazdaRender('@DcSite/Mazda/Car/archive.html.twig', ['cars' => $result]);
  248.     }
  249.     public function usedCarCatalog(Request $request): Response
  250.     {
  251.         $vehicles $this->usedVehicleService->getUsedVehicles(
  252.             $this->getDealer(),
  253.             DealerPathEnum::MAZDA,
  254.             $request->getLocale()
  255.         );
  256.         return $this->baseMazdaRender('@DcSite/Mazda/Car/used-car-catalog.html.twig', ['vehicles' => $vehicles]);
  257.     }
  258.     public function secondhandSingle(Request $requestVehicleViewService $vehicleViewServiceCreditModel $creditModel$url): Response
  259.     {
  260.         if (!$url) {
  261.             throw new NotFoundHttpException();
  262.         }
  263.         $vehicle $this->vehicleFactory->createUsedByUrl($url);
  264.         if (!$vehicle) {
  265.             throw new NotFoundHttpException();
  266.         }
  267.         $vehicleViewService->saveViewVehicle($vehicle$request->getClientIp(), new DateTime());
  268.         $viewedCars = [];
  269.         if (isset($_COOKIE['viewedCars'])) {
  270.             $viewedCars json_decode($_COOKIE['viewedCars']);
  271.             if (!in_array($vehicle->getVehicleId(), $viewedCars)) {
  272.                 $viewedCars[] = $vehicle->getVehicleId();
  273.             }
  274.         } else {
  275.             setcookie('viewedCars'json_encode([$vehicle->getVehicleId()]));
  276.         }
  277.         $viewedCarEntities $this->em->getRepository(Vehicle::class)
  278.             ->findBy(['id' => array_slice(array_reverse(array_diff($viewedCars, [$vehicle->getVehicleId()])), 03)]);
  279.         $viewedCarFactories = [];
  280.         foreach ($viewedCarEntities as $viewedCarEntity) {
  281.             $viewedCarFactory $this->vehicleFactory->createByEntity($viewedCarEntity);
  282.             $galleryItems $viewedCarFactory->getGallery()
  283.                 ? $viewedCarFactory->getGallery()->getGalleryItems()
  284.                 : null;
  285.             $image $galleryItems && $galleryItems->count()
  286.                 ? $galleryItems->first()->getMedia()
  287.                 : $viewedCarFactory->getPreview();
  288.             $viewedCarFactories[] = [
  289.                 'vehicle' => $viewedCarFactory,
  290.                 'image' => $this->mediaExtensionVidi->getPath($image'reference'),
  291.                 'link' => $this->router->generate('mazda_used_car_single', ['url' => $viewedCarFactory->getUrl()]),
  292.             ];
  293.         }
  294.         $galleryItems $vehicle->getGallery()->getGalleryItems();
  295.         $gallery_images = [];
  296.         if ($galleryItems && $galleryItems->count()) {
  297.             foreach ($galleryItems as $galleryItem) {
  298.                 $gallery_images[] = $this->mediaExtensionVidi->getPath($galleryItem->getMedia(), 'reference');
  299.             }
  300.         }
  301.         $similarVehicles = [];
  302.         $similar $this->vehicleRepository->getSimilarVehicles($vehicletruefalsetrue);
  303.         foreach ($similar as $vehicleItem) {
  304.             $vehicleItemGallery $this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle())->getGallery()->getGalleryItems();
  305.             $vehicleItemGalleryImages = [];
  306.             if ($vehicleItemGallery && $vehicleItemGallery->count()) {
  307.                 foreach ($vehicleItemGallery as $vehicleItemGallery_item) {
  308.                     $vehicleItemGalleryImages[] = $this->mediaExtensionVidi->getPath($vehicleItemGallery_item->getMedia(), 'reference');
  309.                 }
  310.             }
  311.             $similarVehicles[] = [
  312.                 'vehicle' => $this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle()),
  313.                 'creditPayment' => $creditModel->getMinPayment($this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle())),
  314.                 'link' => $this->router->generate('mazda_used_car_single', ['url' => $vehicle->getUrl()]),
  315.                 'gallery' => $vehicleItemGalleryImages
  316.             ];
  317.         }
  318.         $options $vehicle->getOptionsArray($request->getLocale());
  319.         return $this->baseMazdaRender('@DcSite/Mazda/Car/used-car-single.html.twig', [
  320.             'secondhand' => $vehicle,
  321.             'options' => $options,
  322.             'buyForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity(), nullnulltruefalse$vehicle->getPrice())->createView(),
  323.             'consultationForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity())->createView(),
  324.             'gallary' => $gallery_images,
  325.             'creditPayment' => $creditModel->getMinPayment($vehicle),
  326.             'similarCars' => $similarVehicles,
  327.             'viewedCars' => $viewedCarFactories,
  328.             'structuredCarData' => $this->getCarStructuredDataCarUsed($request$vehicle)
  329.         ]);
  330.     }
  331. }