src/DcSiteBundle/Controller/Citroen/CarController.php line 212

Open in your IDE?
  1. <?php
  2. namespace DcSiteBundle\Controller\Citroen;
  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\Factory\InStockVehicle;
  9. use CoreBundle\Factory\Vehicle as VehicleFactory;
  10. use CoreBundle\Model\Api\OnlineService\ApiServer1C;
  11. use CoreBundle\Model\Vehicles\AbstractVehicle;
  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 $requestStack,
  42.                                 RouterInterface   $routerFormManager $formManagerEntityManagerInterface $emApiServer1C $apiServer1C,
  43.                                 SessionInterface  $sessionFilesystem $filesystemMediaExtensionVidi $mediaExtensionVidi,
  44.                                 Repository        $vehicleRepositoryVehicleFactory $vehicleFactoryEnvironment $twig,
  45.                                 CarInStockService $carInStockServiceUsedVehicleService $usedVehicleServiceCatalogService $catalogService)
  46.     {
  47.         $this->carInStockService $carInStockService;
  48.         $this->usedVehicleService $usedVehicleService;
  49.         $this->catalogService $catalogService;
  50.         parent::__construct($coreFormFactory$seoMetaTag$requestStack$router$formManager$em$apiServer1C$session$filesystem$mediaExtensionVidi$vehicleRepository$vehicleFactory$twig);
  51.     }
  52.     public function car(Request $requestVehicleService $vehicleServiceAccessoryService $accessoryService,
  53.                         HistoryManager $historyManager$car): ?Response
  54.     {
  55.         $Dealer $this->getDealer();
  56.         $vehicle $this->vehicleFactory->createByUrl($car$Dealer);
  57.         if (!$vehicle) {
  58.             throw new NotFoundHttpException();
  59.         }
  60.         $VehicleEm $vehicle->getVehicleEntity();
  61.         $vehicleColor $vehicleService->getVehicleColor($VehicleEm);
  62.         $carInStock $this->carInStockService->getCarInStockByModel($this->getDealer(), $request->getLocale(), $VehicleEm->getModel(), 4);
  63.         $vehicleFaqs $vehicleService->getVehicleFaqs($VehicleEm);
  64.         $vehicleAccessory $accessoryService->getAccessoriesByDealerVehicleType($Dealer);
  65.         $historyManager->setUserCarHistory($this->getUser(), $vehicle->getVehicleEntity());
  66.         $TdForm = new Forms();
  67.         $TdForm->setVehicle($vehicle->getVehicleEntity());
  68.         $form $this->CoreFormFactory()
  69.             ->callMeForm(new Forms(), true);
  70.         $form->get('dealer')->setData($this->getDealer());
  71.         return $this->baseCitroenRender('@DcSite/Citroen/Car/car-card.html.twig', [
  72.             'model' => $vehicle,
  73.             'vehicleColor' => $vehicleColor,
  74.             'carInStock' => $carInStock,
  75.             'faqs' => $vehicleFaqs,
  76.             'vehicleAccessory' => $vehicleAccessory,
  77.             'buyForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity(), nullnullfalsefalse$vehicle->getPrice())->createView(),
  78.             'buyPartsForm' => $this->CoreFormFactory()->buyPartsForm($this->getDealer())->createView(),
  79.             'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), $TdForm)->createView(),
  80.             'structuredData' => $this->getCarPageStructuredData($request$vehicle),
  81.             'callMeForm' => $form->createView()
  82.         ]);
  83.     }
  84.     public function carConfiguraion(VehicleService $vehicleService$car): ?Response
  85.     {
  86.         $Dealer $this->getDealer();
  87.         $Vehicle $this->vehicleFactory->createByUrl($car$Dealer);
  88.         if (!$Vehicle) {
  89.             throw new NotFoundHttpException();
  90.         }
  91.         $VehicleEm $Vehicle->getVehicleEntity();
  92.         $vehiclePrice $vehicleService->getVehiclePrice($VehicleEm);
  93.         $vehicleEquipment $vehicleService->getVehicleEquipment($VehicleEm);
  94.         return $this->baseCitroenRender('@DcSite/Citroen/Car/configuration.html.twig', [
  95.             'model' => $Vehicle,
  96.             'vehiclePrice' => $vehiclePrice,
  97.             'vehicleEquipment' => $vehicleEquipment,
  98.         ]);
  99.     }
  100.     public function carStock(Request $request): ?Response
  101.     {
  102.         $vehicles $this->carInStockService->getCarInStockByDealer(
  103.             $this->getDealer(),
  104.             null,
  105.             $request->getLocale()
  106.         );
  107.         $this->carInStockService->sortVehicleByDealer($vehicles$this->getDealer()->getUniqueId());
  108.         return $this->baseCitroenRender('@DcSite/Citroen/Car/car-in-stocks.html.twig', ['vehicles' => $vehicles]);
  109.     }
  110.     public function carCardStock(Request $requestInStockVehicle $inStockVehicle$url)
  111.     {
  112.         $car $inStockVehicle->createByUrl($url$this->getDealer());
  113.         if (!$car) {
  114.             $car $inStockVehicle->createByUrl($url$this->getDealer(), false);
  115.             if ($car) {
  116.                 return $this->redirectToRoute('citroen_card_car', ['car' => $car->getVehicle()->getUrl()], 301);
  117.             } else {
  118.                 return $this->redirectToRoute('citroen_car_stock', [], 301);
  119.             }
  120.         }
  121.         $options $car->getOptions($request->getLocale());
  122.         $form $this->CoreFormFactory()->callMeForm(new Forms(), true);
  123.         $form->get('dealer')->setData($this->getDealer());
  124.         return $this->baseCitroenRender(
  125.             '@DcSite/Citroen/Car/car-in-stock-card.html.twig',
  126.             [
  127.                 'model' => $car,
  128.                 'buyInStockForm' =>
  129.                     $this->CoreFormFactory()->buyInStockForm(null$car->getInStockEntity())->createView(),
  130.                 'options' => $options,
  131.                 'structuredCarData' => $this->getCarStructuredDataCarInStock($request$car),
  132.                 'callMeForm' => $form->createView(),
  133.             ]
  134.         );
  135.     }
  136.     public function configurator(Request $request$url): ?Response
  137.     {
  138.         $Vehicle false;
  139.         if ($url !== 'start') {
  140.             $Vehicle $this->vehicleFactory->createByUrl($url$this->getDealer());
  141.             if (!$Vehicle) {
  142.                 throw new NotFoundHttpException();
  143.             }
  144.         }
  145.         $hash $request->query->get('hash');
  146.         return $this->baseCitroenRender('@DcSite/Citroen/Configurator/index.html.twig', [
  147.             'carId' => $Vehicle $Vehicle->getVehicleId() : 0,
  148.             'baseType' => Program::BASE_COEFFICIENT_TYPE,
  149.             'listType' => Program::LIST_COEFFICIENT_TYPE,
  150.             'optionType' => Program::OPTION_COEFFICIENT_TYPE,
  151.             'hash' => $hash,
  152.         ]);
  153.     }
  154.     public function testDrive(): ?Response
  155.     {
  156.         return $this->baseCitroenRender('@DcSite/Citroen/Car/test-drive.html.twig', [
  157.             'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), null, [
  158.                 'child' => false,
  159.                 'widthTime' => true
  160.             ])->createView(),
  161.         ]);
  162.     }
  163.     public function list(Request $requestPagesService $pagesService): ?Response
  164.     {
  165.         $catalog $this->catalogService->getCategoryVehicles($this->getDealer());
  166.         $catalogVehicle $this->catalogService->getCatalogVehicleByCategory($this->getDealer());
  167.         return $this->baseCitroenRender('@DcSite/Citroen/Car/catalog.html.twig', [
  168.             'category' => null,
  169.             'catalog' => $catalog,
  170.             'catalogVehicle' => $catalogVehicle,
  171.             'catalogModelRangePages' => $pagesService->setLang($request->getLocale())->getPages($this->getDealer())
  172.         ]);
  173.     }
  174.     public function listPage(Request $requestPagesService $pagesServicestring $url): ?Response
  175.     {
  176.         $page $pagesService->setLang($request->getLocale())->getPage($this->getDealer(), $url);
  177.         if (empty($page)) {
  178.             throw new NotFoundHttpException();
  179.         }
  180.         return $this->baseCitroenRender('@DcSite/Citroen/Car/catalog-page.html.twig', ['page' => $page]);
  181.     }
  182.     public function category(Request $requestPagesService $pagesService$category): ?Response
  183.     {
  184.         $vehicleCategory $this->em->getRepository(Category::class)->findOneBy(['url' => $category]);
  185.         if (!$vehicleCategory) {
  186.             throw new NotFoundHttpException();
  187.         }
  188.         $catalog $this->catalogService->getCategoryVehicles($this->getDealer());
  189.         $catalogVehicle $this->catalogService->getCatalogVehicleByCategory($this->getDealer(), $category);
  190.         $category $this->catalogService->getCatalogCategory($catalog$category);
  191.         return $this->baseCitroenRender('@DcSite/Citroen/Car/catalog.html.twig', [
  192.             'category' => $category,
  193.             'catalog' => $catalog,
  194.             'catalogVehicle' => $catalogVehicle,
  195.             'catalogModelRangePages' => $pagesService->setLang($request->getLocale())->getPages($this->getDealer())
  196.         ]);
  197.     }
  198.     public function archive(): ?Response
  199.     {
  200.         $vehicles $this->vehicleRepository->getDisabled($this->getDealer());
  201.         $result = [];
  202.         foreach ($vehicles as $vehicle) {
  203.             $model $this->vehicleFactory->createByEntity($vehicle);
  204.             if (!$model) {
  205.                 continue;
  206.             }
  207.             $result[] = $model;
  208.         }
  209.         return $this->baseCitroenRender('@DcSite/Citroen/Car/archive.html.twig', ['cars' => $result]);
  210.     }
  211.     public function usedCarCatalog(Request $request): ?Response
  212.     {
  213.         $vehicles $this->usedVehicleService->getUsedVehicles(
  214.             $this->getDealer(),
  215.             DealerPathEnum::CITROEN,
  216.             $request->getLocale()
  217.         );
  218.         return $this->baseCitroenRender('@DcSite/Citroen/Car/used-car-catalog.html.twig', ['vehicles' => $vehicles]);
  219.     }
  220.     public function secondhandSingle(Request     $requestVehicleViewService $vehicleViewService,
  221.                                      CreditModel $creditModel$url): ?Response
  222.     {
  223.         if (!$url) {
  224.             throw new NotFoundHttpException();
  225.         }
  226.         /** @var AbstractVehicle $vehicle */
  227.         $vehicle $this->vehicleFactory->createUsedByUrl($url);
  228.         if (!$vehicle) {
  229.             throw new NotFoundHttpException();
  230.         }
  231.         $vehicleViewService->saveViewVehicle($vehicle$request->getClientIp(), new DateTime());
  232.         $viewedCars = [];
  233.         if (isset($_COOKIE['viewedCars'])) {
  234.             $viewedCars json_decode($_COOKIE['viewedCars']);
  235.             if (!in_array($vehicle->getVehicleId(), $viewedCars)) {
  236.                 $viewedCars[] = $vehicle->getVehicleId();
  237.             }
  238.         } else {
  239.             setcookie('viewedCars'json_encode([$vehicle->getVehicleId()]));
  240.         }
  241.         $viewedCarEntities $this->em->getRepository(Vehicle::class)
  242.             ->findBy(['id' => array_slice(array_reverse(array_diff($viewedCars, [$vehicle->getVehicleId()])), 03)]);
  243.         $viewedCarFactories = [];
  244.         foreach ($viewedCarEntities as $viewedCarEntity) {
  245.             $viewedCarFactory $this->vehicleFactory->createByEntity($viewedCarEntity);
  246.             $galleryItems null;
  247.             if ($viewedCarFactory->getGallery()) {
  248.                 $galleryItems $viewedCarFactory->getGallery()->getGalleryItems();
  249.             }
  250.             $image $galleryItems && $galleryItems->count()
  251.                 ? $galleryItems->first()->getMedia()
  252.                 : $viewedCarFactory->getPreview();
  253.             $viewedCarFactories[] = [
  254.                 'vehicle' => $viewedCarFactory,
  255.                 'image' => $this->mediaExtensionVidi->getPath($image'reference'),
  256.                 'link' => $this->router->generate('citroen_used_car_single', ['url' => $viewedCarFactory->getUrl()]),
  257.             ];
  258.         }
  259.         $galleryItems $vehicle->getGallery()->getGalleryItems();
  260.         $gallery_images = [];
  261.         if ($galleryItems->count()) {
  262.             foreach ($galleryItems as $galleryItem) {
  263.                 $gallery_images[] = $this->mediaExtensionVidi->getPath($galleryItem->getMedia(), 'reference');
  264.             }
  265.         }
  266.         $similarVehicles = [];
  267.         $similar $this->vehicleRepository->getSimilarVehicles($vehicletruefalsetrue);
  268.         foreach ($similar as $vehicleItem) {
  269.             $vehicleItemGallery $this
  270.                 ->vehicleFactory
  271.                 ->createByEntity($vehicleItem->getVariation()->getVehicle())
  272.                 ->getGallery()
  273.                 ->getGalleryItems();
  274.             $vehicleItemGalleryImages = [];
  275.             if ($vehicleItemGallery && $vehicleItemGallery->count()) {
  276.                 foreach ($vehicleItemGallery as $vehicleItemGallery_item) {
  277.                     $vehicleItemGalleryImages[] = $this
  278.                         ->mediaExtensionVidi
  279.                         ->getPath($vehicleItemGallery_item->getMedia(), 'reference');
  280.                 }
  281.             }
  282.             $similarVehicles[] = [
  283.                 'vehicle' => $this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle()),
  284.                 'creditPayment' => $creditModel->getMinPayment($this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle())),
  285.                 'link' => $this->router->generate('citroen_used_car_single', ['url' => $vehicle->getUrl()]),
  286.                 'gallery' => $vehicleItemGalleryImages
  287.             ];
  288.         }
  289.         $options $vehicle->getOptionsArray($request->getLocale());
  290.         return $this->baseCitroenRender('@DcSite/Citroen/Car/used-car-single.html.twig', [
  291.             'secondhand' => $vehicle,
  292.             'options' => $options,
  293.             'buyForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity(), nullnulltruenull$vehicle->getPrice())->createView(),
  294.             'consultationForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity())->createView(),
  295.             'gallary' => $gallery_images,
  296.             'creditPayment' => $creditModel->getMinPayment($vehicle),
  297.             'similarCars' => $similarVehicles,
  298.             'viewedCars' => $viewedCarFactories,
  299.             'structuredCarData' => $this->getCarStructuredDataCarUsed($request$vehicle)
  300.         ]);
  301.     }
  302. }