src/DcSiteBundle/Controller/Lexus/CarController.php line 289

Open in your IDE?
  1. <?php
  2. namespace DcSiteBundle\Controller\Lexus;
  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\Model\Vehicles\UsedVehicle;
  13. use CoreBundle\Services\MediaExtensionVidi;
  14. use DateTime;
  15. use DcSiteBundle\Enum\DealerPathEnum;
  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\JsonResponse;
  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. use Twig_Error_Loader;
  36. use Twig_Error_Runtime;
  37. use Twig_Error_Syntax;
  38. /**
  39.  * Class CarController
  40.  * @package DcSiteBundle\Controller\Lexus
  41.  */
  42. class CarController extends BaseController
  43. {
  44.     private CarInStockService $carInStockService;
  45.     private UsedVehicleService $usedVehicleService;
  46.     private CatalogService $catalogService;
  47.     public function __construct(CoreFormFactory $coreFormFactorySeoMetaTag $seoMetaTagRequestStack $requestStackRouterInterface $routerFormManager $formManagerEntityManagerInterface $emApiServer1C $apiServer1CSessionInterface $sessionFilesystem $filesystemMediaExtensionVidi $mediaExtensionVidiRepository $vehicleRepositoryVehicleFactory $vehicleFactoryEnvironment $twigCarInStockService $carInStockServiceUsedVehicleService $usedVehicleServiceCatalogService $catalogService)
  48.     {
  49.         $this->carInStockService $carInStockService;
  50.         $this->usedVehicleService $usedVehicleService;
  51.         $this->catalogService $catalogService;
  52.         parent::__construct($coreFormFactory$seoMetaTag$requestStack$router$formManager$em$apiServer1C$session$filesystem$mediaExtensionVidi$vehicleRepository$vehicleFactory$twig);
  53.     }
  54.     public function car(Request $requestVehicleService $vehicleServiceHistoryManager $historyManager$url): ?Response
  55.     {
  56.         $Dealer $this->getDealer();
  57.         $Vehicle $this->vehicleFactory->createByUrl($url$Dealer);
  58.         if (!$Vehicle) {
  59.             throw new NotFoundHttpException();
  60.         }
  61.         $VehicleEm $Vehicle->getVehicleEntity();
  62.         $vehicleColor $vehicleService->getVehicleColor($VehicleEm);
  63.         $carInStock $this->carInStockService->getCarInStockByModel($this->getDealer(), $request->getLocale(), $VehicleEm->getModel(), 4);
  64.         $vehicleFaqs $vehicleService->getVehicleFaqs($VehicleEm);
  65.         $historyManager->setUserCarHistory($this->getUser(), $Vehicle->getVehicleEntity());
  66.         $TdForm = new Forms();
  67.         $TdForm->setVehicle($Vehicle->getVehicleEntity());
  68.         $headerCars = [];
  69.         $vehicles $this->vehicleRepository->getNewByDealer($this->getDealer());
  70.         /** @var Vehicle $vehicle */
  71.         foreach ($vehicles as $vehicle) {
  72.             if (!$vehicle->getGroup()) {
  73.                 continue;
  74.             }
  75.             $carGroup $vehicle->getGroup();
  76.             if (!isset($headerCars[$carGroup->getId()])) {
  77.                 $headerCars[$carGroup->getId()] = [
  78.                     'id' => $carGroup->getId(),
  79.                     'title' => $carGroup->getTitle($request->getLocale()),
  80.                     'cars' => []
  81.                 ];
  82.             }
  83.             $headerCars[$carGroup->getId()]['cars'][] = [
  84.                 'title' => $vehicle->getModel()->getTitle(),
  85.                 'url' => $vehicle->getUrl(),
  86.                 'id' => $vehicle->getId(),
  87.             ];
  88.         }
  89.         $accessoryUrl explode(' '$Vehicle->getGroup()->getTitle($request->getLocale()));
  90.         $form $this->CoreFormFactory()
  91.             ->callMeForm(new Forms(), true);
  92.         $form->get('dealer')->setData($this->getDealer());
  93.         return $this->baseLexusRender('@DcSite/Lexus/Car/car-card.html.twig', [
  94.             'model' => $Vehicle,
  95.             'vehicleColor' => $vehicleColor,
  96.             'carInStock' => $carInStock,
  97.             'faqs' => $vehicleFaqs,
  98.             'headerCars' => $headerCars,
  99.             'buyForm' => $this->CoreFormFactory()->buyForm(null$Vehicle->getVehicleEntity(), nullnullfalsefalse$Vehicle->getPrice())->createView(),
  100.             'buyPartsForm' => $this->CoreFormFactory()->buyPartsForm($this->getDealer())->createView(),
  101.             'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), $TdForm)->createView(),
  102.             'structuredData' => $this->getCarPageStructuredData($request$Vehicle),
  103.             'accessoryUrl' => $accessoryUrl['0'],
  104.             'callMeForm' => $form->createView()
  105.         ]);
  106.     }
  107.     public function carConfiguraion(VehicleService $vehicleService$url): ?Response
  108.     {
  109.         $Dealer $this->getDealer();
  110.         $Vehicle $this->vehicleFactory->createByUrl($url$Dealer);
  111.         if (!$Vehicle) {
  112.             throw new NotFoundHttpException();
  113.         }
  114.         $VehicleEm $Vehicle->getVehicleEntity();
  115.         $vehiclePrice $vehicleService->getVehiclePrice($VehicleEm);
  116.         $vehicleEquipment $vehicleService->getVehicleEquipment($VehicleEm);
  117.         return $this->baseLexusRender('@DcSite/Lexus/Car/configuration.html.twig', [
  118.             'model' => $Vehicle,
  119.             'vehiclePrice' => $vehiclePrice,
  120.             'vehicleEquipment' => $vehicleEquipment,
  121.         ]);
  122.     }
  123.     public function loadCarByCategory(Request $request): JsonResponse
  124.     {
  125.         $id $request->get('id');
  126.         $vehicles $this->vehicleRepository->findByGroup($id$this->getDealer());
  127.         $result = [];
  128.         /** @var Vehicle $vehicle */
  129.         foreach ($vehicles as $vehicle) {
  130.             $carModel $this->vehicleFactory->createByEntity($vehicle);
  131.             if (!$carModel) {
  132.                 continue;
  133.             }
  134.             $result[] = [
  135.                 'id' => $carModel->getVehicleId(),
  136.                 'title' => $carModel->getModelName(),
  137.                 'price' => $carModel->price(),
  138.                 'img' => $this->mediaExtensionVidi->getPath($carModel->getPreview(), 'small'),
  139.             ];
  140.         }
  141.         return $this->json(['data' => $result]);
  142.     }
  143.     public function testDrive(): ?Response
  144.     {
  145.         return $this->baseLexusRender('@DcSite/Lexus/Car/test-drive.html.twig', [
  146.             'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), null, [
  147.                 'child' => false,
  148.                 'widthTime' => true,
  149.                 'communication' => true,
  150.             ])->createView(),
  151.         ]);
  152.     }
  153.     public function carCatalog(Request $requestPagesService $pagesServicestring $url null): ?Response
  154.     {
  155.         if ($url) {
  156.             $vehicleCategory $this->em->getRepository(Category::class)->findOneBy(['url' => $url]);
  157.             if (!$vehicleCategory) {
  158.                 throw new NotFoundHttpException();
  159.             }
  160.         }
  161.         $categories $this->catalogService->getCategoryVehicles($this->getDealer());
  162.         $catalogVehicleGroup $this->catalogService->getCatalogVehicleGroupByCategory($this->getDealer(), $url);
  163.         $searchKeyCategory array_search($urlarray_column($categories'url'));
  164.         $categoryNow = ($searchKeyCategory !== false) ? $categories[$searchKeyCategory] : null;
  165.         return $this->baseLexusRender('@DcSite/Lexus/Car/car-catalog.html.twig', [
  166.             'buyForm' => $this->CoreFormFactory()->buyForm(nullnullnull$this->getDealer())->createView(),
  167.             'category' => $categoryNow,
  168.             'categories' => $categories,
  169.             'vehicles' => $catalogVehicleGroup,
  170.             'catalogModelRangePages' => $pagesService->setLang($request->getLocale())->getPages($this->getDealer())
  171.         ]);
  172.     }
  173.     public function carCatalogPages(Request $requestPagesService $pagesServicestring $url): ?Response
  174.     {
  175.         $page $pagesService->setLang($request->getLocale())->getPage($this->getDealer(), $url);
  176.         if (empty($page)) {
  177.             throw new NotFoundHttpException();
  178.         }
  179.         return $this->baseLexusRender('@DcSite/Lexus/Car/car-catalog-page.html.twig', ['page' => $page]);
  180.     }
  181.     public function configurator(Request $request): ?Response
  182.     {
  183.         $url $request->get('url');
  184.         $Vehicle false;
  185.         if ($url != 'start') {
  186.             $Vehicle $this->vehicleFactory->createByUrl($url$this->getDealer());
  187.             if (!$Vehicle) {
  188.                 throw new NotFoundHttpException();
  189.             }
  190.         }
  191.         $hash $request->query->get('hash');
  192.         return $this->baseLexusRender('@DcSite/Lexus/Configurator/index.html.twig', [
  193.             'modelTitle' => $Vehicle $Vehicle->getModelName() : 0,
  194.             'carId' => $Vehicle $Vehicle->getVehicleId() : 0,
  195.             'baseType' => Program::BASE_COEFFICIENT_TYPE,
  196.             'listType' => Program::LIST_COEFFICIENT_TYPE,
  197.             'optionType' => Program::OPTION_COEFFICIENT_TYPE,
  198.             'hash' => $hash,
  199.         ]);
  200.     }
  201.     public function carStock(Request $request): ?Response
  202.     {
  203.         $vehicles $this->carInStockService->getCarInStockByDealer(
  204.             $this->getDealer(),
  205.             null,
  206.             $request->getLocale()
  207.         );
  208.         $this->carInStockService->sortVehicleByDealer($vehicles$this->getDealer()->getUniqueId());
  209.         return $this->baseLexusRender('@DcSite/Lexus/Car/car-in-stock.html.twig', ['vehicles' => $vehicles]);
  210.     }
  211.     public function actionsCar(): ?Response
  212.     {
  213.         $vehicles $this->vehicleRepository->getActionVehicleItems($this->getDealer());
  214.         $result = [];
  215.         foreach ($vehicles as $vehicle) {
  216.             $model $this->vehicleFactory->createByVehicleItem($vehicle);
  217.             if (!$model) {
  218.                 continue;
  219.             }
  220.             if (!isset($result[$model->getVehicleId()]) || $result[$model->getVehicleId()]->price() > $model->price()) {
  221.                 $result[$model->getVehicleId()] = $model;
  222.             }
  223.         }
  224.         return $this->baseLexusRender('@DcSite/Lexus/Car/actions-car.html.twig', [
  225.             'vehicles' => $result,
  226.         ]);
  227.     }
  228.     public function carStockSingle(Request $requestInStockVehicle $inStockVehicle$url)
  229.     {
  230.         $car $inStockVehicle->createByUrl($url$this->getDealer());
  231.         if (!$car) {
  232.             $car $inStockVehicle->createByUrl($url$this->getDealer(), false);
  233.             if ($car) {
  234.                 return $this->redirectToRoute('lexus_card_car', ['url' => $car->getVehicle()->getUrl()], 301);
  235.             } else {
  236.                 return $this->redirectToRoute('lexus_car_stock', [], 301);
  237.             }
  238.         }
  239.         $options $car->getOptions($request->getLocale());
  240.         $form $this->CoreFormFactory()
  241.             ->callMeForm(new Forms(), true);
  242.         $form->get('dealer')->setData($this->getDealer());
  243.         return $this->baseLexusRender('@DcSite/Lexus/Car/car-in-stock-single.html.twig', [
  244.             'model' => $car,
  245.             'buyInStockForm' => $this->CoreFormFactory()->buyInStockForm(null$car->getInStockEntity())->createView(),
  246.             'options' => $options,
  247.             'structuredCarData' => $this->getCarStructuredDataCarInStock($request$car),
  248.             'callMeForm' => $form->createView(),
  249.         ]);
  250.     }
  251.     public function usedCarCatalog(Request $request): Response
  252.     {
  253.         $vehicles $this->usedVehicleService->getUsedVehicles(
  254.             $this->getDealer(),
  255.             DealerPathEnum::Lexus,
  256.             $request->getLocale()
  257.         );
  258.         return $this->baseLexusRender('@DcSite/Lexus/Car/used-car-catalog.html.twig', ['vehicles' => $vehicles]);
  259.     }
  260.     public function secondhandSingle(Request $requestVehicleViewService $vehicleViewService$url): Response
  261.     {
  262.         if (!$url) {
  263.             throw new NotFoundHttpException();
  264.         }
  265.         $vehicle $this->usedVehicleService->getUsedVehicle($this->getDealer(), $this->getDealer()->getBrand(), $url);
  266.         if (!$vehicle) {
  267.             throw new NotFoundHttpException();
  268.         }
  269.         $vehicleViewService->saveViewVehicle($vehicle$request->getClientIp(), new DateTime());
  270.         $options $vehicle->getOptionsArray($request->getLocale());
  271.         return $this->baseLexusRender('@DcSite/Lexus/Car/used-car-single.html.twig', [
  272.             'secondhand' => $vehicle,
  273.             'options' => $options,
  274.             'buyForm' => $this->CoreFormFactory()->buyForm(null$vehicle->getVehicleEntity(), nullnulltruefalse$vehicle->getPrice())->createView(),
  275.             'structuredCarData' => $this->getCarStructuredDataCarUsed($request$vehicle)
  276.         ]);
  277.     }
  278.     public function archive(): ?Response
  279.     {
  280.         $vehicles $this->vehicleRepository->getDisabled($this->getDealer());
  281.         $result = [];
  282.         foreach ($vehicles as $vehicle) {
  283.             $model $this->vehicleFactory->createByEntity($vehicle);
  284.             if (!$model) {
  285.                 continue;
  286.             }
  287.             $result[] = $model;
  288.         }
  289.         return $this->baseLexusRender('@DcSite/Lexus/Car/archive.html.twig', ['cars' => $result]);
  290.     }
  291.     public function usedCars(Request $request): JsonResponse
  292.     {
  293.         $vehicles $this->vehicleRepository->getUsedByDealer($this->getDealer());
  294.         $usedCars = [];
  295.         /** @var UsedVehicle $limitedCar */
  296.         foreach ($vehicles as $vehicle) {
  297.             $vehicle $this->vehicleFactory->createByEntity($vehicle);
  298.             if (!$vehicle || $vehicle->getModel()->getId() != $request->request->get('modelId') || $vehicle->hasReserved()) {
  299.                 continue;
  300.             }
  301.             $galleryItems $vehicle->getGallery() ? $vehicle->getGallery()->getGalleryItems() : null;
  302.             $image $galleryItems && $galleryItems->count() ? $galleryItems->first()->getMedia() : $vehicle->getPreview();
  303.             $usedCars[] = [
  304.                 "id" => $vehicle->getVehicleId(),
  305.                 "name" => $vehicle->getModelName(),
  306.                 "price" => $vehicle->price(),
  307.                 "year" => $vehicle->getYear(),
  308.                 'mileage' => $vehicle->getMileage(),
  309.                 "url" => $this->router->generate('lexus_used_car_single', ['url' => $vehicle->getUrl()]),
  310.                 "image" => $this->mediaExtensionVidi->getPath($image'reference'),
  311.                 "body" => $vehicle->getBodyTypeName($request->getLocale()),
  312.                 "engine" => $vehicle->getFuelTypeName($request->getLocale()),
  313.                 "transmission" => $vehicle->getTransmissionTypeName($request->getLocale()),
  314.                 "drive" => $vehicle->getDriveUnitTypeName($request->getLocale()),
  315.                 "reserved" => $vehicle->hasReserved(),
  316.             ];
  317.         }
  318.         return new JsonResponse(['success' => true'usedCars' => $usedCars]);
  319.     }
  320. }