<?php
namespace DcSiteBundle\Services;
use CoreBundle\Model\DealerModel;
use CoreBundle\Services\MediaExtensionVidi;
use DateTime;
use CoreBundle\Entity\Brand;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\Vehicles\Vehicle;
use CoreBundle\Model\Vehicles\UsedVehicle;
use PortalBundle\Model\Catalog;
use CoreBundle\Model\Vehicles\Repository as VehicleRepository;
use CoreBundle\Factory\Vehicle as VehicleFactory;
use DcSiteBundle\Model\CreditModel;
use Symfony\Component\Routing\RouterInterface;
class UsedVehicleService
{
const LIMIT = 60;
private VehicleRepository $vehicleRepository;
private VehicleFactory $vehicleFactory;
private MediaExtensionVidi $twigMedia;
private RouterInterface $router;
private CreditModel $creditModel;
public function __construct(
VehicleRepository $vehicleRepository,
VehicleFactory $vehicleFactory,
MediaExtensionVidi $twigMedia,
RouterInterface $router,
CreditModel $creditModel
) {
$this->vehicleRepository = $vehicleRepository;
$this->vehicleFactory = $vehicleFactory;
$this->twigMedia = $twigMedia;
$this->router = $router;
$this->creditModel = $creditModel;
}
public function getUsedVehicle(Dealer $dealer, Brand $brand, $url, $vehicleType = false): ?\CoreBundle\Model\Vehicles\AbstractVehicle
{
$vehicle = $this->vehicleRepository->getUsedVehicle($dealer, $brand, $url, $vehicleType);
if(!$vehicle){
return NULL;
}
return $this->vehicleFactory->createByEntity($vehicle);
}
public function getUsedVehiclesForSitemap($dealer, $path, $locale, $byBrand = true, $limit = null, $vehicleType = false): array
{
$vehicles = $this->vehicleRepository->getUsed($dealer, $byBrand, $vehicleType);
$limitedCars = array_slice($vehicles, 0);
$links = [];
foreach ($limitedCars as $car) {
$links[] = $car->getUrl();
}
return $links;
}
public function getUsedVehicles($dealer, $path, $locale, $byBrand = true, $limit = null, $vehicleType = false, DateTime $date = null)
{
$models = [];
$prices = [];
$years = [];
$mileage = [];
$secondhand = [];
$vehicles = $this->vehicleRepository->getUsed($dealer, $byBrand, $vehicleType, $date);
/**
* @var $vehicle Vehicle
*/
foreach ($vehicles as $vehicle) {
/** @var UsedVehicle $vehivleModel */
$vehivleModel = $this->vehicleFactory->createByEntity($vehicle);
if (!$vehivleModel) {
continue;
}
$models[$vehivleModel->getModel()->getId()] = [
"id" => $vehivleModel->getModel()->getId(),
"name" => $vehivleModel->getModel()->getTitle()
];
$years[$vehivleModel->getYear()] = [
"id" => $vehivleModel->getYear(),
"name" => $vehivleModel->getYear()
];
$prices[] = $vehivleModel->price();
$mileage[] = $vehivleModel->getMileage();
}
$limitedCars = array_slice($vehicles, 0, $limit ?: self::LIMIT);
/** @var UsedVehicle $limitedCar */
foreach ($limitedCars as $limitedCar) {
$limitedCar = $this->vehicleFactory->createByEntity($limitedCar);
if (!$limitedCar) {
continue;
}
$galery = $limitedCar->getGallery() ? $limitedCar->getGallery()->getGalleryItems() : null;
$image = $galery && $galery->count() ? $galery->first()->getMedia() : $limitedCar->getPreview();
$gallery_images = [];
if ($galery && $galery->count()) {
foreach ($galery as $gallery_item) {
if(count($gallery_images) >= 3) {
continue;
}
$gallery_images[] = [
'small' => $this->twigMedia->getPath($gallery_item->getMedia(), 'slider'),
'full' => $this->twigMedia->getPath($gallery_item->getMedia(), 'reference')
];
}
}
$secondhand[] = [
"id" => $limitedCar->getVehicleId(),
"isSelect" => !in_array($limitedCar->getDealer()->getId(), Catalog::NOT_VIDI_SELECT_DEALERS),
"has_nds" => $limitedCar->getHasNds(),
"title" => $limitedCar->getModelName(),
"fullName" => $limitedCar->getFullName(),
"price" => $limitedCar->price(),
"hasActionPrice" => $limitedCar->hasActionPrice(),
"fullPrice" => $limitedCar->FullPrice(),
"year" => $limitedCar->getYear(),
'mileage' => $limitedCar->getMileage(),
"link" => $path ? $this->router->generate($path, ['url' => $limitedCar->getUrl()]) : $limitedCar->getUrl(),
"image" => $this->twigMedia->getPath($image, 'reference'),
"body" => $limitedCar->getBodyTypeName($locale),
"engine" => $limitedCar->getFuelTypeName($locale),
"transmission" => $limitedCar->getTransmissionTypeName($locale),
"reserved" => $limitedCar->hasReserved(),
"deposit" => $limitedCar->hasDeposit(),
"enginePower" => $limitedCar->getEnginePower($locale),
"engineVolume" => $limitedCar->getEngineVolume($locale),
"fuelVolume" => $limitedCar->getFuelVolume($locale),
"fuelType" => $limitedCar->getFuelType(),
"equipmentTitle" => $limitedCar->getEquipmentTitle(),
"drive" => $limitedCar->getDriveUnitTypeName($locale),
"creditPayment" => $this->creditModel->getMinPayment($limitedCar),
"gallery" => $gallery_images,
'isSpecifyPrice' => $limitedCar->isSpecifyPrice(),
'seoDescription' => $limitedCar->seoDescription($locale),
'dateCreate' => $limitedCar->getDateCreate() ? ($limitedCar->getDateCreate())->format('D, d M Y H:i:s \G\M\T') : null,
'dealerID' => $limitedCar->getDealer()->getId(),
];
}
usort($secondhand, fn($item1, $item2) => $item2['isSelect'] <=> $item1['isSelect']);
$pricess = [];
$mileagess = [];
if ($prices) {
array_push($pricess, min($prices), max($prices));
}
if ($mileage) {
array_push($mileagess, min($mileage), max($mileage));
}
if($dealer->getUniqueId() == 'SUNRISE'){
$usedByDealer = [];
foreach ($secondhand as $key => $vehicle) {
switch ($vehicle['dealerID']) {
case 8:
$usedByDealer['sunrise'][] = $vehicle;
break;
case 15:
$usedByDealer['armada'][] = $vehicle;
break;
case 6:
$usedByDealer['automarket'][] = $vehicle;
break;
}
unset($secondhand, $key);
}
$secondhand = $usedByDealer;
}
return [
"models" => $models,
"years" => $years,
"prices" => $pricess,
"mileages" => $mileagess,
"secondhand" => $secondhand,
"secondhandCount" => count($vehicles)
];
}
public function getUsedVehicleByModel($dealer, $locale, $modelId = null, $limit = null)
{
$usedVehicle = [];
$vehicles = $this->vehicleRepository->getUsedVehicleByDealerModel($dealer, $modelId, $limit);
/** @var Vehicle $vehicle */
foreach ($vehicles as $vehicle) {
/** @var UsedVehicle $vehivleModel */
$vehicleModel = $this->vehicleFactory->createByEntity($vehicle);
if (!$vehicleModel) {
continue;
}
$usedVehicle[] = [
"id" => $vehicleModel->getVehicleId(),
"isSelect" => !in_array($vehicleModel->getDealer()->getId(), Catalog::NOT_VIDI_SELECT_DEALERS),
"has_nds" => $vehicleModel->getHasNds(),
"title" => $vehicleModel->getModelName(),
"fullName" => $vehicleModel->getFullName(),
"price" => $vehicleModel->price(),
"year" => $vehicleModel->getYear(),
"image" => $this->twigMedia->getPath($vehicleModel->getPreview(), 'reference'),
'mileage' => $vehicleModel->getMileage(),
"body" => $vehicleModel->getBodyTypeName($locale),
"engine" => $vehicleModel->getFuelTypeName($locale),
"transmissionType" => $vehicleModel->getTransmissionTypeName($locale),
"reserved" => $vehicleModel->hasReserved(),
"deposit" => $vehicleModel->hasDeposit(),
"enginePower" => $vehicleModel->getEnginePower($locale),
"engineVolume" => $vehicleModel->getEngineVolume($locale),
"fuelVolume" => $vehicleModel->getFuelVolume($locale),
"fuelType" => $vehicleModel->getFuelType(),
"equipmentTitle" => $vehicleModel->getEquipmentTitle(),
"driveUnit" => $vehicleModel->getDriveUnitTypeName($locale),
"creditPayment" => $this->creditModel->getMinPayment($vehicleModel),
'isSpecifyPrice' => $vehicleModel->isSpecifyPrice(),
];
}
return $usedVehicle;
}
public function getUsedVehiclesWithoutInit($filterParams, $step, $limit, $path, $locale)
{
$secondhand = [];
$carsData = $this->vehicleRepository->findUsedByParams($filterParams, $step, $limit);
foreach ($carsData['vehicleItems'] as $vehicle) {
$vehicle = $this->vehicleFactory->createByVehicleItem($vehicle);
$galleryItems = $vehicle->getGallery() ? $vehicle->getGallery()->getGalleryItems() : null;
$image = $galleryItems && $galleryItems->count() ? $galleryItems->first()->getMedia() : $vehicle->getPreview();
$secondhand[] = [
"id" => $vehicle->getVehicleId(),
"title" => $vehicle->getModelName(),
"price" => $vehicle->price(),
"year" => $vehicle->getYear(),
'mileage' => $vehicle->getMileage(),
"link" => $this->router->generate($path, ['url' => $vehicle->getUrl()]),
"image" => $this->twigMedia->getPath($image, 'reference'),
"body" => $vehicle->getBodyTypeName($locale),
"engine" => $vehicle->getFuelTypeName($locale),
"transmission" => $vehicle->getTransmissionTypeName($locale),
"reserved" => $vehicle->hasReserved(),
];
}
return [
"secondhand" => $secondhand,
"secondhandCount" => $carsData["count"]
];
}
public function getUsedVehiclesForLandRover(Dealer $dealer, $locale, $withAutomarketCars=false): array
{
$vehicleEntities = $this->vehicleRepository->getUsed($dealer, true);
$vehicles = $this->vehicleFactory->createByEntities($vehicleEntities);
$data = $this->getVehiclesData($vehicles, $locale, $dealer);
if(!$withAutomarketCars){
if ($dealer && $dealer->getId() === DealerModel::LAND_ROVER_DEALER){
$data = array_filter($data, fn($vehicle) => $vehicle['dealerId'] != DealerModel::SECOND_HAND_DEALER);
}
}
return $data;
}
/**
* @param UsedVehicle[] $vehicles
* @return array
*/
private function getVehiclesData($vehicles, $locale, $dealer)
{
$result = [];
$routeName = $dealer->getUrl() === 'jaguar' ? 'jaguar_used_card_car' : 'landrover_used_card_car';
$i = 0;
foreach ($vehicles as $vehicle) {
if ($vehicle->getDealer()->getId() === 6) {
$priceEU = round($vehicle->price() / $dealer->getRate());
} else {
$priceEU = $vehicle->getVehicleItemPrice();
}
$engineVolume = $vehicle->getEngineVolume($locale);
if($engineVolume > 100) {
$engineVolume = number_format(round($engineVolume / 1000, 1), 1, '.', '');
}
$result[] = [
'index' => $i++,
'model' => $vehicle->getModelName(),
'year' => $vehicle->getYear(),
'mileage' => $vehicle->getMileage(),
'transmission' => $vehicle->getTransmissionTypeName($locale),
'fuel' => $vehicle->getFuelTypeName($locale),
'engineVolume' => $engineVolume,
'enginePower' => $vehicle->getEnginePower($locale),
'priceUA' => $vehicle->price(),
'path' => $this->router->generate($routeName, ['id' => $vehicle->getVehicleId()]),
'img' => $this->twigMedia->getPath($vehicle->getPreview(), 'small'),
'priceEU' => $priceEU,
'sold' => $vehicle->getSold(),
'deposit' => $vehicle->getDeposit(),
'reserved' => $vehicle->hasReserved(),
'hasNds' => $vehicle->getHasNds(),
'program' => $vehicle->getProgram(),
'position' => ($vehicle->getPosition() == 0)? 999999 : $vehicle->getPosition(),
'positionDealer' => ($vehicle->getDealer()->getId() !== 6) ? 0 : 1,
'dealerId' => $vehicle->getDealer()->getId()
];
}
$position = array_column($result, 'position');
$positionDealer = array_column($result, 'positionDealer');
array_multisort($positionDealer, SORT_ASC, $position, SORT_ASC, $result);
return $result;
}
public function getFiltersByData($data)
{
$result['model'] = array_values(array_unique(array_column($data, 'model')));
$result['engineVolume'] = array_values(array_unique(array_column($data, 'engineVolume')));
$result['year'] = array_values(array_unique(array_column($data, 'year')));
sort($result['engineVolume']);
rsort($result['year']);
return $result;
}
public function getMotosData($dealer, $byBrand, $vehicleType){
$vehicles = $this->vehicleRepository->getUsed($dealer, $byBrand, $vehicleType);
return $vehicles;
}
}