src/DcSiteBundle/Controller/CarController.php line 513

Open in your IDE?
  1. <?php
  2. namespace DcSiteBundle\Controller;
  3. use AcquiringBundle\Component\Model\PortmoneAcquiring;
  4. use AcquiringBundle\Entity\Order;
  5. use Application\Sonata\MediaBundle\Entity\Media;
  6. use CoreBundle\Component\CoreFormFactory;
  7. use CoreBundle\Component\FormManager;
  8. use CoreBundle\Entity\Dealer;
  9. use CoreBundle\Entity\Vehicles\ConfiguratorColor;
  10. use CoreBundle\Entity\Vehicles\Equipment;
  11. use CoreBundle\Entity\Vehicles\EquipmentOptions;
  12. use CoreBundle\Entity\Vehicles\Feature;
  13. use CoreBundle\Entity\Vehicles\InStock;
  14. use CoreBundle\Entity\Vehicles\VariationCharacteristic;
  15. use CoreBundle\Entity\Vehicles\VehicleFile;
  16. use CoreBundle\Entity\Vehicles\VehicleItem;
  17. use CoreBundle\Factory\InStockVehicle;
  18. use CoreBundle\Factory\Vehicle as VehicleFactory;
  19. use CoreBundle\Model\Api\OnlineService\ApiServer1C;
  20. use CoreBundle\Model\Vehicles\AbstractVehicle;
  21. use CoreBundle\Model\Vehicles\EquipmentOptions as EquipmentOptionsCoreModel;
  22. use CoreBundle\Model\Vehicles\Repository;
  23. use CoreBundle\Services\MediaExtensionVidi;
  24. use DcSiteBundle\Services\VehicleService;
  25. use DcSiteBundle\Twig\TwigDcExtension;
  26. use Doctrine\ORM\EntityManagerInterface;
  27. use PortalBundle\Model\SeoMetaTag;
  28. use Sonata\MediaBundle\Provider\YouTubeProvider;
  29. use Symfony\Component\Filesystem\Filesystem;
  30. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  31. use Symfony\Component\HttpFoundation\File\UploadedFile;
  32. use Symfony\Component\HttpFoundation\JsonResponse;
  33. use Symfony\Component\HttpFoundation\Request;
  34. use Symfony\Component\HttpFoundation\RequestStack;
  35. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  36. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  37. use Symfony\Component\Routing\RouterInterface;
  38. use Symfony\Contracts\Translation\TranslatorInterface;
  39. use Twig\Environment;
  40. class CarController extends BaseDcController
  41. {
  42.     public function __construct(CoreFormFactory $coreFormFactorySeoMetaTag $seoMetaTagRequestStack $requestStackRouterInterface $routerFormManager $formManagerEntityManagerInterface $emApiServer1C $apiServer1CSessionInterface $sessionFilesystem $filesystemMediaExtensionVidi $mediaExtensionVidiRepository $vehicleRepositoryVehicleFactory $vehicleFactoryEnvironment $twig)
  43.     {
  44.         parent::__construct($coreFormFactory$seoMetaTag$requestStack$router$formManager$em$apiServer1C$session$filesystem$mediaExtensionVidi$vehicleRepository$vehicleFactory$twig);
  45.     }
  46.     public function loadCarFeature(Request $request): JsonResponse
  47.     {
  48.         $id $request->get('id');
  49.         $vehicle $this->vehicleFactory->createById($id);
  50.         if (!$vehicle) {
  51.             return $this->json(['success' => false]);
  52.         }
  53.         $features $vehicle->getFeatures();
  54.         if (!count($features)) {
  55.             return $this->json(['success' => false]);
  56.         }
  57.         $result = [];
  58.         /**
  59.          * @var $feature Feature
  60.          */
  61.         foreach ($features as $feature) {
  62.             $id $feature->getGroup()->getId();
  63.             if (!isset($result[$id])) {
  64.                 $result[$id] = [
  65.                     'name' => $feature->getGroup()->getNameByLocale($request->getLocale()),
  66.                     'features' => []
  67.                 ];
  68.             }
  69.             $result[$id]['features'][] = [
  70.                 'id' => $feature->getId(),
  71.                 'image' => $this->mediaExtensionVidi->getPath($feature->getImage(), 'reference'),
  72.                 'title' => $feature->getContentByLocale($request->getLocale())->getTitle(),
  73.                 'content' => $feature->getContentByLocale($request->getLocale())->getContent(),
  74.                 'groupId' => $id,
  75.             ];
  76.         }
  77.         return $this->json(['success' => true'features' => $result]);
  78.     }
  79.     public function loadCarColors(Request $request): JsonResponse
  80.     {
  81.         $id $request->get('id');
  82.         $vehicle $this->vehicleFactory->createById($id);
  83.         if (!$vehicle) {
  84.             return $this->json(['success' => false]);
  85.         }
  86.         if (!count($vehicle->getColors())) {
  87.             return $this->json(['success' => false]);
  88.         }
  89.         $colors = [];
  90.         /** @var ConfiguratorColor $color */
  91.         foreach ($vehicle->getColors() as $color) {
  92.             if (!$color->getState()) {
  93.                 continue;
  94.             }
  95.             $Gallery $color->getGallery();
  96.             if (!$Gallery) {
  97.                 continue;
  98.             }
  99.             $galleryItems $Gallery->getGalleryItems();
  100.             if (!$galleryItems->count()) {
  101.                 continue;
  102.             }
  103.             $colors[] = [
  104.                 'title' => $color->getName($request->getLocale()),
  105.                 'price' => $color->calcPrice(),
  106.                 'preview' => $this->mediaExtensionVidi->getPath($color->getImage(), 'reference'),
  107.                 'image' => $this->mediaExtensionVidi->getPath($galleryItems->first()->getMedia(), 'reference')
  108.             ];
  109.         }
  110.         if (!count($colors)) {
  111.             return $this->json(['success' => false]);
  112.         }
  113.         return $this->json(['success' => true'colors' => $colors]);
  114.     }
  115.     public function loadCarGallery(Request $request): JsonResponse
  116.     {
  117.         $id $request->get('id');
  118.         $width $request->get('width');
  119.         //TODO remove magic numbers
  120.         if ($width 590) {
  121.             $format 'slider';
  122.             $bigFormat 'slider';
  123.         } elseif ($width 870) {
  124.             $format 'new_slider';
  125.             $bigFormat 'new_slider';
  126.         } else {
  127.             $format 'new_slider';
  128.             $bigFormat 'reference';
  129.         }
  130.         $vehicle $this->vehicleFactory->createById($id);
  131.         if (!$vehicle) {
  132.             return $this->json(['success' => false]);
  133.         }
  134.         $galleries = [];
  135.         $twig $this->mediaExtensionVidi;
  136.         $images $vehicle->getGallery();
  137.         if ($images && $images->getGalleryItems()) {
  138.             foreach ($images->getGalleryItems() as $item) {
  139.                 $media $item->getMedia();
  140.                 $metadata $media->getProviderMetadata();
  141.                 $metadata = empty($metadata['title']) && empty($metadata['alt']) ? false $metadata;
  142.                 if (!$media) {
  143.                     continue;
  144.                 }
  145.                 $galleries['images'][] = [
  146.                     'small' => $twig->getPath($media$format),
  147.                     'full' => $twig->getPath($media$bigFormat),
  148.                     'image' => $twig->getPath($media'reference'),
  149.                     'image_webp' => $twig->pathWebp($media'reference'),
  150.                     'metadata' => $metadata,
  151.                 ];
  152.             }
  153.         }
  154.         $Video $vehicle->getVideo();
  155.         if ($Video && $Video->getGalleryItems()) {
  156.             foreach ($Video->getGalleryItems() as $item) {
  157.                 /** @var Media $media */
  158.                 $media $item->getMedia();
  159.                 if (!$media) {
  160.                     continue;
  161.                 }
  162.                 /** @var YouTubeProvider $provider */
  163.                 $provider $this->get($media->getProviderName());
  164.                 if (!($provider instanceof YouTubeProvider)) {
  165.                     continue;
  166.                 }
  167.                 $url $provider->getReferenceUrl($media);
  168.                 $paramsStr explode('?'$url);
  169.                 if (!isset($paramsStr[1])) {
  170.                     continue;
  171.                 }
  172.                 parse_str($paramsStr[1], $params);
  173.                 if (!isset($params['v'])) {
  174.                     continue;
  175.                 }
  176.                 $galleries['video'][] = [
  177.                     'url' => $url,
  178.                     'id' => $params['v'],
  179.                 ];
  180.             }
  181.         }
  182.         return $this->json(['success' => true'galleries' => $galleries]);
  183.     }
  184.     public function loadEquipments(Request $request): JsonResponse
  185.     {
  186.         $id $request->get('id');
  187.         $vehicle $this->vehicleRepository->findById($id);
  188.         if (!$vehicle) {
  189.             return $this->json(['succes' => false]);
  190.         }
  191.         $equipments = [];
  192.         $equipmentOptions = [];
  193.         /** @var Equipment $equipment */
  194.         foreach ($vehicle->getEquipments() as $equipment) {
  195.             if (!$equipment->getState()) {
  196.                 continue;
  197.             }
  198.             $sortPrice $equipment->minPrice();
  199.             if ($sortPrice == 0) {
  200.                 $sortPrice Equipment::SORT_PRICE;
  201.             }
  202.             $equipments[] = [
  203.                 'id' => $equipment->getId(),
  204.                 'title' => $equipment->getTitle(),
  205.                 'sortPrice' => $sortPrice,
  206.                 'price' => $equipment->minPrice(),
  207.                 'fullPrice' => $equipment->minFullPrice(),
  208.                 'preOrderPrice' => $equipment->minPreOrderPrice(),
  209.             ];
  210.             $options $equipment->getOptions();
  211.             /** @var EquipmentOptions $option */
  212.             foreach ($options as $option) {
  213.                 $oneOption $option->getOption();
  214.                 $oType $option->getOption()->getOptionType();
  215.                 if (!isset($equipmentOptions[$oType])) {
  216.                     $equipmentOptions[$oType] = [
  217.                         'id' => $oType,
  218.                         'title' => EquipmentOptionsCoreModel::getTypeName($oType$request->getLocale()),
  219.                         'options' => []
  220.                     ];
  221.                 }
  222.                 if (!isset($equipmentOptions[$oType]['options'][$oneOption->getId()])) {
  223.                     $opTitle $oneOption->getTitleUa();
  224.                     if ($request->getLocale() == 'ru') {
  225.                         $opTitle $oneOption->getTitleRu();
  226.                     }
  227.                     $equipmentOptions[$oType]['options'][$oneOption->getId()] = [
  228.                         'id' => $oneOption->getId(),
  229.                         'title' => $opTitle,
  230.                         'values' => []
  231.                     ];
  232.                 }
  233.                 $currentOptionValue '';
  234.                 if (isset($equipmentOptions[$oType]['options'][$oneOption->getId()]['values'][$equipment->getId()])) {
  235.                     //TODO refactor this
  236.                     //phpcs:ignore
  237.                     $currentOptionValue $equipmentOptions[$oType]['options'][$oneOption->getId()]['values'][$equipment->getId()]['value'];
  238.                 }
  239.                 if ($currentOptionValue) {
  240.                     $currentOptionValue .= ', ' $option->getValue($request->getLocale());
  241.                 } else {
  242.                     $currentOptionValue $option->getValue($request->getLocale());
  243.                 }
  244.                 $equipmentOptions[$oType]['options'][$oneOption->getId()]['values'][$equipment->getId()] = [
  245.                     'price' => $option->price(),
  246.                     'value' => $currentOptionValue,
  247.                     //TODO remove magic numbers
  248.                     'optional' => $option->getIsOptional() > 0,
  249.                 ];
  250.             }
  251.         }
  252.         usort($equipments, fn($a$b) => $a['sortPrice'] <=> $b['sortPrice']);
  253.         return $this->json(['success' => true'equipments' => $equipments'equipmentOptions' => $equipmentOptions]);
  254.     }
  255.     public function getModelInfo($idTranslatorInterface $translatorTwigDcExtension $twigDcExtension): JsonResponse
  256.     {
  257.         $Vehicle $this->vehicleFactory->createById($id$translator$twigDcExtension);
  258.         if (!$Vehicle) {
  259.             return new JsonResponse(['success' => false]);
  260.         }
  261.         $modelOptions $this->buildModelInfo($Vehicle);
  262.         $user $this->getUser();
  263.         if (
  264.             $user &&
  265.             ($user->hasRole('ROLE_DC_MANAGER') ||
  266.                 $user->hasRole('ROLE_SUPER_ADMIN')) &&
  267.             $this->getDealer()->getId() == $user->getDealer()->getId()
  268.         ) {
  269.             $modelOptions['isManager'] = true;
  270.             $modelOptions['loadVariationUrl'] = $this->router->generate('base_comparison_variation_info');
  271.             $modelOptions['saveVariationUrl'] = $this->router->generate('base_comparison_variation_save');
  272.         }
  273.         return new JsonResponse($modelOptions);
  274.     }
  275.     private function buildModelInfo(AbstractVehicle $vehicleTranslatorInterface $translatorTwigDcExtension $twigDcExtension): array
  276.     {
  277.         $locale $this->requestStack->getCurrentRequest()->getLocale();
  278.         $modelOptions = [
  279.             'models' => []
  280.         ];
  281.         $Equipments $vehicle->getAvailEquipments();
  282.         uasort($Equipments, fn($a$b) => $a->getPosition() <=> $b->getPosition());
  283.         /** @var Equipment $equipment */
  284.         foreach ($Equipments as $equipment) {
  285.             //TODO remove magic numbers
  286.             if ($equipment->getState() < 1) {
  287.                 continue;
  288.             }
  289.             $oneEquipment = [
  290.                 'id' => $equipment->getId(),
  291.                 'title' => $equipment->getTitle(),
  292.                 'image' => $vehicle->getPreviewPath(),
  293.                 'minIntPrice' => false,
  294.                 'minPrice' => $equipment->minPrice(),
  295.                 'variations' => []
  296.             ];
  297.             $variations $equipment->getVehicleItems();
  298.             /** @var  VehicleItem $vehicleItem */
  299.             foreach ($variations as $vehicleItem) {
  300.                 //TODO remove magic numbers
  301.                 if ($vehicleItem->getState() < 1) {
  302.                     continue;
  303.                 }
  304.                 $vehicleModel $this->vehicleFactory->createByVehicleItem($vehicleItem);
  305.                 $intPrice $vehicleItem->calcPrice();
  306.                 $price $twigDcExtension->priceFilter(round($vehicleItem->calcPrice()));
  307.                 $body $vehicleModel->getBodyTypeName($locale);
  308.                 $engine '';
  309.                 $fuelType $vehicleModel->getFuelTypeName($locale);
  310.                 $transmissionType $vehicleModel->getTransmissionTypeName($locale);
  311.                 if ($fuelType) {
  312.                     $engine .= $fuelType ' / ';
  313.                 }
  314.                 if ($transmissionType) {
  315.                     $engine .= $transmissionType;
  316.                 }
  317.                 $power '';
  318.                 if ($vehicleModel->getEnginePower($locale)) {
  319.                     $power $vehicleModel->getEnginePower($locale) . ' ' .
  320.                         $translator->trans('car_page.compare.max_p_short', [], 'dc_base');
  321.                 }
  322.                 $techOptions = [
  323.                     [
  324.                         'title' => $translator->trans('car_page.compare.year', [], 'dc_base'),
  325.                         'value' => $vehicleItem->getYear()
  326.                     ],
  327.                 ];
  328.                 /** @var VariationCharacteristic $characteristic */
  329.                 foreach ($vehicleItem->getVariation()->getCharacteristics() as $characteristic) {
  330.                     if (!$characteristic->getCharacteristic()->getIsRequired()) {
  331.                         continue;
  332.                     }
  333.                     if ($characteristic->getCharacteristicValue()) {
  334.                         $value $characteristic->getCharacteristicValue()->getValue($locale);
  335.                     } else {
  336.                         $value $characteristic->getValue($locale);
  337.                     }
  338.                     $techOptions[$characteristic->getCharacteristic()->getId()] = [
  339.                         'title' => $characteristic->getCharacteristic()->getTitle($locale),
  340.                         'value' => $value,
  341.                     ];
  342.                 }
  343.                 $variationArray = [
  344.                     'id' => $vehicleItem->getId(),
  345.                     'data' => [
  346.                         'engineName' => $vehicleModel->getEngineName($locale),
  347.                         'body' => $body,
  348.                         'drive' => $vehicleModel->getDriveUnitTypeName($locale),
  349.                         'driveShort' => $vehicleModel->getDriveUnitTypeName($locale),
  350.                         'trans' => $vehicleModel->getTransmissionTypeName($locale),
  351.                         'fuel' => $vehicleModel->getFuelTypeName($locale),
  352.                         'engine' => $engine,
  353.                         'power' => $power,
  354.                     ],
  355.                     'price' => $price,
  356.                     'preorderPrice' => (int)$vehicleItem->getPreorderPrice(),
  357.                     'intPrice' => $intPrice,
  358.                     'technicalOption' => $techOptions,
  359.                 ];
  360.                 if ($vehicleModel->hasActionPrice()) {
  361.                     $variationArray['fullPrice'] = $vehicleModel->fullPrice();
  362.                 }
  363.                 $oneEquipment['variations'][] = $variationArray;
  364.             }
  365.             usort($oneEquipment['variations'], fn($a$b) => $a['intPrice'] <=> $b['intPrice']);
  366.             if (count($oneEquipment['variations']) > 0) {
  367.                 $modelOptions['models'][] = $oneEquipment;
  368.             }
  369.         }
  370.         usort($modelOptions['models'], fn($a$b) => $a['minIntPrice'] <=> $b['minIntPrice']);
  371.         $techVariations = [];
  372.         $this->buildTech($vehicle$techVariations);
  373.         $modelOptions['tech'] = $techVariations;
  374.         return $modelOptions;
  375.     }
  376.     private function buildTech(AbstractVehicle $vehicle, &$techVariations)
  377.     {
  378.         $locale $this->requestStack->getCurrentRequest()->getLocale();
  379.         $vehicleItems $vehicle->getVehicleItems();
  380.         $keys = [];
  381.         foreach ($vehicleItems as $vehicleItem) {
  382.             $characteristics $vehicleItem->getVariation()->getCharacteristics();
  383.             $key $this->buildVariationKey($characteristics);
  384.             if (in_array($key$keys)) {
  385.                 continue;
  386.             }
  387.             $keys[] = $key;
  388.             /** @var VariationCharacteristic $vCharacteristic */
  389.             foreach ($characteristics as $vCharacteristic) {
  390.                 $characteristicId $vCharacteristic->getCharacteristic()->getId();
  391.                 if (!isset($techVariations[$characteristicId])) {
  392.                     $techVariations[$characteristicId] = [
  393.                         'title' => $vCharacteristic->getCharacteristic()->getTitle($locale),
  394.                         'vars' => []
  395.                     ];
  396.                 }
  397.                 $charValue $vCharacteristic->getCharacteristicValue();
  398.                 $value $charValue $charValue->getValue($locale) : $vCharacteristic->getValue($locale);
  399.                 $techVariations[$characteristicId]['vars'][] = $value;
  400.             }
  401.         }
  402.         foreach ($techVariations as $id => $row) {
  403.             $hasValue false;
  404.             foreach ($row['vars'] as $val) {
  405.                 if ($val) {
  406.                     $hasValue true;
  407.                 }
  408.             }
  409.             if (!$hasValue) {
  410.                 unset($techVariations[$id]);
  411.             }
  412.         }
  413.     }
  414.     private function buildVariationKey($characteristic): string
  415.     {
  416.         $characteristicArray = [];
  417.         /** @var VariationCharacteristic $vCharacteristic */
  418.         foreach ($characteristic as $vCharacteristic) {
  419.             $char $vCharacteristic->getCharacteristic();
  420.             $charValue $vCharacteristic->getCharacteristicValue();
  421.             $charValueId '';
  422.             if ($charValue) {
  423.                 $charValueId $charValue->getId();
  424.             }
  425.             $valueUa $vCharacteristic->getValueUa();
  426.             $valueRu $vCharacteristic->getValueRu();
  427.             $key $charValueId $valueUa $valueRu;
  428.             $characteristicArray[$char->getId()] = md5($key);
  429.         }
  430.         ksort($characteristicArray);
  431.         return md5(implode(''$characteristicArray));
  432.     }
  433.     /**
  434.      * @param $id
  435.      * @return JsonResponse
  436.      */
  437.     public function getModelOptions($idRequest $request)
  438.     {
  439.         $Vehicle $this->vehicleFactory->createById($id);
  440.         if (!$Vehicle) {
  441.             return new JsonResponse(['success' => false]);
  442.         }
  443.         $modelOptions = [];
  444.         $Equipments $Vehicle->getAvailEquipments();
  445.         /** @var Equipment $equipment */
  446.         foreach ($Equipments as $equipment) {
  447.             $options $equipment->getOptions();
  448.             /** @var EquipmentOptions $option */
  449.             foreach ($options as $option) {
  450.                 $oneOption $option->getOption();
  451.                 $oType $option->getOption()->getOptionType();
  452.                 if (!isset($modelOptions[$oType])) {
  453.                     $modelOptions[$oType] = [
  454.                         'id' => $oType,
  455.                         'title' => EquipmentOptionsCoreModel::getTypeName($oType$request->getLocale()),
  456.                         'options' => []
  457.                     ];
  458.                 }
  459.                 if (!isset($modelOptions[$oType]['options'][$oneOption->getId()])) {
  460.                     $opTitle $request->getLocale() == 'ru' $oneOption->getTitleRu() : $oneOption->getTitleUa();
  461.                     $modelOptions[$oType]['options'][$oneOption->getId()] = [
  462.                         'id' => $oneOption->getId(),
  463.                         'title' => $opTitle,
  464.                         'values' => []
  465.                     ];
  466.                 }
  467.                 $modelOptions[$oType]['options'][$oneOption->getId()]['values'][$equipment->getId()] = [
  468.                     'price' => $option->price(),
  469.                     'value' => $option->getValue($request->getLocale()),
  470.                 ];
  471.             }
  472.         }
  473.         return new JsonResponse($modelOptions);
  474.     }
  475.     public function downloadFile($id): BinaryFileResponse
  476.     {
  477.         $File $this->em->getRepository(VehicleFile::class)->find($id);
  478.         if (!$File) {
  479.             throw $this->createNotFoundException();
  480.         }
  481.         $rootDir $this->getParameter('kernel.root_dir');
  482.         $filePath $rootDir '/../public/uploads/files/' $File->getPath();
  483.         if (!$filePath || !file_exists($filePath)) {
  484.             $filePath $rootDir '/../public/uploads/files/' $File->getVehicle()->getId() . '/' $File->getPath();
  485.             if (!$filePath || !file_exists($filePath)) {
  486.                 throw $this->createNotFoundException();
  487.             }
  488.         }
  489.         return $this->file($filePath);
  490.     }
  491.     public function showFile($id): BinaryFileResponse
  492.     {
  493.         $File $this->em->getRepository(VehicleFile::class)->find($id);
  494.         if (!$File) {
  495.             throw $this->createNotFoundException();
  496.         }
  497.         $rootDir $this->getParameter('kernel.root_dir');
  498.         $filePath $rootDir '/../public/uploads/files/' $File->getPath();
  499.         if (!$filePath || !file_exists($filePath)) {
  500.             $filePath $rootDir '/../public/uploads/files/' $File->getVehicle()->getId() . '/' $File->getPath();
  501.             if (!$filePath || !file_exists($filePath)) {
  502.                 throw $this->createNotFoundException();
  503.             }
  504.         }
  505.         return new BinaryFileResponse($filePath);
  506.     }
  507.     public function pricesLoad(Request $requestVehicleService $vehicleService): JsonResponse
  508.     {
  509.         $id $request->get('id');
  510.         $vehicleEntity $this->vehicleRepository->findById($id);
  511.         if (!$vehicleEntity) {
  512.             return $this->json(['succes' => false]);
  513.         }
  514.         $vehiclePrice $vehicleService->getVehiclePrice($vehicleEntity);
  515.         $parameters array_merge($vehiclePrice, [
  516.             'success' => true,
  517.             'dealerId' => $this->getDealer()->getId(),
  518.         ]);
  519.         return $this->json($parameters);
  520.     }
  521.     public function personalInit(): JsonResponse
  522.     {
  523.         $vehicles $this->vehicleRepository->getNewByDealer($this->getDealer());
  524.         $result = [];
  525.         foreach ($vehicles as $row) {
  526.             $vehicleModel $this->vehicleFactory->createByEntity($row);
  527.             if (!$vehicleModel) {
  528.                 continue;
  529.             }
  530.             $result[] = [
  531.                 'id' => $vehicleModel->getVehicleId(),
  532.                 'title' => $vehicleModel->getModelName(),
  533.                 'image' => $vehicleModel->getPreviewPath('menu'),
  534.                 'position' => $vehicleModel->getPosition(),
  535.             ];
  536.         }
  537.         usort($result, fn($a$b) => $a['position'] <=> $b['position']);
  538.         return $this->json(['cars' => $result]);
  539.     }
  540.     public function techLoad(Request $requestVehicleService $vehicleService): JsonResponse
  541.     {
  542.         $id $request->get('id');
  543.         $Vehicle $this->vehicleRepository->findById($id);
  544.         if (!$Vehicle) {
  545.             return $this->json(['success' => false]);
  546.         }
  547.         $technicalCharacteristic $vehicleService->getVehicleTechnicalCharacteristic($Vehicle);
  548.         return $this->json($technicalCharacteristic);
  549.     }
  550.     public function createOrder(Request $requestApiServer1C $apiServer1CPortmoneAcquiring $portmoneAcquiring\AcquiringBundle\Component\Model\Order $orderModel): JsonResponse
  551.     {
  552.         $carId $request->get('car');
  553.         if (!$carId) {
  554.             throw new NotFoundHttpException();
  555.         }
  556.         $InStock $this->em->getRepository(InStock::class)->find($carId);
  557.         if (!$InStock) {
  558.             return $this->json(['success' => false]);
  559.         }
  560.         $documentUid $apiServer1C->createPaymentDocument($this->getDealer());
  561.         if (!$documentUid) {
  562.             return $this->json(['success' => false]);
  563.         }
  564.         $dc $portmoneAcquiring->getDcByDealerId($this->getDealer()->getId());
  565.         $Order $orderModel->createInStockOrder($request$documentUid$InStock$this->getDealer(), PortmoneAcquiring::ACQUIRING_TYPE$dc);
  566.         $backref $request->getSchemeAndHttpHost() . $this->router->generate('toyota_odessa_buy_result', ['hash' => $Order->getHash()]);
  567.         $formData $portmoneAcquiring->getInStockFormData($Order$backref);
  568.         return $this->json(['success' => true'formData' => $formData]);
  569.     }
  570.     public function updateOrder(Request $requestInStockVehicle $inStockVehicleApiServer1C $apiServer1C): JsonResponse
  571.     {
  572.         $orderId $request->get('order');
  573.         $Order $this->em->getRepository(Order::class)->find($orderId);
  574.         if (!$Order) {
  575.             return $this->json(['success' => false]);
  576.         }
  577.         $files = [];
  578.         $pf $request->files->get('pf');
  579.         if ($pf instanceof UploadedFile) {
  580.             $files[] = [
  581.                 'name' => $pf->getClientOriginalName(),
  582.                 'ext' => $pf->getClientOriginalExtension(),
  583.                 'data' => base64_encode(file_get_contents($pf->getRealPath())),
  584.             ];
  585.         }
  586.         $ps $request->files->get('ps');
  587.         if ($ps instanceof UploadedFile) {
  588.             $files[] = [
  589.                 'name' => $ps->getClientOriginalName(),
  590.                 'ext' => $ps->getClientOriginalExtension(),
  591.                 'data' => base64_encode(file_get_contents($ps->getRealPath())),
  592.             ];
  593.         }
  594.         $pp $request->files->get('pp');
  595.         if ($pp instanceof UploadedFile) {
  596.             $files[] = [
  597.                 'name' => $pp->getClientOriginalName(),
  598.                 'ext' => $pp->getClientOriginalExtension(),
  599.                 'data' => base64_encode(file_get_contents($pp->getRealPath())),
  600.             ];
  601.         }
  602.         $inn $request->files->get('inn');
  603.         if ($inn instanceof UploadedFile) {
  604.             $files[] = [
  605.                 'name' => $inn->getClientOriginalName(),
  606.                 'ext' => $inn->getClientOriginalExtension(),
  607.                 'data' => base64_encode(file_get_contents($inn->getRealPath())),
  608.             ];
  609.         }
  610.         $carModel $inStockVehicle->createByEntity($Order->getCar());
  611.         $OrderData = [
  612.             'ID' => $Order->getOneCDocUid(),
  613.             'CustomerName' => $Order->getName(),
  614.             'Status' => $Order->getState(),
  615.             'PaymentAmount' => $Order->getPrice(),
  616.             'AmountPaid' => $Order->getBankAmount(),
  617.             'Amount' => $carModel->price(),
  618.             'PhoneMobile' => $Order->getPhone(),
  619.             'RRN' => $Order->getRrn(),
  620.             'Works' => [],
  621.             'Parts' => [],
  622.             'Files' => $files,
  623.             'Cars' => [
  624.                 [
  625.                     'VIN' => $carModel->getVin(),
  626.                     'Amount' => $carModel->price(),
  627.                     'PaymentAmount' => $Order->getBankAmount(),
  628.                 ]
  629.             ]
  630.         ];
  631.         $result $apiServer1C->updatePaymentDocument($OrderData$this->getDealer());
  632.         if ($result) {
  633.             return $this->json(['success' => $result]);
  634.         }
  635.         die('Fail');
  636.     }
  637.     public function findModels(Request $requestTranslatorInterface $translator): JsonResponse
  638.     {
  639.         $dealerId $request->request->get('dealer');
  640.         $dealer $dealerId $this->em->getRepository(Dealer::class)->find($dealerId) : null;
  641.         if (!$dealer) {
  642.             return new JsonResponse(['success' => false]);
  643.         }
  644.         $vehicles $this->vehicleRepository->getNewByDealer($dealer);
  645.         if ($dealer->getId() == || $dealer->getId() == 15) {
  646.             $vehicles $this->vehicleRepository->getSortedByPositionVehicle($vehicles);
  647.         }
  648.         $cars = [];
  649.         foreach ($vehicles as $vehicle) {
  650.             if (!$vehicle->getCreditAvailable()) continue;
  651.             $vehicleModel $this->vehicleFactory->createByEntity($vehicle);
  652.             if (!$vehicleModel) {
  653.                 continue;
  654.             }
  655.             $hasHybrid '';
  656.             if ($vehicleModel->hasHybrid()) {
  657.                 $hasHybrid ' Hybrid';
  658.             }
  659.             $cars[] = [
  660.                 'image' => $vehicleModel->getPreviewPath('reference'),
  661.                 'image_webp' => $vehicleModel->getPreviewPathWebp('reference'),
  662.                 'name' => $vehicleModel->getModelName() . $hasHybrid,
  663.                 'fullName' => ($vehicleModel->hasHybrid()) ? $vehicleModel->getModelName() . ' ' $translator->trans('pages.base.car_type.hybrid', [], 'dc_base') : $vehicleModel->getModelName(),
  664.                 'minPrice' => $vehicleModel->minPrice(),
  665.                 'id' => $vehicleModel->getVehicleId(),
  666.                 'hasHybrid' => $vehicleModel->hasHybrid(),
  667.             ];
  668.         }
  669.         $brandData = [
  670.             'id' => '',
  671.             'name' => '',
  672.         ];
  673.         if ($dealer->getBrand()) {
  674.             $brandData = [
  675.                 'id' => $dealer->getBrand()->getId(),
  676.                 'name' => $dealer->getBrand()->getName(),
  677.             ];
  678.         }
  679.         $user null;
  680.         if ($this->getUser()) {
  681.             $user = [
  682.                 'name' => $this->getUser()->getName(),
  683.                 'surname' => $this->getUser()->getLastName(),
  684.                 'email' => $this->getUser()->getEmail(),
  685.                 'phone' => $this->getUser()->getPhone(),
  686.             ];
  687.         }
  688.         return new JsonResponse(['success' => true'cars' => $cars'brand' => $brandData'user' => $user]);
  689.     }
  690.     public function findEquipments(Request $request): JsonResponse
  691.     {
  692.         $vehicleId $request->get('vehicleId');
  693.         $vehicleFactory $this->vehicleFactory;
  694.         /** @var Equipment $equipment */
  695.         foreach ($vehicleFactory->createById($vehicleId)->getAvailEquipments() as $equipment) {
  696.             $equipmentData = [
  697.                 'id' => $equipment->getId(),
  698.                 'title' => strtoupper($equipment->getTitle()),
  699.                 'minPrice' => $equipment->minPrice(),
  700.                 'variations' => [],
  701.             ];
  702.             /** @var VehicleItem $vehicleItem */
  703.             foreach ($equipment->getVehicleItems() as $vehicleItem) {
  704.                 if (!$vehicleItem->getState()) {
  705.                     continue;
  706.                 }
  707.                 $vehicleModel $vehicleFactory->createByVehicleItem($vehicleItem);
  708.                 $equipmentData['variations'][] = [
  709.                     'id' => $vehicleItem->getVariation()->getId(),
  710.                     'price' => $vehicleItem->calcPrice(),
  711.                     'fuel' => $vehicleModel->getFuelTypeName($request->getLocale()),
  712.                     'engine_volume' => $vehicleModel->getEngineVolume($request->getLocale()),
  713.                     'engine_power' => $vehicleModel->getEnginePower($request->getLocale()),
  714.                     'transmission' => $vehicleModel->getTransmissionTypeName($request->getLocale()),
  715.                     'drive' => $vehicleModel->getDriveUnitTypeName($request->getLocale()),
  716.                     'title' => strtoupper($equipment->getTitle()),
  717.                     'body' => $vehicleModel->getBodyTypeName($request->getLocale()),
  718.                 ];
  719.             }
  720.             $data['equipments'][] = $equipmentData;
  721.         }
  722.         usort($data['equipments'], fn($a$b) => $a['minPrice'] <=> $b['minPrice']);
  723.         return new JsonResponse(array_merge(['success' => true], $data));
  724.     }
  725. }