src/AutomarketBundle/Services/MainService.php line 241

Open in your IDE?
  1. <?php
  2. namespace AutomarketBundle\Services;
  3. use CoreBundle\Entity\Brand;
  4. use CoreBundle\Entity\Dealer;
  5. use CoreBundle\Entity\Vehicles\CharacteristicValue;
  6. use CoreBundle\Entity\Vehicles\Vehicle;
  7. use CoreBundle\Entity\Vehicles\VehicleItem;
  8. use CoreBundle\Model\Vehicles\Repository;
  9. use CoreBundle\Model\Vehicles\VehicleType;
  10. use CoreBundle\Services\MediaExtensionVidi;
  11. use DcSiteBundle\Services\VehicleService;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Doctrine\ORM\Query\Expr\Join;
  14. use Symfony\Component\Routing\RouterInterface;
  15. class MainService
  16. {
  17.     /**
  18.      * @var EntityManagerInterface
  19.      */
  20.     private $em;
  21.     /**
  22.      * @var MediaExtensionVidi
  23.      */
  24.     private $media;
  25.     /**
  26.      * @var RouterInterface
  27.      */
  28.     private $router;
  29.     /**
  30.      * @var Repository
  31.      */
  32.     private $vehicleRepository;
  33.     /**
  34.      * @var Repository
  35.      */
  36.     private $catalogService;
  37.     /**
  38.      * @var VehicleService
  39.      */
  40.     private $vehicleService;
  41.     /**
  42.      * @var string $lang
  43.      */
  44.     private $lang 'ua';
  45.     public function __construct(MediaExtensionVidi $mediaRouterInterface $routerEntityManagerInterface $em,
  46.                                 Repository $vehicleRepositoryCatalogService  $catalogServiceVehicleService $vehicleService)
  47.     {
  48.         $this->em $em;
  49.         $this->router $router;
  50.         $this->media $media;
  51.         $this->vehicleRepository $vehicleRepository;
  52.         $this->catalogService $catalogService;
  53.         $this->vehicleService $vehicleService;
  54.     }
  55.     public function setLang(string $lang): MainService
  56.     {
  57.         $this->lang $lang;
  58.         return $this;
  59.     }
  60.     /**
  61.      * Отримати тип кузова
  62.      *
  63.      * @param Dealer $dealer
  64.      * @return array
  65.      */
  66.     public function getBodyTypes(Dealer $dealer): array
  67.     {
  68.         $rows $this->em
  69.             ->getRepository(CharacteristicValue::class)
  70.             ->getBodyTypesByDealer();
  71.         $bodyTypes = [];
  72.         /** @var CharacteristicValue $row */
  73.         foreach ($rows as $row){
  74.             $vehicleTypeData VehicleType::getTypeDataById($row->getCharacteristic()->getVehicleType());
  75.             if($row->getCharacteristic()->getVehicleType() === VehicleType::MOTO_TYPE and $row->getId() !== 278){
  76.                 continue;
  77.             }
  78.             $href $this->router->generate('automarket_catalog_characteristic',['state' => 'used','type' => $vehicleTypeData['url'], 'param' => 'body''value' => $row->getUrl() ]);
  79.             if($row->getCharacteristic()->getVehicleType() === VehicleType::MOTO_TYPE){
  80.                 $href $this->router->generate('automarket_catalog',['state' => 'used','type' => $vehicleTypeData['url'] ]);
  81.             }
  82.             $bodyTypes[] = [
  83.                 'id' => $row->getId(),
  84.                 'title' => $row->getValue($this->lang),
  85.                 'type' => $row->getUrl(),
  86.                 'href' => $href,
  87.             ];
  88.         }
  89.         return $bodyTypes;
  90.     }
  91.     /**
  92.      * Отримати бренди
  93.      *
  94.      * @param Dealer $dealer
  95.      * @return array
  96.      */
  97.     public function getBrands(Dealer $dealer): array
  98.     {
  99.         $rows $this->em->getRepository(Brand::class)
  100.             ->createQueryBuilder('b')
  101.             ->addSelect('COUNT(vi.id) AS count_vehicles')
  102.             ->addSelect('MIN(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 min_price')
  103.             ->innerJoin('b.models''m')
  104.             ->innerJoin('m.vehicles''v'Join::WITH'v.state = 1')
  105.             ->join('v.dealer''d')
  106.             ->innerJoin('v.vehicle_items''vi'Join::WITH'vi.state = 1')
  107.             ->where('v.is_used = 1')
  108.             ->andWhere('v.vehicle_type = :type')->setParameter('type'1)
  109.             ->andWhere('vi.deposit = :deposit')->setParameter('deposit'false)
  110.             ->andWhere('vi.sold = :sold')->setParameter('sold'false)
  111. //            ->andWhere('v.dealer = :dealer')->setParameter('dealer', $dealer->getId())
  112.             ->groupBy('b.id')
  113.             ->getQuery()
  114.             ->getResult();
  115.         $rows array_map(function($row) use ($dealer) {
  116.             /**
  117.              * @var Brand $brand
  118.              */
  119.             $brand $row[0];
  120.             $dollar $dealer->getRate();
  121.             $price $row['min_price'];
  122.             $priceDollar ceil($price $dollar);
  123.             return [
  124.                 'id' => $brand->getId(),
  125.                 'name' => $brand->getName(),
  126.                 'count' => $row['count_vehicles'],
  127.                 'price' => intval($priceDollar),
  128.                 'url'=> $this->router->generate('automarket_catalog_brand',['state' => 'used''type' => 'car''brand' => $brand->getUrl() ]),
  129.                 'media' => [
  130.                     'image' => $this->media->getPath($brand->getLogo(), 'menu')
  131.                 ]
  132.             ];
  133.         }, $rows);
  134.         usort($rows, fn($a$b) => $b['count'] <=> $a['count']);
  135.         return $rows;
  136.     }
  137.     /**
  138.      * Отримати нові надходження
  139.      *
  140.      * @param Dealer $dealer
  141.      * @param $user
  142.      * @return array
  143.      */
  144.     public function getNewArrivals(Dealer $dealer$user$isUsed$lang): array
  145.     {
  146.         $newArrivalsVehicleItems $this->vehicleRepository->getNewAddVehicleItem($isUsed5$dealer);
  147.         return $this->catalogService->getVehicleCatalogItem($dealer$newArrivalsVehicleItems$user$lang);
  148.     }
  149.     /**
  150.      * Отримати vehicle зі знижкою
  151.      *
  152.      * @param Dealer $dealer
  153.      * @param $user
  154.      * @return array
  155.      */
  156.     public function getProposeVehicles(Dealer $dealer$user$isUsed$lang$vehicle$vehicleItemID$withDiscount false): array
  157.     {
  158.         $brand $vehicle->getModel()->getBrand();
  159.         $model $vehicle->getModel();
  160.         $bodyType $vehicle->getBodyType();
  161.         $price $vehicle->price();
  162.         // 1. Brand + Model
  163.         $vehiclesSaleList $this->vehicleRepository
  164.             ->getProposeVehicleItem($isUsed$brand$modelnull$withDiscount);
  165.         // 2. BodyType + Price
  166.         $vehiclesByBodyType $this->vehicleRepository
  167.             ->getProposeVehicleItem($isUsednullnull$bodyType$withDiscount);
  168.         $minPriceRange $price 20000;
  169.         $maxPriceRange $price 20000;
  170.         foreach ($vehiclesByBodyType as $vehicleByBodyType) {
  171.             $vehiclePrice $vehicleByBodyType->getAltPrice() ? $vehicleByBodyType->calcPrice() : $vehicleByBodyType->getPrice();
  172.             if ($vehiclePrice $minPriceRange || $vehiclePrice $maxPriceRange ) continue;
  173.             $vehiclesSaleList[] = $vehicleByBodyType;
  174.         }
  175.         // 3. Brand
  176.         $vehiclesByBrand $this->vehicleRepository
  177.             ->getProposeVehicleItem($isUsed$brandnullnull$withDiscount);
  178.         foreach($vehiclesByBrand as $vehicle){
  179.             $vehiclesSaleList[] = $vehicle;
  180.         }
  181.         // Уніфікуємо автомобілі
  182.         $vehiclesSaleListID = [];
  183.         foreach ($vehiclesSaleList as $vehicleItem){
  184.             $vehiclesSaleListID[] = $vehicleItem->getId();
  185.         }
  186.         $vehiclesSaleListID array_unique($vehiclesSaleListID);
  187.         // Видаляємо поточне авто
  188.         $index array_search($vehicleItemID$vehiclesSaleListID);
  189.         if ($index !== false) {
  190.             unset($vehiclesSaleListID[$index]);
  191.         }
  192.         $vehiclesSaleListID count($vehiclesSaleListID) > 10 array_slice($vehiclesSaleListID10) : $vehiclesSaleListID;
  193.         $uniqueVehicleList = [];
  194.         foreach ($vehiclesSaleListID as $vehicleItemID){
  195.             $uniqueVehicleList[] = $this->em->getRepository(VehicleItem::class)->find($vehicleItemID);
  196.         }
  197.         return $this->catalogService->getVehicleCatalogItem($dealer$uniqueVehicleList$user$lang);
  198.     }
  199.     /**
  200.      * Отримати наші добірки
  201.      *
  202.      * @return array
  203.      */
  204.     public function getOurSelections(): array
  205.     {
  206.         $rows $this->vehicleService->getRecommendGroup(truetruetrue);
  207.         return array_map(function($row) {
  208.             /** @var Vehicle $firstVehicle */
  209.             $firstVehicle $row->getVehicles()->first();
  210.             $vehicleTypeData VehicleType::getTypeDataById($firstVehicle->getVehicleType());
  211.             return [
  212.                 'id' => $row->getId(),
  213.                 'title' => $row->getTitle($this->lang),
  214.                 'url' => $this->router->generate('automarket_catalog_vehicle_collections', ['state' => 'used''type' => $vehicleTypeData['url'], 'recommendGroup' => $row->getUrl()]),
  215.                 'media' => [
  216.                     'image' => $this->media->getPath($row->getImage(), 'reference')
  217.                 ]
  218.             ];
  219.         }, $rows);
  220.     }
  221. }