src/AutomarketBundle/Services/CatalogService.php line 853

Open in your IDE?
  1. <?php
  2. namespace AutomarketBundle\Services;
  3. use CoreBundle\Entity\Brand;
  4. use CoreBundle\Entity\Dealer;
  5. use CoreBundle\Entity\Featured;
  6. use CoreBundle\Entity\Model;
  7. use CoreBundle\Entity\Vehicles\RecommendGroup;
  8. use CoreBundle\Entity\Vehicles\VariationCharacteristic;
  9. use CoreBundle\Entity\Vehicles\Vehicle;
  10. use CoreBundle\Entity\Vehicles\VehicleItem;
  11. use CoreBundle\Model\Vehicles\VehicleType;
  12. use CoreBundle\Services\ImageProviderVidi;
  13. use CoreBundle\Services\MediaExtensionVidi;
  14. use CoreBundle\Factory\Vehicle as VehicleFactory;
  15. use DateTime;
  16. use DcSiteBundle\Model\CreditModel;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Doctrine\ORM\Query\Expr\Join;
  19. use Exception;
  20. use PortalBundle\Model\Catalog;
  21. use Symfony\Bundle\FrameworkBundle\Routing\Router;
  22. use Symfony\Component\HttpFoundation\RequestStack;
  23. use Symfony\Component\Routing\RouterInterface;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. class CatalogService
  26. {
  27.     private RouterInterface $router;
  28.     private MediaExtensionVidi $media;
  29.     private TranslatorInterface $translator;
  30.     private EntityManagerInterface $em;
  31.     private RequestStack $requestStack;
  32.     private VehicleFactory $coreFactoryVehicle;
  33.     private CreditModel $creditModel;
  34.     public function __constructMediaExtensionVidi $mediaRouterInterface $routerTranslatorInterface $translator,
  35.                                  EntityManagerInterface $emRequestStack $requestStackVehicleFactory $coreFactoryVehicle,
  36.                                  CreditModel $creditModel)
  37.     {
  38.         $this->media $media;
  39.         $this->router $router;
  40.         $this->translator $translator;
  41.         $this->em $em;
  42.         $this->requestStack $requestStack;
  43.         $this->coreFactoryVehicle $coreFactoryVehicle;
  44.         $this->creditModel $creditModel;
  45.     }
  46.     /**
  47.      * Фільтр
  48.      *
  49.      * @return array
  50.      */
  51.     public function initSearch ()
  52.     {
  53.         $request $this->requestStack->getCurrentRequest();
  54.     }
  55.     public function getVehicleType()
  56.     {
  57.         $request $this->requestStack->getCurrentRequest();
  58.         $vehicleTypeData VehicleType::getTypeDataByUrl($request->get('type') ?? 'car');
  59.         return $vehicleTypeData;
  60.     }
  61.     /**
  62.      * Отримати параметри для фільтра на головній
  63.      *
  64.      * @return array
  65.      */
  66.     public function getOnShowFilter()
  67.     {
  68.         $request $this->requestStack->getCurrentRequest();
  69.         $router $this->router;
  70.         /** @var Dealer $dealer */
  71.         $dealer $this->em->getRepository(Dealer::class)->find(6);
  72.         $brandId $request->get('brandId');
  73.         $modelId $request->get('modelId');
  74.         $minYear $request->get('minYear');
  75.         $maxYear $request->get('maxYear');
  76.         $minPrice $request->get('minPrice');
  77.         $maxPrice $request->get('maxPrice');
  78.         $paramRoute = [];
  79.         $responseData = [
  80.             'brands' => [],
  81.             'models' => [],
  82.             'years' => [],
  83.             'maxPrice' => null,
  84.             'countVehicle' => 0,
  85.         ];
  86.         $queryBuilder $this->em->getRepository(\CoreBundle\Entity\Vehicles\VehicleItem::class)
  87.             ->createQueryBuilder('vi')
  88.             ->addSelect('vi')
  89.             ->addSelect('CASE WHEN ( d.id in (32,33)) 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')
  90.             ->addSelect('vi.year AS year')
  91.             ->join('vi.vehicle','ve')
  92.             ->join('ve.model''m')
  93.             ->join('m.brand','b')
  94.             ->join('ve.dealer''d')
  95.             ->where('ve.vehicle_type = :type')->setParameter('type'1)
  96.             //  TODO Навіщо ми перевіряємо vehicleItem state на вживаних авто? У вживаного авто є всього 1 vehicleItem, і ми маємо відображати авто по vehicle state. Якщо все буде ок, повидаляти з усіх запитів
  97.             //  ->andWhere('vi.state = 1')
  98.             ->andWhere('vi.sold = :sold')->setParameter('sold'false)
  99.             ->andWhere('ve.state = 1')
  100.             ->andWhere('ve.is_not_filled = 0')
  101.             ->andWhere('ve.is_delete != 1')
  102.             ->andWhere('ve.is_used = :isUsed')->setParameter('isUsed'true);
  103.         if ($brandId) {
  104.             $queryBuilder->andWhere('b.id = :brandId')->setParameter('brandId'$brandId);
  105.         }
  106.         if ($modelId) {
  107.             $queryBuilder->andWhere('m.id = :modelId')->setParameter('modelId'$modelId);
  108.         }
  109.         if ($minPrice) {
  110.             $queryBuilder->andHaving('price >= :minPrice')->setParameter('minPrice'$minPrice $dealer->getRate());
  111.             $paramRoute['minPrice'] = $minPrice $dealer->getRate();
  112.         }
  113.         if ($maxPrice) {
  114.             $queryBuilder->andHaving('price <= :maxPrice')->setParameter('maxPrice'$maxPrice $dealer->getRate());
  115.             $paramRoute['maxPrice'] = $maxPrice $dealer->getRate();
  116.         }
  117.         if ($minYear) {
  118.             $queryBuilder->andHaving('vi.year >= :minYear')->setParameter('minYear'$minYear);
  119.             $paramRoute['minYear'] = $minYear;
  120.         }
  121.         if ($maxYear) {
  122.             $queryBuilder->andHaving('vi.year <= :maxYear')->setParameter('maxYear'$maxYear);
  123.             $paramRoute['maxYear'] = $maxYear;
  124.         }
  125.         $result $queryBuilder->getQuery()->getResult();
  126. //        /** @var VehicleItem $item */
  127. //        foreach ($result as $item){
  128. //            dump($item[0]->getVehicle()->getDealer());
  129. //            dump($item[]->getPrice());
  130. //            dump('----------');
  131. //        }
  132. //
  133. //        dump($result);exit;
  134.         if($result) {
  135.             $responseData['years'] = range(min(array_column($result'year')), max(array_column($result'year'))) ;
  136.             $responseData['countVehicle'] = count($result);
  137.             foreach ($result as $item) {
  138.                 /** @var Vehicle $vehicle */
  139.                 $vehicle $item[0]->getVehicle();
  140.                 $vBrand $vehicle->getModel()->getBrand();
  141.                 $vModel $vehicle->getModel();
  142.                 if (!isset($responseData['brands'][$vBrand->getId()])) {
  143.                     $responseData['brands'][$vBrand->getId()] = [
  144.                         'id' => $vBrand->getId(),
  145.                         'title' => $vBrand->getName(),
  146.                         'url' => $vBrand->getUrl()
  147.                     ];
  148.                 }
  149.                 if (!isset($responseData['models'][$vModel->getId()])) {
  150.                     $responseData['models'][$vModel->getId()] = [
  151.                         'id' => $vModel->getId(),
  152.                         'brandId' => $vBrand->getId(),
  153.                         'title' => $vModel->getTitle(),
  154.                         'url' => $vModel->getUrl()
  155.                     ];
  156.                 }
  157.             }
  158.             $maxPrice max(array_column($result'price'));
  159.             if($maxPrice 10) {
  160.                 $price intval(ceil($maxPrice));
  161.                 $shorNum intval('1' str_repeat('0'floor(log10($price))));
  162.                 $remainder $price $shorNum;
  163.                 $responseData['maxPrice'] = $price + ($shorNum $remainder);
  164.             }
  165.         }
  166.         if($brandId && isset($responseData['brands'][$brandId]['url'])) {
  167.             $brandUrl $responseData['brands'][$brandId]['url'];
  168.             $paramRoute['brand'][$brandUrl] = 'true';
  169.         }
  170.         if($modelId && isset($responseData['models'][$modelId]['url'])) {
  171.             $modelUrl $responseData['models'][$modelId]['url'];
  172.             $paramRoute['model'][$modelUrl] = 'true';
  173.         }
  174.         if($result && $responseData['countVehicle'] > && !empty($paramRoute)) {
  175.             $responseData['link'] = $router->generate('automarket_catalog_search'$paramRoute);
  176.         }else{
  177.             $responseData['link'] = $router->generate('automarket_catalog', ['state' => 'used''type' => 'car']);
  178.         }
  179.         return  $responseData;
  180.     }
  181.     public function getBrands($vehicleType)
  182.     {
  183.         $query $this->em->getRepository(\CoreBundle\Entity\Vehicles\Vehicle::class)
  184.             ->createQueryBuilder('v')
  185.             ->select('b.id''b.name''b.url')
  186.             ->join('v.model''m')
  187.             ->join('m.brand''b')
  188.             ->andWhere('v.state = :state')->setParameter('state'true)
  189.             ->andWhere('v.is_delete = :isDelete')->setParameter('isDelete'false)
  190.             ->andWhere('v.is_used = :isUsed')->setParameter('isUsed'true)
  191.             ->andWhere('v.vehicle_type = :type')->setParameter('type'$vehicleType);
  192.         $query->orderBy('b.name');
  193.         $query->groupBy('b.id');
  194.         return $query->getQuery()->getResult();
  195.     }
  196.     public function getModels($vehicleTypeBrand $brand null)
  197.     {
  198.         $query $this->em->getRepository(\CoreBundle\Entity\Vehicles\Vehicle::class)
  199.             ->createQueryBuilder('v')
  200.             ->select('m.id''m.title''m.url')
  201.             ->innerJoin('v.model''m')
  202.             ->innerJoin('m.brand''b')
  203.             ->andWhere('v.state = :state')->setParameter('state'true)
  204.             ->andWhere('v.is_delete = :isDelete')->setParameter('isDelete'false)
  205.             ->andWhere('v.is_used = :isUsed')->setParameter('isUsed'true)
  206.             ->andWhere('v.vehicle_type = :type')->setParameter('type'$vehicleType);
  207.         if ($brand) {
  208.             $query->andWhere('b.id = :brand')->setParameter('brand'$brand);
  209.         }
  210.         $query->orderBy('m.title');
  211.         $query->groupBy('m.id');
  212.         return $query->getQuery()->getResult();
  213.     }
  214.     public function getRecommendGroupByParams($vehicleType)
  215.     {
  216.         $request $this->requestStack->getCurrentRequest();
  217.         $locale $request->getLocale();
  218.         $query $this->em->getRepository(\CoreBundle\Entity\Vehicles\RecommendGroup::class)
  219.             ->createQueryBuilder('rg')
  220.             ->select('rg')
  221.             ->andWhere('rg.state = :rgState')
  222.             ->setParameter('rgState'true)
  223.             ->andWhere('rg.state_slider = :rgStateSlider')
  224.             ->setParameter('rgStateSlider'true);
  225.         $recommendGroup $query->getQuery()->getResult();
  226.         $result = [];
  227.         /** @var RecommendGroup $item */
  228.         foreach ($recommendGroup as $item) {
  229.             $result[$item->getUrl()] = $item->getTitle($locale);
  230.         }
  231.         return $result;
  232.     }
  233.     public function getCharacteristicsByParams($vehicleType$brand null$model null$vehicleIds = [])
  234.     {
  235.         $request $this->requestStack->getCurrentRequest();
  236.         $locale $request->getLocale();
  237.         $query $this->em->getRepository(\CoreBundle\Entity\Vehicles\VariationCharacteristic::class)
  238.             ->createQueryBuilder('vc');
  239.         if ($locale == 'ru') {
  240.             $query->select('cv.id''c.url AS cUrl''cv.url''cv.value_ru AS value');
  241.         } else {
  242.             $query->select('cv.id''c.url AS cUrl''cv.url''cv.value_ua AS value');
  243.         }
  244.         $query->join('vc.characteristic_value''cv')
  245.             ->join('vc.characteristic''c'Join::WITH'c.vehicle_type = :type')->setParameter('type'$vehicleType)
  246.             ->join('vc.variation''v'Join::WITH'v.state = 1')
  247.             ->join('v.vehicle''ve'Join::WITH've.state = 1 AND ve.is_delete <> 1 AND ve.is_used = :is_used')->setParameter('is_used'true)
  248.             ->join('ve.model''m')
  249.             ->join('m.brand''b');
  250.         if ($brand) {
  251.             $query->andWhere('b.url = :bUrl')->setParameter('bUrl'$brand->getUrl());
  252.         }
  253.         if ($model) {
  254.             $query->andWhere('m.url = :mUrl')->setParameter('mUrl'$model->getUrl());
  255.         }
  256.         if (!empty($vehicleIds)) {
  257.             $query->andWhere('ve.id IN (:vehicleIds)')
  258.                 ->setParameter('vehicleIds'$vehicleIds);
  259.         }
  260.         $query->groupBy('cv''c');
  261.         $characteristics $query->getQuery()->getResult();
  262.         $result = [];
  263.         foreach ($characteristics as $row) {
  264.             $result[$row['cUrl']][$row['url']] = $row['value'];
  265.         }
  266.         return $result;
  267.     }
  268.     public function getVehicleByCatalog(Dealer $dealer$findVehicles$user$lang): array
  269.     {
  270.         $rows array_column($findVehicles0);
  271.         return $this->getVehicleCatalogItem($dealer$rows$user$lang);
  272.     }
  273.     public function getVehicleCatalogItem(Dealer $dealer$vehicleItems$user$lang): array
  274.     {
  275.         $request $this->requestStack->getCurrentRequest();
  276.         $features $this->em->getRepository(\CoreBundle\Entity\Featured::class)->findBy(['type' => 'vehicle''user' => $user]);
  277.         $featuresIds = [];
  278.         /** @var Featured $feature */
  279.         foreach ($features as $feature) {
  280.             $favData json_decode($feature->getData());
  281.             if(!isset($favData->vehicleItemId)){
  282.                 continue;
  283.             }
  284.             $featuresIds[$favData->vehicleItemId] = $feature->getId();
  285.         }
  286.         $compareCookie $request->cookies->get('compare');
  287.         $vehicleComparison explode(','$compareCookie);
  288.         return array_reduce($vehicleItems, function($rows$row) use ($dealer$featuresIds$vehicleComparison$lang$request) {
  289.             try {
  290.                 $row $this->coreFactoryVehicle->createByVehicleItem($row);
  291.                 if (empty($row)) {
  292.                     return $rows;
  293.                 }
  294.                 $dollar $dealer->getRate();
  295.                 $price $row->price();
  296.                 $priceAlt $row->getPriceAlt();
  297.                 $priceDollar 0;
  298.                 $sale 0;
  299.                 if ($priceAlt && $priceAlt $row->getPrice()) {
  300.                     $priceAlt $row->getPrice();
  301.                     $sale = ($row->getPriceAlt() / $row->getPrice()) * 100;
  302.                 }
  303.                 if ($dollar 0) {
  304.                     $priceDollar ceil($price $dollar);
  305.                 }
  306.                 $vehicleTypeData VehicleType::getTypeDataById($row->getVehicleType());
  307.                 $vehicleUrl $this->router->generate('automarket_vehicle', ['state' => 'used''type' => $vehicleTypeData['url'], 'brand' => $row->getBrand()->getUrl(), 'model' => $row->getModel()->getUrl(),'id' => $row->getVehicleId()]);
  308.                 $engineVolume = (int)$row->getEngineVolume($request->getLocale());
  309.                 $engineVolumeFormat $engineVolume 10 number_format$engineVolume/10001'.''') : number_format$engineVolume1'.''');
  310.                 $rows[] = [
  311.                     'id' => $row->getVehicleId(),
  312.                     'itemId' => $row->getVehicleItemId(),
  313.                     'title' => $row->getModelName(),
  314.                     'fullName' => $row->getFullName(),
  315.                     'year' => $row->getYear(),
  316.                     'price' => intval($price),
  317.                     'price_alt' => intval($priceAlt),
  318.                     'price_dollar' => intval($priceDollar),
  319.                     'deposit' => $row->getDeposit(),
  320.                     'sold' => $row->getSold(),
  321.                     'sale' => ($sale)? 100 intval($sale) : null,
  322.                     'engine_volume' => $engineVolumeFormat,
  323.                     'mileage' => $row->getMileage(),
  324.                     'mileageThousand' => floor($row->getMileage() / 1000),
  325.                     'url' => $vehicleUrl,
  326.                     'bodyType' => $row->getBodyTypeName($lang),
  327.                     'engine_type' => $row->getFuelTypeName($lang),
  328.                     'transmission' => $row->getTransmissionTypeName($lang),
  329.                     'creditPayment' => $this->creditModel->getMinPayment($row),
  330.                     'featuredId' => $featuresIds[$row->getVehicleItemId()] ?? null,
  331.                     'featuredLink' => $request->getSchemeAndHttpHost().$vehicleUrl,
  332.                     'comparedId' => in_array($row->getVehicleItemId(),$vehicleComparison)? $row->getVehicleItemId() : null,
  333.                     'media' => [
  334.                         'image' => $this->media->getPath($row->getPreview(), 'reference')
  335.                     ],
  336.                     'riaPublicationDate' => $row->getRiaPublicationDate(),
  337.                     'isElectric' => $row->isElectric(),
  338.                     'batteryCapacity' => $row->getBatteryCapacity($lang),
  339.                     'updatedAt' => $row->getUpdatedAt(),
  340.                 ];
  341.                 return $rows;
  342.             } catch (Exception $e) {
  343.                 return $rows;
  344.             }
  345.         }, []);
  346.     }
  347.     private function roundMaxData($num){
  348.         if($num 10) {
  349.             $shorNum intval('1' str_repeat('0'floor(log10($num))));
  350.             $remainder $num $shorNum;
  351.             $num += $shorNum $remainder;
  352.         }
  353.         return $num;
  354.     }
  355.     public function buildFilter($typeFilter null){
  356.         $request $this->requestStack->getCurrentRequest();
  357.         $locale $request->getLocale();
  358.         $vehicleTypeData $this->getVehicleType();
  359.         $brand = isset($routeParams['brand']) ? $this->em->getRepository(\CoreBundle\Entity\Brand::class)->findOneBy(['url' => $routeParams['brand']]) : null;
  360.         $model = isset($routeParams['model']) && $brand $this->em->getRepository(\CoreBundle\Entity\Model::class)->findOneBy(['url' => $routeParams['model'], 'brand' => $brand]) : null;
  361.         $query $this->em->getRepository(\CoreBundle\Entity\Vehicles\VariationCharacteristic::class)
  362.             ->createQueryBuilder('vc')
  363.             ->join('vc.characteristic''c'Join::WITH'c.vehicle_type = :type')->setParameter('type'$vehicleTypeData['id'])
  364.             ->join('vc.characteristic_value','cv')
  365.             ->join('vc.variation''v'Join::WITH'v.state = 1')
  366.             ->join('v.vehicle''ve'Join::WITH've.state = 1 AND ve.is_delete <> 1 AND ve.is_used = :is_used')->setParameter('is_used'1)
  367.             ->join('v.vehicle_items','vi'Join::WITH'vi.state = 1')
  368.             ->andWhere('ve.is_not_filled = 0')
  369.             ->andWhere('ve.is_delete != 1');
  370.         if($typeFilter){
  371.             $query->andWhere('c.model_unique IN (:modelUniques)')->setParameter('modelUniques'$typeFilter);
  372.         }
  373.         if ($model) {
  374.             $query->join('ve.model''m')
  375.                 ->andWhere('m.id = :model')
  376.                 ->setParameter('model'$model->getId());
  377.         }
  378.         if ($brand && !$model) {
  379.             $query->join('ve.model''m')
  380.                 ->join('m.brand''b')
  381.                 ->andWhere('b.id = :brand')
  382.                 ->setParameter('brand'$brand->getId());
  383.         }
  384.         if ($locale == 'ru') {
  385.             $query->orderBy('cv.position')->addOrderBy('cv.value_ru');
  386.         }else{
  387.             $query->orderBy('cv.position')->addOrderBy('cv.value_ua');
  388.         }
  389.         $vCharacteristics $query->getQuery()->getResult();
  390.         $query->addSelect('vi.price')
  391.             ->addSelect('vi.mileage')
  392.             ->addSelect('vi.year');
  393.         $maxVehicleResult $query->getQuery()->getResult();
  394.         $filters['limitationData'] = [
  395.             'minPrice' => 0,
  396.             'maxPrice' => $this->roundMaxData(max(array_column($maxVehicleResult'price'))),
  397.             'minYear' => 0,
  398.             'maxYear' => max(array_column($maxVehicleResult'year')),
  399.             'minMileage' => 0,
  400.             'maxMileage' => $this->roundMaxData(max(array_column($maxVehicleResult'mileage'))),
  401.         ];
  402.         /** @var VariationCharacteristic $vCharacteristic */
  403.         foreach ($vCharacteristics as $vCharacteristic){
  404.             $characteristic $vCharacteristic->getCharacteristic();
  405.             $characteristicValue $vCharacteristic->getCharacteristicValue();
  406.             if(!$characteristic->getUrl() || $characteristic->getUrl() == ''){
  407.                 continue;
  408.             }
  409.             // Тільки автомат та механіка у типі КПП
  410.             if($characteristic->getUrl() == "kpp" &&
  411.                 ($characteristicValue->getUrl() != "avtomat" && $characteristicValue->getUrl() != "mehanika")){
  412.                 continue;
  413.             }
  414.             if (!isset($filters['characteristic'][$characteristic->getUrl()])) {
  415.                 $filters['characteristic'][$characteristic->getUrl()] = [
  416.                     'id' => $characteristic->getId(),
  417.                     'title' => $characteristic->getTitle($locale),
  418.                     'url' => $characteristic->getUrl(),
  419.                     'values' => [],
  420.                 ];
  421.             }
  422.             if(isset($filters['characteristic'][$characteristic->getUrl()]['values'][$characteristicValue->getId()])){
  423.                 continue;
  424.             }
  425.             if ($characteristic->getUrl()) {
  426.                 $filters['characteristic'][$characteristic->getUrl()]['values'][$characteristicValue->getId()] = [
  427.                     'id' => $characteristicValue->getId(),
  428.                     'title' => $characteristicValue->getValue($locale),
  429.                     'url' => $characteristicValue->getUrl(),
  430.                 ];
  431.             } else {
  432.                 $filters['characteristic'][$characteristic->getUrl()]['values'] = null;
  433.             }
  434.         }
  435.         $query $this->em->getRepository(\CoreBundle\Entity\Vehicles\RecommendGroup::class)
  436.             ->createQueryBuilder('rg')
  437.             ->select('rg')
  438.             ->join('rg.vehicles''ve')
  439.             ->where('ve.vehicle_type = :type')
  440.             ->andWhere('ve.state = 1')
  441.             ->andWhere('ve.is_delete != 1')
  442.             ->setParameter('type'$vehicleTypeData['id'])
  443.             ->andWhere('rg.state = :rgState')
  444.             ->setParameter('rgState'true)
  445.             ->andWhere('rg.state_slider = :rgStateSlider')
  446.             ->setParameter('rgStateSlider'true)
  447.             ->andWhere('ve.is_used = :is_used')->setParameter('is_used'1);
  448.         $recommendGroup $query->getQuery()->getResult();
  449.         $filters['recommendGroup'] = [
  450.             'url' => 'recommendGroup',
  451.             'values' => [],
  452.         ];
  453.         /** @var RecommendGroup $item */
  454.         foreach ($recommendGroup as $item) {
  455.             $filters['recommendGroup']['values'][$item->getId()] = [
  456.                 'id' => $item->getId(),
  457.                 'title' => $item->getTitle($locale),
  458.                 'url' => $item->getUrl(),
  459.             ];
  460.         }
  461.         $query $this->em->getRepository(\CoreBundle\Entity\Vehicles\Vehicle::class)
  462.             ->createQueryBuilder('v')
  463.             ->select('b.id as bid''b.url as burl''b.name''m.id''m.url''m.title')
  464.             ->join('v.model''m')
  465.             ->join('m.brand''b')
  466.             ->leftJoin('b.logo''logo')
  467.             ->where('v.vehicle_type = :type')
  468.             ->andWhere('v.state = 1')
  469.             ->andWhere('v.is_delete != 1')
  470.             ->setParameter('type'$vehicleTypeData['id'])
  471.             ->andWhere('v.is_used = :is_used')->setParameter('is_used'1);
  472.         $brands $query->getQuery()->getResult();
  473.         foreach ($brands as $line) {
  474.             if (!isset($filters['brand'][$line['burl']])) {
  475.                 $filters['brand'][$line['burl']] = [
  476.                     'id' => $line['bid'],
  477.                     'title' => $line['name'],
  478.                     'url' => $line['burl'],
  479.                     'count' => 1,
  480.                     'models' => [],
  481.                 ];
  482.             }
  483.             $filters['brand'][$line['burl']]['models'][$line['id']] = [
  484.                 'id' => $line['id'],
  485.                 'url' => $line['url'],
  486.                 'title' => $line['title'],
  487.             ];
  488.         }
  489.         usort($filters['brand'], function ($a$b) {
  490.             if ($a['title'] == $b['title']) {
  491.                 return 1;
  492.             }
  493.             return $a['title'] > $b['title'] ? : -1;
  494.         });
  495.         return $filters;
  496.     }
  497.     public function getFilterHeader(){
  498.         $request $this->requestStack->getCurrentRequest();
  499.         $requestParams $request->query->all();
  500.         $vehicleTypeData $this->getVehicleType();
  501.         $catalogCharacteristic $this->getCharacteristicsByParams($vehicleTypeData['id']);
  502.         $catalogRecommendGroup $this->getRecommendGroupByParams($vehicleTypeData['id']);
  503.         $filters = [];
  504.         foreach ($requestParams as $type => $params) {
  505.             if (!is_array($params)) {
  506.                 $from $this->translator->trans('new_catalog.from', [], 'portal_base') . ' ' $params;
  507.                 $to ' '.$this->translator->trans('new_catalog.to', [], 'portal_base') . ' ' $params;
  508.                 $year $this->translator->trans('new_catalog.year', [], 'portal_base') . ' ';
  509.                 $price $this->translator->trans('new_catalog.price', [], 'portal_base') . ' ';
  510.                 $mileage $this->translator->trans('cars.used.mileage', [], 'portal_base') . ' ';
  511.                 switch ($type) {
  512.                     case $type == 'minYear' && $params 0:
  513.                         $filters['range']['year'] = $year $from;
  514.                         break;
  515.                     case $type == 'maxYear' && $params 0:
  516.                         $filters['range']['year'] =
  517.                             isset($filters['range']['year']) ? $filters['range']['year'] . $to $year $to;
  518.                         break;
  519.                     case $type == 'minPrice' && $params 0:
  520.                         $filters['range']['price'] = $price $from' грн';
  521.                         break;
  522.                     case $type == 'maxPrice' && $params 0:
  523.                         $filters['range']['price'] =
  524.                             isset($filters['range']['price']) ? $filters['range']['price'] . $to' грн' $price $to ' грн';
  525.                         break;
  526.                     case $type == 'minMileage' && $params 0:
  527.                         $filters['range']['mileage'] = $mileage $from' тис.';
  528.                         break;
  529.                     case $type == 'maxMileage' && $params 0:
  530.                         $filters['range']['mileage'] =
  531.                             isset($filters['range']['mileage']) ? $filters['range']['mileage'] . $to' тис.' $mileage $to ' тис.';
  532.                         break;
  533.                 }
  534.                 continue;
  535.             }
  536.             if(empty($params)){
  537.                 continue;
  538.             }
  539.             if($type == 'recommendGroup'){
  540.                 $filters[$type] = array_intersect_key($catalogRecommendGroup$params);
  541.                 continue;
  542.             }
  543.             if($type == 'characteristic'){
  544.                 foreach ($params as $paramType => $param){
  545.                     $result array_intersect_key($catalogCharacteristic$params);
  546.                     if(count($result)) {
  547.                         $filters['characteristic'][$paramType] = array_intersect_key($catalogCharacteristic[$paramType], $param);
  548.                     }
  549.                 }
  550.                 continue;
  551.             }
  552.             $filters[$type] = $params;
  553.         }
  554.         return $filters;
  555.     }
  556.     public function getRouteFilterParams(Dealer $dealer)
  557.     {
  558.         $request $this->requestStack->getCurrentRequest();
  559.         $routeParams $request->attributes->get('_route_params');
  560.         $params = [];
  561.         $typeParams = ['state''type''brand''model''param''price''recommendGroup'];
  562.         foreach ($typeParams as $type){
  563.             switch ($type) {
  564.                 case 'price':
  565.                     if(isset($routeParams['price'])) {
  566.                         $params['maxPrice'] = floor($routeParams[$type] * $dealer->getRate());
  567.                     }
  568.                     break;
  569.                 case 'param':
  570.                     foreach ($routeParams as $key => $value) {
  571.                         if (preg_match('/^param(\d*)$/'$key$matches)) {
  572.                             $index $matches[1];
  573.                             $valueKey $index 'value' $index 'value';
  574.                             if (isset($routeParams[$valueKey])) {
  575.                                 $params['characteristic'][$value][$routeParams[$valueKey]] = true;
  576.                             }
  577.                         }
  578.                     }
  579. //                    if(isset($routeParams['param']) && isset($routeParams['value'])) {
  580. //                        $params['characteristic'][$routeParams['param']][$routeParams['value']] = true;
  581. //                    }
  582.                     break;
  583.                 case 'model':
  584.                 case 'brand':
  585.                 case 'recommendGroup':
  586.                     if(isset($routeParams[$type])) {
  587.                         $params[$type][$routeParams[$type]] = true;
  588.                     }
  589.                     break;
  590.                 default:
  591.                     if(isset($routeParams[$type])){
  592.                         $params[$type] = $routeParams[$type];
  593.                     }
  594.                     break;
  595.             }
  596.         }
  597.         return $params;
  598.     }
  599.     public function showMoreCatalog($countVehicle$countVehicleByPage)
  600.     {
  601.         $request $this->requestStack->getCurrentRequest();
  602.         $currentPage $request->query->get('page') ?: 1;
  603.         return (($countVehicle $countVehicleByPage*$currentPage) > 0);
  604.     }
  605.     public function buildSearchUrl()
  606.     {
  607.         $request $this->requestStack->getCurrentRequest();
  608.         $searchParams $request->query->all();
  609.         $searchParams array_filter($searchParams, fn($value) => $value !== "");
  610.         return $this->router->generate('automarket_catalog_search'$searchParams);
  611.     }
  612.     public function findModelByParams($urlBrands null$urlModels null)
  613.     {
  614.         $filterBrands $this->em->getRepository(\CoreBundle\Entity\Brand::class)->getBrandsByUrl($urlBrands);
  615.         $filterModelIds = [];
  616.         /** @var Brand $brand */
  617.         foreach ($filterBrands as $brand) {
  618.             $models = [];
  619.             $modelSearch = [];
  620.             /** @var Model $model */
  621.             foreach ($brand->getModels() as $model) {
  622.                 if (!$model->getUrl()) {
  623.                     continue;
  624.                 }
  625.                 if (in_array($model->getUrl(), $urlModels)) {
  626.                     $modelSearch[] = $model->getId();
  627.                 }
  628.                 $models[] = $model->getId();
  629.             }
  630.             $filterModelIds = (empty($modelSearch)) ? array_merge($filterModelIds$models) : array_merge($filterModelIds$modelSearch);
  631.         }
  632.         return $filterModelIds;
  633.     }
  634.     public function findVehicleByParams($pageLimit null)
  635.     {
  636.         $request $this->requestStack->getCurrentRequest();
  637.         $routeParams $request->attributes->get('_route_params');
  638.         $routeSearch = ($request->attributes->get('_route') == 'automarket_catalog_search');
  639.         $searchParams $request->query->all();
  640.         $brand $routeParams['brand'] ?? null;
  641.         $model $routeParams['model'] ?? null;
  642.         $price $routeParams['price'] ?? null;
  643.         $year $routeParams['year'] ?? null;
  644.         $param $routeParams['param'] ?? null;
  645.         $param_value $routeParams['value'] ?? null;
  646.         $param2 $routeParams['param2'] ?? null;
  647.         $param_value2 $routeParams['value2'] ?? null;
  648.         $recommendGroup $routeParams['recommendGroup'] ?? null;
  649.         $vehicleTypeData $this->getVehicleType();
  650.         $mounthAgo = (new DateTime())->modify('-30 days')->format('Y-m-d H:i:s');;
  651.         $query $this->em->getRepository(\CoreBundle\Entity\Vehicles\VehicleItem::class)
  652.             ->createQueryBuilder('vi')
  653.             ->addSelect('vi')
  654.             ->addSelect('CASE WHEN ( d.id in (32,33)) 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')
  655.             ->addSelect('CASE WHEN ( d.id in (32,33)) THEN (CASE WHEN vi.alt_price > 0 THEN vi.alt_price ELSE (CASE WHEN vi.alt_rate > 0 THEN vi.price ELSE vi.price END) END) ELSE ( CASE WHEN vi.alt_price > 0 THEN vi.alt_price / d.rate ELSE vi.price / d.rate END)END AS priceUsd')
  656.             ->addSelect('CASE WHEN (CASE WHEN ( d.id in (32,33)) 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 ( d.id in (32,33)) 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')
  657.             ->join('vi.variation''v')
  658.             ->join('v.vehicle''ve')
  659.             ->join('v.characteristics''vch')
  660.             ->join('vch.characteristic''ch')
  661.             ->join('vch.characteristic_value''chv')
  662.             ->join('ve.dealer''d')
  663.             ->join('ve.model''m')
  664.             ->join('m.brand''b')
  665.             ->leftJoin('ve.recommend_group''rg')
  666.             ->where('ve.vehicle_type = :type')
  667.             //  TODO Навіщо ми перевіряємо vehicleItem state на вживаних авто? У вживаного авто є всього 1 vehicleItem, і ми маємо відображати авто по vehicle state. Якщо все буде ок, повидаляти з усіх запитів
  668.             //  ->andWhere('vi.state = 1')
  669.             ->andWhere('ve.state = 1')
  670.             ->andWhere('ve.is_not_filled = 0')
  671.             ->andWhere('ve.is_delete != 1')
  672.             ->setParameter('type'$vehicleTypeData['id'])
  673.             ->andWhere('ve.is_used = :isUsed')->setParameter('isUsed'true)
  674.             ->andWhere('vi.date_of_sale > :mounthAgo OR vi.date_of_sale IS NULL')
  675.             ->orderBy('vi.sold''ASC')
  676.             ->addOrderBy('vi.deposit''ASC')
  677.             ->setParameter('mounthAgo'$mounthAgo);
  678.         if(!$routeSearch) {
  679.             if ($brand) {
  680.                 $query->andWhere('b.url = :brand')->setParameter('brand'$brand);
  681.             }
  682.             if ($brand && $model) {
  683.                 $query->andWhere('m.url = :model')->setParameter('model'$model);
  684.             }
  685.             if (isset($routeParams['param']) && $routeParams['param'] && isset($routeParams['value']) && $routeParams['value']) {
  686.                 $query->andWhere('ch.url = :param AND chv.url = :paramValue')
  687.                     ->setParameter('param'$routeParams['param'])
  688.                     ->setParameter('paramValue'$routeParams['value']);
  689.             }
  690.             if (isset($routeParams['param2']) && isset($routeParams['value2'])) {
  691.                 $cvIds = [];
  692.                 $cType $this->em->getRepository(\CoreBundle\Entity\Vehicles\Characteristic::class)->findOneBy(['url' => $routeParams['param2']]);
  693.                 $alias 'vc' $cType->getId();
  694.                 $fKey 'charId' $cType->getId();
  695.                 $tKey 'cids' $cType->getId();
  696.                 $query->join('v.characteristics'$alias);
  697.                 $cValue $this->em->getRepository(\CoreBundle\Entity\Vehicles\CharacteristicValue::class)->findOneBy(['url' => $routeParams['value2'], 'characteristic' => $cType]);
  698.                 if ($cValue) {
  699.                     $cvIds[] = $cValue->getId();
  700.                 }
  701.                 if (!empty($cvIds)) {
  702.                     $query->andWhere($alias '.characteristic = :' $fKey)->setParameter($fKey$cType->getId());
  703.                     $query->andWhere($alias '.characteristic_value IN (:' $tKey ')')->setParameter($tKey$cvIds);
  704.                 }
  705.             }
  706.             if ($price) {
  707.                 $query->andHaving('priceUsd <= :price')->setParameter('price'$price);
  708.             }
  709.             if ($year) {
  710.                 $query->andHaving('vi.year <= :year')->setParameter('yearMax'$year);
  711.             }
  712.             if ($recommendGroup) {
  713.                 $query->andWhere('rg.url = :recommendGroup')->setParameter('recommendGroup'$recommendGroup);
  714.             }
  715.         }
  716.         if (count($searchParams)) {
  717.             foreach ($searchParams as $key => $item) {
  718.                 switch ($key) {
  719.                     case 'brand':
  720.                         if (!isset($searchParams['model'])) {
  721.                             $query->andWhere('b.url IN (:brand)')->setParameter('brand'array_keys($item));
  722.                         } else {
  723.                             $filterModelIds $this->findModelByParams(array_keys($item), array_keys($searchParams['model']));
  724.                             $query->andWhere('m.id IN (:modelIds)')->setParameter('modelIds'$filterModelIds);
  725.                         }
  726.                         break;
  727.                     case 'model':
  728.                         if (!isset($searchParams['brand']) || count($searchParams['brand']) == 1) {
  729.                             $query->andWhere('m.url IN (:model)')->setParameter('model'array_keys($item));
  730.                         }
  731.                         break;
  732.                     case 'recommendGroup':
  733.                         $query->andWhere('rg.url IN (:recommendGroup)')->setParameter('recommendGroup'array_keys($item));
  734.                         break;
  735.                     case 'minPrice':
  736.                         if ($item 0) {
  737.                             $query->andHaving('price >= :minPrice')->setParameter('minPrice'$item);
  738.                         }
  739.                         break;
  740.                     case 'maxPrice':
  741.                         if ($item 0) {
  742.                             $query->andHaving('price <= :maxPrice')->setParameter('maxPrice'$item);
  743.                         }
  744.                         break;
  745.                     case 'minYear':
  746.                         if ($item 0) {
  747.                             $query->andHaving('vi.year >= :minYear')->setParameter('minYear'$item);
  748.                         }
  749.                         break;
  750.                     case 'maxYear':
  751.                         if ($item 0) {
  752.                             $query->andHaving('vi.year <= :maxYear')->setParameter('maxYear'$item);
  753.                         }
  754.                         break;
  755.                     case 'minMileage':
  756.                         if ($item 0) {
  757.                             $query->andHaving('vi.mileage >= :minMileage')->setParameter('minMileage'$item 1000);
  758.                         }
  759.                         break;
  760.                     case 'maxMileage':
  761.                         if ($item 0) {
  762.                             $query->andHaving('vi.mileage <= :maxMileage')->setParameter('maxMileage'$item 1000);
  763.                         }
  764.                         break;
  765.                     case 'hasNDS':
  766.                         if ($item == 'true') {
  767.                             $query->andWhere('vi.has_nds = 1');
  768.                         }
  769.                         break;
  770.                     case 'sale':
  771.                         if ($item == 'true') {
  772.                             $query->andWhere('vi.alt_price > 0');
  773.                         }
  774.                         break;
  775.                     case 'isSelect':
  776.                         if ($item == 'true') {
  777.                             $query->andWhere($query->expr()->notIn('ve.dealer'Catalog::NOT_VIDI_SELECT_DEALERS));
  778.                         }
  779.                         break;
  780.                 }
  781.             }
  782.         }
  783.         if (isset($searchParams['characteristic']) && $searchParams['characteristic']) {
  784.             foreach ($searchParams['characteristic'] as $type => $params) {
  785.                 $cvIds = [];
  786.                 $cType $this->em->getRepository(\CoreBundle\Entity\Vehicles\Characteristic::class)->findOneBy(['url' => $type]);
  787.                 $alias 'vc' $cType->getId();
  788.                 $fKey 'charId' $cType->getId();
  789.                 $tKey 'cids' $cType->getId();
  790.                 $query->join('v.characteristics'$alias);
  791.                 foreach (array_keys($params) as $vchUrl) {
  792.                     $cValue $this->em->getRepository(\CoreBundle\Entity\Vehicles\CharacteristicValue::class)->findOneBy(['url' => $vchUrl'characteristic' => $cType]);
  793.                     if ($cValue) {
  794.                         $cvIds[] = $cValue->getId();
  795.                     }
  796.                 }
  797.                 if (!empty($cvIds)) {
  798.                     $query->andWhere($alias '.characteristic = :' $fKey)->setParameter($fKey$cType->getId());
  799.                     $query->andWhere($alias '.characteristic_value IN (:' $tKey ')')->setParameter($tKey$cvIds);
  800.                 }
  801.             }
  802.         }
  803.         $allResult $query->getQuery()->getResult();
  804.         $totalCount count($allResult);
  805.         $prices = [];
  806.         $pricesUsd = [];
  807.         $dollar $this->em->getRepository(Dealer::class)->find(6)->getRate();
  808.         if($totalCount){
  809.             foreach ($allResult as $oneResult) {
  810.                     $prices[] = ceil($oneResult['price']);
  811.                     $pricesUsd[] = ceil($oneResult['price'] / $dollar);
  812.             }
  813.         }
  814.         $dataPrice = [
  815.           'minPrice' => $totalCount min($prices) : 0,
  816.           'maxPrice' => $totalCount max($prices) : 0,
  817.           'minPriceUsd' => $totalCount min($pricesUsd) : 0,
  818.           'maxPriceUsd' => $totalCount max($pricesUsd) : 0,
  819.         ];
  820.         unset($allResult);
  821.         if($pageLimit) {
  822.             $limit $pageLimit;
  823.             $page = isset($searchParams['page']) && $searchParams['page'] != ''  $searchParams['page'] : 1;
  824.             $start = ($page 1) * $limit;
  825.         }
  826.         $query->groupBy('vi');
  827.         if (isset($searchParams['sortOrder'])) {
  828.             $sortData explode('-'$searchParams['sortOrder']);
  829.             $sortField $sortData[0] ?? 'price';
  830.             $sortAD = isset($sortData[1]) && in_array($sortData[1], ['ASC''DESC']) ? $sortData[1] : 'ASC';
  831.             switch ($sortField) {
  832.                 case 'price':
  833.                     $field $sortAD == 'DESC' 'price' 'orderPrice';
  834.                     $query->addOrderBy($field$sortAD);
  835.                     $query->addOrderBy('b.name''ASC');
  836.                     $query->addOrderBy('m.title''ASC');
  837.                     break;
  838.                 case 'year':
  839.                     $query->addOrderBy('vi.year'$sortAD);
  840.                     $query->addOrderBy('b.name''ASC');
  841.                     $query->addOrderBy('m.title''ASC');
  842.                     break;
  843.                 case 'mileage':
  844.                     $query->addOrderBy('vi.mileage'$sortAD);
  845.                     $query->addOrderBy('b.name''ASC');
  846.                     $query->addOrderBy('m.title''ASC');
  847.                     break;
  848.                 case 'addVehicle':
  849.                     $query->addOrderBy('ve.date_create'$sortAD);
  850.                     $query->addOrderBy('b.name''ASC');
  851.                     $query->addOrderBy('m.title''ASC');
  852.                     break;
  853.                 default:
  854.                     $query->addOrderBy('orderPrice''ASC');
  855.                     $query->addOrderBy('b.name''ASC');
  856.                     $query->addOrderBy('m.title''ASC');
  857.                     break;
  858.             }
  859.         } else {
  860.             $query->addOrderBy('orderPrice''ASC');
  861.         }
  862.         if($pageLimit) {
  863.             $query->setFirstResult($start)->setMaxResults($limit);
  864.         }
  865.         $data $query->getQuery()->getResult();
  866.         return [
  867.             'count' => $totalCount,
  868.             'dataPrice' => $dataPrice,
  869.             'data' => $data
  870.         ];
  871.     }
  872.     public function noFindVehicleByParams($pageLimit 21)
  873.     {
  874.         $vehicleTypeData $this->getVehicleType();
  875.         $query $this->em->getRepository(VehicleItem::class)
  876.             ->createQueryBuilder('vi')
  877.             ->addSelect('vi')
  878.             ->addSelect('CASE WHEN (d.id != 6) THEN CASE WHEN vi.alt_price > 0 THEN vi.alt_price / d.rate ELSE CASE WHEN vi.alt_rate > 0 THEN vi.alt_rate ELSE vi.price * d.rate END END ELSE CASE WHEN vi.alt_price > 0 THEN vi.alt_price  / d.rate ELSE vi.price / d.rate END END AS price')
  879.             ->addSelect('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')
  880.             ->join('vi.variation''v')
  881.             ->join('v.vehicle''ve'Join::WITH've.is_used = :isUsed')->setParameter('isUsed'true)
  882.             ->join('ve.dealer''d')
  883.             ->andWhere('ve.vehicle_type = :type')
  884.             //  TODO Навіщо ми перевіряємо vehicleItem state на вживаних авто? У вживаного авто є всього 1 vehicleItem, і ми маємо відображати авто по vehicle state. Якщо все буде ок, повидаляти з усіх запитів
  885.             //  ->andWhere('vi.state = 1')
  886.             ->andWhere('ve.state = 1')
  887.             ->andWhere('ve.is_not_filled = 0')
  888.             ->andWhere('ve.is_delete != 1')
  889.             ->setParameter('type'$vehicleTypeData['id'])
  890.             ->orderBy('v.id''DESC')
  891.             ->setMaxResults($pageLimit);
  892.         return [
  893.             'count' => 0,
  894.             'dataPrice' => ['minPrice' => 0,'maxPrice' => 0,'minPriceUsd' => 0,'maxPriceUsd' =>  0],
  895.             'data' => $query->getQuery()->getResult(),
  896.         ];
  897.     }
  898.     public function getBreadcrumbs()
  899.     {
  900.         $translator $this->translator;
  901.         $router $this->router;
  902.         $request $this->requestStack->getCurrentRequest();
  903.         $routeParams $request->attributes->get('_route_params');
  904.         $vehicleTypeData $this->getVehicleType();
  905.         $catalogCharacteristic $this->getCharacteristicsByParams($vehicleTypeData['id']);
  906.         $catalogRecommendGroup $this->getRecommendGroupByParams($vehicleTypeData['id']);
  907.         $breadcrumbs = [];
  908.         $state $routeParams['state'] ?? null;
  909.         $type $routeParams['type'] ?? null;
  910.         $brand $routeParams['brand'] ?? null;
  911.         $model $routeParams['model'] ?? null;
  912.         $param $routeParams['param'] ?? null;
  913.         $value $routeParams['value'] ?? null;
  914.         $param2 $routeParams['param2'] ?? null;
  915.         $value2 $routeParams['value2'] ?? null;
  916.         $price $routeParams['price'] ?? null;
  917.         $recommendGroup $routeParams['recommendGroup'] ?? null;
  918.         $CharacteristicValue $catalogCharacteristic[$param][$value] ?? null;
  919.         $CharacteristicValue2 $catalogCharacteristic[$param2][$value2] ?? null;
  920.         $recommendGroupValue $catalogRecommendGroup[$recommendGroup] ?? null;
  921.         if($state && $type){
  922.             $breadcrumbs[] = [
  923.               'title' => $translator->trans('catalog.' $state '_' $type, [], 'automarket_base'),
  924.               'url' => $router->generate('automarket_catalog', ['state' => $state'type' => $type]),
  925.             ];
  926.         }
  927.         if($brand){
  928.             $breadcrumbs[] = [
  929.                 'title' => $brand,
  930.                 'url' => $router->generate('automarket_catalog_brand', ['state' => $state'type' => $type'brand' => $brand]),
  931.             ];
  932.         }
  933.         if($brand && $model){
  934.             $breadcrumbs[] = [
  935.                 'title' => $model,
  936.                 'url' => $router->generate('automarket_catalog_brand_model', ['state' => $state'type' => $type'brand' => $brand'model' => $model]),
  937.             ];
  938.         }
  939.         if($recommendGroup){
  940.             $breadcrumbs[] = [
  941.                 'title' => $recommendGroupValue,
  942.                 'url' => $router->generate('automarket_catalog_vehicle_collections', ['state' => $state'type' => $type'recommendGroup' => $recommendGroup]),
  943.             ];
  944.         }
  945.         if($param && $value && !$brand && !$model){
  946.             $breadcrumbs[] = [
  947.                 'title' => $CharacteristicValue,
  948.                 'url' => $router->generate('automarket_catalog_characteristic', ['state' => $state'type' => $type'brand' => $brand'model' => $model'param' => $param'value' => $value]),
  949.             ];
  950.         }
  951.         if($param && $value && $param2 && $value2 && !$brand && !$model){
  952.             $breadcrumbs[] = [
  953.                 'title' => $CharacteristicValue2,
  954.                 'url' => $router->generate('automarket_catalog_characteristic_by_body', ['state' => $state'type' => $type'brand' => $brand'model' => $model'param' => $param'value' => $value'param2' => $param2'value2' => $value2]),
  955.             ];
  956.         }
  957.         if ($param && $value && $brand && !$model) {
  958.             $breadcrumbs[] = [
  959.                 'title' => $CharacteristicValue,
  960.                 'url' => $router->generate('automarket_catalog_brand_characteristic', ['state' => $state'type' => $type'brand' => $brand'param' => $param'value' => $value]),
  961.             ];
  962.         }
  963.         if($param && $value && $brand && $model){
  964.             $breadcrumbs[] = [
  965.                 'title' => $CharacteristicValue,
  966.                 'url' => $router->generate('automarket_catalog_brand_model_characteristic', ['state' => $state'type' => $type'brand' => $brand'model' => $model'param' => $param'value' => $value]),
  967.             ];
  968.         }
  969.         if($price && $param && $value  && $brand && $model){
  970.             $breadcrumbs[] = [
  971.                 'title' => 'до ' $price ' $',
  972.                 'url' => $router->generate('automarket_catalog_brand_model_characteristic_price', ['state' => $state'type' => $type'brand' => $brand'model' => $model'param' => $param'value' => $value'price' => $price]),
  973.             ];
  974.         }elseif($price && $brand && $model){
  975.             $breadcrumbs[] = [
  976.                 'title' => 'до ' $price ' $',
  977.                 'url' => $router->generate('automarket_catalog_brand_model_price', ['state' => $state'type' => $type'brand' => $brand'model' => $model'price' => $price]),
  978.             ];
  979.         }
  980.         return $breadcrumbs;
  981.     }
  982.     public function getSchemaCatalog()
  983.     {
  984.     }
  985. }