src/PortalBundle/Controller/ServiceController.php line 816

Open in your IDE?
  1. <?php
  2. namespace PortalBundle\Controller;
  3. use BmpGatewayBundle\Entity\VehicleTestDrive;
  4. use CoreBundle\Component\CoreFormFactory;
  5. use CoreBundle\Component\FormManager;
  6. use CoreBundle\Entity\BodyRepairCategory;
  7. use CoreBundle\Entity\Brand;
  8. use CoreBundle\Entity\Dealer;
  9. use CoreBundle\Entity\Forms;
  10. use CoreBundle\Entity\Model;
  11. use CoreBundle\Entity\Post;
  12. use CoreBundle\Entity\ServicePage;
  13. use CoreBundle\Entity\ServicePageCategory;
  14. use CoreBundle\Entity\Vehicles\InStock;
  15. use CoreBundle\Entity\Vehicles\Vehicle;
  16. use CoreBundle\Entity\ViDiDepartment;
  17. use CoreBundle\Model\Vehicles\Repository;
  18. use CoreBundle\Model\Vehicles\VehicleType;
  19. use CoreBundle\Model\ViDiDepartmentModel;
  20. use CoreBundle\Model\ViDiWorkerModel;
  21. use CoreBundle\Services\MediaExtensionVidi;
  22. use DateTime;
  23. use DcSiteBundle\Entity\ServiceWork;
  24. use DcSiteBundle\Entity\ServiceWorkGroup;
  25. use DcSiteBundle\Entity\ServiceWorkJob;
  26. use DcSiteBundle\Entity\WorkGroupRelation;
  27. use DcSiteBundle\Model\Form\ServiceForm;
  28. use DcSiteBundle\Repository\ServiceWorkGroupRepository;
  29. use Doctrine\ORM\EntityManagerInterface;
  30. use PortalBundle\Entity\Blog;
  31. use PortalBundle\Entity\BlogCategory;
  32. use PortalBundle\Enums\VehicleTypeEnum;
  33. use PortalBundle\Model\SeoMetaTag;
  34. use PortalBundle\Services\MainService;
  35. use PortalBundle\Services\ServiceService;
  36. use Symfony\Component\HttpFoundation\JsonResponse;
  37. use Symfony\Component\HttpFoundation\Request;
  38. use Symfony\Component\HttpFoundation\RequestStack;
  39. use Symfony\Component\HttpFoundation\Response;
  40. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  41. use Symfony\Component\Routing\RouterInterface;
  42. use Symfony\Contracts\Translation\TranslatorInterface;
  43. class ServiceController extends BaseController
  44. {
  45.     const BODY_REPAIR_UNIQUE_ID 'BODY_SERVICE';
  46.     private SeoMetaTag $seoMetaTag;
  47.     public function __construct(CoreFormFactory $coreFormFactoryRequestStack $requestStackRouterInterface $router,
  48.                                 Repository      $vehicleRepositoryServiceService $serviceServiceSeoMetaTag $seoMetaTag)
  49.     {
  50.         parent::__construct($coreFormFactory$requestStack$router$vehicleRepository$serviceService);
  51.         $this->seoMetaTag $seoMetaTag;
  52.     }
  53.     protected function serviceRender($view, array $parameters = [], Response $response null): Response
  54.     {
  55.         $request $this->requestStack->getCurrentRequest();
  56.         $subdomain explode('.'$request->server->get('HTTP_HOST'))[0];
  57.         $isSubdomainShop $subdomain === "shop";
  58.         $seoMeta $this->seoMetaTag->getSeoMeta($request);
  59.         $compareCookie $request->cookies->get('compare');
  60.         $countCompare = ($compareCookie) ? count(explode(','$compareCookie)) : '';
  61.         $parameters array_merge($parameters, [
  62.             'backLoginUrl' => $request->getUri(),
  63.             'countCompare' => $countCompare,
  64.             'seoMeta' => $seoMeta,
  65.             'privacyUrl' => $this->router->generate('portal_privacy_policy'),
  66.             'isSubdomainShop' => $isSubdomainShop
  67.         ]);
  68.         if (isset($parameters['forms'])) {
  69.             $parameters['forms'] = array_merge($parameters['forms'], $this->buildForms());
  70.         } else {
  71.             $parameters array_merge($parameters, ['forms' => $this->buildForms()]);
  72.         }
  73.         $brandsItem $this->vehicleRepository->getAvailBrands(true0VehicleType::DEFAULT_TYPE);
  74.         foreach ($brandsItem as $row) {
  75.             if (!$row['url']) {
  76.                 continue;
  77.             }
  78.             $brands[] = [
  79.                 'name' => $row['name'],
  80.                 'url' => $this->router->generate('portal_new_catalog_b', ['brand' => $row['url'], 'state' => 'new''type' => 'car'])
  81.             ];
  82.         }
  83.         $vehicleType = new VehicleType();
  84.         $parameters array_merge($parameters, ['globalBrands' => $brands'vehicleType' => $vehicleType]);
  85.         if (null === $response) {
  86.             $response = new Response();
  87.         }
  88.         $defaultType VehicleType::getTypeDataById(VehicleType::DEFAULT_TYPE);
  89.         $catalogUrl $this->router->generate('portal_new_catalog_b', ['state' => 'new''type' => $defaultType['url'], 'brand' => 'all']);
  90.         $parameters['catalogUrl'] = $catalogUrl;
  91.         return parent::basePortalRender($view$parameters$response);
  92.     }
  93.     public function to(Request $requestEntityManagerInterface $em)
  94.     {
  95.         $brands $em->getRepository(Brand::class)->getBrandsHasRegulation();
  96.         return $this->serviceRender('@Portal/Service/to.html.twig', [
  97.             'serviceForm' => $this->CoreFormFactory()->serviceForm(nullfalseServiceForm::TO_SERVICE_TYPE)->createView(),
  98.             'serviceBrands' => $brands,
  99.         ]);
  100.     }
  101.     public function toBrand(Request $requestEntityManagerInterface $em): Response
  102.     {
  103.         $brandUrl $request->get('brand');
  104.         $brand $em->getRepository(Brand::class)->getBrandByUrl($brandUrl);
  105.         if (!$brand) {
  106.             throw new NotFoundHttpException();
  107.         }
  108.         $models $em->getRepository(\CoreBundle\Entity\Model::class)->getModelsHasRegulationByBrand($brand->getId());
  109.         return $this->serviceRender('@Portal/Service/to.html.twig', [
  110.             'serviceForm' => $this->CoreFormFactory()->serviceForm(nullfalseServiceForm::TO_SERVICE_TYPE)->createView(),
  111.             'brand' => $brand,
  112.             'serviceModels' => $models,
  113.         ]);
  114.     }
  115.     public function toModel(Request $requestEntityManagerInterface $em): Response
  116.     {
  117.         $brandUrl $request->get('brand');
  118.         $modelUrl $request->get('model');
  119.         $brand $em->getRepository(Brand::class)->getBrandByUrl($brandUrl);
  120.         if (!$brand) {
  121.             throw new NotFoundHttpException();
  122.         }
  123.         $model $em->getRepository(\CoreBundle\Entity\Model::class)->findOneByUrl($modelUrl$brand);
  124.         if (!$model) {
  125.             throw new NotFoundHttpException();
  126.         }
  127.         $models $em->getRepository(\CoreBundle\Entity\Model::class)->getModelsHasRegulationByBrand($brand->getId());
  128.         return $this->serviceRender('@Portal/Service/to.html.twig', [
  129.             'serviceForm' => $this->CoreFormFactory()->serviceForm(nullfalseServiceForm::TO_SERVICE_TYPE)->createView(),
  130.             'brand' => $brand,
  131.             'model' => $model,
  132.             'serviceModels' => $models,
  133.         ]);
  134.     }
  135.     public function bodyRepair(Request $requestEntityManagerInterface $em): Response
  136.     {
  137.         $repoCategories $em->getRepository(BodyRepairCategory::class)->findBy(['state' => true'parent_category' => null], ['position' => 'ASC']);
  138.         $repairCategory = [];
  139.         $dealer $em->getRepository(Dealer::class)->findOneBy(['unique_id' => self::BODY_REPAIR_UNIQUE_ID]);
  140.         $serviceActions $em->getRepository(Post::class)->getActionsService($dealer0true);
  141.         /** @var BodyRepairCategory $category */
  142.         foreach ($repoCategories as $category) {
  143.             if (!isset($repairCategory[$category->getId()])) {
  144.                 $repairCategory[$category->getId()] = [
  145.                     'category' => $category,
  146.                     'subCategories' => []
  147.                 ];
  148.             }
  149.             /** @var BodyRepairCategory $childCategory */
  150.             foreach ($category->getChildCategory() as $childCategory) {
  151.                 if (!$childCategory->getState()) {
  152.                     continue;
  153.                 }
  154.                 $repairCategory[$category->getId()]['subCategories'][$childCategory->getId()] = [
  155.                     'category' => $childCategory,
  156.                     'position' => $childCategory->getPosition(),
  157.                 ];
  158.             }
  159.         }
  160.         return $this->serviceRender('@Portal/Service/body-repair.html.twig', [
  161.             'dealer' => $dealer,
  162.             'serviceActions' => $serviceActions,
  163.             'repairCategory' => $repairCategory,
  164.             'repairPhotoForm' => $this->CoreFormFactory()->repairPhotoForm()->createView(),
  165.         ]);
  166.     }
  167.     public function bodyRepairCategory(Request $requestEntityManagerInterface $em): Response
  168.     {
  169.         $categoryUrl $request->get('category');
  170.         $category $em->getRepository(BodyRepairCategory::class)->findOneBy(['state' => true'url' => $categoryUrl]);
  171.         $dealer $em->getRepository(Dealer::class)->findOneBy(['unique_id' => self::BODY_REPAIR_UNIQUE_ID]);
  172.         $serviceActions $em->getRepository(Post::class)->getActionsService($dealer0true);
  173.         if (!$category) {
  174.             throw $this->createNotFoundException('category not exists');
  175.         }
  176.         $subCategories = [];
  177.         /** @var BodyRepairCategory $item */
  178.         foreach ($category->getChildCategory() as $item) {
  179.             if (!$item->getState()) {
  180.                 continue;
  181.             }
  182.             $subCategories[] = $item;
  183.         }
  184.         return $this->serviceRender('@Portal/Service/body-repair-category.html.twig', [
  185.             'dealer' => $dealer,
  186.             'serviceActions' => $serviceActions,
  187.             'category' => $category,
  188.             'subCategories' => $subCategories,
  189.             'repairPhotoForm' => $this->CoreFormFactory()->repairPhotoForm()->createView(),
  190.         ]);
  191.     }
  192.     public function bodyRepairSubCategory(Request $requestEntityManagerInterface $em): Response
  193.     {
  194.         $categoryUrl $request->get('category');
  195.         $subCategoryUrl $request->get('subCategory');
  196.         $category $em->getRepository(BodyRepairCategory::class)->findOneBy(['state' => true'url' => $categoryUrl]);
  197.         if (!$category) {
  198.             throw $this->createNotFoundException('category not exists');
  199.         }
  200.         $subCategory $em->getRepository(BodyRepairCategory::class)->findOneBy(['state' => true'url' => $subCategoryUrl]);
  201.         if (!$subCategory) {
  202.             throw $this->createNotFoundException('category not exists');
  203.         }
  204.         $dealer $em->getRepository(Dealer::class)->findOneBy(['unique_id' => self::BODY_REPAIR_UNIQUE_ID]);
  205.         $serviceActions $em->getRepository(Post::class)->getActionsService($dealer0true);
  206.         $brands $em->getRepository(Brand::class)->getAvailBrandsInstance();
  207.         return $this->serviceRender('@Portal/Service/body-repair-sub-category.html.twig', [
  208.             'dealer' => $dealer,
  209.             'brands' => $brands,
  210.             'serviceActions' => $serviceActions,
  211.             'subCategory' => $subCategory,
  212.             'repairPhotoForm' => $this->CoreFormFactory()->repairPhotoForm()->createView(),
  213.         ]);
  214.     }
  215.     public function accessories(EntityManagerInterface $em): Response
  216.     {
  217.         $service $em->getRepository(Post::class)->getServiceActions(3);
  218.         return $this->serviceRender('@Portal/Service/accessories.html.twig', [
  219.             'buyPartsForm' => $this->CoreFormFactory()->buyPartsForm()->createView(),
  220.             'serviceActions' => $service,
  221.         ]);
  222.     }
  223.     public function parts(Request $requestMainService $mainService): Response
  224.     {
  225.         $mainService->setLang($request->getLocale());
  226.         $brands $mainService->getBrands([2631]);
  227.         $routeMap = [
  228.             => 'ford_service_spares',
  229.             => 'toyota_service_spares',
  230.             => 'mazda_service_parts',
  231.             => 'lexus_service_spare_parts',
  232.             => 'infiniti_homepage',
  233.             => 'landrover_service_spare_parts',
  234.             10 => 'honda_homepage',
  235.             11 => 'peugeot_service_parts',
  236.             12 => 'nissan_service_accessories',
  237.             15 => 'citroen_service_parts',
  238.             16 => 'opel_service_spare_parts',
  239.             17 => 'yamaha_service_spare_parts',
  240.             23 => 'suzuki_service_parts',
  241.             24 => 'subaru_service_spare_parts',
  242.             42 => 'jeep_service_parts',
  243.             43 => 'mg_service_spare_parts'
  244.         ];
  245.         $filteredBrands array_values(array_filter(array_map(function ($brand) use ($routeMap) {
  246.             if (isset($routeMap[$brand['id']])) {
  247.                 $brand['parts_route'] = $routeMap[$brand['id']];
  248.                 return $brand;
  249.             }
  250.             return null;
  251.         }, $brands)));
  252.         return $this->serviceRender('@Portal/Service/parts.html.twig', [
  253.             'brands' => $filteredBrands,
  254.         ]);
  255.     }
  256.     public function tiresHotel(Request $requestEntityManagerInterface $em): Response
  257.     {
  258.         $repository $em->getRepository(ServiceWorkGroup::class);
  259.         $locale $request->getLocale();
  260.         $mainCategories $repository
  261.             ->getTearHotel([
  262.                 ServiceWorkGroupRepository::UID_TEAR_STORAGE
  263.             ]);
  264.         $additionCategories $repository->getTireHotelAdditionCategories();
  265.         $mainCategories array_merge($mainCategories$additionCategories);
  266.         $regulationDealers $this->serviceService->getRegulationDealers($locale);
  267.         $dealers = [];
  268.         foreach ($regulationDealers as $dealer) {
  269.             if ($dealer['id'] != 7) {
  270.                 $dealers[$dealer['id']] = $dealer['title'];
  271.             }
  272.         }
  273.         return $this->serviceRender('@Portal/Service/tires-hotel.html.twig', [
  274.             'mainCategories' => $mainCategories,
  275.             'additionCategories' => $additionCategories,
  276.             'callMeForm' => $this->CoreFormFactory()
  277.                 ->callMeForm(new Forms(), true)
  278.                 ->createView(),
  279.             'tiresHotelForm' => $this->CoreFormFactory()
  280.                 ->tiresHotelForm(new Forms(), $dealers)
  281.                 ->createView()
  282.         ]);
  283.     }
  284.     public function carRepair(Request $requestEntityManagerInterface $em\CoreBundle\Model\Service\ServiceWork $serviceWork): Response
  285.     {
  286.         $locale $request->getLocale();
  287.         $service $em->getRepository(Post::class)->getServiceActions(3);
  288.         $mainService $serviceWork->getMainService();
  289.         $categories $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($mainService);
  290.         $servicesCategory = [];
  291.         foreach ($categories as $category) {
  292.             $childCategories $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($category);
  293.             if ($childCategories) {
  294.                 if (!isset($servicesCategory[$category->getId()])) {
  295.                     $servicesCategory[$category->getId()] = [
  296.                         'category' => $category,
  297.                         'subCategory' => []
  298.                     ];
  299.                 }
  300.                 foreach ($childCategories as $childCategory) {
  301.                     $servicesCategory[$category->getId()]['subCategory'][$childCategory->getId()] = [
  302.                         'category' => $childCategory,
  303.                         'position' => $childCategory->getPosition(),
  304.                     ];
  305.                 }
  306.                 usort($servicesCategory[$category->getId()]['subCategory'], fn($a$b) => $a['position'] <=> $b['position']);
  307.             }
  308.         }
  309.         $regulationDealers $this->serviceService->getRegulationDealers($locale);
  310.         //unset Toyota Palmira
  311.         foreach ($regulationDealers as $key => $dealer) {
  312.             if ($dealer['id'] == 7) {
  313.                 unset($regulationDealers[$key]);
  314.                 $regulationDealers array_values($regulationDealers);
  315.             }
  316.         }
  317.         return $this->serviceRender('@Portal/Service/car-repair.html.twig', [
  318.             'serviceForm' => $this->CoreFormFactory()->serviceForm(nullfalseServiceForm::BROKE_SERVICE_TYPE)->createView(),
  319.             'serviceActions' => $service,
  320.             'servicesCategory' => $servicesCategory,
  321.             'regulationDealers' => $regulationDealers,
  322.             'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active')
  323.         ]);
  324.     }
  325.     public function servicePageContentDealer(Request $requestEntityManagerInterface $emViDiWorkerModel $viDiWorkerModel): Response
  326.     {
  327.         $requestCategory $request->get('category');
  328.         $requestService $request->get('service');
  329.         $requestDealer $request->get('dealer');
  330.         $serviceActions $em->getRepository(Post::class)->getServiceActions(3);
  331.         $category $em->getRepository(ServicePageCategory::class)->findOneBy(['url' => $requestCategory'state' => true]);
  332.         if (!$category) {
  333.             throw $this->createNotFoundException('category not exists');
  334.         }
  335.         $service $em->getRepository(ServicePageCategory::class)->findOneBy(['url' => $requestService]);
  336.         if (!$service) {
  337.             throw $this->createNotFoundException('service not exists');
  338.         }
  339.         $dealer $em->getRepository(Dealer::class)->findOneBy(['url' => $requestDealer]);
  340.         if (!$dealer) {
  341.             throw $this->createNotFoundException('dealer not exists');
  342.         }
  343.         $dealerModeOperation false;
  344.         $openTime preg_replace("/[^0-9]/"''$dealer->getOpenTime());
  345.         $closeTime preg_replace("/[^0-9]/"''$dealer->getCloseTime());
  346.         ($openTime date("Hi") && $closeTime date("Hi")) ? $dealerModeOperation true $dealerModeOperation false;
  347.         $department $em->getRepository(ViDiDepartment::class)
  348.             ->findOneBy(['dealer' => $dealer'type' => ViDiDepartmentModel::DEPARTMENT_TYPE_SERVICE]);
  349.         $workers $viDiWorkerModel->getAllByDealer($dealer$request->getLocale());
  350.         foreach ($workers as $key => $value) {
  351.             if ($value['department']->getType() != 2) {
  352.                 unset($workers[$key]);
  353.             }
  354.         }
  355.         $pages $em->getRepository(ServicePage::class)->getByCategory($service$dealer);
  356.         /** @var ServicePage $page */
  357.         $jobIds array_column($pages'id');
  358.         $facilities explode(', '$dealer->getFacilities());
  359.         $serviceWorks $em->getRepository(ServiceWork::class)->getByJobIds($jobIds$dealer);
  360.         $price_jobs = [];
  361.         $hour_jobs = [];
  362.         $price_parts = [];
  363.         $jobsType = [
  364.             'jobs' => [],
  365.             'jobsRegulations' => [],
  366.             'jobsModels' => []
  367.         ];
  368.         /** @var ServiceWork $serviceWork */
  369.         foreach ($serviceWorks as $serviceWork) {
  370.             if (!isset($price_jobs[$serviceWork->getId()])) {
  371.                 $price_jobs[$serviceWork->getId()] = 0;
  372.             }
  373.             if (!isset($price_parts[$serviceWork->getId()])) {
  374.                 $price_parts[$serviceWork->getId()] = 0;
  375.             }
  376.             if (!isset($hour_jobs[$serviceWork->getId()])) {
  377.                 $hour_jobs[$serviceWork->getId()] = 0;
  378.             }
  379.             foreach ($serviceWork->getJobs() as $job) {
  380.                 $price_jobs[$serviceWork->getId()] += $job->getPrice();
  381.                 $hour_jobs[$serviceWork->getId()] += $job->getJobHours();
  382.             }
  383.             foreach ($serviceWork->getParts() as $part) {
  384.                 $price_parts[$serviceWork->getId()] += $part->getCount() * $part->getPart()->getPrice();
  385.             }
  386.             $serviceJobIds = [];
  387.             /** @var ServiceWorkJob $serviceWorkJob */
  388.             foreach ($serviceWork->getJobs() as $serviceWorkJob) {
  389.                 $serviceJobIds[$serviceWorkJob->getJob()->getId()] = $serviceWorkJob->getJob()->getNameByLocale($request->getLocale());
  390.             }
  391.             $jobIdIntersect array_intersect(array_keys($serviceJobIds), $jobIds);
  392.             if (!$jobIdIntersect) {
  393.                 continue;
  394.             }
  395.             $currentJobId array_shift($jobIdIntersect);
  396.             if (is_null($serviceWork->getVariation())) {
  397.                 if (!isset($jobsType['jobs'][$serviceWork->getId()])) {
  398.                     $jobsType['jobs'][$serviceWork->getId()] = [
  399.                         'title' => $serviceWork->getTitle($request->getLocale()),
  400.                         'service_work' => [],
  401.                     ];
  402.                 }
  403.                 $jobsType['jobs'][$serviceWork->getId()]['service_work'] = [
  404.                     'regulation_id' => $serviceWork->getId(),
  405.                     'jobs' => $serviceWork->getJobs(),
  406.                     'parts' => $serviceWork->getParts(),
  407.                     'hours' => $hour_jobs[$serviceWork->getId()],
  408.                     'price_service' => round($price_jobs[$serviceWork->getId()] + $price_parts[$serviceWork->getId()])
  409.                 ];
  410.             } elseif ($serviceWork->getIsRegulations() == 1) {
  411.                 $modelId $serviceWork->getVariation()->getModel()->getId();
  412.                 $currentJobId $serviceWork->getMileage();
  413.                 if (!isset($jobsType['jobsRegulations'][$serviceWork->getMileage()])) {
  414.                     $jobsType['jobsRegulations'][$serviceWork->getMileage()] = [
  415.                         'title' => $serviceWork->getMileage(),
  416.                         'models' => [],
  417.                     ];
  418.                 }
  419.                 if (!isset($jobsType['jobsRegulations'][$serviceWork->getMileage()]['models'][$modelId])) {
  420.                     $jobsType['jobsRegulations'][$serviceWork->getMileage()]['models'][$modelId] = [
  421.                         'title' => $serviceWork->getVariation()->getModel()->getTitle(),
  422.                         'model' => $serviceWork->getVariation()->getModel()->getTitle(),
  423.                         'service_work' => [],
  424.                     ];
  425.                 }
  426.                 $jobsType['jobsRegulations'][$serviceWork->getMileage()]['models'][$modelId]['service_work'][$serviceWork->getId()] = [
  427.                     'variation_id' => $serviceWork->getVariation()->getId(),
  428.                     'regulation_id' => $serviceWork->getId(),
  429.                     'hours' => $hour_jobs[$serviceWork->getId()],
  430.                     'jobs' => $serviceWork->getJobs(),
  431.                     'parts' => $serviceWork->getParts(),
  432.                     'model' => $serviceWork->getVariation()->getModel()->getTitle(),
  433.                     'year' => $serviceWork->getVariation()->getYearFrom() . '-' $serviceWork->getVariation()->getYearTo(),
  434.                     'engine' => $serviceWork->getVariation()->getFuelType()->getValue($request->getLocale()) . ' ' number_format($serviceWork->getVariation()->getEngineVolume() / 10001'.'''),
  435.                     'transmission' => $serviceWork->getVariation()->getTransmissionType() . ' ' $serviceWork->getVariation()->getTransmissionStepCount(),
  436.                     'driveUnit' => $serviceWork->getVariation()->getDriveUnit()->getShort($request->getLocale()),
  437.                     'price_service' => round($price_jobs[$serviceWork->getId()] + $price_parts[$serviceWork->getId()])
  438.                 ];
  439.             } else {
  440.                 $Variation $serviceWork->getVariation();
  441.                 $modelId $Variation->getModel()->getId();
  442.                 if (!isset($jobsType['jobsModels'][$currentJobId])) {
  443.                     $jobsType['jobsModels'][$currentJobId] = [
  444.                         'title' => $serviceWork->getTitle($request->getLocale()),
  445.                         'models' => [],
  446.                     ];
  447.                 }
  448.                 if (!isset($jobsType['jobsModels'][$currentJobId]['models'][$modelId])) {
  449.                     $jobsType['jobsModels'][$currentJobId]['models'][$modelId] = [
  450.                         'title' => $Variation->getModel()->getTitle(),
  451.                         'service_work' => [],
  452.                     ];
  453.                 }
  454.                 $service_work = [
  455.                     'variation_id' => $Variation->getId(),
  456.                     'regulation_id' => $serviceWork->getId(),
  457.                     'hours' => $hour_jobs[$serviceWork->getId()],
  458.                     'jobs' => $serviceWork->getJobs(),
  459.                     'parts' => $serviceWork->getParts(),
  460.                     'model' => $Variation->getModel()->getTitle(),
  461.                     'year' => $Variation->getYearFrom() . '-' $Variation->getYearTo(),
  462.                     'engine' => '',
  463.                     'transmission' => $Variation->getTransmissionType() . ' ' $Variation->getTransmissionStepCount(),
  464.                     'driveUnit' => $Variation->getDriveUnit() ? $Variation->getDriveUnit()->getId() : null,
  465.                     'price_service' => round($price_jobs[$serviceWork->getId()] + $price_parts[$serviceWork->getId()])
  466.                 ];
  467.                 if (!is_null($Variation->getFuelType())) {
  468.                     $service_work['engine'] = $Variation->getFuelType()->getValue($request->getLocale()) . ' ' number_format($Variation->getEngineVolume() / 10001'.''');
  469.                 }
  470.                 $jobsType['jobsModels'][$currentJobId]['models'][$modelId]['service_work'][$serviceWork->getId()] = $service_work;
  471.             }
  472.         }
  473.         return $this->serviceRender('@Portal/Service/service-page-content-dealer.html.twig', [
  474.             'serviceForm' => $this->CoreFormFactory()->serviceForm(nullfalseServiceForm::BROKE_SERVICE_TYPE)->createView(),
  475.             'serviceActions' => $serviceActions,
  476.             'category' => $category,
  477.             'service' => $service,
  478.             'dealerModeOperation' => $dealerModeOperation,
  479.             'dealerFacilities' => $facilities,
  480.             'dealer' => $dealer,
  481.             'department' => $department,
  482.             'workers' => $workers,
  483.             'jobsType' => $jobsType,
  484.         ]);
  485.     }
  486.     public static $parts;
  487.     public function savePopupFormBodyRepair(Request $requestEntityManagerInterface $em): JsonResponse
  488.     {
  489.         $dealer $em->getRepository(Dealer::class)->find(['id' => 41]);
  490.         $popupForm = new Forms();
  491.         $popupForm->setDateCreate(new DateTime());
  492.         $popupForm->setType(FormManager::TYPE_REPAIR_CALC);
  493.         $popupForm->setName($request->request->get('name'));
  494.         $popupForm->setPhone($request->request->get('phone'));
  495.         $popupForm->setUtm($request->request->get('utm'));
  496.         $popupForm->setDomain($request->getHost());
  497.         $params json_encode([
  498.             'comment' => $request->request->get('comment'),
  499.         ]);
  500.         $popupForm->setData($params);
  501.         $popupForm->setDealer($dealer);
  502.         $em->persist($popupForm);
  503.         $em->flush();
  504.         return new JsonResponse(['success' => true]);
  505.     }
  506.     public function initRepairCalc(Request $requestTranslatorInterface $translator): JsonResponse
  507.     {
  508.         return new JsonResponse([
  509.             => [
  510.                 'title' => $translator->trans('service.body_repair.calc.front_bumper', [], 'portal_base'),
  511.                 'price' => [
  512.                     'sedan' => 4900,
  513.                     'suv' => 5900,
  514.                     'pickup' => 5400,
  515.                 ]
  516.             ],
  517.             => [
  518.                 'title' => $translator->trans('service.body_repair.calc.front_left_fender', [], 'portal_base'),
  519.                 'price' => [
  520.                     'sedan' => 4900,
  521.                     'suv' => 5900,
  522.                     'pickup' => 5400,
  523.                 ]
  524.             ],
  525.             => [
  526.                 'title' => $translator->trans('service.body_repair.calc.front_right_fender', [], 'portal_base'),
  527.                 'price' => [
  528.                     'sedan' => 4900,
  529.                     'suv' => 5900,
  530.                     'pickup' => 5400,
  531.                 ]
  532.             ],
  533.             => [
  534.                 'title' => $translator->trans('service.body_repair.calc.hood', [], 'portal_base'),
  535.                 'price' => [
  536.                     'sedan' => 4900,
  537.                     'suv' => 5900,
  538.                     'pickup' => 5400,
  539.                 ]
  540.             ],
  541.             => [
  542.                 'title' => $translator->trans('service.body_repair.calc.left_front_door', [], 'portal_base'),
  543.                 'price' => [
  544.                     'sedan' => 4900,
  545.                     'suv' => 5900,
  546.                     'pickup' => 5400,
  547.                 ]
  548.             ],
  549.             => [
  550.                 'title' => $translator->trans('service.body_repair.calc.left_back_door', [], 'portal_base'),
  551.                 'price' => [
  552.                     'sedan' => 4900,
  553.                     'suv' => 5900,
  554.                     'pickup' => 5400,
  555.                 ]
  556.             ],
  557.             => [
  558.                 'title' => $translator->trans('service.body_repair.calc.roof', [], 'portal_base'),
  559.                 'price' => [
  560.                     'sedan' => 4900,
  561.                     'suv' => 5900,
  562.                     'pickup' => 5400,
  563.                 ]
  564.             ],
  565.             => [
  566.                 'title' => $translator->trans('service.body_repair.calc.right_front_door', [], 'portal_base'),
  567.                 'price' => [
  568.                     'sedan' => 4900,
  569.                     'suv' => 5900,
  570.                     'pickup' => 5400,
  571.                 ]
  572.             ],
  573.             => [
  574.                 'title' => $translator->trans('service.body_repair.calc.right_back_door', [], 'portal_base'),
  575.                 'price' => [
  576.                     'sedan' => 4900,
  577.                     'suv' => 5900,
  578.                     'pickup' => 5400,
  579.                 ]
  580.             ],
  581.             10 => [
  582.                 'title' => $translator->trans('service.body_repair.calc.trunk', [], 'portal_base'),
  583.                 'price' => [
  584.                     'sedan' => 4900,
  585.                     'suv' => 5900,
  586.                     'pickup' => 5400,
  587.                 ]
  588.             ],
  589.             11 => [
  590.                 'title' => $translator->trans('service.body_repair.calc.back_left_fender', [], 'portal_base'),
  591.                 'price' => [
  592.                     'sedan' => 4900,
  593.                     'suv' => 5900,
  594.                     'pickup' => 5400,
  595.                 ]
  596.             ],
  597.             12 => [
  598.                 'title' => $translator->trans('service.body_repair.calc.back_right_fender', [], 'portal_base'),
  599.                 'price' => [
  600.                     'sedan' => 4900,
  601.                     'suv' => 5900,
  602.                     'pickup' => 5400,
  603.                 ]
  604.             ],
  605.             13 => [
  606.                 'title' => $translator->trans('service.body_repair.calc.back_bumper', [], 'portal_base'),
  607.                 'price' => [
  608.                     'sedan' => 4900,
  609.                     'suv' => 5900,
  610.                     'pickup' => 5400,
  611.                 ]
  612.             ],
  613.         ]);
  614.     }
  615.     public function saveLeadAccessory(Request $requestFormManager $formManagerEntityManagerInterface $em): JsonResponse
  616.     {
  617.         if (!$dealer $request->get('buy_parts')['dealer']) {
  618.             return $this->json(['success' => false]);
  619.         }
  620.         $dealer $em->getRepository(Dealer::class)->find($dealer);
  621.         if (!$dealer) {
  622.             return $this->json(['success' => false]);
  623.         }
  624.         return $formManager->saveBuyPartsForm($request$dealer);
  625.     }
  626.     public function serviceInit(Request $requestMediaExtensionVidi $mediaExtensionVidi): JsonResponse
  627.     {
  628.         $brands $this->vehicleRepository->getAvailBrandsInstance($request->getLocale());
  629.         foreach ($brands as &$brand) {
  630.             $brand['image'] = $mediaExtensionVidi->getPath($brand['image'], 'menu');
  631.         }
  632.         return new JsonResponse(['success' => true'brands' => $brands]);
  633.     }
  634.     public function serviceFormSave(Request $requestFormManager $formManager): JsonResponse
  635.     {
  636.         return $formManager->saveServiceForm($request);
  637.     }
  638.     public function accessoriesTest(Request $request): Response
  639.     {
  640.         return $this->serviceRender('@Portal/Service/accessories-test.html.twig');
  641.     }
  642.     public function byDealer(EntityManagerInterface $em): Response
  643.     {
  644.         return $this->serviceRender('@Portal/Service/by-dealer.html.twig', [
  645.             'serviceActions' => $em->getRepository(Post::class)->getServiceActions(3),
  646.         ]);
  647.     }
  648.     public function byDealer2(EntityManagerInterface $em): Response
  649.     {
  650.         return $this->serviceRender('@Portal/Service/by-dealer2.html.twig', [
  651.             'serviceActions' => $em->getRepository(Post::class)->getServiceActions(3),
  652.         ]);
  653.     }
  654.     public function byDealer3(EntityManagerInterface $em): Response
  655.     {
  656.         return $this->serviceRender('@Portal/Service/by-dealer3.html.twig', [
  657.             'serviceActions' => $em->getRepository(Post::class)->getServiceActions(3),
  658.         ]);
  659.     }
  660.     public function byDealer4(EntityManagerInterface $em): Response
  661.     {
  662.         return $this->serviceRender('@Portal/Service/by-dealer4.html.twig', [
  663.             'serviceActions' => $em->getRepository(Post::class)->getServiceActions(3),
  664.         ]);
  665.     }
  666.     public function multiConsultationForm(): Response
  667.     {
  668.         return $this->serviceRender('@Portal/Service/consultation-form.html.twig');
  669.     }
  670.     public function multiConsultationFormOnline(): Response
  671.     {
  672.         return $this->serviceRender('@Portal/Service/consultation-form-online.html.twig');
  673.     }
  674.     public function multiConsultationTestdriveForm(Request $requestEntityManagerInterface $em$url null)
  675.     {
  676.         $dealerId null;
  677.         $carId null;
  678.         if ($url) {
  679.             /** @var Vehicle $vehicle */
  680.             if ($request->get('type') == VehicleTypeEnum::IN_STOCK) {
  681.                 $vehicleInStock $em->getRepository(InStock::class)
  682.                     ->findOneBy(['url' => $url]);
  683.                 $vehicle $vehicleInStock && $vehicleInStock->getVehicleItem() ? $vehicleInStock->getVehicleItem()->getVehicle() : null;
  684.             } else {
  685.                 $vehicle $em->getRepository(Vehicle::class)->findOneBy(['url' => $url]);
  686.             }
  687.             if (!$vehicle || !$vehicle->getTestDrive()) {
  688.                 return $this->redirectToRoute('portal_service_testdrive_form');
  689.             }
  690.             $tdVehicle $em->getRepository(VehicleTestDrive::class)->findOneBy(['vehicle' => $vehicle'state' => 1]);
  691.             if (!$tdVehicle) {
  692.                 return $this->redirectToRoute('portal_service_testdrive_form');
  693.             }
  694.             $dealerId $vehicle->getDealer()->getId();
  695.             $carId $tdVehicle->getId();
  696.         }
  697.         return $this->serviceRender('@Portal/Service/consultation-testdrive-form.html.twig', ['dealerId' => $dealerId'carId' => $carId]);
  698.     }
  699.     public function nightBookingService(): Response
  700.     {
  701.         return $this->serviceRender('@Portal/Service/night-booking.html.twig');
  702.     }
  703.     public function nightServiceAgreement(Request $requestEntityManagerInterface $em): Response
  704.     {
  705.         $dealerUrl $request->get('dealerUrl');
  706.         $dealer $em->getRepository(Dealer::class)->findOneBy(['url' => $dealerUrl]);
  707.         return $this->serviceRender('@Portal/Service/night-service-agreement.html.twig', [
  708.             'dealer' => $dealer
  709.         ]);
  710.     }
  711.     public function service(Request $requestEntityManagerInterface $em\CoreBundle\Model\Service\ServiceWork $serviceWork): Response
  712.     {
  713.         $locale $request->getLocale();
  714.         $regulationBrands $em->getRepository(Brand::class)->getBrandsHasRegulation();
  715.         $regulationDealers $this->serviceService->getRegulationDealers($locale);
  716.         $technicalDiscussion $em->getRepository(ServiceWorkGroup::class)->getHeirMainGroup('eb2b75ea-4a5d-11ef-ac14-005056a799b6'5);
  717.         $autoRepair $em->getRepository(ServiceWorkGroup::class)->getHeirMainGroup('c5b44242-3390-11ef-818b-005056a7775d'5);
  718.         $bodyRepair $em->getRepository(ServiceWorkGroup::class)->getHeirMainGroup('c5b44243-3390-11ef-818b-005056a7775d'5);
  719.         //unset Toyota Palmira
  720.         foreach ($regulationDealers as $key => $dealer) {
  721.             if ($dealer['id'] == 7) {
  722.                 unset($regulationDealers[$key]);
  723.                 $regulationDealers array_values($regulationDealers);
  724.             }
  725.         }
  726.         $generalGroup $serviceWork->getMainService();
  727.         $subGeneralGroups $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($generalGroup);
  728.         $maintenanceGroup $em->getRepository(ServiceWorkGroup::class)->find(7294);
  729.         $subMaintenanceGroups $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($maintenanceGroup);
  730.         $subGeneralGroups array_filter($subGeneralGroups, fn($group) => $group->getId() !== 7294);
  731.         usort($subGeneralGroups, fn($a$b) => $a->getPosition() <=> $b->getPosition());
  732.         $dealerId null;
  733.         if ($request->query->get('dealerId')) {
  734.             $dealerId $request->query->get('dealerId');
  735.         }
  736.         return $this->serviceRender('@Portal/Service/service.html.twig', [
  737.             'regulationBrands' => $regulationBrands,
  738.             'regulationDealers' => $regulationDealers,
  739.             'technicalDiscussion' => $technicalDiscussion,
  740.             'subGeneralGroups' => $subGeneralGroups,
  741.             'maintenanceGroup' => $maintenanceGroup,
  742.             'subMaintenanceGroups' => $subMaintenanceGroups,
  743.             'autoRepair' => $autoRepair,
  744.             'bodyRepair' => $bodyRepair,
  745.             'isModalForm' => ($request->get('_route') == 'portal_service_active'),
  746.             'dealerId' => $dealerId
  747.         ]);
  748.     }
  749.     public function servicePageWorkGroupBrand(Request            $requestEntityManagerInterface $em\CoreBundle\Model\Service\ServiceWork $serviceWork,
  750.                                               MediaExtensionVidi $mediaExtensionVidi): Response
  751.     {
  752.         $locale $request->getLocale();
  753.         $requestWorkGroup $request->get('work_group');
  754.         $requestBrand $request->get('brand');
  755.         $workGroup $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestWorkGroup]);
  756.         if (!$workGroup) {
  757.             throw $this->createNotFoundException('category not exists');
  758.         }
  759.         $brand $em->getRepository(Brand::class)->findOneBy(['url' => $requestBrand]);
  760.         $models $serviceWork->getModelsByGroupAndBrand($workGroup$brand);
  761.         $services $serviceWork->getSubGroupsByBrand($workGroup$brand);
  762.         $dealers $this->serviceService->getRegulationServicesByBrand($brand$locale);
  763.         $modifyModelsData = [];
  764.         foreach ($models as $model) {
  765.             $modifyModelsData[] = [
  766.                 'id' => $model->getId(),
  767.                 'title' => $model->getBrand()->getName() . ' ' $model->getTitle(),
  768.                 'url' => $model->getUrl(),
  769.                 'img' => $mediaExtensionVidi->getPath($model->getImage(), 'reference')
  770.             ];
  771.         }
  772.         $minPrice $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroupBrand($workGroup$brand);
  773.         $minWorkTime $em->getRepository(WorkGroupRelation::class)->getJobMinTimeByGroup($workGroup);
  774.         return $this->serviceRender('@Portal/Service/work-group-brand-service.html.twig', [
  775.             'workGroup' => $workGroup,
  776.             'services' => $services,
  777.             'models' => $modifyModelsData,
  778.             'minPrice' => round($minPrice),
  779.             'minWorkTime' => $minWorkTime,
  780.             'brand' => $brand,
  781.             'dealers' => $dealers,
  782.             'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active')
  783.         ]);
  784.     }
  785.     public function servicePageSubWorkGroup(Request $requestEntityManagerInterface $em\CoreBundle\Model\Service\ServiceWork $serviceWork): Response
  786.     {
  787.         $requestWorkGroup $request->get('work_group');
  788.         $requestSubWorkGroup $request->get('sub_group');
  789.         $workGroup $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestWorkGroup]);
  790.         $subWorkGroup $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestSubWorkGroup]);
  791.         $minPrice $em->getRepository(WorkGroupRelation::class)->getJobMInPriceByGroup($subWorkGroup);
  792.         $minWorkTime $em->getRepository(WorkGroupRelation::class)->getJobMinTimeByGroup($subWorkGroup);
  793.         if (!$workGroup) {
  794.             throw $this->createNotFoundException('category not exists');
  795.         }
  796.         $mainGroup $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestWorkGroup]);
  797.         $subGroups $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($mainGroup);
  798.         $anotherGroups = [];
  799.         foreach ($subGroups as $group) {
  800.             if ($group->getId() != $workGroup->getId()) {
  801.                 $anotherGroups[] = [
  802.                     'title' => $group->getTitle($request->getLocale()),
  803.                     'id' => $group->getId(),
  804.                     'price' => $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroup($group)
  805.                 ];
  806.             }
  807.         }
  808.         $regulationDealers $this->serviceService->getRegulationDealers($request->getLocale());
  809.         $brandDealerId null;
  810.         $requestBrand $request->get('brand');
  811.         $brand $em->getRepository(Brand::class)->findOneBy(['url' => $requestBrand]);
  812.         if ($brand) {
  813.             $brandDealerId $brand->getDealer()->first()->getId();
  814.         }
  815.         $brands $serviceWork->getGroupBrands($workGroup);
  816.         foreach ($regulationDealers as $key => $dealer) {
  817.             if ($dealer['id'] == 7) {
  818.                 unset($regulationDealers[$key]);
  819.                 $regulationDealers array_values($regulationDealers);
  820.             }
  821.         }
  822.         $services = [];
  823.         $selectService '';
  824.         foreach ($regulationDealers as $dealer) {
  825.             if (isset($brandDealerId) && $dealer['id'] == $brandDealerId) {
  826.                 $selectService $dealer['title'];
  827.             }
  828.             $services[$dealer['id']] = $dealer['title'];
  829.         }
  830.         return $this->serviceRender('@Portal/Service/sub-work-group-page.html.twig', [
  831.             'workGroup' => $workGroup,
  832.             'anotherGroups' => $anotherGroups,
  833.             'subWorkGroup' => $subWorkGroup,
  834.             'minPrice' => $minPrice,
  835.             'brands' => $brands,
  836.             'minWorkTime' => $minWorkTime,
  837.             'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active'),
  838.             'callMeForm' => $this->CoreFormFactory()
  839.                 ->serviceConsultForm(new Forms(), $services$selectService)
  840.                 ->createView(),
  841.         ]);
  842.     }
  843.     public function servicePageWorkGroup(Request $requestEntityManagerInterface $em\CoreBundle\Model\Service\ServiceWork $serviceWork)
  844.     {
  845.         $requestWorkGroup $request->get('work_group');
  846.         $workGroup $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestWorkGroup]);
  847.         if (!$workGroup) {
  848.             throw $this->createNotFoundException('category not exists');
  849.         }
  850.         $subWorkGroups $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($workGroup);
  851.         $avgPrice $em->getRepository(WorkGroupRelation::class)->getJobAvgPriceByGroup($workGroup);
  852.         $avgWorkTime $em->getRepository(WorkGroupRelation::class)->getJobAvgTimeByGroup($workGroup);
  853.         $brands $serviceWork->getGroupBrands($workGroup);
  854.         return $this->serviceRender('@Portal/Service/work-group-page.html.twig', [
  855.             'workGroup' => $workGroup,
  856.             'brands' => $brands,
  857.             'avgPrice' => round($avgPrice),
  858.             'avgWorkTime' => $avgWorkTime,
  859.             'services' => $subWorkGroups,
  860.             'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active')
  861.         ]);
  862.     }
  863.     public function servicePageWorkGroupModelCalc(Request $requestEntityManagerInterface $em,
  864.                                                   \CoreBundle\Model\Service\ServiceWork $serviceWork)
  865.     {
  866.         $locale $request->getLocale();
  867.         $requestWorkGroup $request->get('work_group');
  868.         $requestBrand $request->get('brand');
  869.         $requestModel $request->get('model');
  870.         $workGroup $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestWorkGroup]);
  871.         if (!$workGroup) {
  872.             throw $this->createNotFoundException('category not exists');
  873.         }
  874.         $brand $em->getRepository(Brand::class)->findOneBy(['url' => $requestBrand]);
  875.         $mainGroup $serviceWork->getMainService();
  876.         $subGroups $serviceWork->getSubGroupsByBrand($mainGroup$brand);
  877.         $anotherGroups = [];
  878.         foreach ($subGroups as $group) {
  879.             if ($group->getId() != $group->getId()) {
  880.                 $anotherGroups[] = [
  881.                     'title' => $group->getTitle($locale),
  882.                     'id' => $group->getId(),
  883.                     'price' => $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroup($group)
  884.                 ];
  885.             }
  886.         }
  887.         $minWorkTime $em->getRepository(WorkGroupRelation::class)->getJobMinTimeByGroup($workGroup);
  888.         $model $em->getRepository(\CoreBundle\Entity\Model::class)->findOneBy(['url' => $requestModel]);
  889.         $brand $em->getRepository(Brand::class)->findOneBy(['url' => $requestBrand]);
  890.         $dealers $this->serviceService->getRegulationServicesByBrand($brand$locale);
  891.         $minPrice $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroupBrand($workGroup$brand);
  892.         $modelsGroupWorks $this->serviceService->getModelsByGroupWork($workGroup$brand);
  893.         $regulationDealers $this->serviceService->getRegulationDealers($locale);
  894.         $brandDealerId null;
  895.         if ($brand) {
  896.             $brandDealerId $brand->getDealer()->first()->getId();
  897.         }
  898.         foreach ($regulationDealers as $key => $dealer) {
  899.             if ($dealer['id'] == 7) {
  900.                 unset($regulationDealers[$key]);
  901.                 $regulationDealers array_values($regulationDealers);
  902.             }
  903.         }
  904.         $services = [];
  905.         $selectService '';
  906.         foreach ($regulationDealers as $dealer) {
  907.             if (isset($brandDealerId) && $dealer['id'] == $brandDealerId) {
  908.                 $selectService $dealer['title'];
  909.             }
  910.             $services[$dealer['id']] = $dealer['title'];
  911.         }
  912.         return $this->serviceRender('@Portal/Service/service-page-work-group-calc.html.twig', [
  913.             'mainGroup' => false,
  914.             'workGroup' => $workGroup,
  915.             'anotherGroups' => $anotherGroups,
  916.             'brand' => $brand,
  917.             'model' => $model,
  918.             'modelsGroupWorks' => $modelsGroupWorks ?? null,
  919.             'minPrice' => round($minPrice),
  920.             'minWorkTime' => $minWorkTime,
  921.             'dealers' => $dealers,
  922.             'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active'),
  923.             'callMeForm' => $this->CoreFormFactory()
  924.                 ->serviceConsultForm(new Forms(), $services$selectService)
  925.                 ->createView(),
  926.         ]);
  927.     }
  928.     public function servicePageWorkGroupBrandCalc(Request $requestEntityManagerInterface $em\CoreBundle\Model\Service\ServiceWork $serviceWork): Response
  929.     {
  930.         $locale $request->getLocale();
  931.         $requestWorkGroup $request->get('work_group');
  932.         $requestSubGroup $request->get('sub_group');
  933.         $requestBrand $request->get('brand');
  934.         $workGroup $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestSubGroup]);
  935.         if (!$workGroup) {
  936.             throw $this->createNotFoundException('category not exists');
  937.         }
  938.         $mainGroup $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestWorkGroup]);
  939.         $brand $em->getRepository(Brand::class)->findOneBy(['url' => $requestBrand]);
  940.         $minPrice $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroupBrand($workGroup$brand);
  941.         $minWorkTime $em->getRepository(WorkGroupRelation::class)->getJobMinTimeByGroup($workGroup);
  942.         $subGroups $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($mainGroup);
  943.         if ($brand) {
  944.             $subGroups $serviceWork->getSubGroupsByBrand($mainGroup$brand);
  945.         }
  946.         $anotherGroups = [];
  947.         foreach ($subGroups as $group) {
  948.             if ($group->getId() != $workGroup->getId()) {
  949.                 $anotherGroups[] = [
  950.                     'title' => $group->getTitle($locale),
  951.                     'id' => $group->getId(),
  952.                     'price' => $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroup($group)
  953.                 ];
  954.             }
  955.         }
  956.         $brand $em->getRepository(Brand::class)->findOneBy(['url' => $requestBrand]);
  957.         $dealers $this->serviceService->getRegulationServicesByBrand($brand$locale);
  958.         $regulationDealers $this->serviceService->getRegulationDealers($locale);
  959.         $brandDealerId null;
  960.         if ($brand) {
  961.             $brandDealerId $brand->getDealer()->first()->getId();
  962.         }
  963.         foreach ($regulationDealers as $key => $dealer) {
  964.             if ($dealer['id'] == 7) {
  965.                 unset($regulationDealers[$key]);
  966.                 $regulationDealers array_values($regulationDealers);
  967.             }
  968.         }
  969.         $services = [];
  970.         $selectService '';
  971.         foreach ($regulationDealers as $dealer) {
  972.             if (isset($brandDealerId) && $dealer['id'] == $brandDealerId) {
  973.                 $selectService $dealer['title'];
  974.             }
  975.             $services[$dealer['id']] = $dealer['title'];
  976.         }
  977.         $modelsGroupWorks $this->serviceService->getModelsByGroupWork($workGroup$brand);
  978.         return $this->serviceRender('@Portal/Service/service-page-work-group-calc.html.twig', [
  979.             'mainGroup' => $mainGroup,
  980.             'workGroup' => $workGroup,
  981.             'modelsGroupWorks' => $modelsGroupWorks ?? null,
  982.             'brand' => $brand,
  983.             'minPrice' => round($minPrice),
  984.             'minWorkTime' => $minWorkTime,
  985.             'dealers' => $dealers,
  986.             'anotherGroups' => $anotherGroups,
  987.             'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active'),
  988.             'callMeForm' => $this->CoreFormFactory()
  989.                 ->serviceConsultForm(new Forms(), $services$selectService)
  990.                 ->createView(),
  991.         ]);
  992.     }
  993.     public function servicePageWorkGroupModel(Request $requestEntityManagerInterface $em)
  994.     {
  995.         $workGroup $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $request->attributes->get('work_group')]);
  996.         $mainGroup $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $request->attributes->get('work_group')]);
  997.         $brand $em->getRepository(Brand::class)->findOneBy(['url' => $request->attributes->get('brand')]);
  998.         $model $em->getRepository(Model::class)->findOneBy(['url' => $request->attributes->get('model')]);
  999.         $regulationDealers $this->serviceService->getRegulationDealers($request->getLocale());
  1000.         foreach ($regulationDealers as $key => $dealer) {
  1001.             if ($dealer['id'] == 7) {
  1002.                 unset($regulationDealers[$key]);
  1003.                 $regulationDealers array_values($regulationDealers);
  1004.             }
  1005.         }
  1006.         $services = [];
  1007.         $selectService '';
  1008.         foreach ($regulationDealers as $dealer) {
  1009.             if (isset($brandDealerId) && $dealer['id'] == $brandDealerId) {
  1010.                 $selectService $dealer['title'];
  1011.             }
  1012.             $services[$dealer['id']] = $dealer['title'];
  1013.         }
  1014.         $serviceWorks $em->getRepository(ServiceWork::class)
  1015.             ->getWorksByModelBrandAndGroup($model->getUrl(), $brand->getUrl(), $workGroup->getId());
  1016.         $subGroups $em->getRepository(ServiceWorkGroup::class)
  1017.             ->getServiceGroupByParentAndModel($mainGroup->getParent(), $model->getUrl());
  1018.         $anotherGroups = [];
  1019.         foreach ($subGroups as $group) {
  1020.             if ($group->getId() != $workGroup->getId()) {
  1021.                 $anotherGroups[] = [
  1022.                     'title' => $group->getTitle($request->getLocale()),
  1023.                     'id' => $group->getId(),
  1024.                     'price' => $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroup($group)
  1025.                 ];
  1026.             }
  1027.         }
  1028.         $minWorkTime $em->getRepository(WorkGroupRelation::class)->getJobMinTimeByGroup($workGroup);
  1029.         $minPrice $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroupBrand($workGroup$brand);
  1030.         $dealers $this->serviceService->getRegulationServicesByBrand($brand$request->getLocale());
  1031.         return $this->serviceRender('@Portal/Service/service-page-by-model.html.twig', [
  1032.             'serviceWorks' => $serviceWorks,
  1033.             'mainGroup' => $mainGroup,
  1034.             'workGroup' => $workGroup,
  1035.             'model' => $model,
  1036.             'dealers' => $dealers,
  1037.             'minWorkTime' => $minWorkTime,
  1038.             'minPrice' => round($minPrice),
  1039.             'anotherGroups' => $anotherGroups,
  1040.             'brand' => $brand,
  1041.             'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active'),
  1042.             'callMeForm' => $this->CoreFormFactory()
  1043.                 ->serviceConsultForm(new Forms(), $services$selectService)
  1044.                 ->createView(),
  1045.         ]);
  1046.     }
  1047.     public function getBlogsCategoriesAction(Request $requestEntityManagerInterface $em): JsonResponse
  1048.     {
  1049.         $categories $em->getRepository(BlogCategory::class)->findBy(['state' => 1]);
  1050.         return new JsonResponse($this->prepareToSendCategories($categories$request->getLocale()));
  1051.     }
  1052.     public function prepareToSendBlogPosts($posts$localeMediaExtensionVidi $mediaExtensionVidi): array
  1053.     {
  1054.         $jsonReadyPosts = [];
  1055.         /** @var Blog $post */
  1056.         foreach ($posts as $blog) {
  1057.             $jsonReadyPosts[] = [
  1058.                 'id' => $blog->getId(),
  1059.                 'title' => $blog->getTitle($locale),
  1060.                 'views' => $blog->getViews(),
  1061.                 'date' => $blog->getCreated()->format('d.m.Y'),
  1062.                 'image' => $mediaExtensionVidi->getPath($blog->getImagePreview(), 'reference'),
  1063.                 'url' => $this->router->generate('portal_blog_single', ['url' => $blog->getUrl(), '_locale' => $locale]),
  1064.                 'categories' => array_map(function ($category) use ($locale) {
  1065.                     return [
  1066.                         'id' => $category->getId(),
  1067.                         'title' => $category->getTitle($locale),
  1068.                     ];
  1069.                 }, $blog->getCategories()->toArray()),
  1070.             ];
  1071.         }
  1072.         return $jsonReadyPosts;
  1073.     }
  1074.     public function prepareToSendCategories($categories$locale): array
  1075.     {
  1076.         $jsonReadyCategories = [];
  1077.         /** @var BlogCategory $category */
  1078.         foreach ($categories as $category) {
  1079.             $jsonReadyCategories[] = [
  1080.                 'id' => $category->getId(),
  1081.                 'url' => $category->getUrl(),
  1082.                 'title' => $category->getTitle($locale),
  1083.             ];
  1084.         }
  1085.         return $jsonReadyCategories;
  1086.     }
  1087.     public function getBlogPostsAction(Request $requestEntityManagerInterface $emMediaExtensionVidi $mediaExtensionVidi): JsonResponse
  1088.     {
  1089.         $category $request->request->get('category');
  1090.         $search $request->request->get('search');
  1091.         $page $request->request->get('page'1);
  1092.         $data $em->getRepository(Blog::class)->getBlogsByParams($category$search$page15);
  1093.         $data['posts'] = $this->prepareToSendBlogPosts($data['posts'], $request->getLocale(), $mediaExtensionVidi);
  1094.         return new JsonResponse($data);
  1095.     }
  1096. }