src/DcSiteBundle/Services/UsedVehicleService.php line 271

Open in your IDE?
  1. <?php
  2. namespace DcSiteBundle\Services;
  3. use CoreBundle\Model\DealerModel;
  4. use CoreBundle\Services\MediaExtensionVidi;
  5. use DateTime;
  6. use CoreBundle\Entity\Brand;
  7. use CoreBundle\Entity\Dealer;
  8. use CoreBundle\Entity\Vehicles\Vehicle;
  9. use CoreBundle\Model\Vehicles\UsedVehicle;
  10. use PortalBundle\Model\Catalog;
  11. use CoreBundle\Model\Vehicles\Repository as VehicleRepository;
  12. use CoreBundle\Factory\Vehicle as VehicleFactory;
  13. use DcSiteBundle\Model\CreditModel;
  14. use Symfony\Component\Routing\RouterInterface;
  15. class UsedVehicleService
  16. {
  17.     const LIMIT 60;
  18.     private VehicleRepository $vehicleRepository;
  19.     private VehicleFactory $vehicleFactory;
  20.     private MediaExtensionVidi $twigMedia;
  21.     private RouterInterface $router;
  22.     private CreditModel $creditModel;
  23.     public function __construct(
  24.         VehicleRepository $vehicleRepository,
  25.         VehicleFactory $vehicleFactory,
  26.         MediaExtensionVidi $twigMedia,
  27.         RouterInterface $router,
  28.         CreditModel $creditModel
  29.     ) {
  30.         $this->vehicleRepository $vehicleRepository;
  31.         $this->vehicleFactory $vehicleFactory;
  32.         $this->twigMedia $twigMedia;
  33.         $this->router $router;
  34.         $this->creditModel $creditModel;
  35.     }
  36.     public function getUsedVehicle(Dealer $dealerBrand $brand$url$vehicleType false): ?\CoreBundle\Model\Vehicles\AbstractVehicle
  37.     {
  38.         $vehicle $this->vehicleRepository->getUsedVehicle($dealer$brand$url$vehicleType);
  39.         if(!$vehicle){
  40.             return NULL;
  41.         }
  42.         return $this->vehicleFactory->createByEntity($vehicle);
  43.     }
  44.     public function getUsedVehiclesForSitemap($dealer$path$locale$byBrand true$limit null$vehicleType false): array
  45.     {
  46.         $vehicles $this->vehicleRepository->getUsed($dealer$byBrand$vehicleType);
  47.         $limitedCars array_slice($vehicles0);
  48.         $links = [];
  49.         foreach ($limitedCars as $car) {
  50.             $links[] = $car->getUrl();
  51.         }
  52.         return $links;
  53.     }
  54.     public function getUsedVehicles($dealer$path$locale$byBrand true$limit null$vehicleType falseDateTime $date null)
  55.     {
  56.         $models = [];
  57.         $prices = [];
  58.         $years = [];
  59.         $mileage = [];
  60.         $secondhand = [];
  61.         $vehicles $this->vehicleRepository->getUsed($dealer$byBrand$vehicleType$date);
  62.         /**
  63.          * @var $vehicle Vehicle
  64.          */
  65.         foreach ($vehicles as $vehicle) {
  66.             /** @var UsedVehicle $vehivleModel */
  67.             $vehivleModel $this->vehicleFactory->createByEntity($vehicle);
  68.             if (!$vehivleModel) {
  69.                 continue;
  70.             }
  71.             $models[$vehivleModel->getModel()->getId()] = [
  72.                 "id" => $vehivleModel->getModel()->getId(),
  73.                 "name" => $vehivleModel->getModel()->getTitle()
  74.             ];
  75.             $years[$vehivleModel->getYear()] = [
  76.                 "id" => $vehivleModel->getYear(),
  77.                 "name" => $vehivleModel->getYear()
  78.             ];
  79.             $prices[] = $vehivleModel->price();
  80.             $mileage[] = $vehivleModel->getMileage();
  81.         }
  82.         $limitedCars array_slice($vehicles0$limit ?: self::LIMIT);
  83.         /** @var UsedVehicle $limitedCar */
  84.         foreach ($limitedCars as $limitedCar) {
  85.             $limitedCar $this->vehicleFactory->createByEntity($limitedCar);
  86.             if (!$limitedCar) {
  87.                 continue;
  88.             }
  89.             $galery $limitedCar->getGallery() ? $limitedCar->getGallery()->getGalleryItems() : null;
  90.             $image $galery && $galery->count() ? $galery->first()->getMedia() : $limitedCar->getPreview();
  91.             $gallery_images = [];
  92.             if ($galery && $galery->count()) {
  93.                 foreach ($galery as $gallery_item) {
  94.                     if(count($gallery_images) >= 3) {
  95.                         continue;
  96.                     }
  97.                     $gallery_images[] = [
  98.                         'small' => $this->twigMedia->getPath($gallery_item->getMedia(), 'slider'),
  99.                         'full' => $this->twigMedia->getPath($gallery_item->getMedia(), 'reference')
  100.                     ];
  101.                 }
  102.             }
  103.             $secondhand[] = [
  104.                 "id" => $limitedCar->getVehicleId(),
  105.                 "isSelect" => !in_array($limitedCar->getDealer()->getId(), Catalog::NOT_VIDI_SELECT_DEALERS),
  106.                 "has_nds" => $limitedCar->getHasNds(),
  107.                 "title" => $limitedCar->getModelName(),
  108.                 "fullName" => $limitedCar->getFullName(),
  109.                 "price" => $limitedCar->price(),
  110.                 "hasActionPrice" => $limitedCar->hasActionPrice(),
  111.                 "fullPrice" => $limitedCar->FullPrice(),
  112.                 "year" => $limitedCar->getYear(),
  113.                 'mileage' => $limitedCar->getMileage(),
  114.                 "link" => $path $this->router->generate($path, ['url' => $limitedCar->getUrl()]) : $limitedCar->getUrl(),
  115.                 "image" => $this->twigMedia->getPath($image'reference'),
  116.                 "body" => $limitedCar->getBodyTypeName($locale),
  117.                 "engine" => $limitedCar->getFuelTypeName($locale),
  118.                 "transmission" => $limitedCar->getTransmissionTypeName($locale),
  119.                 "reserved" => $limitedCar->hasReserved(),
  120.                 "deposit" => $limitedCar->hasDeposit(),
  121.                 "enginePower" => $limitedCar->getEnginePower($locale),
  122.                 "engineVolume" => $limitedCar->getEngineVolume($locale),
  123.                 "fuelVolume" => $limitedCar->getFuelVolume($locale),
  124.                 "fuelType" => $limitedCar->getFuelType(),
  125.                 "equipmentTitle" => $limitedCar->getEquipmentTitle(),
  126.                 "drive" => $limitedCar->getDriveUnitTypeName($locale),
  127.                 "creditPayment" => $this->creditModel->getMinPayment($limitedCar),
  128.                 "gallery" => $gallery_images,
  129.                 'isSpecifyPrice' => $limitedCar->isSpecifyPrice(),
  130.                 'seoDescription' => $limitedCar->seoDescription($locale),
  131.                 'dateCreate' => $limitedCar->getDateCreate() ? ($limitedCar->getDateCreate())->format('D, d M Y H:i:s \G\M\T') : null,
  132.                 'dealerID' => $limitedCar->getDealer()->getId(),
  133.             ];
  134.         }
  135.         usort($secondhand, fn($item1$item2) => $item2['isSelect'] <=> $item1['isSelect']);
  136.         $pricess = [];
  137.         $mileagess = [];
  138.         if ($prices) {
  139.             array_push($pricessmin($prices), max($prices));
  140.         }
  141.         if ($mileage) {
  142.             array_push($mileagessmin($mileage), max($mileage));
  143.         }
  144.         if($dealer->getUniqueId() == 'SUNRISE'){
  145.             $usedByDealer = [];
  146.             foreach ($secondhand as $key => $vehicle) {
  147.                 switch ($vehicle['dealerID']) {
  148.                     case 8:
  149.                         $usedByDealer['sunrise'][] = $vehicle;
  150.                         break;
  151.                     case 15:
  152.                         $usedByDealer['armada'][] = $vehicle;
  153.                         break;
  154.                     case 6:
  155.                         $usedByDealer['automarket'][] = $vehicle;
  156.                         break;
  157.                 }
  158.                 unset($secondhand$key);
  159.             }
  160.             $secondhand $usedByDealer;
  161.         }
  162.         return [
  163.             "models" => $models,
  164.             "years" => $years,
  165.             "prices" => $pricess,
  166.             "mileages" => $mileagess,
  167.             "secondhand" => $secondhand,
  168.             "secondhandCount" => count($vehicles)
  169.         ];
  170.     }
  171.     public function getUsedVehicleByModel($dealer$locale$modelId null$limit null)
  172.     {
  173.         $usedVehicle = [];
  174.         $vehicles $this->vehicleRepository->getUsedVehicleByDealerModel($dealer$modelId$limit);
  175.         /** @var Vehicle $vehicle */
  176.         foreach ($vehicles as $vehicle) {
  177.             /** @var UsedVehicle $vehivleModel */
  178.             $vehicleModel $this->vehicleFactory->createByEntity($vehicle);
  179.             if (!$vehicleModel) {
  180.                 continue;
  181.             }
  182.             $usedVehicle[] = [
  183.                 "id" => $vehicleModel->getVehicleId(),
  184.                 "isSelect" => !in_array($vehicleModel->getDealer()->getId(), Catalog::NOT_VIDI_SELECT_DEALERS),
  185.                 "has_nds" => $vehicleModel->getHasNds(),
  186.                 "title" => $vehicleModel->getModelName(),
  187.                 "fullName" => $vehicleModel->getFullName(),
  188.                 "price" => $vehicleModel->price(),
  189.                 "year" => $vehicleModel->getYear(),
  190.                 "image" => $this->twigMedia->getPath($vehicleModel->getPreview(), 'reference'),
  191.                 'mileage' => $vehicleModel->getMileage(),
  192.                 "body" => $vehicleModel->getBodyTypeName($locale),
  193.                 "engine" => $vehicleModel->getFuelTypeName($locale),
  194.                 "transmissionType" => $vehicleModel->getTransmissionTypeName($locale),
  195.                 "reserved" => $vehicleModel->hasReserved(),
  196.                 "deposit" => $vehicleModel->hasDeposit(),
  197.                 "enginePower" => $vehicleModel->getEnginePower($locale),
  198.                 "engineVolume" => $vehicleModel->getEngineVolume($locale),
  199.                 "fuelVolume" => $vehicleModel->getFuelVolume($locale),
  200.                 "fuelType" => $vehicleModel->getFuelType(),
  201.                 "equipmentTitle" => $vehicleModel->getEquipmentTitle(),
  202.                 "driveUnit" => $vehicleModel->getDriveUnitTypeName($locale),
  203.                 "creditPayment" => $this->creditModel->getMinPayment($vehicleModel),
  204.                 'isSpecifyPrice' => $vehicleModel->isSpecifyPrice(),
  205.             ];
  206.         }
  207.         return $usedVehicle;
  208.     }
  209.     public function getUsedVehiclesWithoutInit($filterParams$step$limit$path$locale)
  210.     {
  211.         $secondhand = [];
  212.         $carsData $this->vehicleRepository->findUsedByParams($filterParams$step$limit);
  213.         foreach ($carsData['vehicleItems'] as $vehicle) {
  214.             $vehicle $this->vehicleFactory->createByVehicleItem($vehicle);
  215.             $galleryItems $vehicle->getGallery() ? $vehicle->getGallery()->getGalleryItems() : null;
  216.             $image $galleryItems && $galleryItems->count() ? $galleryItems->first()->getMedia() : $vehicle->getPreview();
  217.             $secondhand[] = [
  218.                 "id" => $vehicle->getVehicleId(),
  219.                 "title" => $vehicle->getModelName(),
  220.                 "price" => $vehicle->price(),
  221.                 "year" => $vehicle->getYear(),
  222.                 'mileage' => $vehicle->getMileage(),
  223.                 "link" => $this->router->generate($path, ['url' => $vehicle->getUrl()]),
  224.                 "image" => $this->twigMedia->getPath($image'reference'),
  225.                 "body" => $vehicle->getBodyTypeName($locale),
  226.                 "engine" => $vehicle->getFuelTypeName($locale),
  227.                 "transmission" => $vehicle->getTransmissionTypeName($locale),
  228.                 "reserved" => $vehicle->hasReserved(),
  229.             ];
  230.         }
  231.         return [
  232.             "secondhand" => $secondhand,
  233.             "secondhandCount" => $carsData["count"]
  234.         ];
  235.     }
  236.     public function getUsedVehiclesForLandRover(Dealer $dealer$locale$withAutomarketCars=false): array
  237.     {
  238.         $vehicleEntities $this->vehicleRepository->getUsed($dealertrue);
  239.         $vehicles $this->vehicleFactory->createByEntities($vehicleEntities);
  240.         $data $this->getVehiclesData($vehicles$locale$dealer);
  241.         if(!$withAutomarketCars){
  242.             if ($dealer && $dealer->getId() === DealerModel::LAND_ROVER_DEALER){
  243.                 $data array_filter($data, fn($vehicle) => $vehicle['dealerId'] != DealerModel::SECOND_HAND_DEALER);
  244.             }
  245.         }
  246.         return $data;
  247.     }
  248.     /**
  249.      * @param UsedVehicle[] $vehicles
  250.      * @return array
  251.      */
  252.     private function getVehiclesData($vehicles$locale$dealer)
  253.     {
  254.         $result = [];
  255.         $routeName $dealer->getUrl() === 'jaguar' 'jaguar_used_card_car' 'landrover_used_card_car';
  256.         $i 0;
  257.         foreach ($vehicles as $vehicle) {
  258.             if ($vehicle->getDealer()->getId() === 6) {
  259.                 $priceEU round($vehicle->price() / $dealer->getRate());
  260.             } else {
  261.                 $priceEU $vehicle->getVehicleItemPrice();
  262.             }
  263.             $engineVolume $vehicle->getEngineVolume($locale);
  264.             if($engineVolume 100) {
  265.                 $engineVolume number_format(round($engineVolume 10001), 1'.''');
  266.             }
  267.             $result[] = [
  268.                 'index' => $i++,
  269.                 'model' => $vehicle->getModelName(),
  270.                 'year' => $vehicle->getYear(),
  271.                 'mileage' => $vehicle->getMileage(),
  272.                 'transmission' => $vehicle->getTransmissionTypeName($locale),
  273.                 'fuel' => $vehicle->getFuelTypeName($locale),
  274.                 'engineVolume' => $engineVolume,
  275.                 'enginePower' => $vehicle->getEnginePower($locale),
  276.                 'priceUA' => $vehicle->price(),
  277.                 'path' => $this->router->generate($routeName, ['id' => $vehicle->getVehicleId()]),
  278.                 'img' => $this->twigMedia->getPath($vehicle->getPreview(), 'small'),
  279.                 'priceEU' => $priceEU,
  280.                 'sold' => $vehicle->getSold(),
  281.                 'deposit' => $vehicle->getDeposit(),
  282.                 'reserved' => $vehicle->hasReserved(),
  283.                 'hasNds' => $vehicle->getHasNds(),
  284.                 'program' => $vehicle->getProgram(),
  285.                 'position' => ($vehicle->getPosition() == 0)? 999999 $vehicle->getPosition(),
  286.                 'positionDealer' => ($vehicle->getDealer()->getId() !== 6) ? 1,
  287.                 'dealerId' => $vehicle->getDealer()->getId()
  288.             ];
  289.         }
  290.         $position  array_column($result'position');
  291.         $positionDealer array_column($result'positionDealer');
  292.         array_multisort($positionDealerSORT_ASC$positionSORT_ASC$result);
  293.         return $result;
  294.     }
  295.     public function getFiltersByData($data)
  296.     {
  297.         $result['model'] = array_values(array_unique(array_column($data'model')));
  298.         $result['engineVolume'] = array_values(array_unique(array_column($data'engineVolume')));
  299.         $result['year'] = array_values(array_unique(array_column($data'year')));
  300.         sort($result['engineVolume']);
  301.         rsort($result['year']);
  302.         return $result;
  303.     }
  304.     public function getMotosData($dealer$byBrand$vehicleType){
  305.         $vehicles $this->vehicleRepository->getUsed($dealer$byBrand$vehicleType);
  306.         return $vehicles;
  307.     }
  308. }