src/DcSiteBundle/Controller/Peugeot/CarController.php line 94

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