<?php
namespace DcSiteBundle\Controller;
use AcquiringBundle\Component\Model\PortmoneAcquiring;
use AcquiringBundle\Entity\Order;
use Application\Sonata\MediaBundle\Entity\Media;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Component\FormManager;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\Vehicles\ConfiguratorColor;
use CoreBundle\Entity\Vehicles\Equipment;
use CoreBundle\Entity\Vehicles\EquipmentOptions;
use CoreBundle\Entity\Vehicles\Feature;
use CoreBundle\Entity\Vehicles\InStock;
use CoreBundle\Entity\Vehicles\VariationCharacteristic;
use CoreBundle\Entity\Vehicles\VehicleFile;
use CoreBundle\Entity\Vehicles\VehicleItem;
use CoreBundle\Factory\InStockVehicle;
use CoreBundle\Factory\Vehicle as VehicleFactory;
use CoreBundle\Model\Api\OnlineService\ApiServer1C;
use CoreBundle\Model\Vehicles\AbstractVehicle;
use CoreBundle\Model\Vehicles\EquipmentOptions as EquipmentOptionsCoreModel;
use CoreBundle\Model\Vehicles\Repository;
use CoreBundle\Services\MediaExtensionVidi;
use DcSiteBundle\Services\VehicleService;
use DcSiteBundle\Twig\TwigDcExtension;
use Doctrine\ORM\EntityManagerInterface;
use PortalBundle\Model\SeoMetaTag;
use Sonata\MediaBundle\Provider\YouTubeProvider;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
class CarController extends BaseDcController
{
public function __construct(CoreFormFactory $coreFormFactory, SeoMetaTag $seoMetaTag, RequestStack $requestStack, RouterInterface $router, FormManager $formManager, EntityManagerInterface $em, ApiServer1C $apiServer1C, SessionInterface $session, Filesystem $filesystem, MediaExtensionVidi $mediaExtensionVidi, Repository $vehicleRepository, VehicleFactory $vehicleFactory, Environment $twig)
{
parent::__construct($coreFormFactory, $seoMetaTag, $requestStack, $router, $formManager, $em, $apiServer1C, $session, $filesystem, $mediaExtensionVidi, $vehicleRepository, $vehicleFactory, $twig);
}
public function loadCarFeature(Request $request): JsonResponse
{
$id = $request->get('id');
$vehicle = $this->vehicleFactory->createById($id);
if (!$vehicle) {
return $this->json(['success' => false]);
}
$features = $vehicle->getFeatures();
if (!count($features)) {
return $this->json(['success' => false]);
}
$result = [];
/**
* @var $feature Feature
*/
foreach ($features as $feature) {
$id = $feature->getGroup()->getId();
if (!isset($result[$id])) {
$result[$id] = [
'name' => $feature->getGroup()->getNameByLocale($request->getLocale()),
'features' => []
];
}
$result[$id]['features'][] = [
'id' => $feature->getId(),
'image' => $this->mediaExtensionVidi->getPath($feature->getImage(), 'reference'),
'title' => $feature->getContentByLocale($request->getLocale())->getTitle(),
'content' => $feature->getContentByLocale($request->getLocale())->getContent(),
'groupId' => $id,
];
}
return $this->json(['success' => true, 'features' => $result]);
}
public function loadCarColors(Request $request): JsonResponse
{
$id = $request->get('id');
$vehicle = $this->vehicleFactory->createById($id);
if (!$vehicle) {
return $this->json(['success' => false]);
}
if (!count($vehicle->getColors())) {
return $this->json(['success' => false]);
}
$colors = [];
/** @var ConfiguratorColor $color */
foreach ($vehicle->getColors() as $color) {
if (!$color->getState()) {
continue;
}
$Gallery = $color->getGallery();
if (!$Gallery) {
continue;
}
$galleryItems = $Gallery->getGalleryItems();
if (!$galleryItems->count()) {
continue;
}
$colors[] = [
'title' => $color->getName($request->getLocale()),
'price' => $color->calcPrice(),
'preview' => $this->mediaExtensionVidi->getPath($color->getImage(), 'reference'),
'image' => $this->mediaExtensionVidi->getPath($galleryItems->first()->getMedia(), 'reference')
];
}
if (!count($colors)) {
return $this->json(['success' => false]);
}
return $this->json(['success' => true, 'colors' => $colors]);
}
public function loadCarGallery(Request $request): JsonResponse
{
$id = $request->get('id');
$width = $request->get('width');
//TODO remove magic numbers
if ($width < 590) {
$format = 'slider';
$bigFormat = 'slider';
} elseif ($width < 870) {
$format = 'new_slider';
$bigFormat = 'new_slider';
} else {
$format = 'new_slider';
$bigFormat = 'reference';
}
$vehicle = $this->vehicleFactory->createById($id);
if (!$vehicle) {
return $this->json(['success' => false]);
}
$galleries = [];
$twig = $this->mediaExtensionVidi;
$images = $vehicle->getGallery();
if ($images && $images->getGalleryItems()) {
foreach ($images->getGalleryItems() as $item) {
$media = $item->getMedia();
$metadata = $media->getProviderMetadata();
$metadata = empty($metadata['title']) && empty($metadata['alt']) ? false : $metadata;
if (!$media) {
continue;
}
$galleries['images'][] = [
'small' => $twig->getPath($media, $format),
'full' => $twig->getPath($media, $bigFormat),
'image' => $twig->getPath($media, 'reference'),
'image_webp' => $twig->pathWebp($media, 'reference'),
'metadata' => $metadata,
];
}
}
$Video = $vehicle->getVideo();
if ($Video && $Video->getGalleryItems()) {
foreach ($Video->getGalleryItems() as $item) {
/** @var Media $media */
$media = $item->getMedia();
if (!$media) {
continue;
}
/** @var YouTubeProvider $provider */
$provider = $this->get($media->getProviderName());
if (!($provider instanceof YouTubeProvider)) {
continue;
}
$url = $provider->getReferenceUrl($media);
$paramsStr = explode('?', $url);
if (!isset($paramsStr[1])) {
continue;
}
parse_str($paramsStr[1], $params);
if (!isset($params['v'])) {
continue;
}
$galleries['video'][] = [
'url' => $url,
'id' => $params['v'],
];
}
}
return $this->json(['success' => true, 'galleries' => $galleries]);
}
public function loadEquipments(Request $request): JsonResponse
{
$id = $request->get('id');
$vehicle = $this->vehicleRepository->findById($id);
if (!$vehicle) {
return $this->json(['succes' => false]);
}
$equipments = [];
$equipmentOptions = [];
/** @var Equipment $equipment */
foreach ($vehicle->getEquipments() as $equipment) {
if (!$equipment->getState()) {
continue;
}
$sortPrice = $equipment->minPrice();
if ($sortPrice == 0) {
$sortPrice = Equipment::SORT_PRICE;
}
$equipments[] = [
'id' => $equipment->getId(),
'title' => $equipment->getTitle(),
'sortPrice' => $sortPrice,
'price' => $equipment->minPrice(),
'fullPrice' => $equipment->minFullPrice(),
'preOrderPrice' => $equipment->minPreOrderPrice(),
];
$options = $equipment->getOptions();
/** @var EquipmentOptions $option */
foreach ($options as $option) {
$oneOption = $option->getOption();
$oType = $option->getOption()->getOptionType();
if (!isset($equipmentOptions[$oType])) {
$equipmentOptions[$oType] = [
'id' => $oType,
'title' => EquipmentOptionsCoreModel::getTypeName($oType, $request->getLocale()),
'options' => []
];
}
if (!isset($equipmentOptions[$oType]['options'][$oneOption->getId()])) {
$opTitle = $oneOption->getTitleUa();
if ($request->getLocale() == 'ru') {
$opTitle = $oneOption->getTitleRu();
}
$equipmentOptions[$oType]['options'][$oneOption->getId()] = [
'id' => $oneOption->getId(),
'title' => $opTitle,
'values' => []
];
}
$currentOptionValue = '';
if (isset($equipmentOptions[$oType]['options'][$oneOption->getId()]['values'][$equipment->getId()])) {
//TODO refactor this
//phpcs:ignore
$currentOptionValue = $equipmentOptions[$oType]['options'][$oneOption->getId()]['values'][$equipment->getId()]['value'];
}
if ($currentOptionValue) {
$currentOptionValue .= ', ' . $option->getValue($request->getLocale());
} else {
$currentOptionValue = $option->getValue($request->getLocale());
}
$equipmentOptions[$oType]['options'][$oneOption->getId()]['values'][$equipment->getId()] = [
'price' => $option->price(),
'value' => $currentOptionValue,
//TODO remove magic numbers
'optional' => $option->getIsOptional() > 0,
];
}
}
usort($equipments, fn($a, $b) => $a['sortPrice'] <=> $b['sortPrice']);
return $this->json(['success' => true, 'equipments' => $equipments, 'equipmentOptions' => $equipmentOptions]);
}
public function getModelInfo($id, TranslatorInterface $translator, TwigDcExtension $twigDcExtension): JsonResponse
{
$Vehicle = $this->vehicleFactory->createById($id, $translator, $twigDcExtension);
if (!$Vehicle) {
return new JsonResponse(['success' => false]);
}
$modelOptions = $this->buildModelInfo($Vehicle);
$user = $this->getUser();
if (
$user &&
($user->hasRole('ROLE_DC_MANAGER') ||
$user->hasRole('ROLE_SUPER_ADMIN')) &&
$this->getDealer()->getId() == $user->getDealer()->getId()
) {
$modelOptions['isManager'] = true;
$modelOptions['loadVariationUrl'] = $this->router->generate('base_comparison_variation_info');
$modelOptions['saveVariationUrl'] = $this->router->generate('base_comparison_variation_save');
}
return new JsonResponse($modelOptions);
}
private function buildModelInfo(AbstractVehicle $vehicle, TranslatorInterface $translator, TwigDcExtension $twigDcExtension): array
{
$locale = $this->requestStack->getCurrentRequest()->getLocale();
$modelOptions = [
'models' => []
];
$Equipments = $vehicle->getAvailEquipments();
uasort($Equipments, fn($a, $b) => $a->getPosition() <=> $b->getPosition());
/** @var Equipment $equipment */
foreach ($Equipments as $equipment) {
//TODO remove magic numbers
if ($equipment->getState() < 1) {
continue;
}
$oneEquipment = [
'id' => $equipment->getId(),
'title' => $equipment->getTitle(),
'image' => $vehicle->getPreviewPath(),
'minIntPrice' => false,
'minPrice' => $equipment->minPrice(),
'variations' => []
];
$variations = $equipment->getVehicleItems();
/** @var VehicleItem $vehicleItem */
foreach ($variations as $vehicleItem) {
//TODO remove magic numbers
if ($vehicleItem->getState() < 1) {
continue;
}
$vehicleModel = $this->vehicleFactory->createByVehicleItem($vehicleItem);
$intPrice = $vehicleItem->calcPrice();
$price = $twigDcExtension->priceFilter(round($vehicleItem->calcPrice()));
$body = $vehicleModel->getBodyTypeName($locale);
$engine = '';
$fuelType = $vehicleModel->getFuelTypeName($locale);
$transmissionType = $vehicleModel->getTransmissionTypeName($locale);
if ($fuelType) {
$engine .= $fuelType . ' / ';
}
if ($transmissionType) {
$engine .= $transmissionType;
}
$power = '';
if ($vehicleModel->getEnginePower($locale)) {
$power = $vehicleModel->getEnginePower($locale) . ' ' .
$translator->trans('car_page.compare.max_p_short', [], 'dc_base');
}
$techOptions = [
[
'title' => $translator->trans('car_page.compare.year', [], 'dc_base'),
'value' => $vehicleItem->getYear()
],
];
/** @var VariationCharacteristic $characteristic */
foreach ($vehicleItem->getVariation()->getCharacteristics() as $characteristic) {
if (!$characteristic->getCharacteristic()->getIsRequired()) {
continue;
}
if ($characteristic->getCharacteristicValue()) {
$value = $characteristic->getCharacteristicValue()->getValue($locale);
} else {
$value = $characteristic->getValue($locale);
}
$techOptions[$characteristic->getCharacteristic()->getId()] = [
'title' => $characteristic->getCharacteristic()->getTitle($locale),
'value' => $value,
];
}
$variationArray = [
'id' => $vehicleItem->getId(),
'data' => [
'engineName' => $vehicleModel->getEngineName($locale),
'body' => $body,
'drive' => $vehicleModel->getDriveUnitTypeName($locale),
'driveShort' => $vehicleModel->getDriveUnitTypeName($locale),
'trans' => $vehicleModel->getTransmissionTypeName($locale),
'fuel' => $vehicleModel->getFuelTypeName($locale),
'engine' => $engine,
'power' => $power,
],
'price' => $price,
'preorderPrice' => (int)$vehicleItem->getPreorderPrice(),
'intPrice' => $intPrice,
'technicalOption' => $techOptions,
];
if ($vehicleModel->hasActionPrice()) {
$variationArray['fullPrice'] = $vehicleModel->fullPrice();
}
$oneEquipment['variations'][] = $variationArray;
}
usort($oneEquipment['variations'], fn($a, $b) => $a['intPrice'] <=> $b['intPrice']);
if (count($oneEquipment['variations']) > 0) {
$modelOptions['models'][] = $oneEquipment;
}
}
usort($modelOptions['models'], fn($a, $b) => $a['minIntPrice'] <=> $b['minIntPrice']);
$techVariations = [];
$this->buildTech($vehicle, $techVariations);
$modelOptions['tech'] = $techVariations;
return $modelOptions;
}
private function buildTech(AbstractVehicle $vehicle, &$techVariations)
{
$locale = $this->requestStack->getCurrentRequest()->getLocale();
$vehicleItems = $vehicle->getVehicleItems();
$keys = [];
foreach ($vehicleItems as $vehicleItem) {
$characteristics = $vehicleItem->getVariation()->getCharacteristics();
$key = $this->buildVariationKey($characteristics);
if (in_array($key, $keys)) {
continue;
}
$keys[] = $key;
/** @var VariationCharacteristic $vCharacteristic */
foreach ($characteristics as $vCharacteristic) {
$characteristicId = $vCharacteristic->getCharacteristic()->getId();
if (!isset($techVariations[$characteristicId])) {
$techVariations[$characteristicId] = [
'title' => $vCharacteristic->getCharacteristic()->getTitle($locale),
'vars' => []
];
}
$charValue = $vCharacteristic->getCharacteristicValue();
$value = $charValue ? $charValue->getValue($locale) : $vCharacteristic->getValue($locale);
$techVariations[$characteristicId]['vars'][] = $value;
}
}
foreach ($techVariations as $id => $row) {
$hasValue = false;
foreach ($row['vars'] as $val) {
if ($val) {
$hasValue = true;
}
}
if (!$hasValue) {
unset($techVariations[$id]);
}
}
}
private function buildVariationKey($characteristic): string
{
$characteristicArray = [];
/** @var VariationCharacteristic $vCharacteristic */
foreach ($characteristic as $vCharacteristic) {
$char = $vCharacteristic->getCharacteristic();
$charValue = $vCharacteristic->getCharacteristicValue();
$charValueId = '';
if ($charValue) {
$charValueId = $charValue->getId();
}
$valueUa = $vCharacteristic->getValueUa();
$valueRu = $vCharacteristic->getValueRu();
$key = $charValueId . $valueUa . $valueRu;
$characteristicArray[$char->getId()] = md5($key);
}
ksort($characteristicArray);
return md5(implode('', $characteristicArray));
}
/**
* @param $id
* @return JsonResponse
*/
public function getModelOptions($id, Request $request)
{
$Vehicle = $this->vehicleFactory->createById($id);
if (!$Vehicle) {
return new JsonResponse(['success' => false]);
}
$modelOptions = [];
$Equipments = $Vehicle->getAvailEquipments();
/** @var Equipment $equipment */
foreach ($Equipments as $equipment) {
$options = $equipment->getOptions();
/** @var EquipmentOptions $option */
foreach ($options as $option) {
$oneOption = $option->getOption();
$oType = $option->getOption()->getOptionType();
if (!isset($modelOptions[$oType])) {
$modelOptions[$oType] = [
'id' => $oType,
'title' => EquipmentOptionsCoreModel::getTypeName($oType, $request->getLocale()),
'options' => []
];
}
if (!isset($modelOptions[$oType]['options'][$oneOption->getId()])) {
$opTitle = $request->getLocale() == 'ru' ? $oneOption->getTitleRu() : $oneOption->getTitleUa();
$modelOptions[$oType]['options'][$oneOption->getId()] = [
'id' => $oneOption->getId(),
'title' => $opTitle,
'values' => []
];
}
$modelOptions[$oType]['options'][$oneOption->getId()]['values'][$equipment->getId()] = [
'price' => $option->price(),
'value' => $option->getValue($request->getLocale()),
];
}
}
return new JsonResponse($modelOptions);
}
public function downloadFile($id): BinaryFileResponse
{
$File = $this->em->getRepository(VehicleFile::class)->find($id);
if (!$File) {
throw $this->createNotFoundException();
}
$rootDir = $this->getParameter('kernel.root_dir');
$filePath = $rootDir . '/../public/uploads/files/' . $File->getPath();
if (!$filePath || !file_exists($filePath)) {
$filePath = $rootDir . '/../public/uploads/files/' . $File->getVehicle()->getId() . '/' . $File->getPath();
if (!$filePath || !file_exists($filePath)) {
throw $this->createNotFoundException();
}
}
return $this->file($filePath);
}
public function showFile($id): BinaryFileResponse
{
$File = $this->em->getRepository(VehicleFile::class)->find($id);
if (!$File) {
throw $this->createNotFoundException();
}
$rootDir = $this->getParameter('kernel.root_dir');
$filePath = $rootDir . '/../public/uploads/files/' . $File->getPath();
if (!$filePath || !file_exists($filePath)) {
$filePath = $rootDir . '/../public/uploads/files/' . $File->getVehicle()->getId() . '/' . $File->getPath();
if (!$filePath || !file_exists($filePath)) {
throw $this->createNotFoundException();
}
}
return new BinaryFileResponse($filePath);
}
public function pricesLoad(Request $request, VehicleService $vehicleService): JsonResponse
{
$id = $request->get('id');
$vehicleEntity = $this->vehicleRepository->findById($id);
if (!$vehicleEntity) {
return $this->json(['succes' => false]);
}
$vehiclePrice = $vehicleService->getVehiclePrice($vehicleEntity);
$parameters = array_merge($vehiclePrice, [
'success' => true,
'dealerId' => $this->getDealer()->getId(),
]);
return $this->json($parameters);
}
public function personalInit(): JsonResponse
{
$vehicles = $this->vehicleRepository->getNewByDealer($this->getDealer());
$result = [];
foreach ($vehicles as $row) {
$vehicleModel = $this->vehicleFactory->createByEntity($row);
if (!$vehicleModel) {
continue;
}
$result[] = [
'id' => $vehicleModel->getVehicleId(),
'title' => $vehicleModel->getModelName(),
'image' => $vehicleModel->getPreviewPath('menu'),
'position' => $vehicleModel->getPosition(),
];
}
usort($result, fn($a, $b) => $a['position'] <=> $b['position']);
return $this->json(['cars' => $result]);
}
public function techLoad(Request $request, VehicleService $vehicleService): JsonResponse
{
$id = $request->get('id');
$Vehicle = $this->vehicleRepository->findById($id);
if (!$Vehicle) {
return $this->json(['success' => false]);
}
$technicalCharacteristic = $vehicleService->getVehicleTechnicalCharacteristic($Vehicle);
return $this->json($technicalCharacteristic);
}
public function createOrder(Request $request, ApiServer1C $apiServer1C, PortmoneAcquiring $portmoneAcquiring, \AcquiringBundle\Component\Model\Order $orderModel): JsonResponse
{
$carId = $request->get('car');
if (!$carId) {
throw new NotFoundHttpException();
}
$InStock = $this->em->getRepository(InStock::class)->find($carId);
if (!$InStock) {
return $this->json(['success' => false]);
}
$documentUid = $apiServer1C->createPaymentDocument($this->getDealer());
if (!$documentUid) {
return $this->json(['success' => false]);
}
$dc = $portmoneAcquiring->getDcByDealerId($this->getDealer()->getId());
$Order = $orderModel->createInStockOrder($request, $documentUid, $InStock, $this->getDealer(), PortmoneAcquiring::ACQUIRING_TYPE, $dc);
$backref = $request->getSchemeAndHttpHost() . $this->router->generate('toyota_odessa_buy_result', ['hash' => $Order->getHash()]);
$formData = $portmoneAcquiring->getInStockFormData($Order, $backref);
return $this->json(['success' => true, 'formData' => $formData]);
}
public function updateOrder(Request $request, InStockVehicle $inStockVehicle, ApiServer1C $apiServer1C): JsonResponse
{
$orderId = $request->get('order');
$Order = $this->em->getRepository(Order::class)->find($orderId);
if (!$Order) {
return $this->json(['success' => false]);
}
$files = [];
$pf = $request->files->get('pf');
if ($pf instanceof UploadedFile) {
$files[] = [
'name' => $pf->getClientOriginalName(),
'ext' => $pf->getClientOriginalExtension(),
'data' => base64_encode(file_get_contents($pf->getRealPath())),
];
}
$ps = $request->files->get('ps');
if ($ps instanceof UploadedFile) {
$files[] = [
'name' => $ps->getClientOriginalName(),
'ext' => $ps->getClientOriginalExtension(),
'data' => base64_encode(file_get_contents($ps->getRealPath())),
];
}
$pp = $request->files->get('pp');
if ($pp instanceof UploadedFile) {
$files[] = [
'name' => $pp->getClientOriginalName(),
'ext' => $pp->getClientOriginalExtension(),
'data' => base64_encode(file_get_contents($pp->getRealPath())),
];
}
$inn = $request->files->get('inn');
if ($inn instanceof UploadedFile) {
$files[] = [
'name' => $inn->getClientOriginalName(),
'ext' => $inn->getClientOriginalExtension(),
'data' => base64_encode(file_get_contents($inn->getRealPath())),
];
}
$carModel = $inStockVehicle->createByEntity($Order->getCar());
$OrderData = [
'ID' => $Order->getOneCDocUid(),
'CustomerName' => $Order->getName(),
'Status' => $Order->getState(),
'PaymentAmount' => $Order->getPrice(),
'AmountPaid' => $Order->getBankAmount(),
'Amount' => $carModel->price(),
'PhoneMobile' => $Order->getPhone(),
'RRN' => $Order->getRrn(),
'Works' => [],
'Parts' => [],
'Files' => $files,
'Cars' => [
[
'VIN' => $carModel->getVin(),
'Amount' => $carModel->price(),
'PaymentAmount' => $Order->getBankAmount(),
]
]
];
$result = $apiServer1C->updatePaymentDocument($OrderData, $this->getDealer());
if ($result) {
return $this->json(['success' => $result]);
}
die('Fail');
}
public function findModels(Request $request, TranslatorInterface $translator): JsonResponse
{
$dealerId = $request->request->get('dealer');
$dealer = $dealerId ? $this->em->getRepository(Dealer::class)->find($dealerId) : null;
if (!$dealer) {
return new JsonResponse(['success' => false]);
}
$vehicles = $this->vehicleRepository->getNewByDealer($dealer);
if ($dealer->getId() == 8 || $dealer->getId() == 15) {
$vehicles = $this->vehicleRepository->getSortedByPositionVehicle($vehicles);
}
$cars = [];
foreach ($vehicles as $vehicle) {
if (!$vehicle->getCreditAvailable()) continue;
$vehicleModel = $this->vehicleFactory->createByEntity($vehicle);
if (!$vehicleModel) {
continue;
}
$hasHybrid = '';
if ($vehicleModel->hasHybrid()) {
$hasHybrid = ' Hybrid';
}
$cars[] = [
'image' => $vehicleModel->getPreviewPath('reference'),
'image_webp' => $vehicleModel->getPreviewPathWebp('reference'),
'name' => $vehicleModel->getModelName() . $hasHybrid,
'fullName' => ($vehicleModel->hasHybrid()) ? $vehicleModel->getModelName() . ' ' . $translator->trans('pages.base.car_type.hybrid', [], 'dc_base') : $vehicleModel->getModelName(),
'minPrice' => $vehicleModel->minPrice(),
'id' => $vehicleModel->getVehicleId(),
'hasHybrid' => $vehicleModel->hasHybrid(),
];
}
$brandData = [
'id' => '',
'name' => '',
];
if ($dealer->getBrand()) {
$brandData = [
'id' => $dealer->getBrand()->getId(),
'name' => $dealer->getBrand()->getName(),
];
}
$user = null;
if ($this->getUser()) {
$user = [
'name' => $this->getUser()->getName(),
'surname' => $this->getUser()->getLastName(),
'email' => $this->getUser()->getEmail(),
'phone' => $this->getUser()->getPhone(),
];
}
return new JsonResponse(['success' => true, 'cars' => $cars, 'brand' => $brandData, 'user' => $user]);
}
public function findEquipments(Request $request): JsonResponse
{
$vehicleId = $request->get('vehicleId');
$vehicleFactory = $this->vehicleFactory;
/** @var Equipment $equipment */
foreach ($vehicleFactory->createById($vehicleId)->getAvailEquipments() as $equipment) {
$equipmentData = [
'id' => $equipment->getId(),
'title' => strtoupper($equipment->getTitle()),
'minPrice' => $equipment->minPrice(),
'variations' => [],
];
/** @var VehicleItem $vehicleItem */
foreach ($equipment->getVehicleItems() as $vehicleItem) {
if (!$vehicleItem->getState()) {
continue;
}
$vehicleModel = $vehicleFactory->createByVehicleItem($vehicleItem);
$equipmentData['variations'][] = [
'id' => $vehicleItem->getVariation()->getId(),
'price' => $vehicleItem->calcPrice(),
'fuel' => $vehicleModel->getFuelTypeName($request->getLocale()),
'engine_volume' => $vehicleModel->getEngineVolume($request->getLocale()),
'engine_power' => $vehicleModel->getEnginePower($request->getLocale()),
'transmission' => $vehicleModel->getTransmissionTypeName($request->getLocale()),
'drive' => $vehicleModel->getDriveUnitTypeName($request->getLocale()),
'title' => strtoupper($equipment->getTitle()),
'body' => $vehicleModel->getBodyTypeName($request->getLocale()),
];
}
$data['equipments'][] = $equipmentData;
}
usort($data['equipments'], fn($a, $b) => $a['minPrice'] <=> $b['minPrice']);
return new JsonResponse(array_merge(['success' => true], $data));
}
}