<?php
namespace DcSiteBundle\Services;
use CoreBundle\Factory\InStockVehicle;
use CoreBundle\Factory\Vehicle as VehicleFactory;
use CoreBundle\Model\Vehicles\InStockRepository;
use CoreBundle\Services\MediaExtensionVidi;
use DateTime;
use DcSiteBundle\Model\CreditModel;
use Symfony\Component\Routing\RouterInterface;
class CarInStockService
{
private InStockRepository $inStockRepository;
private InStockVehicle $inStockVehicle;
private VehicleFactory $vehicleFactory;
private MediaExtensionVidi $mediaExtension;
private RouterInterface $router;
private CreditModel $creditModel;
public function __construct(
InStockRepository $inStockRepository,
InStockVehicle $inStockVehicle,
VehicleFactory $vehicleFactory,
MediaExtensionVidi $mediaExtension,
RouterInterface $router,
CreditModel $creditModel
)
{
$this->inStockRepository = $inStockRepository;
$this->inStockVehicle = $inStockVehicle;
$this->vehicleFactory = $vehicleFactory;
$this->mediaExtension = $mediaExtension;
$this->router = $router;
$this->creditModel = $creditModel;
}
public function getCarInStockByDealer($dealer, $vehicleType, $locale, $limit = null, DateTime $date = null): array
{
$vehicles = $this->inStockRepository->getByDealer($dealer, $limit, $vehicleType, $date);
return $this->getCarInStock($vehicles, $locale);
}
public function getCarInStockByModel($dealer, $locale, $modelId = null, $limit = null): array
{
$vehicles = $this->inStockRepository->getByDealerModel($dealer, $limit, $modelId);
return $this->getCarInStock($vehicles, $locale);
}
public function getCarInStockByModelWithPriority($dealer, $locale, $modelId = null, $limit = null): array
{
$vehicles = $this->inStockRepository->getByDealerModelWithPriority($dealer, $limit, $modelId);
return $this->getCarInStock($vehicles, $locale);
}
public function getCarInStockByVehicle($id, $locale, $limit = null): array
{
$vehicles = $this->inStockRepository->getByVehicleId($id, $limit);
return $this->getCarInStock($vehicles, $locale);
}
public function getCarInStock($vehicles, $locale): array
{
$result = $prices = [];
$result['vehicles'] = [];
$minPrice = [];
foreach ($vehicles as $vehicle) {
$inStockModel = $this->inStockVehicle->createByEntity($vehicle);
$vehicleFactory = $this->vehicleFactory->createByEntity($vehicle->getVehicleItem()->getVehicle());
$modelId = $inStockModel->getModel()->getId();
if (!isset($minPrice[$modelId]) || $minPrice[$modelId] > $inStockModel->price()) {
$minPrice[$modelId] = $inStockModel->price();
}
$catId = $inStockModel->getCategory()->getId();
$result['vehicleModels'][$catId][$modelId] = [
'id' => $inStockModel->getId(),
'price' => $minPrice[$modelId],
'image' => $this->mediaExtension->getPath($inStockModel->getVehiclePreview(), 'reference'),
'model' => $modelId,
'modelTitle' => $inStockModel->getModelTitle(),
];
$result['vehicles'][] = [
'id' => $inStockModel->getId(),
'position' => $inStockModel->getVehicle()->getPosition(),
//TODO remove magic number
'sortPrice' => $inStockModel->getInDelivery() ? $inStockModel->price()+ 999999999999 : $inStockModel->price(),
'price' => $inStockModel->price(),
'creditPayment' => $this->creditModel->getMinPayment($vehicleFactory),
'inDelivery' => $inStockModel->getInDelivery(),
'fullPrice' => $inStockModel->hasActionPrice() ? $inStockModel->fullPrice() : 0,
'name' => $inStockModel->getModelTitle(),
'image' => $this
->mediaExtension
->getPath($inStockModel->getPreview(), 'reference'),
'model' => $modelId,
'url' => $this->router->generate('base_car_in_stock_card', ['url' => $inStockModel->getUrl()]),
'modelTitle' => $inStockModel->getModelTitle(),
'color' => $inStockModel->getColor(),
'year' => $inStockModel->getYear(),
'equipment' => [
'id' => $inStockModel->getEquipment()->getId(),
'title' => $inStockModel->getEquipment()->getTitle(),
],
'fuelType' => [
'id' => $inStockModel->getFuelType() ? $inStockModel->getFuelType()->getId() : null,
'name' => $inStockModel->getFuelType() ? $inStockModel->getFuelTypeName($locale) : '',
],
'clearPrices' => [
'vehicleItemPrice' => $vehicle->getVehicleItem()->getPrice(),
'vehicleActionPrice' => $vehicle->getActionPrice(),
],
'engineVolume' => $inStockModel->getEngineVolume($locale),
'enginePower' => $inStockModel->getEnginePower($locale),
'fuelVolume' => $inStockModel->getFuelVolumeType($locale),
'transmissionType' => [
'id' => $inStockModel->getTransmissionType() ? $inStockModel->getTransmissionType()->getId() : null,
'name' => $inStockModel->getTransmissionType() ?
$inStockModel->getTransmissionTypeName($locale) :
'',
],
'driveUnit' => [
'id' => $inStockModel->getDriveUnitType() ?
$inStockModel->getDriveUnitType()->getId() :
null,
'name' => $inStockModel->getDriveUnitType() ?
$inStockModel->getDriveUnitTypeName($locale) :
'',
],
'power' => $inStockModel->getEnginePower($locale),
'video' => $inStockModel->hasVideo(),
'hasStorage' => $inStockModel->hasStorage(),
'hasReserved' => $inStockModel->hasReserved(),
'toOrder' => $inStockModel->toOrder(),
'specifyPrice' => $inStockModel->isSpecifyPrice(),
'ePower' => $inStockModel->isEPower(),
'seoTitle' => $inStockModel->seoTitle($locale),
'seoDescription' => $inStockModel->seoDescription($locale),
'dateCreate' => $inStockModel->getDateCreate() ? ($inStockModel->getDateCreate())->format('D, d M Y H:i:s \G\M\T') : null
];
$result['categories'][$inStockModel->getCategory()->getId()] = [
'id' => $inStockModel->getCategory()->getId(),
'name' => $inStockModel->getCategory()->getTitle($locale),
];
$result['models'][$modelId] = [
'id' => $modelId,
'name' => $inStockModel->getModelTitle(),
];
$result['equipments'][$modelId][$inStockModel->getEquipment()->getId()] = [
'id' => $inStockModel->getEquipment()->getId(),
'name' => $inStockModel->getEquipment()->getTitle(),
];
if ($inStockModel->getFuelType()) {
$result['fuel'][$modelId][$inStockModel->getFuelType()->getId()] = [
'id' => $inStockModel->getFuelType()->getId(),
'name' => $inStockModel->getFuelTypeName($locale),
];
}
if ($inStockModel->getColor()) {
if (!isset($result['color'][$modelId])) {
$result['color'][$modelId] = [];
}
if (!in_array($inStockModel->getColor(), $result['color'][$modelId])) {
$result['color'][$modelId][] = $inStockModel->getColor();
}
}
$prices[] = $inStockModel->price();
}
$result['minPrice'] = $prices ? min($prices) : 0;
$result['maxPrice'] = $prices ? max($prices) : 0;
return $result;
}
public function sortVehicleByDealer(&$vehicles, $identifier)
{
if (in_array($identifier,['JAGUAR', 'SKAY', 'ROVER', 'NORD'])) {
usort(
$vehicles['vehicles'],
fn($a, $b) => $a['sortPrice'] <=> $b['sortPrice']
);
} elseif (in_array($identifier, ['LIBERTY', 'ARMADA', 'INSITE'])){
$sortedByParams = [];
foreach ($vehicles['vehicles'] as $vehicle ) {
if($vehicle['fullPrice'] > $vehicle['price']){
$sortedByParams['action'][] = $vehicle;
continue;
}
if($vehicle['hasStorage']){
$sortedByParams['storage'][] = $vehicle;
continue;
}
if($vehicle['inDelivery']){
$sortedByParams['inDelivery'][] = $vehicle;
continue;
}
if($vehicle['toOrder']){
$sortedByParams['toOrder'][] = $vehicle;
}
}
foreach ($sortedByParams as &$array){
usort($array, fn($a, $b) => $a['sortPrice'] <=> $b['sortPrice']
);
}
$vehicles['vehicles'] = array_merge(
$sortedByParams['action'] ?? [],
$sortedByParams['storage'] ?? [],
$sortedByParams['inDelivery'] ?? [],
$sortedByParams['toOrder'] ?? []
);
} elseif ($identifier == 'PEUGEOT') {
$delivery = array_column($vehicles['vehicles'], 'inDelivery');
$position = array_column($vehicles['vehicles'], 'position');
array_multisort($delivery, SORT_ASC, $position, SORT_NUMERIC, SORT_ASC, $vehicles['vehicles']);
} elseif ($identifier == 'CITROEN') {
usort(
$vehicles['vehicles'],
fn($firstCompareElement, $secondCompareElement) => $firstCompareElement['inDelivery'] <=> $secondCompareElement['inDelivery']
);
} elseif ($identifier == 'FORD_DC') {
usort(
$vehicles['vehicles'],
fn($a, $b) => $b['id'] <=> $a['id']
);
} elseif ($identifier == 'STAR') {
usort(
$vehicles['vehicles'],
fn($a, $b) => $a['sortPrice'] <=> $b['sortPrice']
);
} else {
usort(
$vehicles['vehicles'],
fn($a, $b) => $a['position'] <=> $b['position']
);
}
}
}