src/DcSiteBundle/Controller/Infiniti/CarController.php line 111

Open in your IDE?
  1. <?php
  2. namespace DcSiteBundle\Controller\Infiniti;
  3. use CoreBundle\Component\CoreFormFactory;
  4. use CoreBundle\Component\FormManager;
  5. use CoreBundle\Entity\Vehicles\Vehicle;
  6. use CoreBundle\Factory\InStockVehicle;
  7. use CoreBundle\Factory\Vehicle as VehicleFactory;
  8. use CoreBundle\Model\Api\OnlineService\ApiServer1C;
  9. use CoreBundle\Model\Vehicles\Repository;
  10. use CoreBundle\Services\MediaExtensionVidi;
  11. use DcSiteBundle\Model\CreditModel;
  12. use DcSiteBundle\Services\AccessoryService;
  13. use DcSiteBundle\Services\HistoryManager;
  14. use DcSiteBundle\Services\VehicleService;
  15. use DcSiteBundle\Services\VehicleViewService;
  16. use Doctrine\ORM\EntityManagerInterface;
  17. use PortalBundle\Model\SeoMetaTag;
  18. use CoreBundle\Entity\Forms;
  19. use CoreBundle\Model\Vehicles\AbstractVehicle;
  20. use DateTime;
  21. use DcSiteBundle\Enum\DealerPathEnum;
  22. use DcSiteBundle\Services\CarInStockService;
  23. use DcSiteBundle\Services\ModelRange\Pages\PagesService;
  24. use DcSiteBundle\Services\UsedVehicleService;
  25. use Doctrine\ORM\NonUniqueResultException;
  26. use Doctrine\ORM\OptimisticLockException;
  27. use Symfony\Component\Filesystem\Filesystem;
  28. use Symfony\Component\HttpFoundation\Request;
  29. use Symfony\Component\HttpFoundation\RequestStack;
  30. use Symfony\Component\HttpFoundation\Response;
  31. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  32. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  33. use Symfony\Component\Routing\RouterInterface;
  34. use Twig\Environment;
  35. class CarController extends BaseController
  36. {
  37.     private CarInStockService $carInStockService;
  38.     private UsedVehicleService $usedVehicleService;
  39. public function __construct(CoreFormFactory $coreFormFactorySeoMetaTag $seoMetaTagRequestStack $requestStackRouterInterface $routerFormManager $formManagerEntityManagerInterface $emApiServer1C $apiServer1CSessionInterface $sessionFilesystem $filesystemMediaExtensionVidi $mediaExtensionVidiRepository $vehicleRepositoryVehicleFactory $vehicleFactoryEnvironment $twigCarInStockService $carInStockServiceUsedVehicleService $usedVehicleService)
  40. {
  41.     $this->carInStockService $carInStockService;
  42.     $this->usedVehicleService $usedVehicleService;
  43.     parent::__construct($coreFormFactory$seoMetaTag$requestStack$router$formManager$em$apiServer1C$session$filesystem$mediaExtensionVidi$vehicleRepository$vehicleFactory$twig);
  44. }
  45.     public function car(Request $requestVehicleService $vehicleServiceCreditModel $creditModel,
  46.                         AccessoryService $accessoryServiceHistoryManager $historyManager$url): ?Response
  47.     {
  48.         $dealer $this->getDealer();
  49.         $vehicle $this->vehicleFactory->createByUrl($url$dealer);
  50.         if(!$vehicle) {
  51.             throw new NotFoundHttpException();
  52.         }
  53.         $VehicleEm $vehicle->getVehicleEntity();
  54.         $vehicleColor $vehicleService->getVehicleColor($VehicleEm);
  55.         $carInStock $this->carInStockService->getCarInStockByModel($this->getDealer(),$request->getLocale(),$VehicleEm->getModel(),4);
  56.         $vehicleFaqs $vehicleService->getVehicleFaqs($VehicleEm);
  57.         $vehicleAccessory $accessoryService->getAccessoriesByDealerVehicleType($dealer);
  58.         $historyManager->setUserCarHistory($this->getUser(), $vehicle->getVehicleEntity());
  59.         $minPayment $creditModel->getMinPayment($vehicle);
  60.         $TdForm = new Forms();
  61.         $TdForm->setVehicle($vehicle->getVehicleEntity());
  62.         $form $this->CoreFormFactory()
  63.             ->callMeForm(new Forms(), true);
  64.         $form->get('dealer')->setData($this->getDealer());
  65.         return $this->baseInfinitiRender('@DcSite/Infiniti/Car/car-card.html.twig', [
  66.             'model' => $vehicle,
  67.             'vehicleColor' => $vehicleColor,
  68.             'carInStock' => $carInStock,
  69.             'faqs' => $vehicleFaqs,
  70.             'vehicleAccessory' => $vehicleAccessory,
  71.             'type' => null,
  72.             'minPayment' => $minPayment,
  73.             'buyForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity(), nullnullfalsefalse$vehicle->getPrice())->createView(),
  74.             'buyPartsForm' => $this->CoreFormFactory()->buyPartsForm($this->getDealer())->createView(),
  75.             'creditForm' =>  $this->CoreFormFactory()->creditForm($this->getDealer())->createView(),
  76.             'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(),$TdForm)->createView(),
  77.             'structuredData' => $this->getCarPageStructuredData($request$vehicle),
  78.             'callMeForm' => $form->createView()
  79.         ]);
  80.     }
  81.     public function carConfiguraion(VehicleService $vehicleService$url)
  82.     {
  83.         $Dealer $this->getDealer();
  84.         $Vehicle $this->CoreFormFactory()->createByUrl($url$Dealer);
  85.         if (!$Vehicle) {
  86.             throw new NotFoundHttpException();
  87.         }
  88.         $VehicleEm $Vehicle->getVehicleEntity();
  89.         $vehiclePrice $vehicleService->getVehiclePrice($VehicleEm);
  90.         $vehicleEquipment $vehicleService->getVehicleEquipment($VehicleEm);
  91.         return $this->baseInfinitiRender'@DcSite/Infiniti/Car/configuration.html.twig', [
  92.             'model' => $Vehicle,
  93.             'vehiclePrice' => $vehiclePrice,
  94.             'vehicleEquipment' => $vehicleEquipment,
  95.         ] );
  96.     }
  97.     public function lineUp(Request $requestPagesService $pagesService): ?Response
  98.     {
  99.         $vehicles $this->vehicleRepository->getNewByDealer($this->getDealer());
  100.         $result = [];
  101.         foreach ($vehicles as $vehicle) {
  102.             $vehicleModel $this->vehicleFactory->createByEntity($vehicle);
  103.             if($vehicleModel) {
  104.                 $result[] = $vehicleModel;
  105.             }
  106.         }
  107.         return $this->baseInfinitiRender('@DcSite/Infiniti/Car/model-lineup.html.twig', [
  108.             'cars' => $result,
  109.             'catalogModelRangePages' => $pagesService
  110.                 ->setLang($request->getLocale())
  111.                 ->getPages($this->getDealer())
  112.         ]);
  113.     }
  114.     public function lineUpPage(Request $requestPagesService $pagesServicestring $url): ?Response
  115.     {
  116.         $page $pagesService
  117.             ->setLang($request->getLocale())
  118.             ->getPage($this->getDealer(), $url);
  119.         if (empty($page)) {
  120.             throw new NotFoundHttpException();
  121.         }
  122.         return $this->baseInfinitiRender('@DcSite/Infiniti/Car/model-lineup-page.html.twig', ['page' => $page]);
  123.     }
  124.     public function carStock(Request $request): Response
  125.     {
  126.         $vehicles $this->carInStockService->getCarInStockByDealer(
  127.             $this->getDealer(),
  128.             null,
  129.             $request->getLocale()
  130.         );
  131.         $this->carInStockService->sortVehicleByDealer($vehicles$this->getDealer()->getUniqueId());
  132.         return $this->baseInfinitiRender('@DcSite/Infiniti/Car/car-in-stock.html.twig', ['vehicles' => $vehicles]);
  133.     }
  134.     public function carCardStock(Request $requestInStockVehicle $inStockVehicleFactory) {
  135.         $inStockVehicle $inStockVehicleFactory->createByUrl($request->get('url'), $this->getDealer());
  136.         if(!$inStockVehicle) {
  137.             $inStockVehicle $inStockVehicleFactory->createByUrl($request->get('url'), $this->getDealer(), false);
  138.             if ($inStockVehicle) {
  139.                 return $this->redirectToRoute('infiniti_card_car', ['url' => $inStockVehicle->getVehicle()->getUrl()], 301);
  140.             } else {
  141.                 return $this->redirectToRoute('infiniti_car_stock', [], 301);
  142.             }
  143.         }
  144.         $options  $inStockVehicle->getOptions($request->getLocale());
  145.         $form $this->CoreFormFactory()->callMeForm(new Forms(), true);
  146.         $form->get('dealer')->setData($this->getDealer());
  147.         return $this->baseInfinitiRender('@DcSite/Infiniti/Car/in-stock-card.html.twig',[
  148.             'model' => $inStockVehicle,
  149.             'options' => $options,
  150.             'buyInStockForm' => $this->CoreFormFactory()->buyInStockForm(null$inStockVehicle->getInStockEntity())->createView(),
  151.             'structuredCarData' => $this->getCarStructuredDataCarInStock($request$inStockVehicle),
  152.             'callMeForm' => $form->createView(),
  153.         ]);
  154.     }
  155.     public function testDrive(): ?Response
  156.     {
  157.         return $this->baseInfinitiRender('@DcSite/Infiniti/Car/test-drive.html.twig', [
  158.             'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(),null, [
  159.                 'child' => false,
  160.                 'widthTime' => true
  161.             ])->createView(),
  162.         ]);
  163.     }
  164.     public function archive(): ?Response
  165.     {
  166.         $vehicles $this->vehicleRepository->getDisabled($this->getDealer());
  167.         $result = [];
  168.         foreach ($vehicles as $vehicle) {
  169.             $model $this->vehicleFactory->createByEntity($vehicle);
  170.             if(!$model) {
  171.                 continue;
  172.             }
  173.             $result[] = $model;
  174.         }
  175.         return $this->baseInfinitiRender('@DcSite/Infiniti/Car/archive.html.twig', ['cars' => $result]);
  176.     }
  177.     public function usedCarCatalog(Request $request): ?Response
  178.     {
  179.         $vehicles $this->usedVehicleService->getUsedVehicles(
  180.             $this->getDealer(),
  181.             DealerPathEnum::INFINITI,
  182.             $request->getLocale()
  183.         );
  184.         return $this->baseInfinitiRender('@DcSite/Infiniti/Car/used-car-catalog.html.twig', ['vehicles' => $vehicles]);
  185.     }
  186.     public function secondhandSingle(Request $requestVehicleViewService $vehicleViewServiceCreditModel $creditModel$url): ?Response
  187.     {
  188.         if (!$url) {
  189.             throw new NotFoundHttpException();
  190.         }
  191.         /** @var AbstractVehicle $vehicle */
  192.         $vehicle $this->vehicleFactory->createUsedByUrl($url);
  193.         if (!$vehicle) {
  194.             throw new NotFoundHttpException();
  195.         }
  196.         $vehicleViewService->saveViewVehicle($vehicle$request->getClientIp(), new DateTime());
  197.         $viewedCars = [];
  198.         if (isset($_COOKIE['viewedCars'])) {
  199.             $viewedCars json_decode($_COOKIE['viewedCars']);
  200.             if (!in_array($vehicle->getVehicleId(), $viewedCars)) {
  201.                 $viewedCars[] = $vehicle->getVehicleId();
  202.             }
  203.         } else {
  204.             setcookie('viewedCars'json_encode([$vehicle->getVehicleId()]));
  205.         }
  206.         $viewedCarEntities $this->em->getRepository(Vehicle::class)
  207.             ->findBy(['id' => array_slice(array_reverse(array_diff($viewedCars, [$vehicle->getVehicleId()])), 03)]);
  208.         $viewedCarFactories = [];
  209.         foreach ($viewedCarEntities as $viewedCarEntity) {
  210.             $viewedCarFactory $this->vehicleFactory->createByEntity($viewedCarEntity);
  211.             $galleryItems $viewedCarFactory->getGallery()
  212.                 ? $viewedCarFactory->getGallery()->getGalleryItems()
  213.                 : null;
  214.             $image $galleryItems && $galleryItems->count()
  215.                 ? $galleryItems->first()->getMedia()
  216.                 : $viewedCarFactory->getPreview();
  217.             $viewedCarFactories[] = [
  218.                 'vehicle' => $viewedCarFactory,
  219.                 'image' => $this->mediaExtensionVidi->getPath($image'reference'),
  220.                 'link' => $this->router->generate('infiniti_used_car_single', ['url' => $viewedCarFactory->getUrl()]),
  221.             ];
  222.         }
  223.         $galleryItems $vehicle->getGallery()->getGalleryItems();
  224.         $gallery_images = [];
  225.         if ($galleryItems && $galleryItems->count()) {
  226.             foreach ($galleryItems as $galleryItem) {
  227.                 $gallery_images[] = $this->mediaExtensionVidi->getPath($galleryItem->getMedia(), 'reference');
  228.             }
  229.         }
  230.         $similarVehicles = [];
  231.         $similar $this->vehicleRepository->getSimilarVehicles($vehicletruefalsetrue);
  232.         foreach ($similar as $vehicleItem) {
  233.             $vehicleItemGallery $this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle())->getGallery()->getGalleryItems();
  234.             $vehicleItemGalleryImages = [];
  235.             if ($vehicleItemGallery && $vehicleItemGallery->count()) {
  236.                 foreach ($vehicleItemGallery as $vehicleItemGallery_item) {
  237.                     $vehicleItemGalleryImages[] = $this->mediaExtensionVidi->getPath($vehicleItemGallery_item->getMedia(), 'reference');
  238.                 }
  239.             }
  240.             $similarVehicles[] = [
  241.                 'vehicle' =>  $this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle()),
  242.                 'creditPayment' => $creditModel->getMinPayment($this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle())),
  243.                 'link' => $this->router->generate('infiniti_used_car_single', ['url' => $vehicle->getUrl()]),
  244.                 'gallery' => $vehicleItemGalleryImages
  245.             ];
  246.         }
  247.         $options $vehicle->getOptionsArray($request->getLocale());
  248.         return $this->baseInfinitiRender('@DcSite/Infiniti/Car/used-car-single.html.twig', [
  249.             'secondhand' => $vehicle,
  250.             'options' => $options,
  251.             'buyForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity(), nullnulltruefalse$vehicle->getPrice())->createView(),
  252.             'consultForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity())->createView(),
  253.             'consultationForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity())->createView(),
  254.             'gallary' => $gallery_images,
  255.             'creditPayment' => $creditModel->getMinPayment($vehicle),
  256.             'similarCars' => $similarVehicles,
  257.             'viewedCars' => $viewedCarFactories,
  258.             'structuredCarData' => $this->getCarStructuredDataCarUsed($request$vehicle)
  259.         ]);
  260.     }
  261. }