src/DcSiteBundle/Services/CarInStockService.php line 48

Open in your IDE?
  1. <?php
  2. namespace DcSiteBundle\Services;
  3. use CoreBundle\Factory\InStockVehicle;
  4. use CoreBundle\Factory\Vehicle as VehicleFactory;
  5. use CoreBundle\Model\Vehicles\InStockRepository;
  6. use CoreBundle\Services\MediaExtensionVidi;
  7. use DateTime;
  8. use DcSiteBundle\Model\CreditModel;
  9. use Symfony\Component\Routing\RouterInterface;
  10. class CarInStockService
  11. {
  12.     private InStockRepository $inStockRepository;
  13.     private InStockVehicle $inStockVehicle;
  14.     private VehicleFactory $vehicleFactory;
  15.     private MediaExtensionVidi $mediaExtension;
  16.     private RouterInterface $router;
  17.     private CreditModel $creditModel;
  18.     public function __construct(
  19.         InStockRepository $inStockRepository,
  20.         InStockVehicle    $inStockVehicle,
  21.         VehicleFactory $vehicleFactory,
  22.         MediaExtensionVidi   $mediaExtension,
  23.         RouterInterface            $router,
  24.         CreditModel $creditModel
  25.     )
  26.     {
  27.         $this->inStockRepository $inStockRepository;
  28.         $this->inStockVehicle $inStockVehicle;
  29.         $this->vehicleFactory $vehicleFactory;
  30.         $this->mediaExtension $mediaExtension;
  31.         $this->router $router;
  32.         $this->creditModel $creditModel;
  33.     }
  34.     public function getCarInStockByDealer($dealer$vehicleType$locale$limit nullDateTime $date null): array
  35.     {
  36.         $vehicles $this->inStockRepository->getByDealer($dealer$limit$vehicleType$date);
  37.         return $this->getCarInStock($vehicles$locale);
  38.     }
  39.     public function getCarInStockByModel($dealer$locale$modelId null$limit null): array
  40.     {
  41.         $vehicles $this->inStockRepository->getByDealerModel($dealer$limit$modelId);
  42.         return $this->getCarInStock($vehicles$locale);
  43.     }
  44.     public function getCarInStockByModelWithPriority($dealer$locale$modelId null$limit null): array
  45.     {
  46.         $vehicles $this->inStockRepository->getByDealerModelWithPriority($dealer$limit$modelId);
  47.         return $this->getCarInStock($vehicles$locale);
  48.     }
  49.     public function getCarInStockByVehicle($id$locale$limit null): array
  50.     {
  51.         $vehicles $this->inStockRepository->getByVehicleId($id$limit);
  52.         return $this->getCarInStock($vehicles$locale);
  53.     }
  54.     public function getCarInStock($vehicles$locale): array
  55.     {
  56.         $result $prices = [];
  57.         $result['vehicles'] = [];
  58.         $minPrice = [];
  59.         foreach ($vehicles as $vehicle) {
  60.             $inStockModel $this->inStockVehicle->createByEntity($vehicle);
  61.             $vehicleFactory $this->vehicleFactory->createByEntity($vehicle->getVehicleItem()->getVehicle());
  62.             $modelId $inStockModel->getModel()->getId();
  63.             if (!isset($minPrice[$modelId]) || $minPrice[$modelId] > $inStockModel->price()) {
  64.                 $minPrice[$modelId] = $inStockModel->price();
  65.             }
  66.             $catId $inStockModel->getCategory()->getId();
  67.             $result['vehicleModels'][$catId][$modelId] = [
  68.                 'id' => $inStockModel->getId(),
  69.                 'price' => $minPrice[$modelId],
  70.                 'image' => $this->mediaExtension->getPath($inStockModel->getVehiclePreview(), 'reference'),
  71.                 'model' => $modelId,
  72.                 'modelTitle' => $inStockModel->getModelTitle(),
  73.             ];
  74.             $result['vehicles'][] = [
  75.                 'id' => $inStockModel->getId(),
  76.                 'position' => $inStockModel->getVehicle()->getPosition(),
  77.                 //TODO remove magic number
  78.                 'sortPrice' => $inStockModel->getInDelivery() ? $inStockModel->price()+ 999999999999 $inStockModel->price(),
  79.                 'price' => $inStockModel->price(),
  80.                 'creditPayment' => $this->creditModel->getMinPayment($vehicleFactory),
  81.                 'inDelivery' => $inStockModel->getInDelivery(),
  82.                 'fullPrice' => $inStockModel->hasActionPrice() ? $inStockModel->fullPrice() : 0,
  83.                 'name' => $inStockModel->getModelTitle(),
  84.                 'image' => $this
  85.                     ->mediaExtension
  86.                     ->getPath($inStockModel->getPreview(), 'reference'),
  87.                 'model' => $modelId,
  88.                 'url' => $this->router->generate('base_car_in_stock_card', ['url' => $inStockModel->getUrl()]),
  89.                 'modelTitle' => $inStockModel->getModelTitle(),
  90.                 'color' => $inStockModel->getColor(),
  91.                 'year' => $inStockModel->getYear(),
  92.                 'equipment' => [
  93.                     'id' => $inStockModel->getEquipment()->getId(),
  94.                     'title' => $inStockModel->getEquipment()->getTitle(),
  95.                 ],
  96.                 'fuelType' => [
  97.                     'id' => $inStockModel->getFuelType() ? $inStockModel->getFuelType()->getId() : null,
  98.                     'name' => $inStockModel->getFuelType() ? $inStockModel->getFuelTypeName($locale) : '',
  99.                 ],
  100.                 'clearPrices' => [
  101.                     'vehicleItemPrice' => $vehicle->getVehicleItem()->getPrice(),
  102.                     'vehicleActionPrice' => $vehicle->getActionPrice(),
  103.                 ],
  104.                 'engineVolume' => $inStockModel->getEngineVolume($locale),
  105.                 'enginePower' => $inStockModel->getEnginePower($locale),
  106.                 'fuelVolume' => $inStockModel->getFuelVolumeType($locale),
  107.                 'transmissionType' => [
  108.                     'id' => $inStockModel->getTransmissionType() ? $inStockModel->getTransmissionType()->getId() : null,
  109.                     'name' => $inStockModel->getTransmissionType() ?
  110.                         $inStockModel->getTransmissionTypeName($locale) :
  111.                         '',
  112.                 ],
  113.                 'driveUnit' => [
  114.                     'id' => $inStockModel->getDriveUnitType() ?
  115.                         $inStockModel->getDriveUnitType()->getId() :
  116.                         null,
  117.                     'name' => $inStockModel->getDriveUnitType() ?
  118.                         $inStockModel->getDriveUnitTypeName($locale) :
  119.                         '',
  120.                 ],
  121.                 'power' => $inStockModel->getEnginePower($locale),
  122.                 'video' => $inStockModel->hasVideo(),
  123.                 'hasStorage' => $inStockModel->hasStorage(),
  124.                 'hasReserved' => $inStockModel->hasReserved(),
  125.                 'toOrder' => $inStockModel->toOrder(),
  126.                 'specifyPrice' => $inStockModel->isSpecifyPrice(),
  127.                 'ePower' => $inStockModel->isEPower(),
  128.                 'seoTitle' => $inStockModel->seoTitle($locale),
  129.                 'seoDescription' => $inStockModel->seoDescription($locale),
  130.                 'dateCreate' => $inStockModel->getDateCreate() ? ($inStockModel->getDateCreate())->format('D, d M Y H:i:s \G\M\T') : null
  131.             ];
  132.             $result['categories'][$inStockModel->getCategory()->getId()] = [
  133.                 'id' => $inStockModel->getCategory()->getId(),
  134.                 'name' => $inStockModel->getCategory()->getTitle($locale),
  135.             ];
  136.             $result['models'][$modelId] = [
  137.                 'id' => $modelId,
  138.                 'name' => $inStockModel->getModelTitle(),
  139.             ];
  140.             $result['equipments'][$modelId][$inStockModel->getEquipment()->getId()] = [
  141.                 'id' => $inStockModel->getEquipment()->getId(),
  142.                 'name' => $inStockModel->getEquipment()->getTitle(),
  143.             ];
  144.             if ($inStockModel->getFuelType()) {
  145.                 $result['fuel'][$modelId][$inStockModel->getFuelType()->getId()] = [
  146.                     'id' => $inStockModel->getFuelType()->getId(),
  147.                     'name' => $inStockModel->getFuelTypeName($locale),
  148.                 ];
  149.             }
  150.             if ($inStockModel->getColor()) {
  151.                 if (!isset($result['color'][$modelId])) {
  152.                     $result['color'][$modelId] = [];
  153.                 }
  154.                 if (!in_array($inStockModel->getColor(), $result['color'][$modelId])) {
  155.                     $result['color'][$modelId][] = $inStockModel->getColor();
  156.                 }
  157.             }
  158.             $prices[] = $inStockModel->price();
  159.         }
  160.         $result['minPrice'] = $prices min($prices) : 0;
  161.         $result['maxPrice'] = $prices max($prices) : 0;
  162.         return $result;
  163.     }
  164.     public function sortVehicleByDealer(&$vehicles$identifier)
  165.     {
  166.         if (in_array($identifier,['JAGUAR''SKAY''ROVER''NORD'])) {
  167.             usort(
  168.                 $vehicles['vehicles'],
  169.                 fn($a$b) => $a['sortPrice'] <=> $b['sortPrice']
  170.             );
  171.         } elseif (in_array($identifier, ['LIBERTY''ARMADA''INSITE'])){
  172.             $sortedByParams = [];
  173.             foreach ($vehicles['vehicles'] as $vehicle ) {
  174.                 if($vehicle['fullPrice'] > $vehicle['price']){
  175.                     $sortedByParams['action'][] = $vehicle;
  176.                     continue;
  177.                 }
  178.                 if($vehicle['hasStorage']){
  179.                     $sortedByParams['storage'][] = $vehicle;
  180.                     continue;
  181.                 }
  182.                 if($vehicle['inDelivery']){
  183.                     $sortedByParams['inDelivery'][] = $vehicle;
  184.                     continue;
  185.                 }
  186.                 if($vehicle['toOrder']){
  187.                     $sortedByParams['toOrder'][] = $vehicle;
  188.                 }
  189.             }
  190.             foreach ($sortedByParams as &$array){
  191.                 usort($array, fn($a$b) => $a['sortPrice'] <=> $b['sortPrice']
  192.                 );
  193.             }
  194.             $vehicles['vehicles'] = array_merge(
  195.                 $sortedByParams['action'] ?? [],
  196.                 $sortedByParams['storage'] ?? [],
  197.                 $sortedByParams['inDelivery'] ?? [],
  198.                 $sortedByParams['toOrder'] ?? []
  199.             );
  200.         } elseif ($identifier == 'PEUGEOT') {
  201.             $delivery  array_column($vehicles['vehicles'], 'inDelivery');
  202.             $position array_column($vehicles['vehicles'], 'position');
  203.             array_multisort($deliverySORT_ASC$positionSORT_NUMERICSORT_ASC$vehicles['vehicles']);
  204.         } elseif ($identifier == 'CITROEN') {
  205.             usort(
  206.                 $vehicles['vehicles'],
  207.                 fn($firstCompareElement$secondCompareElement) => $firstCompareElement['inDelivery'] <=> $secondCompareElement['inDelivery']
  208.             );
  209.         } elseif ($identifier == 'FORD_DC') {
  210.             usort(
  211.                 $vehicles['vehicles'],
  212.                 fn($a$b) => $b['id'] <=> $a['id']
  213.             );
  214.         } elseif ($identifier == 'STAR') {
  215.             usort(
  216.                 $vehicles['vehicles'],
  217.                 fn($a$b) => $a['sortPrice'] <=> $b['sortPrice']
  218.             );
  219.         } else {
  220.             usort(
  221.                 $vehicles['vehicles'],
  222.                 fn($a$b) => $a['position'] <=> $b['position']
  223.             );
  224.         }
  225.     }
  226. }