src/PortalBundle/Model/Catalog.php line 80

Open in your IDE?
  1. <?php
  2. namespace PortalBundle\Model;
  3. use Application\Sonata\MediaBundle\Entity\Media;
  4. use CoreBundle\Entity\Vehicles\CharacteristicValue;
  5. use CoreBundle\Entity\Vehicles\VariationCharacteristic;
  6. use CoreBundle\Entity\Dealer;
  7. use CoreBundle\Model\Vehicles\Characteristic;
  8. use DateTime;
  9. use CoreBundle\Entity\Brand;
  10. use CoreBundle\Entity\Model;
  11. use CoreBundle\Entity\Vehicles\ConfiguratorColor;
  12. use CoreBundle\Entity\Vehicles\InStock;
  13. use CoreBundle\Entity\Vehicles\RecommendGroup;
  14. use CoreBundle\Entity\Vehicles\Vehicle;
  15. use CoreBundle\Entity\Vehicles\VehicleItem;
  16. use CoreBundle\Factory\Vehicle as VehicleFactory;
  17. use CoreBundle\Factory\InStockVehicle as VehicleInStockFactory;
  18. use CoreBundle\Model\Vehicles\InStockRepository;
  19. use CoreBundle\Model\Vehicles\VehicleType;
  20. use CoreBundle\Services\MediaExtensionVidi;
  21. use DcSiteBundle\Controller\Unicommerce\MainController;
  22. use DcSiteBundle\Model\CreditModel;
  23. use Doctrine\ORM\EntityManagerInterface;
  24. use Doctrine\ORM\Query\Expr\Join;
  25. use PortalBundle\Enums\CatalogEnum;
  26. use PortalBundle\Services\VehicleService;
  27. use Symfony\Component\HttpFoundation\RequestStack;
  28. use Symfony\Component\Routing\RouterInterface;
  29. use Symfony\Contracts\Translation\TranslatorInterface;
  30. class Catalog
  31. {
  32.     const NOT_VIDI_SELECT_DEALERS = [467324314];
  33.     const PRE_PAGES 18;
  34.     private EntityManagerInterface $em;
  35.     private RouterInterface $router;
  36.     private MediaExtensionVidi $mediaExtension;
  37.     private VehicleFactory $vehicleFactory;
  38.     private TranslatorInterface $translator;
  39.     private RequestStack $requestStack;
  40.     private CreditModel $creditModel;
  41.     private InStockRepository $carInStockService;
  42.     private VehicleService $vehicleService;
  43.     private VehicleInStockFactory $vehicleInStockFactory;
  44.     public function __construct(
  45.         EntityManagerInterface       $em,
  46.         RouterInterface              $router,
  47.         MediaExtensionVidi  $mediaExtension,
  48.         TranslatorInterface $translator,
  49.         VehicleFactory      $vehicleFactory,
  50.         RequestStack        $requestStack,
  51.         CreditModel         $creditModel,
  52.         InStockRepository $inStockRepository,
  53.         VehicleService $vehicleService,
  54.         VehicleInStockFactory $vehicleInStockFactory
  55.     )
  56.     {
  57.         $this->em $em;
  58.         $this->router $router;
  59.         $this->mediaExtension $mediaExtension;
  60.         $this->translator $translator;
  61.         $this->vehicleFactory $vehicleFactory;
  62.         $this->requestStack $requestStack;
  63.         $this->creditModel $creditModel;
  64.         $this->inStockRepository $inStockRepository;
  65.         $this->vehicleService $vehicleService;
  66.         $this->vehicleInStockFactory $vehicleInStockFactory;
  67.     }
  68.     public function getVehicleByCatalog($user$findVehicles$routeParams$compareCookie)
  69.     {
  70.         $featuresIds $this->vehicleService->getFeatures($user);
  71.         $vehicleComparison explode(','$compareCookie);
  72.         $items = [];
  73.         foreach ($findVehicles as $item) {
  74.             $vehicle $this->vehicleFactory->createByVehicleItem($item[0]);
  75.             if (!$vehicle) {
  76.                 continue;
  77.             }
  78.             /** @var InStock $carInStock */
  79.             $carInStock $this->inStockRepository->getByVehicleId($vehicle->getVehicleId(), 1);
  80.             $carInStockImage = ($carInStock) ? $carInStock[0]->getPreview() : null;
  81.             $vehicleColors = [];
  82.             foreach ($vehicle->getColors() as $color) {
  83.                 if (!$color->getState()) {
  84.                     continue;
  85.                 }
  86.                 $imageVehicle $color->getGallery();
  87.                 if (!$imageVehicle) {
  88.                     continue;
  89.                 }
  90.                 $firstImageVehicle $imageVehicle->getGalleryItems()->first();
  91.                 if (!$firstImageVehicle) {
  92.                     continue;
  93.                 }
  94.                 $vehicleColors[$color->getId()] = [
  95.                     'imageColor' => $this->mediaExtension->getPath($color->getImage(), 'reference'),
  96.                     'imageWebpVehicle' => $this->mediaExtension->pathWebp($firstImageVehicle->getMedia(), 'reference'),
  97.                     'imageVehicle' => $this->mediaExtension->getPath($firstImageVehicle->getMedia(), 'reference'),
  98.                 ];
  99.             }
  100.             if ($carInStockImage) {
  101.                 $vehiclePictureSecond = [
  102.                     'img' => $this->mediaExtension->getPath($carInStockImage'reference'),
  103.                     'img_webp' => $this->mediaExtension->pathWebp($carInStockImage'reference'),
  104.                 ];
  105.             } elseif ($vehicle->getPreviewSecond()) {
  106.                 $vehiclePictureSecond = [
  107.                     'img' => $this->mediaExtension->getPath($vehicle->getPreviewSecond(), 'reference'),
  108.                     'img_webp' => $this->mediaExtension->pathWebp($vehicle->getPreviewSecond(), 'reference'),
  109.                 ];
  110.             } else {
  111.                 $vehiclePictureSecond = [
  112.                     'img' => $this->mediaExtension->getPath($vehicle->getPreview(), 'reference'),
  113.                     'img_webp' => $this->mediaExtension->pathWebp($vehicle->getPreview(), 'reference'),
  114.                 ];
  115.             }
  116.             $items[] = [
  117.                 'vehicleType' => VehicleType::getTypeDataById($vehicle->getVehicleType()),
  118.                 'creditPayment' => $this->creditModel->getMinPayment($vehicle),
  119.                 'vehicle' => $vehicle,
  120.                 'featuredId' => $featuresIds[$vehicle->getVehicleItemId()] ?? null,
  121.                 'comparedId' => in_array($vehicle->getVehicleItemId(), $vehicleComparison) ? $vehicle->getVehicleItemId() : null,
  122.                 'dealer' => $vehicle->getDealer()->getId(),
  123.                 'vehiclePrice' => $item['price'],
  124.                 'vehicleColors' => $vehicleColors,
  125.                 'vehiclePicture' => [
  126.                     'img' => $this->mediaExtension->getPath($vehicle->getPreview(), 'reference'),
  127.                     'img_webp' => $this->mediaExtension->pathWebp($vehicle->getPreview(), 'reference'),
  128.                 ],
  129.                 'vehiclePictureSecond' => $vehiclePictureSecond,
  130.                 'hasNds' => $routeParams['state'] === CatalogEnum::CATALOG_USED $vehicle->getHasNds() : false,
  131.                 'isSelect' =>
  132.                     $routeParams['state'] === CatalogEnum::CATALOG_USED &&
  133.                     !in_array($vehicle->getDealer()->getId(), Catalog::NOT_VIDI_SELECT_DEALERS),
  134.             ];
  135.         }
  136.         return $items;
  137.     }
  138.     public function getVehicleByCatalogForSitemap($routeParams)
  139.     {
  140.         $findVehicles $this->findByParams($routeParams, [], 9999);
  141.         if(!$findVehicles['data']){
  142.            return false;
  143.         }
  144.         $items = [];
  145.         foreach ($findVehicles['data'] as $item) {
  146.             $vehicle $this->vehicleFactory->createByVehicleItem($item[0]);
  147.             if (!$vehicle) {
  148.                 continue;
  149.             }
  150.             $items[] = $vehicle;
  151.         }
  152.         return $items;
  153.     }
  154.     public function getInStockVehicleByCatalog($user$inStockVehicle)
  155.     {
  156.         $request $this->requestStack->getCurrentRequest();
  157.         $vehicle $inStockVehicle->getVehicle();
  158.         $vehicleFactory $this->vehicleFactory->createByEntity($vehicle);
  159.         $featuresIds $this->vehicleService->getFeatures($user);
  160.         $compareCookie $request->cookies->get('compare');
  161.         $vehicleComparison explode(','$compareCookie);
  162.         $item = [
  163.             'vehicleType' => VehicleType::getTypeDataById($vehicle->getVehicleType()),
  164.             'creditPayment' => $this->creditModel->getMinPayment($vehicleFactory),
  165.             'vehicle' => $inStockVehicle,
  166.             'featuredId' =>  $featuresIds[$vehicleFactory->getVehicleItemId()] ?? null,
  167.             'comparedId' =>  in_array($vehicleFactory->getVehicleItemId(), $vehicleComparison) ? $vehicleFactory->getVehicleItemId() : null,
  168.             'vehiclePrice' => '',
  169.             'vehicleColors' => '',
  170.             'vehiclePicture' => [
  171.                 'img' => $this->mediaExtension->getPath($inStockVehicle->getPreview(), 'reference'),
  172.                 'img_webp' => $this->mediaExtension->pathWebp($inStockVehicle->getPreview(), 'reference'),
  173.             ],
  174.             'vehiclePictureSecond' => [
  175.                 'img' => $this->mediaExtension->getPath($inStockVehicle->getPreview(), 'reference'),
  176.                 'img_webp' => $this->mediaExtension->pathWebp($inStockVehicle->getPreview(), 'reference'),
  177.             ],
  178.             'hasNds' =>  $inStockVehicle->getHasNds(),
  179.             'isSelect' => !in_array($vehicle->getDealer()->getId(), Catalog::NOT_VIDI_SELECT_DEALERS),
  180.             'isStock' => true,
  181.             'isUsed' => false
  182.         ];
  183.         return $item;
  184.     }
  185.     public function getCatalogNav($type$state$hasCredit$brand$param$value$group null)
  186.     {
  187.         $request $this->requestStack->getCurrentRequest();
  188.         $route $request->get('_route');
  189.         $catalogNav = [];
  190.         if (in_array($route, [CatalogEnum::ROUTE_PORTAL_CATALOGCatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG])) {
  191.             $catalogNav $this->getVehicleTypeBodyPrice($state$type$hasCredit'BT');
  192.         }
  193.         if (in_array($route, [CatalogEnum::ROUTE_PORTAL_CATALOG_PARAMCatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_PARAM])) {
  194.             $catalogNav $this->getVehicleBrandPrice($state$type$hasCredit$param$value);
  195.         }
  196.         if ($route == CatalogEnum::ROUTE_PORTAL_CATALOG_GROUPS) {
  197.             $catalogNav $this->getVehicleTypeBodyPrice($state$type$hasCredit,'BT'$group);
  198.         }
  199.         if ($route == CatalogEnum::ROUTE_PORTAL_CATALOG_PARAM) {
  200.             $catalogNav $this->getVehicleBrandPrice($state$type$hasCredit$param$value);
  201.         }
  202.         if (in_array($route, [CatalogEnum::ROUTE_PORTAL_CATALOG_BRAMD_BODY_TYPECatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_BRAMD_BODY_TYPE])) {
  203.             $catalogNav $this->getVehicleModelPrice($state$type$hasCredit$brand$param$value);
  204.         }
  205.         if (in_array($route, [CatalogEnum::ROUTE_PORTAL_CATALOG_B_NAMECatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_B_NAME])) {
  206.             $catalogNav $this->getVehicleModelPriceWithoutParam($state$type$hasCredit$brand);
  207.         }
  208.         return $catalogNav;
  209.     }
  210.     public function getCatalogNavByGetParams($type$state$hasCredit$brand$searchParams$value)
  211.     {
  212.         $request $this->requestStack->getCurrentRequest();
  213.         $route $request->get('_route');
  214.         $catalogNav = [];
  215.         if ($route == CatalogEnum::ROUTE_PORTAL_CATALOG || $route == CatalogEnum::ROUTE_PORTAL_CATALOG_FILTER) {
  216.             if (!isset($searchParams['dynamic']) && !isset($searchParams['m-brand'])) {
  217.                 $catalogNav $this->getVehicleTypeBodyPrice($state$type$hasCredit'BT');
  218.             }
  219.             if (isset($searchParams['dynamic']) && !isset($searchParams['m-brand'])) {
  220.                 $param array_key_first($searchParams['dynamic']);
  221.                 $value array_key_first($searchParams['dynamic'][$param]);
  222.                 $catalogNav $this->getVehicleBrandPrice($state$type$hasCredit$param$value);
  223.             }
  224.             if (isset($searchParams['dynamic']) && isset($searchParams['m-brand'])) {
  225.                 $param array_key_first($searchParams['dynamic']);
  226.                 $value array_key_first($searchParams['dynamic'][$param]);
  227.                 $brand array_key_first($searchParams['m-brand']);
  228.                 $catalogNav $this->getVehicleModelPrice($state$type$hasCredit$brand$param$value);
  229.             }
  230.             if (!isset($searchParams['dynamic']) && isset($searchParams['m-brand'])) {
  231.                 $brand array_key_first($searchParams['m-brand']);
  232.                 $catalogNav $this->getVehicleModelPrice($state$type$hasCredit$brand''''$searchParams);
  233.             }
  234.             if (!isset($searchParams['dynamic']) && !isset($searchParams['m-model']) && isset($searchParams['m-brand'])) {
  235.                 $catalogNav $this->getVehicleModelPriceWithoutParam($state$type$hasCredit$brand);
  236.             }
  237.         }
  238.         return $catalogNav;
  239.     }
  240.     public function getStockCatalogNav($type$state$brand$searchParams$value)
  241.     {
  242.         $request $this->requestStack->getCurrentRequest();
  243.         $route $request->get('_route');
  244.         $catalogNav = [];
  245.         if ($route == CatalogEnum::ROUTE_PORTAL_CATALOG_STOCK || $route == CatalogEnum::ROUTE_PORTAL_CATALOG_FILTER_STOCK) {
  246.             if (!isset($searchParams['dynamic']) && !isset($searchParams['m-brand'])) {
  247.                 $catalogNav $this->getStockTypeBodyPrice($state$type'BT');
  248.             }
  249.             if (isset($searchParams['dynamic']) && !isset($searchParams['m-brand'])) {
  250.                 $param array_key_first($searchParams['dynamic']);
  251.                 $value array_key_first($searchParams['dynamic'][$param]);
  252.                 $catalogNav $this->getStockVehicleBrandPrice($state$type$param$value$searchParams);
  253.             }
  254.             if (isset($searchParams['dynamic']) && isset($searchParams['m-brand'])) {
  255.                 $param array_key_first($searchParams['dynamic']);
  256.                 $value array_key_first($searchParams['dynamic'][$param]);
  257.                 $brand array_key_first($searchParams['m-brand']);
  258.                 $catalogNav $this->getStockVehicleModelPrice($state$type$brand$param$value$searchParams);
  259.             }
  260.             if (!isset($searchParams['dynamic']) && isset($searchParams['m-brand'])) {
  261.                 $brand array_key_first($searchParams['m-brand']);
  262.                 $catalogNav $this->getStockVehicleModelPrice($state$type$brand''''$searchParams);
  263.             }
  264.             if (!isset($searchParams['dynamic']) && !isset($searchParams['m-model']) && isset($searchParams['m-brand'])) {
  265.                 $catalogNav $this->getStockVehicleModelPriceWithoutParam($state$typearray_key_first($searchParams['m-brand']));
  266.             }
  267.         }
  268.         return $catalogNav;
  269.     }
  270.     public function getVehicleBrandPrice($state$type$hasCredit$param$value)
  271.     {
  272.         $isUsed $state == 'new' 1;
  273.         $vehicleType VehicleType::getTypeDataByUrl($type);
  274.         $query $this->em->getRepository(VehicleItem::class)->createQueryBuilder('vi')
  275.             ->select(
  276.                         'b.id as brand_id',
  277.                         'COUNT(ve.id) as vehicle_count',
  278.                         'MIN(
  279.                     CASE
  280.                         WHEN
  281.                             (ve.is_used = 0)
  282.                         THEN
  283.                             CASE
  284.                                 WHEN vi.alt_price > 0 THEN vi.alt_price
  285.                                 WHEN vi.alt_rate > 0 THEN vi.alt_rate * vi.price
  286.                                 ELSE vi.price * d.rate
  287.                             END
  288.                         ELSE
  289.                             CASE
  290.                                 WHEN vi.alt_price > 0 THEN vi.alt_price
  291.                                 ELSE vi.price
  292.                             END
  293.                     END
  294.                 ) AS min_price'
  295.             );
  296.         $query->innerJoin('vi.vehicle''ve'Join::WITH've.vehicle_type = :vehicleType')->setParameter('vehicleType'$vehicleType['id'])
  297.             ->innerJoin('ve.dealer''d')
  298.             ->innerJoin('ve.model''m')
  299.             ->innerJoin('m.brand''b')
  300.             ->innerJoin('vi.variation''va')
  301.             ->innerJoin('va.characteristics''vch')
  302.             ->innerJoin('vch.characteristic''ch')
  303.             ->innerJoin('vch.characteristic_value''chv')
  304.             ->andWhere("ch.id = :param")
  305.             ->andWhere('chv.url = :url')
  306.             ->andWhere('vi.sold != 1')
  307.             ->setParameter('param'$param)
  308.             ->setParameter('url'$value)
  309.             ->andWhere('ve.state = 1')
  310.             ->andWhere('vi.sold != 1')
  311.             ->andWhere('ve.is_not_filled = 0')
  312.             ->andWhere('ve.is_delete != 1')
  313.             ->andWhere('ve.is_used = :isUsed')
  314.             ->setParameter('isUsed'$isUsed);
  315.         if ($hasCredit) {
  316.             $query->andWhere('ve.credit_available = :hasCredit')
  317.                 ->setParameter('hasCredit'$hasCredit);
  318.         }
  319.         $query->groupBy('brand_id');
  320.         $vehicleItems $query->getQuery()->getResult();
  321.         $brands_id array_column($vehicleItems'brand_id');
  322.         $query $this->em->getRepository(Brand::class)->createQueryBuilder('b')
  323.             ->where('b.id in (:brands)')->setParameter('brands'$brands_id);
  324.         $brands $query->getQuery()->getResult();
  325.         if ($hasCredit) {
  326.             $nameRoute CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_BRAMD_BODY_TYPE;
  327.         } else {
  328.             $nameRoute CatalogEnum::ROUTE_PORTAL_CATALOG_BRAMD_BODY_TYPE;
  329.         }
  330.         /** @var Brand $brand */
  331.         foreach ($brands as $brand) {
  332.             $key array_search($brand->getId(), array_column($vehicleItems'brand_id'));
  333.             $vehicleItems[$key]['brand'] = $brand;
  334.             $vehicleItems[$key]['url'] = $this->router->generate($nameRoute, ['state' => $state'type' => $vehicleType['url'], 'brand' => $brand->getUrl(), 'param' => $param'value' => $value]);
  335.         }
  336.         return $vehicleItems;
  337.     }
  338.     public function getStockVehicleBrandPrice($state$type$param$value$searchParams)
  339.     {
  340.         $vehicleType VehicleType::getTypeDataByUrl($type);
  341.         $query $this->em->getRepository(VehicleItem::class)->createQueryBuilder('vi')
  342.             ->select('b.id as brand_id','COUNT(ve.id) as vehicle_count','MIN(
  343.                                                                                     CASE
  344.                                                                                         WHEN cis.action_price > 0 THEN cis.action_price
  345.                                                                                         WHEN cis.action_price_usd > 0 THEN
  346.                                                                                             CASE
  347.                                                                                                 WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  348.                                                                                                 ELSE cis.action_price_usd * d.rate
  349.                                                                                             END
  350.                                                                                         WHEN vi.alt_price > 0 THEN vi.alt_price
  351.                                                                                         ELSE
  352.                                                                                             CASE
  353.                                                                                                 WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  354.                                                                                                 ELSE vi.price * d.rate
  355.                                                                                             END
  356.                                                                                         END + COALESCE(cis.add_cost, 0)
  357.                                                                                  )  AS min_price');
  358. //            ->select('b.id as brand_id', 'COUNT(ve.id) as vehicle_count', 'MIN(case when (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) = 0 then 9999999999 else (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) end) as min_price');
  359.         $query->innerJoin('vi.vehicle''ve'Join::WITH've.vehicle_type = :vehicleType')->setParameter('vehicleType'$vehicleType['id'])
  360.             ->innerJoin('ve.dealer''d')
  361.             ->innerJoin('ve.model''m')
  362.             ->innerJoin('m.brand''b')
  363.             ->innerJoin('vi.variation''va')
  364.             ->innerJoin('va.characteristics''vch')
  365.             ->innerJoin('vch.characteristic''ch')
  366.             ->innerJoin('vch.characteristic_value''chv')
  367.             ->leftJoin('vi.vehicleInStock''cis')
  368.             ->andWhere("ch.id = :param")
  369.             ->andWhere('chv.url = :url')
  370.             ->setParameter('param'$param)
  371.             ->setParameter('url'$value)
  372.             ->andWhere('ve.state = 1')
  373.             ->andWhere('cis.state = 1')
  374.             ->andWhere('ve.is_not_filled = 0')
  375.             ->andWhere('ve.is_delete != 1')
  376.             ->andWhere('cis.is_delete != 1')
  377.             ->andWhere('ve.is_used = 0')
  378.             ->groupBy('brand_id');
  379.         $vehicleItems $query->getQuery()->getResult();
  380.         $brands_id array_column($vehicleItems'brand_id');
  381.         $query $this->em->getRepository(Brand::class)->createQueryBuilder('b')
  382.             ->where('b.id in (:brands)')->setParameter('brands'$brands_id);
  383.         $brands $query->getQuery()->getResult();
  384.         /** @var Brand $brand */
  385.         foreach ($brands as $brand) {
  386.             $key array_search($brand->getId(), array_column($vehicleItems'brand_id'));
  387.             $vehicleItems[$key]['brand'] = $brand;
  388.             $vehicleItems[$key]['url'] = $this->router->generate(CatalogEnum::ROUTE_PORTAL_CATALOG_FILTER_STOCKarray_merge($searchParams,['state' => $state'type' => $vehicleType['url'], 'm-brand' => [$brand->getUrl() => true]]));
  389.         }
  390.         return $vehicleItems;
  391.     }
  392.     public function getVehicleModelPriceWithoutParam($state$type$hasCredit$brandUrl)
  393.     {
  394.         $vehicleType VehicleType::getTypeDataByUrl($type);
  395.         $isUsed $state == 'new' 1;
  396.         $query $this->em->getRepository(VehicleItem::class)->createQueryBuilder('vi')
  397.             ->select(
  398.                 'm.id AS model_id',
  399.                 'COUNT(DISTINCT vi.id) AS vehicle_count',
  400.                 'MIN(CASE
  401.                 WHEN (ve.is_used = 0) THEN
  402.                     CASE
  403.                         WHEN vi.alt_price > 0 THEN vi.alt_price
  404.                         ELSE
  405.                             CASE
  406.                                 WHEN vi.alt_rate > 0 THEN vi.alt_rate * vi.price
  407.                                 ELSE vi.price * d.rate
  408.                             END
  409.                     END
  410.                 ELSE
  411.                     CASE
  412.                         WHEN vi.alt_price > 0 THEN vi.alt_price
  413.                         ELSE vi.price
  414.                     END
  415.             END) AS min_price'
  416.             )
  417.             ->innerJoin('vi.vehicle''ve'Join::WITH've.vehicle_type = :vehicleType')
  418.             ->setParameter('vehicleType'$vehicleType['id'])
  419.             ->innerJoin('ve.dealer''d')
  420.             ->innerJoin('ve.model''m'Join::WITH'm.url IS NOT NULL')
  421.             ->innerJoin('m.brand''b'Join::WITH'b.url = :brandUrl')
  422.             ->setParameter('brandUrl'$brandUrl)
  423.             ->innerJoin('vi.variation''va')
  424.             ->innerJoin('va.characteristics''vch')
  425.             ->innerJoin('vch.characteristic''ch')
  426.             ->innerJoin('vch.characteristic_value''chv')
  427.             ->andWhere('vi.state = 1')
  428.             ->andWhere('ve.state = 1')
  429.             ->andWhere('ve.is_not_filled = 0')
  430.             ->andWhere('ve.is_delete != 1')
  431.             ->andWhere('ve.is_used = :isUsed')
  432.             ->andWhere('vi.sold != 1')
  433.             ->setParameter('isUsed'$isUsed);
  434.         if ($hasCredit) {
  435.             $query->andWhere('ve.credit_available = :hasCredit')
  436.                 ->setParameter('hasCredit'$hasCredit);
  437.         }
  438.         $query->groupBy('m.id');
  439.         $vehicleItems $query->getQuery()->getResult();
  440.         $models_id array_column($vehicleItems'model_id');
  441.         $query $this->em->getRepository(Model::class)->createQueryBuilder('m')
  442.             ->where('m.id in (:models)')->setParameter('models'$models_id);
  443.         $models $query->getQuery()->getResult();
  444.         if ($hasCredit) {
  445.             $nameRoute CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_BM_NAME;
  446.         } else {
  447.             $nameRoute CatalogEnum::ROUTE_PORTAL_CATALOG_BM_NAME;
  448.         }
  449.         /** @var Model $model */
  450.         foreach ($models as $model) {
  451.             $key array_search($model->getId(), array_column($vehicleItems'model_id'));
  452.             $vehicleItems[$key]['model'] = $model;
  453.             $vehicleItems[$key]['url'] = $this->router->generate($nameRoute, [
  454.                 'state' => $state,
  455.                 'type' => $vehicleType['url'],
  456.                 'brand' => $brandUrl,
  457.                 'model' => $model->getUrl()]);
  458.         }
  459.         return $vehicleItems;
  460.     }
  461.     public function getStockVehicleModelPriceWithoutParam($state$type$brandUrl)
  462.     {
  463.         $vehicleType VehicleType::getTypeDataByUrl($type);
  464.         $query $this->em->getRepository(VehicleItem::class)->createQueryBuilder('vi')
  465.             ->select('m.id as model_id''COUNT(ve.id) as vehicle_count''MIN(
  466.                                                                                     CASE
  467.                                                                                         WHEN cis.action_price > 0 THEN cis.action_price
  468.                                                                                         WHEN cis.action_price_usd > 0 THEN
  469.                                                                                             CASE
  470.                                                                                                 WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  471.                                                                                                 ELSE cis.action_price_usd * d.rate
  472.                                                                                             END
  473.                                                                                         WHEN vi.alt_price > 0 THEN vi.alt_price
  474.                                                                                         ELSE
  475.                                                                                             CASE
  476.                                                                                                 WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  477.                                                                                                 ELSE vi.price * d.rate
  478.                                                                                             END
  479.                                                                                         END + COALESCE(cis.add_cost, 0)
  480.                                                                                  )  AS min_price')
  481.             ->innerJoin('vi.vehicle''ve'Join::WITH've.vehicle_type = :vehicleType')->setParameter('vehicleType'$vehicleType['id'])
  482.             ->innerJoin('ve.dealer''d')
  483.             ->innerJoin('ve.model''m'Join::WITH'm.url IS NOT NULL')
  484.             ->innerJoin('m.brand''b'Join::WITH'b.url = :brandUrl')->setParameter('brandUrl'$brandUrl)
  485.             ->innerJoin('vi.variation''va')
  486.             ->innerJoin('va.characteristics''vch')
  487.             ->innerJoin('vch.characteristic''ch')
  488.             ->innerJoin('vch.characteristic_value''chv')
  489.             ->innerJoin('vi.vehicleInStock''cis')
  490.             ->andWhere('vi.state = 1')
  491.             ->andWhere('cis.state = 1')
  492.             ->andWhere('ve.state = 1')
  493.             ->andWhere('ve.is_not_filled = 0')
  494.             ->andWhere('ve.is_delete != 1')
  495.             ->andWhere('cis.is_delete != 1')
  496.             ->andWhere('ve.is_used = 0')
  497.             ->groupBy('m.id');
  498.         $vehicleItems $query->getQuery()->getResult();
  499.         $models_id array_column($vehicleItems'model_id');
  500.         $query $this->em->getRepository(Model::class)->createQueryBuilder('m')
  501.             ->where('m.id in (:models)')->setParameter('models'$models_id);
  502.         $models $query->getQuery()->getResult();
  503.         /** @var Model $model */
  504.         foreach ($models as $model) {
  505.             $key array_search($model->getId(), array_column($vehicleItems'model_id'));
  506.             $vehicleItems[$key]['model'] = $model;
  507.             $vehicleItems[$key]['url'] = $this->router->generate(CatalogEnum::ROUTE_PORTAL_CATALOG_FILTER_STOCK, ['state' => $state'type' => $vehicleType['url'], 'm-brand' => [$brandUrl => true], 'm-model' => [$model->getUrl() => true]]);
  508.         }
  509.         return $vehicleItems;
  510.     }
  511.     public function getVehicleModelPrice($state$type$hasCredit$brandUrl$param$value)
  512.     {
  513.         $isUsed $state == 'used' 0;
  514.         $vehicleType VehicleType::getTypeDataByUrl($type);
  515.         $query $this->em->getRepository(VehicleItem::class)->createQueryBuilder('vi')
  516.             ->select(
  517.                 'm.id AS model_id',
  518.                 'COUNT(DISTINCT ve.id) AS vehicle_count',
  519.                 'MIN(CASE
  520.                 WHEN (ve.is_used = 0) THEN
  521.                     CASE
  522.                         WHEN vi.alt_price > 0 THEN vi.alt_price
  523.                         ELSE
  524.                             CASE
  525.                                 WHEN vi.alt_rate > 0 THEN vi.alt_rate * vi.price
  526.                                 ELSE vi.price * d.rate
  527.                             END
  528.                     END
  529.                 ELSE
  530.                     CASE
  531.                         WHEN vi.alt_price > 0 THEN vi.alt_price
  532.                         ELSE vi.price
  533.                     END
  534.             END) AS min_price'
  535.             );
  536.         $query->innerJoin('vi.vehicle''ve'Join::WITH've.vehicle_type = :vehicleType')->setParameter('vehicleType'$vehicleType['id'])
  537.             ->innerJoin('ve.dealer''d')
  538.             ->innerJoin('ve.model''m'Join::WITH'm.url IS NOT NULL')
  539.             ->innerJoin('m.brand''b'Join::WITH'b.url = :brandUrl')->setParameter('brandUrl'$brandUrl)
  540.             ->innerJoin('vi.variation''va')
  541.             ->innerJoin('va.characteristics''vch')
  542.             ->innerJoin('vch.characteristic''ch')
  543.             ->innerJoin('vch.characteristic_value''chv')
  544.             ->andWhere("ch.id = :param")
  545.             ->andWhere('chv.url = :url')
  546.             ->setParameter('param'$param)
  547.             ->setParameter('url'$value)
  548.             ->andWhere('vi.state = 1')
  549.             ->andWhere('vi.sold != 1')
  550.             ->andWhere('ve.is_used = :is_used')
  551.             ->setParameter('is_used'$isUsed)
  552.             ->andWhere('ve.state = 1')
  553.             ->andWhere('ve.is_not_filled = 0')
  554.             ->andWhere('ve.is_delete != 1');
  555.         if ($hasCredit) {
  556.             $query->andWhere('ve.credit_available = :hasCredit')
  557.                 ->setParameter('hasCredit'$hasCredit);
  558.         }
  559.         $query->groupBy('model_id');
  560.         $vehicleItems $query->getQuery()->getResult();
  561.         $models_id array_column($vehicleItems'model_id');
  562.         $query $this->em->getRepository(Model::class)->createQueryBuilder('m')
  563.             ->where('m.id in (:models)')->setParameter('models'$models_id);
  564.         $models $query->getQuery()->getResult();
  565.         if ($hasCredit) {
  566.             $nameRoute CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_BM_NAME;
  567.         } else {
  568.             $nameRoute CatalogEnum::ROUTE_PORTAL_CATALOG_BM_NAME;
  569.         }
  570.         /** @var Model $model */
  571.         foreach ($models as $model) {
  572.             $key array_search($model->getId(), array_column($vehicleItems'model_id'));
  573.             $vehicleItems[$key]['model'] = $model;
  574.             $vehicleItems[$key]['url'] = $this->router->generate($nameRoute, ['state' => $state'type' => $vehicleType['url'], 'brand' => $brandUrl'model' => $model->getUrl()]);
  575.         }
  576.         return $vehicleItems;
  577.     }
  578.     public function getStockVehicleModelPrice($state$type$brandUrl$param$value$searchParams)
  579.     {
  580.         $vehicleType VehicleType::getTypeDataByUrl($type);
  581.         $query $this->em->getRepository(VehicleItem::class)->createQueryBuilder('vi')
  582.             ->select('m.id as model_id''COUNT(ve.id) as vehicle_count''MIN(
  583.                                                                                     CASE
  584.                                                                                         WHEN cis.action_price > 0 THEN cis.action_price
  585.                                                                                         WHEN cis.action_price_usd > 0 THEN
  586.                                                                                             CASE
  587.                                                                                                 WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  588.                                                                                                 ELSE cis.action_price_usd * d.rate
  589.                                                                                             END
  590.                                                                                         WHEN vi.alt_price > 0 THEN vi.alt_price
  591.                                                                                         ELSE
  592.                                                                                             CASE
  593.                                                                                                 WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  594.                                                                                                 ELSE vi.price * d.rate
  595.                                                                                             END
  596.                                                                                         END + COALESCE(cis.add_cost, 0)
  597.                                                                                  )  AS min_price');
  598.         $query->innerJoin('vi.vehicle''ve'Join::WITH've.vehicle_type = :vehicleType')->setParameter('vehicleType'$vehicleType['id'])
  599.             ->innerJoin('ve.dealer''d')
  600.             ->innerJoin('ve.model''m'Join::WITH'm.url IS NOT NULL')
  601.             ->innerJoin('m.brand''b'Join::WITH'b.url = :brandUrl')->setParameter('brandUrl'$brandUrl)
  602.             ->innerJoin('vi.variation''va')
  603.             ->innerJoin('va.characteristics''vch')
  604.             ->innerJoin('vch.characteristic''ch')
  605.             ->innerJoin('vch.characteristic_value''chv')
  606.             ->innerJoin('vi.vehicleInStock''cis')
  607.             ->andWhere("ch.id = :param")
  608.             ->andWhere('chv.url = :url')
  609.             ->setParameter('param'$param)
  610.             ->setParameter('url'$value)
  611.             ->andWhere('vi.state = 1')
  612.             ->andWhere('cis.state = 1')
  613.             ->andWhere('ve.is_used = 0')
  614.             ->andWhere('ve.state = 1')
  615.             ->andWhere('ve.is_not_filled = 0')
  616.             ->andWhere('cis.is_delete != 1')
  617.             ->andWhere('ve.is_delete != 1')
  618.             ->groupBy('model_id');
  619.         $vehicleItems $query->getQuery()->getResult();
  620.         $models_id array_column($vehicleItems'model_id');
  621.         $query $this->em->getRepository(Model::class)->createQueryBuilder('m')
  622.             ->where('m.id in (:models)')->setParameter('models'$models_id);
  623.         $models $query->getQuery()->getResult();
  624.         /** @var Model $model */
  625.         foreach ($models as $model) {
  626.             $key array_search($model->getId(), array_column($vehicleItems'model_id'));
  627.             $vehicleItems[$key]['model'] = $model;
  628.             $vehicleItems[$key]['url'] = $this->router->generate(CatalogEnum::ROUTE_PORTAL_CATALOG_FILTER_STOCKarray_merge($searchParams, ['state' => $state'type' => $vehicleType['url'], 'm-model' => [$model->getUrl() => true]]));
  629.         }
  630.         return $vehicleItems;
  631.     }
  632.     public function getVehicleTypeBodyPrice($state$type$hasCredit$modelUnique$group null)
  633.     {
  634.         $vehicleType VehicleType::getTypeDataByUrl($type);
  635.         $request $this->requestStack->getCurrentRequest();
  636.         $query $this->em->getRepository(VehicleItem::class)->createQueryBuilder('vi')
  637.             ->select('vcv.url''vc.id as characteristic_id''MIN(case when (case when (ve.is_used = 0 OR (d.id != 6 AND ve.vehicle_type != 4)) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) = 0 then 9999999999 else (case when (ve.is_used = 0 OR (d.id != 6 AND ve.vehicle_type != 4)) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) end) as min_price');
  638.         if ($request->getLocale() == 'ru') {
  639.             $query->addSelect('vcv.value_ru as title');
  640.         } else {
  641.             $query->addSelect('vcv.value_ua as title');
  642.         }
  643.         $query->innerJoin('vi.vehicle''ve'Join::WITH've.vehicle_type = :vehicleType')->setParameter('vehicleType'$vehicleType['id'])
  644.             ->innerJoin('ve.dealer''d')
  645.             ->innerJoin('vi.variation''v')
  646.             ->innerJoin('v.characteristics''vrc')
  647.             ->innerJoin('vrc.characteristic''vc'Join::WITH'vc.model_unique = :modelUnique AND vc.vehicle_type = :vehicleType')
  648.             ->setParameter('modelUnique'$modelUnique)
  649.             ->setParameter('vehicleType'$vehicleType['id'])
  650.             ->leftJoin('ve.recommend_group''rg')
  651.             ->innerJoin('vrc.characteristic_value''vcv');
  652.         if ($group){
  653.             $query->andWhere('rg.url = :group')
  654.                 ->setParameter('group'$group);
  655.         }
  656.         if ($state === CatalogEnum::CATALOG_USED) {
  657.             $query->andWhere('ve.is_used = 1');
  658.         } else {
  659.             $query->andWhere('ve.is_used = 0');
  660.         }
  661.         if ($hasCredit) {
  662.             $query->andWhere('ve.credit_available = :hasCredit')
  663.                 ->setParameter('hasCredit'$hasCredit);
  664.         }
  665.         $query->andWhere('vi.state = 1')
  666.             ->andWhere('ve.state = 1')
  667.             ->andWhere('vi.sold != 1')
  668.             ->andWhere('ve.is_not_filled = 0')
  669.             ->andWhere('ve.is_delete != 1')
  670.             ->andWhere('vcv.is_action = 1')
  671.             ->orderBy('vcv.position')
  672.             ->groupBy('title''vcv.url''characteristic_id''vcv.position');
  673.         $vehicleTypeBody $query->getQuery()->getArrayResult();
  674.         if ($hasCredit) {
  675.             $nameRoute CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_PARAM;
  676.         } else {
  677.             $nameRoute CatalogEnum::ROUTE_PORTAL_CATALOG_PARAM;
  678.         }
  679.         foreach ($vehicleTypeBody as &$item) {
  680.             $item['tag'] = $item['url'];
  681.             $item['url'] = $this->router->generate($nameRoute, ['state' => $state'type' => $vehicleType['url'], 'param' => $item['characteristic_id'], 'value' => $item['url']]);
  682.         }
  683.         return $vehicleTypeBody;
  684.     }
  685.     public function getStockTypeBodyPrice($state$type$modelUnique)
  686.     {
  687.         $vehicleType VehicleType::getTypeDataByUrl($type);
  688.         $request $this->requestStack->getCurrentRequest();
  689.         $query $this->em->getRepository(InStock::class)->createQueryBuilder('cis')
  690.             ->select('vcv.url''vc.id as characteristic_id''MIN(
  691.                                                                         CASE
  692.                                                                             WHEN cis.action_price > 0 THEN cis.action_price
  693.                                                                             WHEN cis.action_price_usd > 0 THEN
  694.                                                                                 CASE
  695.                                                                                     WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  696.                                                                                     ELSE cis.action_price_usd * d.rate
  697.                                                                                 END
  698.                                                                             WHEN vi.alt_price > 0 THEN vi.alt_price
  699.                                                                             ELSE
  700.                                                                                 CASE
  701.                                                                                     WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  702.                                                                                     ELSE vi.price * d.rate
  703.                                                                                 END
  704.                                                                         END + COALESCE(cis.add_cost, 0)
  705.                                                                     ) AS min_price');
  706.         if ($request->getLocale() == 'ru') {
  707.             $query->addSelect('vcv.value_ru as title');
  708.         } else {
  709.             $query->addSelect('vcv.value_ua as title');
  710.         }
  711.         $query->innerJoin('cis.vehicle_item''vi')
  712.             ->innerJoin('vi.vehicle''ve'Join::WITH've.vehicle_type = :vehicleType')->setParameter('vehicleType'$vehicleType['id'])
  713.             ->innerJoin('ve.dealer''d')
  714.             ->innerJoin('vi.variation''v')
  715.             ->innerJoin('v.characteristics''vrc')
  716.             ->innerJoin('vrc.characteristic''vc'Join::WITH'vc.model_unique = :modelUnique AND vc.vehicle_type = :vehicleType')
  717.             ->setParameter('modelUnique'$modelUnique)
  718.             ->setParameter('vehicleType'$vehicleType['id'])
  719.             ->innerJoin('vrc.characteristic_value''vcv');
  720.         $query->andWhere('vi.state = 1')
  721.             ->andWhere('ve.state = 1')
  722.             ->andWhere('cis.state = 1')
  723.             ->andWhere('ve.is_not_filled = 0')
  724.             ->andWhere('ve.is_delete != 1')
  725.             ->andWhere('cis.is_delete != 1')
  726.             ->andWhere('vcv.is_action = 1')
  727.             ->andWhere('ve.is_used = 0')
  728.             ->orderBy('vcv.position')
  729.             ->groupBy('title''vcv.url''characteristic_id',  'vcv.position');
  730.         $vehicleTypeBody $query->getQuery()->getArrayResult();
  731.         foreach ($vehicleTypeBody as &$item) {
  732.             $item['tag'] = $item['url'];
  733.             $item['url'] = $this->router->generate(CatalogEnum::ROUTE_PORTAL_CATALOG_FILTER_STOCK, ['inStock' => 1'state' => $state'type' => $vehicleType['url'], 'dynamic' => [$item['characteristic_id']=>[$item['url'] => true]]]);
  734.         }
  735.         return $vehicleTypeBody;
  736.     }
  737.     public function getVehicleTopViews($limit 5$brand null)
  738.     {
  739.         $request $this->requestStack->getCurrentRequest();
  740.         $state $request->get('state');
  741.         $type $request->get('type');
  742.         $hasCredit $request->get('credit');
  743.         $group $request->get('group');
  744.         $vehicleType VehicleType::getTypeDataByUrl($type);
  745.         $isUsed $state == CatalogEnum::CATALOG_USED;
  746.         $query $this->em->getRepository(Vehicle::class)->createQueryBuilder('ve')
  747.             ->select('ve''MIN(case when (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) = 0 then 9999999999 else (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) end) as min_price');
  748.         $query->innerJoin('ve.vehicle_items''vi')
  749.             ->innerJoin('ve.dealer''d')
  750.             ->innerJoin('ve.model''m')
  751.             ->leftJoin('ve.recommend_group''rg');
  752.         if ($brand) {
  753.             $query->andWhere('m.brand = :brand')->setParameter('brand'$brand);
  754.         }
  755.         if ($hasCredit) {
  756.             $query->andWhere('ve.credit_available = :hasCredit')->setParameter('hasCredit'$hasCredit);
  757.         }
  758.         if ($group) {
  759.             $query->andWhere('rg.url = :group')->setParameter('group'$group);
  760.         }
  761.         $query->andWhere('ve.vehicle_type = :vehicleType')->setParameter('vehicleType'$vehicleType['id'])
  762.             ->andWhere('vi.state = 1')
  763.             ->andWhere('vi.sold = 0')
  764.             ->andWhere('ve.is_used = :isUsed')->setParameter('isUsed'$isUsed)
  765.             ->andWhere('ve.state = 1')
  766.             ->andWhere('ve.is_not_filled = 0')
  767.             ->andWhere('ve.is_delete != 1')
  768.             ->andWhere('vi.sold != 1')
  769.             ->groupBy('ve''vi.views')
  770.             ->orderBy('vi.views''DESC')
  771.             ->addOrderBy('min_price''ASC')
  772.             ->setMaxResults($limit);
  773.         $vehicle $query->getQuery()->getResult();
  774.         foreach ($vehicle as &$item) {
  775.             $item $this->vehicleFactory->createByEntity($item[0]);
  776.         }
  777.         return $vehicle;
  778.     }
  779.     public function getVehicleItemTopViews($limit 5$brand null$model null)
  780.     {
  781.         $request $this->requestStack->getCurrentRequest();
  782.         $state $request->get('state');
  783.         $type $request->get('type');
  784.         $hasCredit $request->get('credit');
  785.         $vehicleType VehicleType::getTypeDataByUrl($type);
  786.         $isUsed $state == CatalogEnum::CATALOG_USED;
  787.         $query $this->em->getRepository(VehicleItem::class)->createQueryBuilder('vi')
  788.             ->select('vi''MIN(case when (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) = 0 then 9999999999 else (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) end) as min_price');
  789.         $query
  790.             ->innerJoin('vi.vehicle''ve')
  791.             ->innerJoin('ve.model''m')
  792.             ->innerJoin('ve.dealer''d');
  793.         if ($brand) {
  794.             $query->andWhere('m.brand = :brand')->setParameter('brand'$brand);
  795.         }
  796.         if ($model) {
  797.             $query->andWhere('ve.model = :model')->setParameter('model'$model);
  798.         }
  799.         $query->andWhere('ve.vehicle_type = :vehicleType')->setParameter('vehicleType'$vehicleType['id'])
  800.             ->andWhere('vi.state = 1')
  801.             ->andWhere('ve.is_used = :isUsed')->setParameter('isUsed'$isUsed)
  802.             ->andWhere('ve.state = 1')
  803.             ->andWhere('ve.is_not_filled = 0')
  804.             ->andWhere('vi.sold != 1')
  805.             ->andWhere('ve.is_delete != 1');
  806.         if ($hasCredit) {
  807.             $query->andWhere('ve.credit_available = :hasCredit')->setParameter('hasCredit'$hasCredit);
  808.         }
  809.         if ($isUsed) {
  810.             $query->groupBy('vi')
  811.                 ->orderBy('ve.date_create''DESC');
  812.         } else {
  813.             $query->groupBy('vi')
  814.                 ->orderBy('ve.views''DESC');
  815.         }
  816.         $query->addOrderBy('min_price''ASC')
  817.             ->setMaxResults($limit);
  818.         $vehicleItem $query->getQuery()->getResult();
  819.         /** @var VehicleItem $item */
  820.         foreach ($vehicleItem as &$item) {
  821.             $item $this->vehicleFactory->createByVehicleItem($item[0]);
  822.         }
  823.         return $vehicleItem;
  824.     }
  825.     public function getRandomBrand($limit 5$brand null)
  826.     {
  827.         $request $this->requestStack->getCurrentRequest();
  828.         $state $request->get('state');
  829.         $type $request->get('type');
  830.         $hasCredit $request->get('credit');
  831.         $vehicleType VehicleType::getTypeDataByUrl($type);
  832.         $isUsed $state == CatalogEnum::CATALOG_USED;
  833.         $query $this->em->getRepository(\CoreBundle\Entity\Vehicles\Vehicle::class)->createQueryBuilder('ve')
  834.             ->select('ve')
  835.             ->addSelect('MIN(case when (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) = 0 then 9999999999 else (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) end) as min_price');
  836.         $query->innerJoin('ve.vehicle_items''vi')
  837.             ->innerJoin('ve.model''m')
  838.             ->innerJoin('m.brand''b')
  839.             ->innerJoin('ve.dealer''d');
  840.         if ($brand) {
  841.             $query->andWhere('m.brand != :brand')->setParameter('brand'$brand);
  842.         }
  843.         if ($hasCredit) {
  844.             $query->andWhere('ve.credit_available = :hasCredit')->setParameter('hasCredit'$hasCredit);
  845.         }
  846.         $query->andWhere('ve.vehicle_type = :vehicleType')->setParameter('vehicleType'$vehicleType['id'])
  847.             ->andWhere('vi.state = 1')
  848.             ->andWhere('vi.sold = 0')
  849.             ->andWhere('ve.is_used = :isUsed')->setParameter('isUsed'$isUsed)
  850.             ->andWhere('ve.state = 1')
  851.             ->andWhere('ve.is_not_filled = 0')
  852.             ->andWhere('ve.is_delete != 1')
  853.             ->andWhere('vi.sold != 1')
  854.             ->groupBy('b')
  855.             ->orderBy('min_price''ASC')
  856.             ->setMaxResults($limit);
  857.         $vehicles $query->getQuery()->getResult();
  858.         /** @var Vehicle[] $item */
  859.         foreach ($vehicles as &$item) {
  860.             $item = [
  861.                 'title' => $item[0]->getModel()->getBrand(),
  862.                 'url' => $item[0]->getModel()->getBrand()->getUrl(),
  863.                 'type' => 'brand',
  864.                 'price' => $item['min_price'],
  865.                 'creditPayment' => $this->creditModel->getMinPayment($this->vehicleFactory->createByEntity($item[0])),
  866.             ];
  867.         }
  868.         return $vehicles;
  869.     }
  870.     public function getRandomModelBrand($limit 5$brand null$model null)
  871.     {
  872.         $request $this->requestStack->getCurrentRequest();
  873.         $state $request->get('state');
  874.         $type $request->get('type');
  875.         $hasCredit $request->get('credit');
  876.         $vehicleType VehicleType::getTypeDataByUrl($type);
  877.         $isUsed $state == CatalogEnum::CATALOG_USED;
  878.         $query $this->em->getRepository(\CoreBundle\Entity\Vehicles\Vehicle::class)->createQueryBuilder('ve')
  879.             ->select('ve')
  880.             ->addSelect('MIN(case when (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) = 0 then 9999999999 else (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) end) as min_price');
  881.         $query->innerJoin('ve.vehicle_items''vi')
  882.             ->innerJoin('ve.model''m')
  883.             ->innerJoin('m.brand''b')
  884.             ->innerJoin('ve.dealer''d');
  885.         if ($brand) {
  886.             $query->andWhere('m.brand = :brand')->setParameter('brand'$brand);
  887.         }
  888.         if ($model) {
  889.             $query->andWhere('m.id != :model')->setParameter('model'$model);
  890.         }
  891.         if ($hasCredit) {
  892.             $query->andWhere('ve.credit_available = :hasCredit')->setParameter('hasCredit'$hasCredit);
  893.         }
  894.         $query->andWhere('ve.vehicle_type = :vehicleType')->setParameter('vehicleType'$vehicleType['id'])
  895.             ->andWhere('vi.state = 1')
  896.             ->andWhere('vi.sold = 0')
  897.             ->andWhere('ve.is_used = :isUsed')->setParameter('isUsed'$isUsed)
  898.             ->andWhere('ve.state = 1')
  899.             ->andWhere('ve.is_not_filled = 0')
  900.             ->andWhere('ve.is_delete != 1')
  901.             ->andWhere('vi.sold != 1')
  902.             ->groupBy('m')
  903.             ->orderBy('min_price''ASC')
  904.             ->setMaxResults($limit);
  905.         $vehicles $query->getQuery()->getResult();
  906.         /** @var Vehicle[] $item */
  907.         foreach ($vehicles as &$item) {
  908.             $item = [
  909.                 'title' => $item[0]->getModel(),
  910.                 'url' => $item[0]->getModel()->getUrl(),
  911.                 'type' => 'model',
  912.                 'price' => $item['min_price'],
  913.                 'creditPayment' => $this->creditModel->getMinPayment($this->vehicleFactory->createByEntity($item[0])),
  914.             ];
  915.         }
  916.         return $vehicles;
  917.     }
  918.     public function getVehicleImageColor()
  919.     {
  920.         $request $this->requestStack->getCurrentRequest();
  921.         $firstImage false;
  922.         $vehicleId $request->get('vehicleId');
  923.         $colorId $request->get('colorId');
  924.         /** @var ConfiguratorColor $vehicleColor */
  925.         $vehicleColor $this->em->getRepository(ConfiguratorColor::class)->findOneBy(['id' => $colorId'vehicle' => $vehicleId]);
  926.         if($vehicleColor && $vehicleColor->getGallery() && !empty($vehicleColor->getGallery()->getGalleryItems())) {
  927.             $firstImage $vehicleColor->getGallery()->getGalleryItems()->first();
  928.         }
  929.         if (!$firstImage) {
  930.             return null;
  931.         }
  932.         return $this->mediaExtension->getPath($vehicleColor->getGallery()->getGalleryItems()->first()->getMedia(), 'reference');
  933.     }
  934.     public function getFilterByCatalog()
  935.     {
  936.         $request $this->requestStack->getCurrentRequest();
  937.         $searchParams $request->query->all();
  938.         $typeData VehicleType::getTypeDataByUrl($request->get('type'));
  939.         $state $request->get('state');
  940.         $isUsed $state == 'used';
  941.         //TODO remove this magic string
  942.         $catalogBrands array_column($this->getBrands($state$typeData['id']), 'name''url');
  943.         $catalogModels array_column($this->getModels($typeData['id'], $isUsed), 'title''url');
  944.         $catalogCharacteristic $this->getCharacteristicsByParams($typeData['id'], null$isUsed);
  945.         foreach ($catalogCharacteristic as $key => $value) {
  946.             $catalogCharacteristic[$key] = array_column($value['values'], 'value_' $request->getLocale(), 'url');
  947.         }
  948.         $filters = [];
  949.         foreach ($searchParams as $type => $params) {
  950.             if (!is_array($params)) {
  951.                 $from $this->translator->trans('new_catalog.from', [], 'portal_base') . ' ' $params;
  952.                 $to ' до ' $params;
  953.                 $year $this->translator->trans('new_catalog.year', [], 'portal_base') . ' ';
  954.                 $price $this->translator->trans('new_catalog.price', [], 'portal_base') . ' ';
  955.                 $mileage $this->translator->trans('cars.used.mileage', [], 'portal_base') . ' ';
  956.                 if (!isset($filters['range'])) {
  957.                     $filters['range'] = [];
  958.                 }
  959.                 //TODO remove this magic string
  960.                 switch ($type) {
  961.                     case 'yearFrom':
  962.                         $filters['range']['year'] = $year $from;
  963.                         break;
  964.                     case 'yearTo':
  965.                         $filters['range']['year'] =
  966.                             isset($filters['range']['year']) ? $filters['range']['year'] . $to $year $to;
  967.                         break;
  968.                     case 'priceFrom':
  969.                         $filters['range']['price'] = $price $from;
  970.                         break;
  971.                     case 'priceTo':
  972.                         $filters['range']['price'] =
  973.                             isset($filters['range']['price']) ? $filters['range']['price'] . $to $price $to;
  974.                         break;
  975.                     case 'mileageFrom':
  976.                         $filters['range']['mileage'] = $mileage $from;
  977.                         break;
  978.                     case 'mileageTo':
  979.                         $filters['range']['mileage'] =
  980.                             isset($filters['range']['mileage']) ? $filters['range']['mileage'] . $to $mileage $to;
  981.                         break;
  982.                 }
  983.                 continue;
  984.             }
  985.             foreach ($params as $key => $value) {
  986.                 if (empty($filters[$type])) {
  987.                     //TODO remove this magic string
  988.                     if ($type == 'm-brand' && empty($filters['brand'])) {
  989.                         $filters['brand'] = [];
  990.                     } elseif ($type == 'm-model' && empty($filters['model'])) {
  991.                         $filters['model'] = [];
  992.                     } else {
  993.                         $filters[$type] = [];
  994.                     }
  995.                 }
  996.                 switch ($type) {
  997.                     //TODO remove this magic string
  998.                     case 'm-brand':
  999.                         $filters['brand'][$key] = $catalogBrands[$key];
  1000.                         break;
  1001.                     case 'm-model':
  1002.                         $filters['model'][$key] = $catalogModels[$key];
  1003.                         break;
  1004.                     case 'dynamic':
  1005.                         foreach ($value as $characteristic => $state) {
  1006.                             if (!isset($catalogCharacteristic[$key])) {
  1007.                                 continue;
  1008.                             }
  1009.                             $filters[$type][$key][$characteristic] = $catalogCharacteristic[$key][$characteristic];
  1010.                         }
  1011.                         break;
  1012.                 }
  1013.             }
  1014.         }
  1015.         if (empty($filters['range'])) {
  1016.             unset($filters['range']);
  1017.         }
  1018.     }
  1019.     public function getActualTypes($isUsed$hasCredit false$locale 'ua')
  1020.     {
  1021.         $query $this->em->getRepository(Vehicle::class)->createQueryBuilder('v')
  1022.             ->select('v.vehicle_type')
  1023.             ->where('v.state = 1')
  1024.             ->andWhere('v.is_delete != 1');
  1025.         if ($isUsed !== false) {
  1026.             $query->andWhere('v.is_used = :isUsed')
  1027.                 ->setParameter('isUsed'$isUsed);
  1028.         }
  1029.         if ($hasCredit) {
  1030.             $query->andWhere('v.credit_available = :hasCredit')
  1031.                 ->setParameter('hasCredit'$hasCredit);
  1032.         }
  1033.         $query->groupBy('v.vehicle_type');
  1034.         $types $query->getQuery()->getResult();
  1035.         $ids = [];
  1036.         foreach ($types as $row) {
  1037.             $ids[] = $row['vehicle_type'];
  1038.         }
  1039.         $result = [];
  1040.         VehicleType::$locale $locale;
  1041.         foreach (VehicleType::getTypesData() as $id => $item) {
  1042.             if (in_array($id$ids)) {
  1043.                 $result[] = $item;
  1044.             }
  1045.         }
  1046.         return $result;
  1047.     }
  1048.     public function getBrands($state$type$hasCredit false)
  1049.     {
  1050.         $query $this->em->getRepository(Vehicle::class)
  1051.             ->createQueryBuilder('v')
  1052.             ->select('b.id''b.name''b.url')
  1053.             ->join('v.model''m')
  1054.             ->join('m.brand''b')
  1055.             ->where('v.state = 1')
  1056.             ->andWhere('v.is_delete != 1')
  1057.             ->andWhere('v.vehicle_type = :type')
  1058.             ->setParameter('type'$type);
  1059.         if ($hasCredit) {
  1060.             $query->andWhere('v.credit_available = :hasCredit')
  1061.                 ->setParameter('hasCredit'$hasCredit);
  1062.         }
  1063.         if ($state == 'used') {
  1064.             $query->andWhere('v.is_used = 1');
  1065.         }
  1066.         if ($state == 'new') {
  1067.             $query->andWhere('v.is_used = 0');
  1068.         }
  1069.         $query->orderBy('b.name');
  1070.         $query->groupBy('b.id');
  1071.         return $query->getQuery()->getResult();
  1072.     }
  1073.     public function getModels($type$isUsedBrand $brand null)
  1074.     {
  1075.         $query $this->em->getRepository(Vehicle::class)
  1076.             ->createQueryBuilder('v')
  1077.             ->select('m.id''m.title''m.url')
  1078.             ->join('v.model''m')
  1079.             ->join('m.brand''b')
  1080.             ->where('v.state = 1')
  1081.             ->andWhere('v.is_delete != 1')
  1082.             ->andWhere('v.vehicle_type = :type')
  1083.             ->setParameter('type'$type);
  1084.         if ($brand != null) {
  1085.             $query->andWhere('b.id = :brand')
  1086.                 ->setParameter('brand'$brand);
  1087.         }
  1088.         if ($isUsed !== false) {
  1089.             $query->andWhere('v.is_used = :isUsed')
  1090.                 ->setParameter('isUsed'$isUsed);
  1091.         }
  1092.         $query->orderBy('m.title');
  1093.         $query->groupBy('m.id');
  1094.         return $query->getQuery()->getResult();
  1095.     }
  1096.     public function getModelsAndArhive($type$isUsedBrand $brand null$hasCredit false)
  1097.     {
  1098.         $query $this->em->getRepository(Vehicle::class)
  1099.             ->createQueryBuilder('v')
  1100.             ->select('m.id''m.title''m.url')
  1101.             ->join('v.model''m')
  1102.             ->join('m.brand''b')
  1103.             ->andWhere('v.vehicle_type = :type')
  1104.             ->setParameter('type'$type);
  1105.         if ($brand != null) {
  1106.             $query->andWhere('b.id = :brand')
  1107.                 ->setParameter('brand'$brand);
  1108.         }
  1109.         if ($isUsed !== false) {
  1110.             $query->andWhere('v.is_used = :isUsed')
  1111.                 ->setParameter('isUsed'$isUsed);
  1112.         }
  1113.         if ($hasCredit) {
  1114.             $query->andWhere('v.credit_available = :hasCredit')
  1115.                 ->setParameter('hasCredit'$hasCredit);
  1116.         }
  1117.         $query->orderBy('m.title');
  1118.         $query->groupBy('m.id');
  1119.         return $query->getQuery()->getResult();
  1120.     }
  1121.     public function getGroups($type$hasCredit false)
  1122.     {
  1123.         $request $this->requestStack->getCurrentRequest();
  1124.         $query $this->em->getRepository(RecommendGroup::class)
  1125.             ->createQueryBuilder('rg')
  1126.             ->select('rg.id''rg.title_'.$request->getLocale().' as title''rg.url')
  1127.             ->innerJoin('rg.vehicles','v')
  1128.             ->where('rg.state = :state')
  1129.             ->setParameter('state'true)
  1130.             ->andWhere('v.vehicle_type = :type')
  1131.             ->setParameter('type'$type);
  1132.         if ($hasCredit) {
  1133.             $query->andWhere('v.credit_available = :hasCredit')
  1134.                 ->setParameter('hasCredit'$hasCredit);
  1135.         }
  1136.         return $query->getQuery()->getResult();
  1137.     }
  1138.     public function findByParams($routeParams$searchParams$pageLimit 21$withOutYear true)
  1139.     {
  1140.         $brand = isset($routeParams['brand']) && $routeParams['brand'] != 'all' $this->em->getRepository(Brand::class)->findOneBy(['url' => $routeParams['brand']]) : null;
  1141.         $model = isset($routeParams['model']) && $brand $this->em->getRepository(Model::class)->findOneBy(['url' => $routeParams['model'], 'brand' => $brand]) : null;
  1142.         $group = isset($routeParams['group']) ? $this->em->getRepository(RecommendGroup::class)->findOneBy(['url' => $routeParams['group']]) : null;
  1143.         $typeData VehicleType::getTypeDataByUrl($routeParams['type']);
  1144.         $isUsed $routeParams['state'] == 'all' false : ($routeParams['state'] == 'new' 1);
  1145.         $hasCredit filter_var($routeParams['credit'] ?? falseFILTER_VALIDATE_BOOLEAN);
  1146.         $query $this->em->getRepository(VehicleItem::class)
  1147.             ->createQueryBuilder('vi')
  1148.             ->select('vi',
  1149.                 'case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end as price',
  1150.                 'case when (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) = 0 then 9999999999 else (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) end as orderPrice')
  1151.             ->join('vi.variation''v');
  1152.         if (isset($searchParams['inStock']) && $searchParams['inStock'] === 'true') {
  1153.             $query->join('vi.vehicleInStock''vis');
  1154.         }
  1155.         $query->join('v.vehicle''ve')
  1156.             ->join('ve.dealer''d')
  1157.             ->join('ve.model''m')
  1158.             ->join('m.brand''b')
  1159.             ->leftJoin('ve.recommend_group''rg')
  1160.             ->where('ve.vehicle_type = :type')
  1161.             ->andWhere('vi.state = 1')
  1162.             ->andWhere('ve.state = 1')
  1163.             ->andWhere('ve.is_not_filled = 0')
  1164.             ->andWhere('ve.is_delete != 1')
  1165.             ->setParameter('type'$typeData['id']);
  1166.         if ($hasCredit) {
  1167.             $query->andWhere('ve.credit_available = :hasCredit')
  1168.                 ->setParameter('hasCredit'$hasCredit);
  1169.         }
  1170.         if ($isUsed !== false) {
  1171.             $mounthAgo = (new DateTime())->modify('-30 days');
  1172.             $query->andWhere('ve.is_used = :is_used')
  1173.                 ->setParameter('is_used'$isUsed)
  1174.                 ->andWhere('vi.date_of_sale > :mounthAgo OR vi.date_of_sale IS NULL')
  1175.                 ->setParameter('mounthAgo'$mounthAgo)
  1176.                 ->setParameter('is_used'$isUsed);
  1177.         }
  1178.         if ($model) {
  1179.             $query->andWhere('m.id = :model')
  1180.                 ->setParameter('model'$model->getId());
  1181.         }
  1182.         if ($brand && !$model) {
  1183.             $query->andWhere('b.id = :brand')
  1184.                 ->setParameter('brand'$brand->getId());
  1185.         }
  1186.         if ($group) {
  1187.             $query->andWhere('rg.id = :group')
  1188.                 ->setParameter('group'$group->getId());
  1189.         }
  1190.         if (count($searchParams)) {
  1191.             foreach ($searchParams as $key => $item) {
  1192.                 switch ($key) {
  1193.                     case 'm-brand':
  1194.                         if (!isset($searchParams['m-model'])) {
  1195.                             $query->andWhere('b.url IN (:mBrand)')
  1196.                                 ->setParameter('mBrand'array_keys($item));
  1197.                         } else {
  1198.                             $filterModelIds $this->findModelByParams(array_keys($item), array_keys($searchParams['m-model']));
  1199.                             $query->andWhere('m.id IN (:modelIds)')
  1200.                                 ->setParameter('modelIds'$filterModelIds);
  1201.                         }
  1202.                         break;
  1203.                     case 'm-model':
  1204.                         if (!isset($searchParams['m-brand']) || count($searchParams['m-brand']) == 1) {
  1205.                             $query->andWhere('m.url IN (:mModel)')
  1206.                                 ->setParameter('mModel'array_keys($item));
  1207.                         }
  1208.                         break;
  1209.                     case 'group':
  1210.                             $query->andWhere('rg.url IN (:group)')
  1211.                                 ->setParameter('group'array_keys($item));
  1212.                         break;
  1213.                     case 'priceFrom':
  1214.                         if ($item 0) {
  1215.                             $query->andHaving('price >= :minPrice')
  1216.                                 ->setParameter('minPrice'$item);
  1217.                         }
  1218.                         break;
  1219.                     case 'priceTo':
  1220.                         if ($item 0) {
  1221.                             $query->andHaving('price <= :priceMax')
  1222.                                 ->setParameter('priceMax'$item);
  1223.                         }
  1224.                         break;
  1225.                     case 'yearFrom':
  1226.                         if ($item 0) {
  1227.                             $query->andHaving('vi.year >= :yearMin')
  1228.                                 ->setParameter('yearMin'$item);
  1229.                         }
  1230.                         break;
  1231.                     case 'yearTo':
  1232.                         if ($item 0) {
  1233.                             $query->andHaving('vi.year <= :yearMax')
  1234.                                 ->setParameter('yearMax'$item);
  1235.                         }
  1236.                         break;
  1237.                     case 'mileageFrom':
  1238.                         if ($item 0) {
  1239.                             $query->andHaving('vi.mileage >= :mileageFrom')
  1240.                                 ->setParameter('mileageFrom'$item);
  1241.                         }
  1242.                         break;
  1243.                     case 'mileageTo':
  1244.                         if ($item 0) {
  1245.                             $query->andHaving('vi.mileage <= :mileageTo')
  1246.                                 ->setParameter('mileageTo'$item);
  1247.                         }
  1248.                         break;
  1249.                     case 'recommend':
  1250.                         if ($item 0) {
  1251.                             $query->andWhere('rg.id = :recommend')
  1252.                                 ->setParameter('recommend'$item);
  1253.                         }
  1254.                         break;
  1255.                     case 'hasNDS':
  1256.                         if ($item == 'true') {
  1257.                             $query->andWhere('vi.has_nds = 1');
  1258.                         }
  1259.                         break;
  1260.                     case 'isSelect':
  1261.                         if ($item == 'true') {
  1262.                             $query->andWhere($query->expr()->notIn('ve.dealer'Catalog::NOT_VIDI_SELECT_DEALERS));
  1263.                         }
  1264.                         break;
  1265.                 }
  1266.             }
  1267.         }
  1268.         $catalogCharacteristics $this->getCatalogCharacteristicsId();
  1269.         $dynamic = isset($searchParams['dynamic']) && count($searchParams['dynamic']) ? $searchParams['dynamic'] : [];
  1270.         if (isset($routeParams['param']) && isset($routeParams['value'])) {
  1271.             // Exclusion for catalog parameter "Years"
  1272.             if ($routeParams['param'] == SeoMetaTag::YEARS_PARAMETER && $withOutYear) {
  1273.                 $query->andHaving('vi.year = :year')
  1274.                     ->setParameter('year'$routeParams['value']);
  1275.             } else {
  1276.                 $charValue $this->em->getRepository(CharacteristicValue::class)->findOneBy(
  1277.                     ['url' => $routeParams['value'], 'characteristic' => $routeParams['param']]
  1278.                 );
  1279.                 if ($charValue) {
  1280.                     $dynamic[$charValue->getCharacteristic()->getId()][$charValue->getUrl()] = 1;
  1281.                 }
  1282.             }
  1283.         }
  1284. //        if (isset($routeParams['group']) && !is_array($routeParams['group'])){
  1285. //            $query->andWhere('rg.url = :group')
  1286. //                ->setParameter('group', $routeParams['group']);
  1287. //        }
  1288.         if (count($dynamic)) {
  1289.             foreach ($dynamic as $cId => $params) {
  1290.                 $alias 'vc' $cId;
  1291.                 $fKey 'charId' $cId;
  1292.                 $tKey 'cids' $cId;
  1293.                 $query->join('v.characteristics'$alias);
  1294.                 if (in_array($cId$catalogCharacteristics)) {
  1295.                     $cvIds = [];
  1296.                     foreach ($params as $vcUrl => $true) {
  1297.                         $cValue $this->em->getRepository(CharacteristicValue::class)->findOneBy(['url' => $vcUrl'characteristic' => (int)$cId]);
  1298.                         if ($cValue) {
  1299.                             $cvIds[] = $cValue->getId();
  1300.                         }
  1301.                     }
  1302.                     if (!empty($cvIds)) {
  1303.                         $query->andWhere($alias '.characteristic = :' $fKey)
  1304.                             ->setParameter($fKey$cId);
  1305.                         $query->andWhere($alias '.characteristic_value IN (:' $tKey ')')
  1306.                             ->setParameter($tKey$cvIds);
  1307.                     }
  1308.                 } else {
  1309.                     $localeValue 'value_' $routeParams['_locale'];
  1310.                     if (!empty($params['from']) && $params['from'] > 0) {
  1311.                         $query->andWhere($alias '.characteristic = :' $fKey ' AND INT(' $alias '.' $localeValue ') >= :from')
  1312.                             ->setParameter($fKey$cId)
  1313.                             ->setParameter('from'$params['from']);
  1314.                     }
  1315.                     if (!empty($params['to']) && $params['to'] > 0) {
  1316.                         $query->andWhere($alias '.characteristic = :' $fKey ' AND INT(' $alias '.' $localeValue ') <= :to')
  1317.                             ->setParameter($fKey$cId)
  1318.                             ->setParameter('to'$params['to']);
  1319.                     }
  1320.                 }
  1321.             }
  1322.         }
  1323.         $allResult $query->getQuery()->getResult();
  1324.         $prices = [];
  1325.         $creditPayments = [];
  1326.         foreach ($allResult as $result) {
  1327.             if ($result['price'] != 0) {
  1328.                 $prices[] = $result['price'];
  1329.             }
  1330.             if ($result['price'] != 0) {
  1331.                 $creditPayments[] = $this->creditModel->getMinPayment($this->vehicleFactory->createByEntity($result[0]->getVehicle()));
  1332.             }
  1333.         }
  1334.         if($prices){
  1335.             $minMaxPrice = [
  1336.                 'minPrice' => count($prices) ? min($prices) : 0,
  1337.                 'maxPrice' => count($prices) ? max($prices) : 0,
  1338.             ];
  1339.         }
  1340.         $minMaxCreditPayment = [
  1341.             'min' => count($prices) ? min($prices) : 0,
  1342.             'max' => count($prices) ? max($prices) : 0,
  1343.         ];
  1344.         $totalCount count($allResult);
  1345.         unset($allResult);
  1346.         $limit $pageLimit;
  1347.         $page $searchParams['page'] ?? 1;
  1348.         $start = ($page 1) * $limit;
  1349.         $query
  1350.             ->groupBy('vi')
  1351.             ->orderBy('vi.sold''ASC');
  1352.         if (isset($searchParams['sortOrder'])) {
  1353.             $sortData explode('-'$searchParams['sortOrder']);
  1354.             $sortField $sortData[0] ?? 'price';
  1355.             $sortAD = isset($sortData[1]) && in_array($sortData[1], ['ASC''DESC']) ? $sortData[1] : 'ASC';
  1356.             switch ($sortField) {
  1357.                 case 'price':
  1358.                     $field $sortAD == 'DESC' 'price' 'orderPrice';
  1359.                     $query->addOrderBy($field$sortAD);
  1360.                     $query->addOrderBy('b.name''ASC');
  1361.                     $query->addOrderBy('m.title''ASC');
  1362.                     break;
  1363.                 case 'year':
  1364.                     $query->addOrderBy('vi.year'$sortAD);
  1365.                     $query->addOrderBy('b.name''ASC');
  1366.                     $query->addOrderBy('m.title''ASC');
  1367.                     break;
  1368.                 case 'mileage':
  1369.                     $query->addOrderBy('vi.mileage'$sortAD);
  1370.                     $query->addOrderBy('b.name''ASC');
  1371.                     $query->addOrderBy('m.title''ASC');
  1372.                     break;
  1373.                 default:
  1374.                     $query->addOrderBy('orderPrice''ASC');
  1375.                     $query->addOrderBy('b.name''ASC');
  1376.                     $query->addOrderBy('m.title''ASC');
  1377.                     break;
  1378.             }
  1379.         } else {
  1380.             $query->addOrderBy('orderPrice''ASC');
  1381.         }
  1382.         $query->setFirstResult($start)
  1383.             ->setMaxResults($limit);
  1384.         return [
  1385.             'count' => $totalCount,
  1386.             'data' => $query->getQuery()->getResult(),
  1387.             'minMaxPrice' => $minMaxPrice ?? null,
  1388.             'minMaxCreditPayment' => $minMaxCreditPayment
  1389.         ];
  1390.     }
  1391.     public function findStockByParams($routeParams$searchParams$pageLimit 21$withOutYear true)
  1392.     {
  1393.         $brand = isset($routeParams['brand']) && $routeParams['brand'] != 'all' $this->em->getRepository(Brand::class)->findOneBy(['url' => $routeParams['brand']]) : null;
  1394.         $model = isset($routeParams['model']) && $brand $this->em->getRepository(Model::class)->findOneBy(['url' => $routeParams['model'], 'brand' => $brand]) : null;
  1395.         $typeData VehicleType::getTypeDataByUrl($routeParams['type']);
  1396.         $query $this->em->getRepository(InStock::class)
  1397.             ->createQueryBuilder('cis')
  1398.                 ->select('cis',
  1399.                     'vi',
  1400.                     '(CASE
  1401.                             WHEN cis.action_price > 0 THEN cis.action_price
  1402.                             WHEN cis.action_price_usd > 0 THEN
  1403.                                 (CASE
  1404.                                     WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  1405.                                     ELSE cis.action_price_usd * d.rate
  1406.                                 END)
  1407.                             WHEN vi.alt_price > 0 THEN vi.alt_price
  1408.                             ELSE
  1409.                                 (CASE
  1410.                                     WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  1411.                                     ELSE vi.price * d.rate
  1412.                                 END)
  1413.                         END) + COALESCE(cis.add_cost, 0) AS price',
  1414.                     '(CASE
  1415.                         WHEN (CASE
  1416.                                 WHEN cis.action_price > 0 THEN cis.action_price
  1417.                                 WHEN cis.action_price_usd > 0 THEN
  1418.                                     (CASE
  1419.                                         WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  1420.                                         ELSE cis.action_price_usd * d.rate
  1421.                                     END)
  1422.                                 WHEN vi.alt_price > 0 THEN vi.alt_price
  1423.                                 ELSE
  1424.                                     (CASE
  1425.                                         WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  1426.                                         ELSE vi.price * d.rate
  1427.                                     END)
  1428.                             END + COALESCE(cis.add_cost, 0)) = 0 THEN 9999999999
  1429.                         ELSE
  1430.                             (CASE
  1431.                                 WHEN cis.action_price > 0 THEN cis.action_price
  1432.                                 WHEN cis.action_price_usd > 0 THEN
  1433.                                     (CASE
  1434.                                         WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  1435.                                         ELSE cis.action_price_usd * d.rate
  1436.                                     END)
  1437.                                 WHEN vi.alt_price > 0 THEN vi.alt_price
  1438.                                 ELSE
  1439.                                     (CASE
  1440.                                         WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  1441.                                         ELSE vi.price * d.rate
  1442.                                     END)
  1443.                             END + COALESCE(cis.add_cost, 0))
  1444.                     END) AS orderPrice')
  1445.                 ->innerJoin('cis.vehicle_item''vi')
  1446.                 ->innerJoin('vi.variation''v')
  1447.                 ->innerJoin('v.characteristics''vc')
  1448.                 ->innerJoin('vc.characteristic_value''vcv')
  1449.                 ->innerJoin('vi.equipment''e')
  1450.                 ->innerJoin('vi.vehicle''vehicle')
  1451.                 ->join('vehicle.dealer''d')
  1452.                 ->join('vehicle.model''m')
  1453.                 ->join('m.brand''b')
  1454.                 ->leftJoin('vehicle.recommend_group''rg')
  1455.                 ->where('cis.state = 1 and cis.is_delete != 1')
  1456.                 ->andWhere('vehicle.is_delete != 1')
  1457.                 ->andWhere('vehicle.is_delete != 1')
  1458.                 ->andWhere('vehicle.state = 1');
  1459.         if ($model) {
  1460.             $query->andWhere('m.id = :model')
  1461.                 ->setParameter('model'$model->getId());
  1462.         }
  1463.         if ($brand && !$model) {
  1464.             $query->andWhere('b.id = :brand')
  1465.                 ->setParameter('brand'$brand->getId());
  1466.         }
  1467.         if (count($searchParams)) {
  1468.             foreach ($searchParams as $key => $item) {
  1469.                 switch ($key) {
  1470.                     case 'm-brand':
  1471.                         if (!isset($searchParams['m-model'])) {
  1472.                             $query->andWhere('b.url IN (:mBrand)')
  1473.                                 ->setParameter('mBrand'array_keys($item));
  1474.                         } else {
  1475.                             $filterModelIds $this->findModelByParams(array_keys($item), array_keys($searchParams['m-model']));
  1476.                             $query->andWhere('m.id IN (:modelIds)')
  1477.                                 ->setParameter('modelIds'$filterModelIds);
  1478.                         }
  1479.                         break;
  1480.                     case 'm-model':
  1481.                         if (!isset($searchParams['m-brand']) || count($searchParams['m-brand']) == 1) {
  1482.                             $query->andWhere('m.url IN (:mModel)')
  1483.                                 ->setParameter('mModel'array_keys($item));
  1484.                         }
  1485.                         break;
  1486.                     case 'group':
  1487.                         $query->andWhere('rg.url IN (:group)')
  1488.                             ->setParameter('group'array_keys($item));
  1489.                         break;
  1490.                     case 'priceFrom':
  1491.                         if ($item 0) {
  1492.                             $query->andHaving('price >= :minPrice')
  1493.                                 ->setParameter('minPrice'$item);
  1494.                         }
  1495.                         break;
  1496.                     case 'priceTo':
  1497.                         if ($item 0) {
  1498.                             $query->andHaving('price <= :priceMax')
  1499.                                 ->setParameter('priceMax'$item);
  1500.                         }
  1501.                         break;
  1502.                     case 'yearFrom':
  1503.                         if ($item 0) {
  1504.                             $query->andHaving('vi.year >= :yearMin')
  1505.                                 ->setParameter('yearMin'$item);
  1506.                         }
  1507.                         break;
  1508.                     case 'yearTo':
  1509.                         if ($item 0) {
  1510.                             $query->andHaving('vi.year <= :yearMax')
  1511.                                 ->setParameter('yearMax'$item);
  1512.                         }
  1513.                         break;
  1514.                     case 'mileageFrom':
  1515.                         if ($item 0) {
  1516.                             $query->andHaving('vi.mileage >= :mileageFrom')
  1517.                                 ->setParameter('mileageFrom'$item);
  1518.                         }
  1519.                         break;
  1520.                     case 'mileageTo':
  1521.                         if ($item 0) {
  1522.                             $query->andHaving('vi.mileage <= :mileageTo')
  1523.                                 ->setParameter('mileageTo'$item);
  1524.                         }
  1525.                         break;
  1526.                     case 'recommend':
  1527.                         if ($item 0) {
  1528.                             $query->andWhere('rg.id = :recommend')
  1529.                                 ->setParameter('recommend'$item);
  1530.                         }
  1531.                         break;
  1532.                     case 'hasNDS':
  1533.                         if ($item == 'true') {
  1534.                             $query->andWhere('vi.has_nds = 1');
  1535.                         }
  1536.                         break;
  1537.                     case 'isSelect':
  1538.                         if ($item == 'true') {
  1539.                             $query->andWhere($query->expr()->notIn('ve.dealer'Catalog::NOT_VIDI_SELECT_DEALERS));
  1540.                         }
  1541.                         break;
  1542.                 }
  1543.             }
  1544.         }
  1545.         $catalogCharacteristics $this->getCatalogCharacteristicsId();
  1546.         $dynamic = isset($searchParams['dynamic']) && count($searchParams['dynamic']) ? $searchParams['dynamic'] : [];
  1547.         if (isset($routeParams['param']) && isset($routeParams['value'])) {
  1548.             // Exclusion for catalog parameter "Years"
  1549.             if ($routeParams['param'] == SeoMetaTag::YEARS_PARAMETER && $withOutYear) {
  1550.                 $query->andHaving('vi.year = :year')
  1551.                     ->setParameter('year'$routeParams['value']);
  1552.             } else {
  1553.                 $charValue $this->em->getRepository(CharacteristicValue::class)->findOneBy(
  1554.                     ['url' => $routeParams['value'], 'characteristic' => $routeParams['param']]
  1555.                 );
  1556.                 if ($charValue) {
  1557.                     $dynamic[$charValue->getCharacteristic()->getId()][$charValue->getUrl()] = 1;
  1558.                 }
  1559.             }
  1560.         }
  1561.         if (count($dynamic)) {
  1562.             foreach ($dynamic as $cId => $params) {
  1563.                 $alias 'vc' $cId;
  1564.                 $fKey 'charId' $cId;
  1565.                 $tKey 'cids' $cId;
  1566.                 $query->join('v.characteristics'$alias);
  1567.                 if (in_array($cId$catalogCharacteristics)) {
  1568.                     $cvIds = [];
  1569.                     foreach ($params as $vcUrl => $true) {
  1570.                         $cValue $this->em->getRepository(CharacteristicValue::class)->findOneBy(['url' => $vcUrl'characteristic' => (int)$cId]);
  1571.                         if ($cValue) {
  1572.                             $cvIds[] = $cValue->getId();
  1573.                         }
  1574.                     }
  1575.                     if (!empty($cvIds)) {
  1576.                         $query->andWhere($alias '.characteristic = :' $fKey)
  1577.                             ->setParameter($fKey$cId);
  1578.                         $query->andWhere($alias '.characteristic_value IN (:' $tKey ')')
  1579.                             ->setParameter($tKey$cvIds);
  1580.                     }
  1581.                 } else {
  1582.                     $localeValue 'value_' $routeParams['_locale'];
  1583.                     if (!empty($params['from']) && $params['from'] > 0) {
  1584.                         $query->andWhere($alias '.characteristic = :' $fKey ' AND INT(' $alias '.' $localeValue ') >= :from')
  1585.                             ->setParameter($fKey$cId)
  1586.                             ->setParameter('from'$params['from']);
  1587.                     }
  1588.                     if (!empty($params['to']) && $params['to'] > 0) {
  1589.                         $query->andWhere($alias '.characteristic = :' $fKey ' AND INT(' $alias '.' $localeValue ') <= :to')
  1590.                             ->setParameter($fKey$cId)
  1591.                             ->setParameter('to'$params['to']);
  1592.                     }
  1593.                 }
  1594.             }
  1595.         }
  1596.         $allResult $query->getQuery()->getResult();
  1597.         $totalCount count($allResult);
  1598.         unset($allResult);
  1599.         $limit $pageLimit;
  1600.         $page $searchParams['page'] ?? 1;
  1601.         $start = ($page 1) * $limit;
  1602.         $query
  1603.             ->groupBy('cis');
  1604.         if (isset($searchParams['sortOrder'])) {
  1605.             $sortData explode('-'$searchParams['sortOrder']);
  1606.             $sortField $sortData[0] ?? 'price';
  1607.             $sortAD = isset($sortData[1]) && in_array($sortData[1], ['ASC''DESC']) ? $sortData[1] : 'ASC';
  1608.             switch ($sortField) {
  1609.                 case 'price':
  1610.                     $field $sortAD == 'DESC' 'price' 'orderPrice';
  1611.                     $query->orderBy($field$sortAD);
  1612.                     $query->addOrderBy('b.name''ASC');
  1613.                     $query->addOrderBy('m.title''ASC');
  1614.                     break;
  1615.                 case 'year':
  1616.                     $query->orderBy('vi.year'$sortAD);
  1617.                     $query->addOrderBy('b.name''ASC');
  1618.                     $query->addOrderBy('m.title''ASC');
  1619.                     break;
  1620.                 case 'mileage':
  1621.                     $query->orderBy('vi.mileage'$sortAD);
  1622.                     $query->addOrderBy('b.name''ASC');
  1623.                     $query->addOrderBy('m.title''ASC');
  1624.                     break;
  1625.                 default:
  1626.                     $query->orderBy('orderPrice''ASC');
  1627.                     $query->addOrderBy('b.name''ASC');
  1628.                     $query->addOrderBy('m.title''ASC');
  1629.                     break;
  1630.             }
  1631.         } else {
  1632.             $query->orderBy('orderPrice''ASC');
  1633.         }
  1634.         $query->setFirstResult($start)
  1635.             ->setMaxResults($limit);
  1636.         return [
  1637.             'count' => $totalCount,
  1638.             'data' => $query->getQuery()->getResult()
  1639.         ];
  1640.     }
  1641.     public function noFindVehicleByParams($routeParams$searchParams$pageLimit 21)
  1642.     {
  1643.         $typeData VehicleType::getTypeDataByUrl($routeParams['type']);
  1644.         $isUsed $routeParams['state'] == 'all' false : ($routeParams['state'] == 'new' 1);
  1645.         $query $this->em->getRepository(VehicleItem::class)
  1646.             ->createQueryBuilder('vi')
  1647.             ->select('vi',
  1648.                 'case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end as price',
  1649.                 'case when (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) = 0 then 9999999999 else (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) end as orderPrice')
  1650.             ->join('vi.variation''v')
  1651.             ->join('v.vehicle''ve'Join::WITH've.is_used = :is_used')->setParameter('is_used'$isUsed);
  1652.         if (isset($searchParams['inStock']) && $searchParams['inStock'] === 'true') {
  1653.             $query->join('vi.vehicleInStock''vis');
  1654.         }
  1655.         $query->join('ve.dealer''d')
  1656.             ->andWhere('ve.vehicle_type = :type')
  1657.             ->andWhere('vi.state = 1')
  1658.             ->andWhere('ve.state = 1')
  1659.             ->andWhere('ve.is_not_filled = 0')
  1660.             ->andWhere('ve.is_delete != 1')
  1661.             ->setParameter('type'$typeData['id'])
  1662.             ->orderBy('v.id''DESC')
  1663.             ->setMaxResults($pageLimit);
  1664.         return [
  1665.             'count' => 0,
  1666.             'data' => $query->getQuery()->getResult()
  1667.         ];
  1668.     }
  1669.     public function noFindStockVehicleByParams($routeParams$searchParams$pageLimit 21)
  1670.     {
  1671.         $typeData VehicleType::getTypeDataByUrl($routeParams['type']);
  1672.         $isUsed $routeParams['state'] == 'all' false : ($routeParams['state'] == 'new' 1);
  1673.         $query $this->em->getRepository(InStock::class)
  1674.             ->createQueryBuilder('cis')
  1675.             ->select('cis',
  1676.                 'vi',
  1677.                 '(CASE
  1678.                             WHEN cis.action_price > 0 THEN cis.action_price
  1679.                             WHEN cis.action_price_usd > 0 THEN
  1680.                                 (CASE
  1681.                                     WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  1682.                                     ELSE cis.action_price_usd * d.rate
  1683.                                 END)
  1684.                             WHEN vi.alt_price > 0 THEN vi.alt_price
  1685.                             ELSE
  1686.                                 (CASE
  1687.                                     WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  1688.                                     ELSE vi.price * d.rate
  1689.                                 END)
  1690.                         END) + COALESCE(cis.add_cost, 0) AS price',
  1691.                 '(CASE
  1692.                         WHEN (CASE
  1693.                                 WHEN cis.action_price > 0 THEN cis.action_price
  1694.                                 WHEN cis.action_price_usd > 0 THEN
  1695.                                     (CASE
  1696.                                         WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  1697.                                         ELSE cis.action_price_usd * d.rate
  1698.                                     END)
  1699.                                 WHEN vi.alt_price > 0 THEN vi.alt_price
  1700.                                 ELSE
  1701.                                     (CASE
  1702.                                         WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  1703.                                         ELSE vi.price * d.rate
  1704.                                     END)
  1705.                             END + COALESCE(cis.add_cost, 0)) = 0 THEN 9999999999
  1706.                         ELSE
  1707.                             (CASE
  1708.                                 WHEN cis.action_price > 0 THEN cis.action_price
  1709.                                 WHEN cis.action_price_usd > 0 THEN
  1710.                                     (CASE
  1711.                                         WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  1712.                                         ELSE cis.action_price_usd * d.rate
  1713.                                     END)
  1714.                                 WHEN vi.alt_price > 0 THEN vi.alt_price
  1715.                                 ELSE
  1716.                                     (CASE
  1717.                                         WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  1718.                                         ELSE vi.price * d.rate
  1719.                                     END)
  1720.                             END + COALESCE(cis.add_cost, 0))
  1721.                     END) AS orderPrice')
  1722.             ->innerJoin('cis.vehicle_item''vi')
  1723.             ->innerJoin('vi.variation''v')
  1724.             ->innerJoin('vi.equipment''e')
  1725.             ->innerJoin('vi.vehicle''vehicle')
  1726.             ->join('vehicle.dealer''d')
  1727.             ->where('cis.state = 1 and cis.is_delete != 1')
  1728.             ->andWhere('vehicle.is_delete != 1')
  1729.             ->andWhere('vehicle.is_delete != 1')
  1730.             ->andWhere('vehicle.state = 1')
  1731.             ->orderBy('v.id''DESC')
  1732.             ->setMaxResults($pageLimit);
  1733.         return [
  1734.             'count' => 0,
  1735.             'data' => $query->getQuery()->getResult()
  1736.         ];
  1737.     }
  1738.     public function findModelByParams($urlBrands null$urlModels null)
  1739.     {
  1740.         $filterBrands $this->em->getRepository(Brand::class)->getBrandsByUrl($urlBrands);
  1741.         $filterModelIds = [];
  1742.         /** @var Brand $brand */
  1743.         foreach ($filterBrands as $brand) {
  1744.             $models = [];
  1745.             $modelSearch = [];
  1746.             /** @var Model $model */
  1747.             foreach ($brand->getModels() as $model) {
  1748.                 if (!$model->getUrl()) {
  1749.                     continue;
  1750.                 }
  1751.                 if (in_array($model->getUrl(), $urlModels)) {
  1752.                     $modelSearch[] = $model->getId();
  1753.                 }
  1754.                 $models[] = $model->getId();
  1755.             }
  1756.             $filterModelIds = (empty($modelSearch)) ? array_merge($filterModelIds$models) : array_merge($filterModelIds$modelSearch);
  1757.         }
  1758.         return $filterModelIds;
  1759.     }
  1760.     public function getCharacteristicsByParams($typeBrand $brand nullModel $model null$isUsed)
  1761.     {
  1762.         $query $this->em->getRepository(VariationCharacteristic::class)
  1763.             ->createQueryBuilder('vc')
  1764.             ->select('c.id''c.title_ua''c.title_ru''cv.url''cv.value_ua''cv.value_ru')
  1765.             ->join('vc.characteristic_value''cv')
  1766.             ->join('vc.characteristic''c'Join::WITH'c.vehicle_type = :type')->setParameter('type'$type)
  1767.             ->join('vc.variation''v'Join::WITH'v.state = 1')
  1768.             ->where('c.in_filter = 1');
  1769.         if ($isUsed !== false) {
  1770.             $query
  1771.                 ->join('v.vehicle''ve'Join::WITH've.state = 1 AND ve.is_delete <> 1 AND ve.is_used = :is_used')
  1772.                 ->join('ve.model''m')
  1773.                 ->setParameter('is_used'$isUsed);
  1774.         } else {
  1775.             $query
  1776.                 ->join('v.vehicle''ve'Join::WITH've.state = 1 AND ve.is_delete <> 1')
  1777.                 ->join('ve.model''m');
  1778.         }
  1779.         if ($brand) {
  1780.             $query
  1781.                 ->join('m.brand''b')
  1782.                 ->andWhere('b.id = :brand')
  1783.                 ->setParameter('brand'$brand->getId());
  1784.         }
  1785.         if ($model) {
  1786.             $query->andWhere('m.id = :model')->setParameter('model'$model->getId());
  1787.         }
  1788.         $query->groupBy('cv''c');
  1789.         $characteristics $query->getQuery()->getResult();
  1790.         $result = [];
  1791.         foreach ($characteristics as $row) {
  1792.             if (!isset($result[$row['id']])) {
  1793.                 $result[$row['id']] = [
  1794.                     'id' => $row['id'],
  1795.                     'title_ru' => $row['title_ru'],
  1796.                     'title_ua' => $row['title_ua'],
  1797.                     'values' => [],
  1798.                 ];
  1799.             }
  1800.             $result[$row['id']]['values'][] = [
  1801.                 'url' => $row['url'],
  1802.                 'value_ru' => $row['value_ru'],
  1803.                 'value_ua' => $row['value_ua'],
  1804.             ];
  1805.         }
  1806.         return $result;
  1807.     }
  1808.     public function buildFilters($routeParams$locale)
  1809.     {
  1810.         $brand = isset($routeParams['brand']) && $routeParams['brand'] != 'all' $this->em->getRepository(Brand::class)->findOneBy(['url' => $routeParams['brand']]) : null;
  1811.         $model = isset($routeParams['model']) && $brand $this->em->getRepository(Model::class)->findOneBy(['url' => $routeParams['model'], 'brand' => $brand'state' => true]) : null;
  1812.         $typeData VehicleType::getTypeDataByUrl($routeParams['type']);
  1813.         $isUsed $routeParams['state'] == 'all' false : ($routeParams['state'] == 'new'  1);
  1814.         $hasCredit filter_var($routeParams['credit'] ?? falseFILTER_VALIDATE_BOOLEAN);
  1815.         $vehicleTypes = [];
  1816.         foreach ($this->getActualTypes($isUsed$hasCredit$locale) as $oneType) {
  1817.             //Todo not exist template
  1818.             if ($oneType['url'] === 'special') {
  1819.                 continue;
  1820.             }
  1821.             $vehicleTypes[] = [
  1822.                 'url' => $oneType['url'],
  1823.                 'title' => $oneType['title'],
  1824.             ];
  1825.         }
  1826.         $filters = [
  1827.             'types' => $vehicleTypes,
  1828.             'dynamic' => [],
  1829.             'group' => [],
  1830.             'brand' => [],
  1831.         ];
  1832.         $query $this->em->getRepository(VariationCharacteristic::class)
  1833.             ->createQueryBuilder('vc')
  1834.             ->select('c.id''c.title_ua''c.title_ru''cv.url''cv.value_ua''cv.value_ru')
  1835.             ->leftJoin('vc.characteristic_value''cv')
  1836.             ->join('vc.characteristic''c'Join::WITH'c.vehicle_type = :type')
  1837.             ->setParameter('type'$typeData['id'])
  1838.             ->join('vc.variation''v'Join::WITH'v.state = 1')
  1839.             ->where('c.in_filter = 1');
  1840.         if ($isUsed !== false) {
  1841.             $query
  1842.                 ->join('v.vehicle''ve'Join::WITH've.state = 1 AND ve.is_delete <> 1 AND ve.is_used = :is_used')
  1843.                 ->setParameter('is_used'$isUsed);
  1844.         } else {
  1845.             $query
  1846.                 ->join('v.vehicle''ve'Join::WITH've.state = 1 AND ve.is_delete <> 1');
  1847.         }
  1848.         if ($model) {
  1849.             $query
  1850.                 ->join('ve.model''m')
  1851.                 ->andWhere('m.id = :model')
  1852.                 ->setParameter('model'$model->getId());
  1853.         }
  1854.         if ($brand && !$model) {
  1855.             $query
  1856.                 ->join('ve.model''m')
  1857.                 ->join('m.brand''b')
  1858.                 ->andWhere('b.id = :brand')
  1859.                 ->setParameter('brand'$brand->getId());
  1860.         }
  1861.         $query->orderBy('cv.position');
  1862.         if($locale == 'ru'){
  1863.             $query->addOrderBy('cv.value_ru');
  1864.         }else{
  1865.             $query->addOrderBy('cv.value_ua');
  1866.         }
  1867.         $query->groupBy('cv''c');
  1868.         $result $query->getQuery()->getResult();
  1869.         foreach ($result as $row) {
  1870.             if (!isset($filters['dynamic'][$row['id']])) {
  1871.                 $filters['dynamic'][$row['id']] = [
  1872.                     'id' => $row['id'],
  1873.                     'title' => $locale == 'ru' $row['title_ru'] : $row['title_ua'],
  1874.                     'values' => [],
  1875.                 ];
  1876.             }
  1877.             if (isset($row['url'])) {
  1878.                 $filters['dynamic'][$row['id']]['values'][] = [
  1879.                     'url' => $row['url'],
  1880.                     'value' => $locale == 'ru' $row['value_ru'] : $row['value_ua'],
  1881.                 ];
  1882.             } else {
  1883.                 $filters['dynamic'][$row['id']]['values'] = null;
  1884.             }
  1885.         }
  1886.         $query $this->em->getRepository(RecommendGroup::class)
  1887.             ->createQueryBuilder('rg')
  1888.             ->join('rg.vehicles''v')
  1889.             ->where('rg.state = :state')->setParameter('state'true)
  1890.             ->andWhere('v.vehicle_type = :type')->setParameter('type'$typeData['id'])
  1891.             ->andWhere('v.state = 1 AND v.is_delete <> 1');
  1892.             if ($isUsed !== false) {
  1893.                 $query->andWhere('v.is_used = :is_used')->setParameter('is_used'$isUsed);
  1894.             }
  1895.         if ($model) {
  1896.             $query
  1897.                 ->join('v.model''m')
  1898.                 ->andWhere('m.id = :model')
  1899.                 ->setParameter('model'$model->getId());
  1900.         }
  1901.         if ($brand && !$model) {
  1902.             $query
  1903.                 ->join('v.model''m')
  1904.                 ->join('m.brand''b')
  1905.                 ->andWhere('b.id = :brand')
  1906.                 ->setParameter('brand'$brand->getId());
  1907.         }
  1908.         $query->orderBy('rg.position');
  1909.         $recommendGroup $query->getQuery()->getResult();
  1910.         /** @var RecommendGroup $group */
  1911.         foreach ($recommendGroup as $group) {
  1912.             if ($group->getUrl()) {
  1913.                 $filters['group'][] = [
  1914.                     'url' => $group->getUrl(),
  1915.                     'title' => $locale == 'ru' $group->getTitleRu() : $group->getTitleUa(),
  1916.                 ];
  1917.             } else {
  1918.                 $filters['group'] = null;
  1919.             }
  1920.         }
  1921.         $query $this->em->getRepository(Vehicle::class)
  1922.             ->createQueryBuilder('v')
  1923.             ->select('b.url as burl''b.name''m.id''m.url''m.title''logo.id as logo_id')
  1924.             ->join('v.model''m')
  1925.             ->join('m.brand''b')
  1926.             ->join('b.logo''logo')
  1927.             ->where('v.vehicle_type = :type')
  1928.             ->andWhere('v.state = 1')
  1929.             ->andWhere('v.is_delete != 1')
  1930.             ->setParameter('type'$typeData['id']);
  1931.         if ($isUsed !== false) {
  1932.             $query->andWhere('v.is_used = :is_used')
  1933.                 ->setParameter('is_used'$isUsed);
  1934.         }
  1935.         $brands $query->getQuery()->getResult();
  1936.         foreach ($brands as $line) {
  1937.             if (!isset($filters['brand'][$line['burl']])) {
  1938.                 $logo $this->em->getRepository(Media::class)->find($line['logo_id']);
  1939.                 $filters['brand'][$line['burl']] = [
  1940.                     'url' => $line['burl'],
  1941.                     'title' => $line['name'],
  1942.                     'link' => $this->router->generate('portal_new_catalog_b', [
  1943.                         'state' => $routeParams['state'],
  1944.                         'type' => $typeData['url'],
  1945.                         'brand' => $line['burl'],
  1946.                     ]),
  1947.                     'logo' => $this->mediaExtension->getPath($logo'menu'),
  1948.                     'count' => 1,
  1949.                     'models' => [],
  1950.                 ];
  1951.             }
  1952.             $filters['brand'][$line['burl']]['count'] += 1;
  1953.             $filters['brand'][$line['burl']]['models'][$line['id']] = [
  1954.                 'url' => $line['url'],
  1955.                 'title' => $line['title'],
  1956.             ];
  1957.         }
  1958.         usort($filters['brand'], function ($a$b) {
  1959.             if ($a['title'] == $b['title']) {
  1960.                 return 1;
  1961.             }
  1962.             return $a['title'] > $b['title'] ? : -1;
  1963.         });
  1964.         return $filters;
  1965.     }
  1966.     public function buildStockFilters($routeParams$locale)
  1967.     {
  1968.         $brand = isset($routeParams['brand']) && $routeParams['brand'] != 'all' $this->em->getRepository(Brand::class)->findOneBy(['url' => $routeParams['brand']]) : null;
  1969.         $model = isset($routeParams['model']) && $brand $this->em->getRepository(Model::class)->findOneBy(['url' => $routeParams['model'], 'brand' => $brand'state' => true]) : null;
  1970.         $typeData VehicleType::getTypeDataByUrl($routeParams['type']);
  1971.         $filters = [
  1972.             'dynamic' => [],
  1973.             'group' => [],
  1974.             'brand' => [],
  1975.         ];
  1976.         $query $this->em->getRepository(VariationCharacteristic::class)
  1977.             ->createQueryBuilder('vc')
  1978.             ->select('c.id''c.title_ua''c.title_ru''cv.url''cv.value_ua''cv.value_ru')
  1979.             ->leftJoin('vc.characteristic_value''cv')
  1980.             ->join('vc.characteristic''c'Join::WITH'c.vehicle_type = :type')
  1981.             ->setParameter('type'$typeData['id'])
  1982.             ->join('vc.variation''v'Join::WITH'v.state = 1')
  1983.             ->where('c.in_filter = 1')
  1984.             ->leftJoin('v.vehicle_items''vi')
  1985.             ->leftJoin('vi.vehicleInStock''cis')
  1986.             ->andWhere('cis.state = 1 and cis.is_delete != 1');
  1987.         $query
  1988.             ->join('v.vehicle''ve'Join::WITH've.state = 1 AND ve.is_delete != 1');
  1989.         if ($model) {
  1990.             $query
  1991.                 ->join('ve.model''m')
  1992.                 ->andWhere('m.id = :model')
  1993.                 ->setParameter('model'$model->getId());
  1994.         }
  1995.         if ($brand && !$model) {
  1996.             $query
  1997.                 ->join('ve.model''m')
  1998.                 ->join('m.brand''b')
  1999.                 ->andWhere('b.id = :brand')
  2000.                 ->setParameter('brand'$brand->getId());
  2001.         }
  2002.         $query->orderBy('cv.position');
  2003.         if($locale == 'ru'){
  2004.             $query->addOrderBy('cv.value_ru');
  2005.         }else{
  2006.             $query->addOrderBy('cv.value_ua');
  2007.         }
  2008.         $query->groupBy('cv''c');
  2009.         $result $query->getQuery()->getResult();
  2010.         foreach ($result as $row) {
  2011.             if (!isset($filters['dynamic'][$row['id']])) {
  2012.                 $filters['dynamic'][$row['id']] = [
  2013.                     'id' => $row['id'],
  2014.                     'title' => $locale == 'ru' $row['title_ru'] : $row['title_ua'],
  2015.                     'values' => [],
  2016.                 ];
  2017.             }
  2018.             if (isset($row['url'])) {
  2019.                 $filters['dynamic'][$row['id']]['values'][] = [
  2020.                     'url' => $row['url'],
  2021.                     'value' => $locale == 'ru' $row['value_ru'] : $row['value_ua'],
  2022.                 ];
  2023.             } else {
  2024.                 $filters['dynamic'][$row['id']]['values'] = null;
  2025.             }
  2026.         }
  2027.         $query $this->em->getRepository(RecommendGroup::class)
  2028.             ->createQueryBuilder('rg')
  2029.             ->join('rg.vehicles''v')
  2030.             ->where('rg.state = :state')->setParameter('state'true)
  2031.             ->andWhere('v.vehicle_type = :type')->setParameter('type'$typeData['id'])
  2032.             ->andWhere('v.state = 1 AND v.is_delete != 1');
  2033.         if ($model) {
  2034.             $query
  2035.                 ->join('v.model''m')
  2036.                 ->andWhere('m.id = :model')
  2037.                 ->setParameter('model'$model->getId());
  2038.         }
  2039.         if ($brand && !$model) {
  2040.             $query
  2041.                 ->join('v.model''m')
  2042.                 ->join('m.brand''b')
  2043.                 ->andWhere('b.id = :brand')
  2044.                 ->setParameter('brand'$brand->getId());
  2045.         }
  2046.         $query->orderBy('rg.position');
  2047.         $recommendGroup $query->getQuery()->getResult();
  2048.         /** @var RecommendGroup $group */
  2049.         foreach ($recommendGroup as $group) {
  2050.             if ($group->getUrl()) {
  2051.                 $filters['group'][] = [
  2052.                     'url' => $group->getUrl(),
  2053.                     'title' => $locale == 'ru' $group->getTitleRu() : $group->getTitleUa(),
  2054.                 ];
  2055.             } else {
  2056.                 $filters['group'] = null;
  2057.             }
  2058.         }
  2059.         $query $this->em->getRepository(InStock::class)
  2060.             ->createQueryBuilder('cis')
  2061.             ->select('b.url as burl''b.name ''m.id ''m.url''m.title''logo.id as logo_id')
  2062.             ->innerJoin('cis.vehicle_item''vi')
  2063.             ->innerJoin('vi.variation''v')
  2064.             ->innerJoin('vi.vehicle''vehicle')
  2065.             ->join('vehicle.model''m')
  2066.             ->join('m.brand''b')
  2067.             ->join('b.logo''logo')
  2068.             ->where('cis.state = 1')
  2069.             ->andWhere('cis.is_delete != 1')
  2070.             ->andWhere('vehicle.is_delete != 1')
  2071.             ->andWhere('vehicle.state = 1');
  2072.         $brands $query->getQuery()->getResult();
  2073.         foreach ($brands as $line) {
  2074.             if (!isset($filters['brand'][$line['burl']])) {
  2075.                 $logo $this->em->getRepository(Media::class)->find($line['logo_id']);
  2076.                 $filters['brand'][$line['burl']] = [
  2077.                     'url' => $line['burl'],
  2078.                     'title' => $line['name'],
  2079.                     'link' => $this->router->generate('portal_in_stock_filter_catalog', [
  2080.                         'state' => $routeParams['state'],
  2081.                         'type' => $typeData['url'],
  2082.                         'brand' => $line['burl'],
  2083.                     ]),
  2084.                     'logo' => $this->mediaExtension->getPath($logo'menu'),
  2085.                     'count' => 1,
  2086.                     'models' => [],
  2087.                 ];
  2088.             }
  2089.             $filters['brand'][$line['burl']]['count'] += 1;
  2090.             $filters['brand'][$line['burl']]['models'][$line['id']] = [
  2091.                 'url' => $line['url'],
  2092.                 'title' => $line['title'],
  2093.             ];
  2094.         }
  2095.         usort($filters['brand'], function ($a$b) {
  2096.             if ($a['title'] == $b['title']) {
  2097.                 return 1;
  2098.             }
  2099.             return $a['title'] > $b['title'] ? : -1;
  2100.         });
  2101.         return $filters;
  2102.     }
  2103.     public function getCatalogCharacteristicsId(): array
  2104.     {
  2105.         $result $this->em->getRepository(CharacteristicValue::class)->createQueryBuilder('cv')
  2106.             ->join('cv.characteristic''c')
  2107.             ->select('c.id')
  2108.             ->distinct()
  2109.             ->getQuery()->getResult();
  2110.         return array_column($result'id');
  2111.     }
  2112.     public function getCharacteristicsByType($type$vehicleType$locale)
  2113.     {
  2114.         $characteristics $this->em->getRepository(Characteristic::class)->findBy([
  2115.             'characteristic_type' => $type,
  2116.             'vehicle_type' => $vehicleType,
  2117.             'in_filter' => 1,
  2118.         ]);
  2119.         $result = [];
  2120.         foreach ($characteristics as $item) {
  2121.             $result[$item->getId()] = [
  2122.                 'id' => $item->getId(),
  2123.                 'title' => $item->getTitle($locale),
  2124.             ];
  2125.         }
  2126.         return $result;
  2127.     }
  2128.     public function getYearsOfProductionFromUsedVehicles($locale)
  2129.     {
  2130.         $years $this->em->getRepository(VehicleItem::class)->createQueryBuilder('vi')
  2131.             ->select('vi.year')
  2132.             ->join('vi.vehicle''vehicle')
  2133.             ->where('vehicle.is_used = 1')
  2134.             ->andWhere('vehicle.state = 1')
  2135.             ->groupBy('vi.year')
  2136.             ->orderBy('vi.year''DESC')
  2137.             ->getQuery()->getResult();
  2138.         $title $locale == 'ua' 'Рік випуску' 'Год выпуска';
  2139.         $result = [SeoMetaTag::YEARS_PARAMETER => ['title' => $title'links' => []]];
  2140.         foreach ($years as $year) {
  2141.             $result[SeoMetaTag::YEARS_PARAMETER]['links'][] = [
  2142.                 'url' => $year['year'],
  2143.                 'title' => $year['year'],
  2144.             ];
  2145.         }
  2146.         return $result;
  2147.     }
  2148.     public function findStockVehiclesSiteMap()
  2149.     {
  2150.         $vehicleTypes = [VehicleType::PASSENGER_TYPEVehicleType::BUS_TYPE];
  2151.         $query $this->em->getRepository(\CoreBundle\Entity\Vehicles\InStock::class)
  2152.             ->createQueryBuilder('cis')
  2153.             ->select('cis',
  2154.                 'vi',
  2155.                 '(CASE
  2156.                             WHEN cis.action_price > 0 THEN cis.action_price
  2157.                             WHEN cis.action_price_usd > 0 THEN
  2158.                                 (CASE
  2159.                                     WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  2160.                                     ELSE cis.action_price_usd * d.rate
  2161.                                 END)
  2162.                             WHEN vi.alt_price > 0 THEN vi.alt_price
  2163.                             ELSE
  2164.                                 (CASE
  2165.                                     WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  2166.                                     ELSE vi.price * d.rate
  2167.                                 END)
  2168.                         END) + COALESCE(cis.add_cost, 0) AS price',
  2169.                 '(CASE
  2170.                         WHEN (CASE
  2171.                                 WHEN cis.action_price > 0 THEN cis.action_price
  2172.                                 WHEN cis.action_price_usd > 0 THEN
  2173.                                     (CASE
  2174.                                         WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  2175.                                         ELSE cis.action_price_usd * d.rate
  2176.                                     END)
  2177.                                 WHEN vi.alt_price > 0 THEN vi.alt_price
  2178.                                 ELSE
  2179.                                     (CASE
  2180.                                         WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  2181.                                         ELSE vi.price * d.rate
  2182.                                     END)
  2183.                             END + COALESCE(cis.add_cost, 0)) = 0 THEN 9999999999
  2184.                         ELSE
  2185.                             (CASE
  2186.                                 WHEN cis.action_price > 0 THEN cis.action_price
  2187.                                 WHEN cis.action_price_usd > 0 THEN
  2188.                                     (CASE
  2189.                                         WHEN vi.alt_rate > 0 THEN cis.action_price_usd * vi.alt_rate
  2190.                                         ELSE cis.action_price_usd * d.rate
  2191.                                     END)
  2192.                                 WHEN vi.alt_price > 0 THEN vi.alt_price
  2193.                                 ELSE
  2194.                                     (CASE
  2195.                                         WHEN vi.alt_rate > 0 THEN vi.price * vi.alt_rate
  2196.                                         ELSE vi.price * d.rate
  2197.                                     END)
  2198.                             END + COALESCE(cis.add_cost, 0))
  2199.                     END) AS orderPrice')
  2200.             ->innerJoin('cis.vehicle_item''vi')
  2201.             ->innerJoin('vi.variation''v')
  2202.             ->innerJoin('v.characteristics''vc')
  2203.             ->innerJoin('vc.characteristic_value''vcv')
  2204.             ->innerJoin('vi.equipment''e')
  2205.             ->innerJoin('vi.vehicle''vehicle')
  2206.             ->join('vehicle.dealer''d')
  2207.             ->join('vehicle.model''m')
  2208.             ->join('m.brand''b')
  2209.             ->where('cis.state = 1 and cis.is_delete != 1')
  2210.             ->andWhere('vehicle.is_delete != 1')
  2211.             ->andWhere('vehicle.is_delete != 1')
  2212.             ->andWhere('vehicle.vehicle_type IN (:vehicle_type)')
  2213.             ->setParameter('vehicle_type'$vehicleTypes)
  2214.             ->andWhere('vehicle.state = 1');
  2215.         $vehicles $query->getQuery()->getResult();
  2216.         foreach ($vehicles as $vehicle) {
  2217.             $inStockModel $this->vehicleInStockFactory->createByEntity($vehicle[0]);
  2218.             $result[] = $inStockModel;
  2219.         }
  2220.         return $result;
  2221.     }
  2222.     public function findUsedVehiclesSiteMap()
  2223.     {
  2224.         $typeData VehicleType::getTypeDataByUrl('car');
  2225.         $query $this->em->getRepository(\CoreBundle\Entity\Vehicles\VehicleItem::class)
  2226.             ->createQueryBuilder('vi')
  2227.             ->select('vi',
  2228.                 'case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end as price',
  2229.                 'case when (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) = 0 then 9999999999 else (case when (ve.is_used = 0 OR d.id != 6) then (case when vi.alt_price > 0 then vi.alt_price else (case when vi.alt_rate > 0  then vi.alt_rate * vi.price else vi.price * d.rate end) end) else (case when vi.alt_price > 0 then vi.alt_price else vi.price end) end) end as orderPrice')
  2230.             ->join('vi.variation''v');
  2231.         if (isset($searchParams['inStock']) && $searchParams['inStock'] === 'true') {
  2232.             $query->join('vi.vehicleInStock''vis');
  2233.         }
  2234.         $query->join('v.vehicle''ve')
  2235.             ->join('ve.dealer''d')
  2236.             ->join('ve.model''m')
  2237.             ->join('m.brand''b')
  2238.             ->leftJoin('ve.recommend_group''rg')
  2239.             ->where('ve.vehicle_type = :type')
  2240.             ->andWhere('vi.state = 1')
  2241.             ->andWhere('ve.state = 1')
  2242.             ->andWhere('ve.is_not_filled = 0')
  2243.             ->andWhere('ve.is_delete != 1')
  2244.             ->andWhere('vi.sold != 1')
  2245.             ->setParameter('type'$typeData['id']);
  2246.             $mounthAgo = (new DateTime())->modify('-30 days');
  2247.             $query->andWhere('ve.is_used = :is_used')
  2248.                 ->setParameter('is_used'1)
  2249.                 ->andWhere('vi.date_of_sale > :mounthAgo OR vi.date_of_sale IS NULL')
  2250.                 ->setParameter('mounthAgo'$mounthAgo);
  2251.         $vehicles $query->getQuery()->getResult();
  2252.         foreach ($vehicles as $vehicle) {
  2253.              $usedModel $this->vehicleFactory->createByEntity($vehicle[0]->getVehicle());
  2254.             $result[] = $usedModel;
  2255.         }
  2256.         return $result;
  2257.     }
  2258.     public function findStockVehiclesRss(Dealer $dealer)
  2259.     {
  2260.         $vehicleTypes = [VehicleType::PASSENGER_TYPEVehicleType::BUS_TYPE];
  2261.         $mounthAgo = (new DateTime())->modify('-30 days');
  2262.         $query $this->em->getRepository(InStock::class)
  2263.             ->createQueryBuilder('cis')
  2264.             ->select('cis''vi')
  2265.             ->innerJoin('cis.vehicle_item''vi')
  2266.             ->innerJoin('vi.variation''v')
  2267.             ->innerJoin('v.characteristics''vc')
  2268.             ->innerJoin('vc.characteristic_value''vcv')
  2269.             ->innerJoin('vi.equipment''e')
  2270.             ->innerJoin('vi.vehicle''vehicle')
  2271.             ->join('vehicle.dealer''d')
  2272.             ->join('vehicle.model''m')
  2273.             ->join('m.brand''b')
  2274.             ->where('cis.state = 1 and cis.is_delete != 1')
  2275.             ->andWhere('vehicle.is_delete != 1')
  2276.             ->andWhere('vehicle.is_delete != 1')
  2277.             ->andWhere('vehicle.vehicle_type IN (:vehicle_type)')
  2278.             ->andWhere('vehicle.date_create <= :mounthAgo')
  2279.             ->andWhere('d.id = :dealer')
  2280.             ->setParameter('dealer'$dealer)
  2281.             ->setParameter('vehicle_type'$vehicleTypes)
  2282.             ->setParameter('mounthAgo'$mounthAgo)
  2283.             ->andWhere('vehicle.state = 1');
  2284.         $vehicles $query->getQuery()->getResult();
  2285.         foreach ($vehicles as $vehicle) {
  2286.             $inStockModel $this->vehicleInStockFactory->createByEntity($vehicle);
  2287.             $result[] = $inStockModel;
  2288.         }
  2289.         return $result;
  2290.     }
  2291.     public function findUsedVehiclesRss(Dealer $dealer)
  2292.     {
  2293.         $typeData VehicleType::getTypeDataByUrl('car');
  2294.         $mounthAgo = (new DateTime())->modify('-30 days');
  2295.         $query $this->em->getRepository(VehicleItem::class)
  2296.             ->createQueryBuilder('vi')
  2297.             ->select('vi')
  2298.             ->join('vi.variation''v');
  2299.         if (isset($searchParams['inStock']) && $searchParams['inStock'] === 'true') {
  2300.             $query->join('vi.vehicleInStock''vis');
  2301.         }
  2302.         $query->join('v.vehicle''ve')
  2303.             ->join('ve.dealer''d')
  2304.             ->join('ve.model''m')
  2305.             ->join('m.brand''b')
  2306.             ->leftJoin('ve.recommend_group''rg')
  2307.             ->where('ve.vehicle_type = :type')
  2308.             ->andWhere('vi.state = 1')
  2309.             ->andWhere('ve.state = 1')
  2310.             ->andWhere('ve.is_not_filled = 0')
  2311.             ->andWhere('ve.is_delete != 1')
  2312.             ->andWhere('vi.sold != 1')
  2313.             ->andWhere('ve.ria_publication_date <= :monthAgo' )
  2314.             ->setParameter('monthAgo'$mounthAgo)
  2315.             ->setParameter('type'$typeData['id']);
  2316.         $query->andWhere('d.id = :dealer')
  2317.             ->setParameter('dealer'$dealer);
  2318.         $vehicles $query->getQuery()->getResult();
  2319.         foreach ($vehicles as $vehicle) {
  2320.             $usedModel $this->vehicleFactory->createByEntity($vehicle->getVehicle());
  2321.             $result[] = $usedModel;
  2322.         }
  2323.         return $result;
  2324.     }
  2325. }