- <?php
- namespace AutomarketBundle\Services;
- use CoreBundle\Entity\Brand;
- use CoreBundle\Entity\Dealer;
- use CoreBundle\Entity\Featured;
- use CoreBundle\Entity\Model;
- use CoreBundle\Entity\Vehicles\RecommendGroup;
- use CoreBundle\Entity\Vehicles\VariationCharacteristic;
- use CoreBundle\Entity\Vehicles\Vehicle;
- use CoreBundle\Entity\Vehicles\VehicleItem;
- use CoreBundle\Model\Vehicles\VehicleType;
- use CoreBundle\Services\ImageProviderVidi;
- use CoreBundle\Services\MediaExtensionVidi;
- use CoreBundle\Factory\Vehicle as VehicleFactory;
- use DateTime;
- use DcSiteBundle\Model\CreditModel;
- use Doctrine\ORM\EntityManagerInterface;
- use Doctrine\ORM\Query\Expr\Join;
- use Exception;
- use PortalBundle\Model\Catalog;
- use Symfony\Bundle\FrameworkBundle\Routing\Router;
- use Symfony\Component\HttpFoundation\RequestStack;
- use Symfony\Component\Routing\RouterInterface;
- use Symfony\Contracts\Translation\TranslatorInterface;
- class CatalogService
- {
-     private RouterInterface $router;
-     private MediaExtensionVidi $media;
-     private TranslatorInterface $translator;
-     private EntityManagerInterface $em;
-     private RequestStack $requestStack;
-     private VehicleFactory $coreFactoryVehicle;
-     private CreditModel $creditModel;
-     public function __construct( MediaExtensionVidi $media, RouterInterface $router, TranslatorInterface $translator,
-                                  EntityManagerInterface $em, RequestStack $requestStack, VehicleFactory $coreFactoryVehicle,
-                                  CreditModel $creditModel)
-     {
-         $this->media = $media;
-         $this->router = $router;
-         $this->translator = $translator;
-         $this->em = $em;
-         $this->requestStack = $requestStack;
-         $this->coreFactoryVehicle = $coreFactoryVehicle;
-         $this->creditModel = $creditModel;
-     }
-     /**
-      * Фільтр
-      *
-      * @return array
-      */
-     public function initSearch ()
-     {
-         $request = $this->requestStack->getCurrentRequest();
-     }
-     public function getVehicleType()
-     {
-         $request = $this->requestStack->getCurrentRequest();
-         $vehicleTypeData = VehicleType::getTypeDataByUrl($request->get('type') ?? 'car');
-         return $vehicleTypeData;
-     }
-     /**
-      * Отримати параметри для фільтра на головній
-      *
-      * @return array
-      */
-     public function getOnShowFilter()
-     {
-         $request = $this->requestStack->getCurrentRequest();
-         $router = $this->router;
-         /** @var Dealer $dealer */
-         $dealer = $this->em->getRepository(Dealer::class)->find(6);
-         $brandId = $request->get('brandId');
-         $modelId = $request->get('modelId');
-         $minYear = $request->get('minYear');
-         $maxYear = $request->get('maxYear');
-         $minPrice = $request->get('minPrice');
-         $maxPrice = $request->get('maxPrice');
-         $paramRoute = [];
-         $responseData = [
-             'brands' => [],
-             'models' => [],
-             'years' => [],
-             'maxPrice' => null,
-             'countVehicle' => 0,
-         ];
-         $queryBuilder = $this->em->getRepository(\CoreBundle\Entity\Vehicles\VehicleItem::class)
-             ->createQueryBuilder('vi')
-             ->addSelect('vi')
-             ->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')
-             ->addSelect('vi.year AS year')
-             ->join('vi.vehicle','ve')
-             ->join('ve.model', 'm')
-             ->join('m.brand','b')
-             ->join('ve.dealer', 'd')
-             ->where('ve.vehicle_type = :type')->setParameter('type', 1)
-             //  TODO Навіщо ми перевіряємо vehicleItem state на вживаних авто? У вживаного авто є всього 1 vehicleItem, і ми маємо відображати авто по vehicle state. Якщо все буде ок, повидаляти з усіх запитів
-             //  ->andWhere('vi.state = 1')
-             ->andWhere('vi.sold = :sold')->setParameter('sold', false)
-             ->andWhere('ve.state = 1')
-             ->andWhere('ve.is_not_filled = 0')
-             ->andWhere('ve.is_delete != 1')
-             ->andWhere('ve.is_used = :isUsed')->setParameter('isUsed', true);
-         if ($brandId) {
-             $queryBuilder->andWhere('b.id = :brandId')->setParameter('brandId', $brandId);
-         }
-         if ($modelId) {
-             $queryBuilder->andWhere('m.id = :modelId')->setParameter('modelId', $modelId);
-         }
-         if ($minPrice) {
-             $queryBuilder->andHaving('price >= :minPrice')->setParameter('minPrice', $minPrice * $dealer->getRate());
-             $paramRoute['minPrice'] = $minPrice * $dealer->getRate();
-         }
-         if ($maxPrice) {
-             $queryBuilder->andHaving('price <= :maxPrice')->setParameter('maxPrice', $maxPrice * $dealer->getRate());
-             $paramRoute['maxPrice'] = $maxPrice * $dealer->getRate();
-         }
-         if ($minYear) {
-             $queryBuilder->andHaving('vi.year >= :minYear')->setParameter('minYear', $minYear);
-             $paramRoute['minYear'] = $minYear;
-         }
-         if ($maxYear) {
-             $queryBuilder->andHaving('vi.year <= :maxYear')->setParameter('maxYear', $maxYear);
-             $paramRoute['maxYear'] = $maxYear;
-         }
-         $result = $queryBuilder->getQuery()->getResult();
- //        /** @var VehicleItem $item */
- //        foreach ($result as $item){
- //            dump($item[0]->getVehicle()->getDealer());
- //            dump($item[]->getPrice());
- //            dump('----------');
- //        }
- //
- //        dump($result);exit;
-         if($result) {
-             $responseData['years'] = range(min(array_column($result, 'year')), max(array_column($result, 'year'))) ;
-             $responseData['countVehicle'] = count($result);
-             foreach ($result as $item) {
-                 /** @var Vehicle $vehicle */
-                 $vehicle = $item[0]->getVehicle();
-                 $vBrand = $vehicle->getModel()->getBrand();
-                 $vModel = $vehicle->getModel();
-                 if (!isset($responseData['brands'][$vBrand->getId()])) {
-                     $responseData['brands'][$vBrand->getId()] = [
-                         'id' => $vBrand->getId(),
-                         'title' => $vBrand->getName(),
-                         'url' => $vBrand->getUrl()
-                     ];
-                 }
-                 if (!isset($responseData['models'][$vModel->getId()])) {
-                     $responseData['models'][$vModel->getId()] = [
-                         'id' => $vModel->getId(),
-                         'brandId' => $vBrand->getId(),
-                         'title' => $vModel->getTitle(),
-                         'url' => $vModel->getUrl()
-                     ];
-                 }
-             }
-             $maxPrice = max(array_column($result, 'price'));
-             if($maxPrice > 10) {
-                 $price = intval(ceil($maxPrice));
-                 $shorNum = intval('1' . str_repeat('0', floor(log10($price))));
-                 $remainder = $price % $shorNum;
-                 $responseData['maxPrice'] = $price + ($shorNum - $remainder);
-             }
-         }
-         if($brandId && isset($responseData['brands'][$brandId]['url'])) {
-             $brandUrl = $responseData['brands'][$brandId]['url'];
-             $paramRoute['brand'][$brandUrl] = 'true';
-         }
-         if($modelId && isset($responseData['models'][$modelId]['url'])) {
-             $modelUrl = $responseData['models'][$modelId]['url'];
-             $paramRoute['model'][$modelUrl] = 'true';
-         }
-         if($result && $responseData['countVehicle'] > 0 && !empty($paramRoute)) {
-             $responseData['link'] = $router->generate('automarket_catalog_search', $paramRoute);
-         }else{
-             $responseData['link'] = $router->generate('automarket_catalog', ['state' => 'used', 'type' => 'car']);
-         }
-         return  $responseData;
-     }
-     public function getBrands($vehicleType)
-     {
-         $query = $this->em->getRepository(\CoreBundle\Entity\Vehicles\Vehicle::class)
-             ->createQueryBuilder('v')
-             ->select('b.id', 'b.name', 'b.url')
-             ->join('v.model', 'm')
-             ->join('m.brand', 'b')
-             ->andWhere('v.state = :state')->setParameter('state', true)
-             ->andWhere('v.is_delete = :isDelete')->setParameter('isDelete', false)
-             ->andWhere('v.is_used = :isUsed')->setParameter('isUsed', true)
-             ->andWhere('v.vehicle_type = :type')->setParameter('type', $vehicleType);
-         $query->orderBy('b.name');
-         $query->groupBy('b.id');
-         return $query->getQuery()->getResult();
-     }
-     public function getModels($vehicleType, Brand $brand = null)
-     {
-         $query = $this->em->getRepository(\CoreBundle\Entity\Vehicles\Vehicle::class)
-             ->createQueryBuilder('v')
-             ->select('m.id', 'm.title', 'm.url')
-             ->innerJoin('v.model', 'm')
-             ->innerJoin('m.brand', 'b')
-             ->andWhere('v.state = :state')->setParameter('state', true)
-             ->andWhere('v.is_delete = :isDelete')->setParameter('isDelete', false)
-             ->andWhere('v.is_used = :isUsed')->setParameter('isUsed', true)
-             ->andWhere('v.vehicle_type = :type')->setParameter('type', $vehicleType);
-         if ($brand) {
-             $query->andWhere('b.id = :brand')->setParameter('brand', $brand);
-         }
-         $query->orderBy('m.title');
-         $query->groupBy('m.id');
-         return $query->getQuery()->getResult();
-     }
-     public function getRecommendGroupByParams($vehicleType)
-     {
-         $request = $this->requestStack->getCurrentRequest();
-         $locale = $request->getLocale();
-         $query = $this->em->getRepository(\CoreBundle\Entity\Vehicles\RecommendGroup::class)
-             ->createQueryBuilder('rg')
-             ->select('rg')
-             ->andWhere('rg.state = :rgState')
-             ->setParameter('rgState', true)
-             ->andWhere('rg.state_slider = :rgStateSlider')
-             ->setParameter('rgStateSlider', true);
-         $recommendGroup = $query->getQuery()->getResult();
-         $result = [];
-         /** @var RecommendGroup $item */
-         foreach ($recommendGroup as $item) {
-             $result[$item->getUrl()] = $item->getTitle($locale);
-         }
-         return $result;
-     }
-     public function getCharacteristicsByParams($vehicleType, $brand = null, $model = null, $vehicleIds = [])
-     {
-         $request = $this->requestStack->getCurrentRequest();
-         $locale = $request->getLocale();
-         $query = $this->em->getRepository(\CoreBundle\Entity\Vehicles\VariationCharacteristic::class)
-             ->createQueryBuilder('vc');
-         if ($locale == 'ru') {
-             $query->select('cv.id', 'c.url AS cUrl', 'cv.url', 'cv.value_ru AS value');
-         } else {
-             $query->select('cv.id', 'c.url AS cUrl', 'cv.url', 'cv.value_ua AS value');
-         }
-         $query->join('vc.characteristic_value', 'cv')
-             ->join('vc.characteristic', 'c', Join::WITH, 'c.vehicle_type = :type')->setParameter('type', $vehicleType)
-             ->join('vc.variation', 'v', Join::WITH, 'v.state = 1')
-             ->join('v.vehicle', 've', Join::WITH, 've.state = 1 AND ve.is_delete <> 1 AND ve.is_used = :is_used')->setParameter('is_used', true)
-             ->join('ve.model', 'm')
-             ->join('m.brand', 'b');
-         if ($brand) {
-             $query->andWhere('b.url = :bUrl')->setParameter('bUrl', $brand->getUrl());
-         }
-         if ($model) {
-             $query->andWhere('m.url = :mUrl')->setParameter('mUrl', $model->getUrl());
-         }
-         if (!empty($vehicleIds)) {
-             $query->andWhere('ve.id IN (:vehicleIds)')
-                 ->setParameter('vehicleIds', $vehicleIds);
-         }
-         $query->groupBy('cv', 'c');
-         $characteristics = $query->getQuery()->getResult();
-         $result = [];
-         foreach ($characteristics as $row) {
-             $result[$row['cUrl']][$row['url']] = $row['value'];
-         }
-         return $result;
-     }
-     public function getVehicleByCatalog(Dealer $dealer, $findVehicles, $user, $lang): array
-     {
-         $rows = array_column($findVehicles, 0);
-         return $this->getVehicleCatalogItem($dealer, $rows, $user, $lang);
-     }
-     public function getVehicleCatalogItem(Dealer $dealer, $vehicleItems, $user, $lang): array
-     {
-         $request = $this->requestStack->getCurrentRequest();
-         $features = $this->em->getRepository(\CoreBundle\Entity\Featured::class)->findBy(['type' => 'vehicle', 'user' => $user]);
-         $featuresIds = [];
-         /** @var Featured $feature */
-         foreach ($features as $feature) {
-             $favData = json_decode($feature->getData());
-             if(!isset($favData->vehicleItemId)){
-                 continue;
-             }
-             $featuresIds[$favData->vehicleItemId] = $feature->getId();
-         }
-         $compareCookie = $request->cookies->get('compare');
-         $vehicleComparison = explode(',', $compareCookie);
-         return array_reduce($vehicleItems, function($rows, $row) use ($dealer, $featuresIds, $vehicleComparison, $lang, $request) {
-             try {
-                 $row = $this->coreFactoryVehicle->createByVehicleItem($row);
-                 if (empty($row)) {
-                     return $rows;
-                 }
-                 $dollar = $dealer->getRate();
-                 $price = $row->price();
-                 $priceAlt = $row->getPriceAlt();
-                 $priceDollar = 0;
-                 $sale = 0;
-                 if ($priceAlt > 0 && $priceAlt < $row->getPrice()) {
-                     $priceAlt = $row->getPrice();
-                     $sale = ($row->getPriceAlt() / $row->getPrice()) * 100;
-                 }
-                 if ($dollar > 0) {
-                     $priceDollar = ceil($price / $dollar);
-                 }
-                 $vehicleTypeData = VehicleType::getTypeDataById($row->getVehicleType());
-                 $vehicleUrl = $this->router->generate('automarket_vehicle', ['state' => 'used', 'type' => $vehicleTypeData['url'], 'brand' => $row->getBrand()->getUrl(), 'model' => $row->getModel()->getUrl(),'id' => $row->getVehicleId()]);
-                 $engineVolume = (int)$row->getEngineVolume($request->getLocale());
-                 $engineVolumeFormat = $engineVolume > 10 ? number_format( $engineVolume/1000, 1, '.', '') : number_format( $engineVolume, 1, '.', '');
-                 $rows[] = [
-                     'id' => $row->getVehicleId(),
-                     'itemId' => $row->getVehicleItemId(),
-                     'title' => $row->getModelName(),
-                     'fullName' => $row->getFullName(),
-                     'year' => $row->getYear(),
-                     'price' => intval($price),
-                     'price_alt' => intval($priceAlt),
-                     'price_dollar' => intval($priceDollar),
-                     'deposit' => $row->getDeposit(),
-                     'sold' => $row->getSold(),
-                     'sale' => ($sale)? 100 - intval($sale) : null,
-                     'engine_volume' => $engineVolumeFormat,
-                     'mileage' => $row->getMileage(),
-                     'mileageThousand' => floor($row->getMileage() / 1000),
-                     'url' => $vehicleUrl,
-                     'bodyType' => $row->getBodyTypeName($lang),
-                     'engine_type' => $row->getFuelTypeName($lang),
-                     'transmission' => $row->getTransmissionTypeName($lang),
-                     'creditPayment' => $this->creditModel->getMinPayment($row),
-                     'featuredId' => $featuresIds[$row->getVehicleItemId()] ?? null,
-                     'featuredLink' => $request->getSchemeAndHttpHost().$vehicleUrl,
-                     'comparedId' => in_array($row->getVehicleItemId(),$vehicleComparison)? $row->getVehicleItemId() : null,
-                     'media' => [
-                         'image' => $this->media->getPath($row->getPreview(), 'reference')
-                     ],
-                     'riaPublicationDate' => $row->getRiaPublicationDate(),
-                     'isElectric' => $row->isElectric(),
-                     'batteryCapacity' => $row->getBatteryCapacity($lang),
-                 ];
-                 return $rows;
-             } catch (Exception $e) {
-                 return $rows;
-             }
-         }, []);
-     }
-     private function roundMaxData($num){
-         if($num > 10) {
-             $shorNum = intval('1' . str_repeat('0', floor(log10($num))));
-             $remainder = $num % $shorNum;
-             $num += $shorNum - $remainder;
-         }
-         return $num;
-     }
-     public function buildFilter($typeFilter = null){
-         $request = $this->requestStack->getCurrentRequest();
-         $locale = $request->getLocale();
-         $vehicleTypeData = $this->getVehicleType();
-         $brand = isset($routeParams['brand']) ? $this->em->getRepository(\CoreBundle\Entity\Brand::class)->findOneBy(['url' => $routeParams['brand']]) : null;
-         $model = isset($routeParams['model']) && $brand ? $this->em->getRepository(\CoreBundle\Entity\Model::class)->findOneBy(['url' => $routeParams['model'], 'brand' => $brand]) : null;
-         $query = $this->em->getRepository(\CoreBundle\Entity\Vehicles\VariationCharacteristic::class)
-             ->createQueryBuilder('vc')
-             ->join('vc.characteristic', 'c', Join::WITH, 'c.vehicle_type = :type')->setParameter('type', $vehicleTypeData['id'])
-             ->join('vc.characteristic_value','cv')
-             ->join('vc.variation', 'v', Join::WITH, 'v.state = 1')
-             ->join('v.vehicle', 've', Join::WITH, 've.state = 1 AND ve.is_delete <> 1 AND ve.is_used = :is_used')->setParameter('is_used', 1)
-             ->join('v.vehicle_items','vi', Join::WITH, 'vi.state = 1')
-             ->andWhere('ve.is_not_filled = 0')
-             ->andWhere('ve.is_delete != 1');
-         if($typeFilter){
-             $query->andWhere('c.model_unique IN (:modelUniques)')->setParameter('modelUniques', $typeFilter);
-         }
-         if ($model) {
-             $query->join('ve.model', 'm')
-                 ->andWhere('m.id = :model')
-                 ->setParameter('model', $model->getId());
-         }
-         if ($brand && !$model) {
-             $query->join('ve.model', 'm')
-                 ->join('m.brand', 'b')
-                 ->andWhere('b.id = :brand')
-                 ->setParameter('brand', $brand->getId());
-         }
-         if ($locale == 'ru') {
-             $query->orderBy('cv.position')->addOrderBy('cv.value_ru');
-         }else{
-             $query->orderBy('cv.position')->addOrderBy('cv.value_ua');
-         }
-         $vCharacteristics = $query->getQuery()->getResult();
-         $query->addSelect('vi.price')
-             ->addSelect('vi.mileage')
-             ->addSelect('vi.year');
-         $maxVehicleResult = $query->getQuery()->getResult();
-         $filters['limitationData'] = [
-             'minPrice' => 0,
-             'maxPrice' => $this->roundMaxData(max(array_column($maxVehicleResult, 'price'))),
-             'minYear' => 0,
-             'maxYear' => max(array_column($maxVehicleResult, 'year')),
-             'minMileage' => 0,
-             'maxMileage' => $this->roundMaxData(max(array_column($maxVehicleResult, 'mileage'))),
-         ];
-         /** @var VariationCharacteristic $vCharacteristic */
-         foreach ($vCharacteristics as $vCharacteristic){
-             $characteristic = $vCharacteristic->getCharacteristic();
-             $characteristicValue = $vCharacteristic->getCharacteristicValue();
-             if(!$characteristic->getUrl() || $characteristic->getUrl() == ''){
-                 continue;
-             }
-             // Тільки автомат та механіка у типі КПП
-             if($characteristic->getUrl() == "kpp" &&
-                 ($characteristicValue->getUrl() != "avtomat" && $characteristicValue->getUrl() != "mehanika")){
-                 continue;
-             }
-             if (!isset($filters['characteristic'][$characteristic->getUrl()])) {
-                 $filters['characteristic'][$characteristic->getUrl()] = [
-                     'id' => $characteristic->getId(),
-                     'title' => $characteristic->getTitle($locale),
-                     'url' => $characteristic->getUrl(),
-                     'values' => [],
-                 ];
-             }
-             if(isset($filters['characteristic'][$characteristic->getUrl()]['values'][$characteristicValue->getId()])){
-                 continue;
-             }
-             if ($characteristic->getUrl()) {
-                 $filters['characteristic'][$characteristic->getUrl()]['values'][$characteristicValue->getId()] = [
-                     'id' => $characteristicValue->getId(),
-                     'title' => $characteristicValue->getValue($locale),
-                     'url' => $characteristicValue->getUrl(),
-                 ];
-             } else {
-                 $filters['characteristic'][$characteristic->getUrl()]['values'] = null;
-             }
-         }
-         $query = $this->em->getRepository(\CoreBundle\Entity\Vehicles\RecommendGroup::class)
-             ->createQueryBuilder('rg')
-             ->select('rg')
-             ->join('rg.vehicles', 've')
-             ->where('ve.vehicle_type = :type')
-             ->andWhere('ve.state = 1')
-             ->andWhere('ve.is_delete != 1')
-             ->setParameter('type', $vehicleTypeData['id'])
-             ->andWhere('rg.state = :rgState')
-             ->setParameter('rgState', true)
-             ->andWhere('rg.state_slider = :rgStateSlider')
-             ->setParameter('rgStateSlider', true)
-             ->andWhere('ve.is_used = :is_used')->setParameter('is_used', 1);
-         $recommendGroup = $query->getQuery()->getResult();
-         $filters['recommendGroup'] = [
-             'url' => 'recommendGroup',
-             'values' => [],
-         ];
-         /** @var RecommendGroup $item */
-         foreach ($recommendGroup as $item) {
-             $filters['recommendGroup']['values'][$item->getId()] = [
-                 'id' => $item->getId(),
-                 'title' => $item->getTitle($locale),
-                 'url' => $item->getUrl(),
-             ];
-         }
-         $query = $this->em->getRepository(\CoreBundle\Entity\Vehicles\Vehicle::class)
-             ->createQueryBuilder('v')
-             ->select('b.id as bid', 'b.url as burl', 'b.name', 'm.id', 'm.url', 'm.title')
-             ->join('v.model', 'm')
-             ->join('m.brand', 'b')
-             ->leftJoin('b.logo', 'logo')
-             ->where('v.vehicle_type = :type')
-             ->andWhere('v.state = 1')
-             ->andWhere('v.is_delete != 1')
-             ->setParameter('type', $vehicleTypeData['id'])
-             ->andWhere('v.is_used = :is_used')->setParameter('is_used', 1);
-         $brands = $query->getQuery()->getResult();
-         foreach ($brands as $line) {
-             if (!isset($filters['brand'][$line['burl']])) {
-                 $filters['brand'][$line['burl']] = [
-                     'id' => $line['bid'],
-                     'title' => $line['name'],
-                     'url' => $line['burl'],
-                     'count' => 1,
-                     'models' => [],
-                 ];
-             }
-             $filters['brand'][$line['burl']]['models'][$line['id']] = [
-                 'id' => $line['id'],
-                 'url' => $line['url'],
-                 'title' => $line['title'],
-             ];
-         }
-         usort($filters['brand'], function ($a, $b) {
-             if ($a['title'] == $b['title']) {
-                 return 1;
-             }
-             return $a['title'] > $b['title'] ? 1 : -1;
-         });
-         return $filters;
-     }
-     public function getFilterHeader(){
-         $request = $this->requestStack->getCurrentRequest();
-         $requestParams = $request->query->all();
-         $vehicleTypeData = $this->getVehicleType();
-         $catalogCharacteristic = $this->getCharacteristicsByParams($vehicleTypeData['id']);
-         $catalogRecommendGroup = $this->getRecommendGroupByParams($vehicleTypeData['id']);
-         $filters = [];
-         foreach ($requestParams as $type => $params) {
-             if (!is_array($params)) {
-                 $from = $this->translator->trans('new_catalog.from', [], 'portal_base') . ' ' . $params;
-                 $to = ' '.$this->translator->trans('new_catalog.to', [], 'portal_base') . ' ' . $params;
-                 $year = $this->translator->trans('new_catalog.year', [], 'portal_base') . ' ';
-                 $price = $this->translator->trans('new_catalog.price', [], 'portal_base') . ' ';
-                 $mileage = $this->translator->trans('cars.used.mileage', [], 'portal_base') . ' ';
-                 switch ($type) {
-                     case $type == 'minYear' && $params > 0:
-                         $filters['range']['year'] = $year . $from;
-                         break;
-                     case $type == 'maxYear' && $params > 0:
-                         $filters['range']['year'] =
-                             isset($filters['range']['year']) ? $filters['range']['year'] . $to : $year . $to;
-                         break;
-                     case $type == 'minPrice' && $params > 0:
-                         $filters['range']['price'] = $price . $from. ' грн';
-                         break;
-                     case $type == 'maxPrice' && $params > 0:
-                         $filters['range']['price'] =
-                             isset($filters['range']['price']) ? $filters['range']['price'] . $to. ' грн' : $price . $to . ' грн';
-                         break;
-                     case $type == 'minMileage' && $params > 0:
-                         $filters['range']['mileage'] = $mileage . $from. ' тис.';
-                         break;
-                     case $type == 'maxMileage' && $params > 0:
-                         $filters['range']['mileage'] =
-                             isset($filters['range']['mileage']) ? $filters['range']['mileage'] . $to. ' тис.' : $mileage . $to . ' тис.';
-                         break;
-                 }
-                 continue;
-             }
-             if(empty($params)){
-                 continue;
-             }
-             if($type == 'recommendGroup'){
-                 $filters[$type] = array_intersect_key($catalogRecommendGroup, $params);
-                 continue;
-             }
-             if($type == 'characteristic'){
-                 foreach ($params as $paramType => $param){
-                     $result = array_intersect_key($catalogCharacteristic, $params);
-                     if(count($result)) {
-                         $filters['characteristic'][$paramType] = array_intersect_key($catalogCharacteristic[$paramType], $param);
-                     }
-                 }
-                 continue;
-             }
-             $filters[$type] = $params;
-         }
-         return $filters;
-     }
-     public function getRouteFilterParams(Dealer $dealer)
-     {
-         $request = $this->requestStack->getCurrentRequest();
-         $routeParams = $request->attributes->get('_route_params');
-         $params = [];
-         $typeParams = ['state', 'type', 'brand', 'model', 'param', 'price', 'recommendGroup'];
-         foreach ($typeParams as $type){
-             switch ($type) {
-                 case 'price':
-                     if(isset($routeParams['price'])) {
-                         $params['maxPrice'] = floor($routeParams[$type] * $dealer->getRate());
-                     }
-                     break;
-                 case 'param':
-                     foreach ($routeParams as $key => $value) {
-                         if (preg_match('/^param(\d*)$/', $key, $matches)) {
-                             $index = $matches[1];
-                             $valueKey = $index ? 'value' . $index : 'value';
-                             if (isset($routeParams[$valueKey])) {
-                                 $params['characteristic'][$value][$routeParams[$valueKey]] = true;
-                             }
-                         }
-                     }
- //                    if(isset($routeParams['param']) && isset($routeParams['value'])) {
- //                        $params['characteristic'][$routeParams['param']][$routeParams['value']] = true;
- //                    }
-                     break;
-                 case 'model':
-                 case 'brand':
-                 case 'recommendGroup':
-                     if(isset($routeParams[$type])) {
-                         $params[$type][$routeParams[$type]] = true;
-                     }
-                     break;
-                 default:
-                     if(isset($routeParams[$type])){
-                         $params[$type] = $routeParams[$type];
-                     }
-                     break;
-             }
-         }
-         return $params;
-     }
-     public function showMoreCatalog($countVehicle, $countVehicleByPage)
-     {
-         $request = $this->requestStack->getCurrentRequest();
-         $currentPage = $request->query->get('page') ?: 1;
-         return (($countVehicle - $countVehicleByPage*$currentPage) > 0);
-     }
-     public function buildSearchUrl()
-     {
-         $request = $this->requestStack->getCurrentRequest();
-         $searchParams = $request->query->all();
-         $searchParams = array_filter($searchParams, fn($value) => $value !== "");
-         return $this->router->generate('automarket_catalog_search', $searchParams);
-     }
-     public function findModelByParams($urlBrands = null, $urlModels = null)
-     {
-         $filterBrands = $this->em->getRepository(\CoreBundle\Entity\Brand::class)->getBrandsByUrl($urlBrands);
-         $filterModelIds = [];
-         /** @var Brand $brand */
-         foreach ($filterBrands as $brand) {
-             $models = [];
-             $modelSearch = [];
-             /** @var Model $model */
-             foreach ($brand->getModels() as $model) {
-                 if (!$model->getUrl()) {
-                     continue;
-                 }
-                 if (in_array($model->getUrl(), $urlModels)) {
-                     $modelSearch[] = $model->getId();
-                 }
-                 $models[] = $model->getId();
-             }
-             $filterModelIds = (empty($modelSearch)) ? array_merge($filterModelIds, $models) : array_merge($filterModelIds, $modelSearch);
-         }
-         return $filterModelIds;
-     }
-     public function findVehicleByParams($pageLimit = null)
-     {
-         $request = $this->requestStack->getCurrentRequest();
-         $routeParams = $request->attributes->get('_route_params');
-         $routeSearch = ($request->attributes->get('_route') == 'automarket_catalog_search');
-         $searchParams = $request->query->all();
-         $brand = $routeParams['brand'] ?? null;
-         $model = $routeParams['model'] ?? null;
-         $price = $routeParams['price'] ?? null;
-         $year = $routeParams['year'] ?? null;
-         $param = $routeParams['param'] ?? null;
-         $param_value = $routeParams['value'] ?? null;
-         $param2 = $routeParams['param2'] ?? null;
-         $param_value2 = $routeParams['value2'] ?? null;
-         $recommendGroup = $routeParams['recommendGroup'] ?? null;
-         $vehicleTypeData = $this->getVehicleType();
-         $mounthAgo = (new DateTime())->modify('-30 days')->format('Y-m-d H:i:s');;
-         $query = $this->em->getRepository(\CoreBundle\Entity\Vehicles\VehicleItem::class)
-             ->createQueryBuilder('vi')
-             ->addSelect('vi')
-             ->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')
-             ->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')
-             ->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')
-             ->join('vi.variation', 'v')
-             ->join('v.vehicle', 've')
-             ->join('v.characteristics', 'vch')
-             ->join('vch.characteristic', 'ch')
-             ->join('vch.characteristic_value', 'chv')
-             ->join('ve.dealer', 'd')
-             ->join('ve.model', 'm')
-             ->join('m.brand', 'b')
-             ->leftJoin('ve.recommend_group', 'rg')
-             ->where('ve.vehicle_type = :type')
-             //  TODO Навіщо ми перевіряємо vehicleItem state на вживаних авто? У вживаного авто є всього 1 vehicleItem, і ми маємо відображати авто по vehicle state. Якщо все буде ок, повидаляти з усіх запитів
-             //  ->andWhere('vi.state = 1')
-             ->andWhere('ve.state = 1')
-             ->andWhere('ve.is_not_filled = 0')
-             ->andWhere('ve.is_delete != 1')
-             ->setParameter('type', $vehicleTypeData['id'])
-             ->andWhere('ve.is_used = :isUsed')->setParameter('isUsed', true)
-             ->andWhere('vi.date_of_sale > :mounthAgo OR vi.date_of_sale IS NULL')
-             ->orderBy('vi.sold', 'ASC')
-             ->addOrderBy('vi.deposit', 'ASC')
-             ->setParameter('mounthAgo', $mounthAgo);
-         if(!$routeSearch) {
-             if ($brand) {
-                 $query->andWhere('b.url = :brand')->setParameter('brand', $brand);
-             }
-             if ($brand && $model) {
-                 $query->andWhere('m.url = :model')->setParameter('model', $model);
-             }
-             if (isset($routeParams['param']) && $routeParams['param'] && isset($routeParams['value']) && $routeParams['value']) {
-                 $query->andWhere('ch.url = :param AND chv.url = :paramValue')
-                     ->setParameter('param', $routeParams['param'])
-                     ->setParameter('paramValue', $routeParams['value']);
-             }
-             if (isset($routeParams['param2']) && isset($routeParams['value2'])) {
-                 $cvIds = [];
-                 $cType = $this->em->getRepository(\CoreBundle\Entity\Vehicles\Characteristic::class)->findOneBy(['url' => $routeParams['param2']]);
-                 $alias = 'vc' . $cType->getId();
-                 $fKey = 'charId' . $cType->getId();
-                 $tKey = 'cids' . $cType->getId();
-                 $query->join('v.characteristics', $alias);
-                 $cValue = $this->em->getRepository(\CoreBundle\Entity\Vehicles\CharacteristicValue::class)->findOneBy(['url' => $routeParams['value2'], 'characteristic' => $cType]);
-                 if ($cValue) {
-                     $cvIds[] = $cValue->getId();
-                 }
-                 if (!empty($cvIds)) {
-                     $query->andWhere($alias . '.characteristic = :' . $fKey)->setParameter($fKey, $cType->getId());
-                     $query->andWhere($alias . '.characteristic_value IN (:' . $tKey . ')')->setParameter($tKey, $cvIds);
-                 }
-             }
-             if ($price) {
-                 $query->andHaving('priceUsd <= :price')->setParameter('price', $price);
-             }
-             if ($year) {
-                 $query->andHaving('vi.year <= :year')->setParameter('yearMax', $year);
-             }
-             if ($recommendGroup) {
-                 $query->andWhere('rg.url = :recommendGroup')->setParameter('recommendGroup', $recommendGroup);
-             }
-         }
-         if (count($searchParams)) {
-             foreach ($searchParams as $key => $item) {
-                 switch ($key) {
-                     case 'brand':
-                         if (!isset($searchParams['model'])) {
-                             $query->andWhere('b.url IN (:brand)')->setParameter('brand', array_keys($item));
-                         } else {
-                             $filterModelIds = $this->findModelByParams(array_keys($item), array_keys($searchParams['model']));
-                             $query->andWhere('m.id IN (:modelIds)')->setParameter('modelIds', $filterModelIds);
-                         }
-                         break;
-                     case 'model':
-                         if (!isset($searchParams['brand']) || count($searchParams['brand']) == 1) {
-                             $query->andWhere('m.url IN (:model)')->setParameter('model', array_keys($item));
-                         }
-                         break;
-                     case 'recommendGroup':
-                         $query->andWhere('rg.url IN (:recommendGroup)')->setParameter('recommendGroup', array_keys($item));
-                         break;
-                     case 'minPrice':
-                         if ($item > 0) {
-                             $query->andHaving('price >= :minPrice')->setParameter('minPrice', $item);
-                         }
-                         break;
-                     case 'maxPrice':
-                         if ($item > 0) {
-                             $query->andHaving('price <= :maxPrice')->setParameter('maxPrice', $item);
-                         }
-                         break;
-                     case 'minYear':
-                         if ($item > 0) {
-                             $query->andHaving('vi.year >= :minYear')->setParameter('minYear', $item);
-                         }
-                         break;
-                     case 'maxYear':
-                         if ($item > 0) {
-                             $query->andHaving('vi.year <= :maxYear')->setParameter('maxYear', $item);
-                         }
-                         break;
-                     case 'minMileage':
-                         if ($item > 0) {
-                             $query->andHaving('vi.mileage >= :minMileage')->setParameter('minMileage', $item * 1000);
-                         }
-                         break;
-                     case 'maxMileage':
-                         if ($item > 0) {
-                             $query->andHaving('vi.mileage <= :maxMileage')->setParameter('maxMileage', $item * 1000);
-                         }
-                         break;
-                     case 'hasNDS':
-                         if ($item == 'true') {
-                             $query->andWhere('vi.has_nds = 1');
-                         }
-                         break;
-                     case 'sale':
-                         if ($item == 'true') {
-                             $query->andWhere('vi.alt_price > 0');
-                         }
-                         break;
-                     case 'isSelect':
-                         if ($item == 'true') {
-                             $query->andWhere($query->expr()->notIn('ve.dealer', Catalog::NOT_VIDI_SELECT_DEALERS));
-                         }
-                         break;
-                 }
-             }
-         }
-         if (isset($searchParams['characteristic']) && $searchParams['characteristic']) {
-             foreach ($searchParams['characteristic'] as $type => $params) {
-                 $cvIds = [];
-                 $cType = $this->em->getRepository(\CoreBundle\Entity\Vehicles\Characteristic::class)->findOneBy(['url' => $type]);
-                 $alias = 'vc' . $cType->getId();
-                 $fKey = 'charId' . $cType->getId();
-                 $tKey = 'cids' . $cType->getId();
-                 $query->join('v.characteristics', $alias);
-                 foreach (array_keys($params) as $vchUrl) {
-                     $cValue = $this->em->getRepository(\CoreBundle\Entity\Vehicles\CharacteristicValue::class)->findOneBy(['url' => $vchUrl, 'characteristic' => $cType]);
-                     if ($cValue) {
-                         $cvIds[] = $cValue->getId();
-                     }
-                 }
-                 if (!empty($cvIds)) {
-                     $query->andWhere($alias . '.characteristic = :' . $fKey)->setParameter($fKey, $cType->getId());
-                     $query->andWhere($alias . '.characteristic_value IN (:' . $tKey . ')')->setParameter($tKey, $cvIds);
-                 }
-             }
-         }
-         $allResult = $query->getQuery()->getResult();
-         $totalCount = count($allResult);
-         $prices = [];
-         $pricesUsd = [];
-         $dollar = $this->em->getRepository(Dealer::class)->find(6)->getRate();
-         if($totalCount){
-             foreach ($allResult as $oneResult) {
-                     $prices[] = ceil($oneResult['price']);
-                     $pricesUsd[] = ceil($oneResult['price'] / $dollar);
-             }
-         }
-         $dataPrice = [
-           'minPrice' => $totalCount ? min($prices) : 0,
-           'maxPrice' => $totalCount ? max($prices) : 0,
-           'minPriceUsd' => $totalCount ? min($pricesUsd) : 0,
-           'maxPriceUsd' => $totalCount ? max($pricesUsd) : 0,
-         ];
-         unset($allResult);
-         if($pageLimit) {
-             $limit = $pageLimit;
-             $page = isset($searchParams['page']) && $searchParams['page'] != ''  ? $searchParams['page'] : 1;
-             $start = ($page - 1) * $limit;
-         }
-         $query->groupBy('vi');
-         if (isset($searchParams['sortOrder'])) {
-             $sortData = explode('-', $searchParams['sortOrder']);
-             $sortField = $sortData[0] ?? 'price';
-             $sortAD = isset($sortData[1]) && in_array($sortData[1], ['ASC', 'DESC']) ? $sortData[1] : 'ASC';
-             switch ($sortField) {
-                 case 'price':
-                     $field = $sortAD == 'DESC' ? 'price' : 'orderPrice';
-                     $query->addOrderBy($field, $sortAD);
-                     $query->addOrderBy('b.name', 'ASC');
-                     $query->addOrderBy('m.title', 'ASC');
-                     break;
-                 case 'year':
-                     $query->addOrderBy('vi.year', $sortAD);
-                     $query->addOrderBy('b.name', 'ASC');
-                     $query->addOrderBy('m.title', 'ASC');
-                     break;
-                 case 'mileage':
-                     $query->addOrderBy('vi.mileage', $sortAD);
-                     $query->addOrderBy('b.name', 'ASC');
-                     $query->addOrderBy('m.title', 'ASC');
-                     break;
-                 case 'addVehicle':
-                     $query->addOrderBy('ve.date_create', $sortAD);
-                     $query->addOrderBy('b.name', 'ASC');
-                     $query->addOrderBy('m.title', 'ASC');
-                     break;
-                 default:
-                     $query->addOrderBy('orderPrice', 'ASC');
-                     $query->addOrderBy('b.name', 'ASC');
-                     $query->addOrderBy('m.title', 'ASC');
-                     break;
-             }
-         } else {
-             $query->addOrderBy('orderPrice', 'ASC');
-         }
-         if($pageLimit) {
-             $query->setFirstResult($start)->setMaxResults($limit);
-         }
-         $data = $query->getQuery()->getResult();
-         return [
-             'count' => $totalCount,
-             'dataPrice' => $dataPrice,
-             'data' => $data
-         ];
-     }
-     public function noFindVehicleByParams($pageLimit = 21)
-     {
-         $vehicleTypeData = $this->getVehicleType();
-         $query = $this->em->getRepository(VehicleItem::class)
-             ->createQueryBuilder('vi')
-             ->addSelect('vi')
-             ->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')
-             ->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')
-             ->join('vi.variation', 'v')
-             ->join('v.vehicle', 've', Join::WITH, 've.is_used = :isUsed')->setParameter('isUsed', true)
-             ->join('ve.dealer', 'd')
-             ->andWhere('ve.vehicle_type = :type')
-             //  TODO Навіщо ми перевіряємо vehicleItem state на вживаних авто? У вживаного авто є всього 1 vehicleItem, і ми маємо відображати авто по vehicle state. Якщо все буде ок, повидаляти з усіх запитів
-             //  ->andWhere('vi.state = 1')
-             ->andWhere('ve.state = 1')
-             ->andWhere('ve.is_not_filled = 0')
-             ->andWhere('ve.is_delete != 1')
-             ->setParameter('type', $vehicleTypeData['id'])
-             ->orderBy('v.id', 'DESC')
-             ->setMaxResults($pageLimit);
-         return [
-             'count' => 0,
-             'dataPrice' => ['minPrice' => 0,'maxPrice' => 0,'minPriceUsd' => 0,'maxPriceUsd' =>  0],
-             'data' => $query->getQuery()->getResult(),
-         ];
-     }
-     public function getBreadcrumbs()
-     {
-         $translator = $this->translator;
-         $router = $this->router;
-         $request = $this->requestStack->getCurrentRequest();
-         $routeParams = $request->attributes->get('_route_params');
-         $vehicleTypeData = $this->getVehicleType();
-         $catalogCharacteristic = $this->getCharacteristicsByParams($vehicleTypeData['id']);
-         $catalogRecommendGroup = $this->getRecommendGroupByParams($vehicleTypeData['id']);
-         $breadcrumbs = [];
-         $state = $routeParams['state'] ?? null;
-         $type = $routeParams['type'] ?? null;
-         $brand = $routeParams['brand'] ?? null;
-         $model = $routeParams['model'] ?? null;
-         $param = $routeParams['param'] ?? null;
-         $value = $routeParams['value'] ?? null;
-         $param2 = $routeParams['param2'] ?? null;
-         $value2 = $routeParams['value2'] ?? null;
-         $price = $routeParams['price'] ?? null;
-         $recommendGroup = $routeParams['recommendGroup'] ?? null;
-         $CharacteristicValue = $catalogCharacteristic[$param][$value] ?? null;
-         $CharacteristicValue2 = $catalogCharacteristic[$param2][$value2] ?? null;
-         $recommendGroupValue = $catalogRecommendGroup[$recommendGroup] ?? null;
-         if($state && $type){
-             $breadcrumbs[] = [
-               'title' => $translator->trans('catalog.' . $state . '_' . $type, [], 'automarket_base'),
-               'url' => $router->generate('automarket_catalog', ['state' => $state, 'type' => $type]),
-             ];
-         }
-         if($brand){
-             $breadcrumbs[] = [
-                 'title' => $brand,
-                 'url' => $router->generate('automarket_catalog_brand', ['state' => $state, 'type' => $type, 'brand' => $brand]),
-             ];
-         }
-         if($brand && $model){
-             $breadcrumbs[] = [
-                 'title' => $model,
-                 'url' => $router->generate('automarket_catalog_brand_model', ['state' => $state, 'type' => $type, 'brand' => $brand, 'model' => $model]),
-             ];
-         }
-         if($recommendGroup){
-             $breadcrumbs[] = [
-                 'title' => $recommendGroupValue,
-                 'url' => $router->generate('automarket_catalog_vehicle_collections', ['state' => $state, 'type' => $type, 'recommendGroup' => $recommendGroup]),
-             ];
-         }
-         if($param && $value && !$brand && !$model){
-             $breadcrumbs[] = [
-                 'title' => $CharacteristicValue,
-                 'url' => $router->generate('automarket_catalog_characteristic', ['state' => $state, 'type' => $type, 'brand' => $brand, 'model' => $model, 'param' => $param, 'value' => $value]),
-             ];
-         }
-         if($param && $value && $param2 && $value2 && !$brand && !$model){
-             $breadcrumbs[] = [
-                 'title' => $CharacteristicValue2,
-                 'url' => $router->generate('automarket_catalog_characteristic_by_body', ['state' => $state, 'type' => $type, 'brand' => $brand, 'model' => $model, 'param' => $param, 'value' => $value, 'param2' => $param2, 'value2' => $value2]),
-             ];
-         }
-         if ($param && $value && $brand && !$model) {
-             $breadcrumbs[] = [
-                 'title' => $CharacteristicValue,
-                 'url' => $router->generate('automarket_catalog_brand_characteristic', ['state' => $state, 'type' => $type, 'brand' => $brand, 'param' => $param, 'value' => $value]),
-             ];
-         }
-         if($param && $value && $brand && $model){
-             $breadcrumbs[] = [
-                 'title' => $CharacteristicValue,
-                 'url' => $router->generate('automarket_catalog_brand_model_characteristic', ['state' => $state, 'type' => $type, 'brand' => $brand, 'model' => $model, 'param' => $param, 'value' => $value]),
-             ];
-         }
-         if($price && $param && $value  && $brand && $model){
-             $breadcrumbs[] = [
-                 'title' => 'до ' . $price . ' $',
-                 'url' => $router->generate('automarket_catalog_brand_model_characteristic_price', ['state' => $state, 'type' => $type, 'brand' => $brand, 'model' => $model, 'param' => $param, 'value' => $value, 'price' => $price]),
-             ];
-         }elseif($price && $brand && $model){
-             $breadcrumbs[] = [
-                 'title' => 'до ' . $price . ' $',
-                 'url' => $router->generate('automarket_catalog_brand_model_price', ['state' => $state, 'type' => $type, 'brand' => $brand, 'model' => $model, 'price' => $price]),
-             ];
-         }
-         return $breadcrumbs;
-     }
-     public function getSchemaCatalog()
-     {
-     }
- }
-