<?php
namespace PortalBundle\Controller;
use BmpGatewayBundle\Entity\VehicleTestDrive;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Component\FormManager;
use CoreBundle\Entity\BodyRepairCategory;
use CoreBundle\Entity\Brand;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\Forms;
use CoreBundle\Entity\Model;
use CoreBundle\Entity\Post;
use CoreBundle\Entity\ServicePage;
use CoreBundle\Entity\ServicePageCategory;
use CoreBundle\Entity\Vehicles\InStock;
use CoreBundle\Entity\Vehicles\Vehicle;
use CoreBundle\Entity\ViDiDepartment;
use CoreBundle\Model\Vehicles\Repository;
use CoreBundle\Model\Vehicles\VehicleType;
use CoreBundle\Model\ViDiDepartmentModel;
use CoreBundle\Model\ViDiWorkerModel;
use CoreBundle\Services\MediaExtensionVidi;
use DateTime;
use DcSiteBundle\Entity\ServiceWork;
use DcSiteBundle\Entity\ServiceWorkGroup;
use DcSiteBundle\Entity\ServiceWorkJob;
use DcSiteBundle\Entity\WorkGroupRelation;
use DcSiteBundle\Model\Form\ServiceForm;
use DcSiteBundle\Repository\ServiceWorkGroupRepository;
use Doctrine\ORM\EntityManagerInterface;
use PortalBundle\Entity\Blog;
use PortalBundle\Entity\BlogCategory;
use PortalBundle\Enums\VehicleTypeEnum;
use PortalBundle\Model\SeoMetaTag;
use PortalBundle\Services\MainService;
use PortalBundle\Services\ServiceService;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class ServiceController extends BaseController
{
const BODY_REPAIR_UNIQUE_ID = 'BODY_SERVICE';
private SeoMetaTag $seoMetaTag;
public function __construct(CoreFormFactory $coreFormFactory, RequestStack $requestStack, RouterInterface $router,
Repository $vehicleRepository, ServiceService $serviceService, SeoMetaTag $seoMetaTag)
{
parent::__construct($coreFormFactory, $requestStack, $router, $vehicleRepository, $serviceService);
$this->seoMetaTag = $seoMetaTag;
}
protected function serviceRender($view, array $parameters = [], Response $response = null): Response
{
$request = $this->requestStack->getCurrentRequest();
$subdomain = explode('.', $request->server->get('HTTP_HOST'))[0];
$isSubdomainShop = $subdomain === "shop";
$seoMeta = $this->seoMetaTag->getSeoMeta($request);
$compareCookie = $request->cookies->get('compare');
$countCompare = ($compareCookie) ? count(explode(',', $compareCookie)) : '';
$parameters = array_merge($parameters, [
'backLoginUrl' => $request->getUri(),
'countCompare' => $countCompare,
'seoMeta' => $seoMeta,
'privacyUrl' => $this->router->generate('portal_privacy_policy'),
'isSubdomainShop' => $isSubdomainShop
]);
if (isset($parameters['forms'])) {
$parameters['forms'] = array_merge($parameters['forms'], $this->buildForms());
} else {
$parameters = array_merge($parameters, ['forms' => $this->buildForms()]);
}
$brandsItem = $this->vehicleRepository->getAvailBrands(true, 0, VehicleType::DEFAULT_TYPE);
foreach ($brandsItem as $row) {
if (!$row['url']) {
continue;
}
$brands[] = [
'name' => $row['name'],
'url' => $this->router->generate('portal_new_catalog_b', ['brand' => $row['url'], 'state' => 'new', 'type' => 'car'])
];
}
$vehicleType = new VehicleType();
$parameters = array_merge($parameters, ['globalBrands' => $brands, 'vehicleType' => $vehicleType]);
if (null === $response) {
$response = new Response();
}
$defaultType = VehicleType::getTypeDataById(VehicleType::DEFAULT_TYPE);
$catalogUrl = $this->router->generate('portal_new_catalog_b', ['state' => 'new', 'type' => $defaultType['url'], 'brand' => 'all']);
$parameters['catalogUrl'] = $catalogUrl;
return parent::basePortalRender($view, $parameters, $response);
}
public function to(Request $request, EntityManagerInterface $em)
{
$brands = $em->getRepository(Brand::class)->getBrandsHasRegulation();
return $this->serviceRender('@Portal/Service/to.html.twig', [
'serviceForm' => $this->CoreFormFactory()->serviceForm(null, false, ServiceForm::TO_SERVICE_TYPE)->createView(),
'serviceBrands' => $brands,
]);
}
public function toBrand(Request $request, EntityManagerInterface $em): Response
{
$brandUrl = $request->get('brand');
$brand = $em->getRepository(Brand::class)->getBrandByUrl($brandUrl);
if (!$brand) {
throw new NotFoundHttpException();
}
$models = $em->getRepository(\CoreBundle\Entity\Model::class)->getModelsHasRegulationByBrand($brand->getId());
return $this->serviceRender('@Portal/Service/to.html.twig', [
'serviceForm' => $this->CoreFormFactory()->serviceForm(null, false, ServiceForm::TO_SERVICE_TYPE)->createView(),
'brand' => $brand,
'serviceModels' => $models,
]);
}
public function toModel(Request $request, EntityManagerInterface $em): Response
{
$brandUrl = $request->get('brand');
$modelUrl = $request->get('model');
$brand = $em->getRepository(Brand::class)->getBrandByUrl($brandUrl);
if (!$brand) {
throw new NotFoundHttpException();
}
$model = $em->getRepository(\CoreBundle\Entity\Model::class)->findOneByUrl($modelUrl, $brand);
if (!$model) {
throw new NotFoundHttpException();
}
$models = $em->getRepository(\CoreBundle\Entity\Model::class)->getModelsHasRegulationByBrand($brand->getId());
return $this->serviceRender('@Portal/Service/to.html.twig', [
'serviceForm' => $this->CoreFormFactory()->serviceForm(null, false, ServiceForm::TO_SERVICE_TYPE)->createView(),
'brand' => $brand,
'model' => $model,
'serviceModels' => $models,
]);
}
public function bodyRepair(Request $request, EntityManagerInterface $em): Response
{
$repoCategories = $em->getRepository(BodyRepairCategory::class)->findBy(['state' => true, 'parent_category' => null], ['position' => 'ASC']);
$repairCategory = [];
$dealer = $em->getRepository(Dealer::class)->findOneBy(['unique_id' => self::BODY_REPAIR_UNIQUE_ID]);
$serviceActions = $em->getRepository(Post::class)->getActionsService($dealer, 0, true);
/** @var BodyRepairCategory $category */
foreach ($repoCategories as $category) {
if (!isset($repairCategory[$category->getId()])) {
$repairCategory[$category->getId()] = [
'category' => $category,
'subCategories' => []
];
}
/** @var BodyRepairCategory $childCategory */
foreach ($category->getChildCategory() as $childCategory) {
if (!$childCategory->getState()) {
continue;
}
$repairCategory[$category->getId()]['subCategories'][$childCategory->getId()] = [
'category' => $childCategory,
'position' => $childCategory->getPosition(),
];
}
}
return $this->serviceRender('@Portal/Service/body-repair.html.twig', [
'dealer' => $dealer,
'serviceActions' => $serviceActions,
'repairCategory' => $repairCategory,
'repairPhotoForm' => $this->CoreFormFactory()->repairPhotoForm()->createView(),
]);
}
public function bodyRepairCategory(Request $request, EntityManagerInterface $em): Response
{
$categoryUrl = $request->get('category');
$category = $em->getRepository(BodyRepairCategory::class)->findOneBy(['state' => true, 'url' => $categoryUrl]);
$dealer = $em->getRepository(Dealer::class)->findOneBy(['unique_id' => self::BODY_REPAIR_UNIQUE_ID]);
$serviceActions = $em->getRepository(Post::class)->getActionsService($dealer, 0, true);
if (!$category) {
throw $this->createNotFoundException('category not exists');
}
$subCategories = [];
/** @var BodyRepairCategory $item */
foreach ($category->getChildCategory() as $item) {
if (!$item->getState()) {
continue;
}
$subCategories[] = $item;
}
return $this->serviceRender('@Portal/Service/body-repair-category.html.twig', [
'dealer' => $dealer,
'serviceActions' => $serviceActions,
'category' => $category,
'subCategories' => $subCategories,
'repairPhotoForm' => $this->CoreFormFactory()->repairPhotoForm()->createView(),
]);
}
public function bodyRepairSubCategory(Request $request, EntityManagerInterface $em): Response
{
$categoryUrl = $request->get('category');
$subCategoryUrl = $request->get('subCategory');
$category = $em->getRepository(BodyRepairCategory::class)->findOneBy(['state' => true, 'url' => $categoryUrl]);
if (!$category) {
throw $this->createNotFoundException('category not exists');
}
$subCategory = $em->getRepository(BodyRepairCategory::class)->findOneBy(['state' => true, 'url' => $subCategoryUrl]);
if (!$subCategory) {
throw $this->createNotFoundException('category not exists');
}
$dealer = $em->getRepository(Dealer::class)->findOneBy(['unique_id' => self::BODY_REPAIR_UNIQUE_ID]);
$serviceActions = $em->getRepository(Post::class)->getActionsService($dealer, 0, true);
$brands = $em->getRepository(Brand::class)->getAvailBrandsInstance();
return $this->serviceRender('@Portal/Service/body-repair-sub-category.html.twig', [
'dealer' => $dealer,
'brands' => $brands,
'serviceActions' => $serviceActions,
'subCategory' => $subCategory,
'repairPhotoForm' => $this->CoreFormFactory()->repairPhotoForm()->createView(),
]);
}
public function accessories(EntityManagerInterface $em): Response
{
$service = $em->getRepository(Post::class)->getServiceActions(3);
return $this->serviceRender('@Portal/Service/accessories.html.twig', [
'buyPartsForm' => $this->CoreFormFactory()->buyPartsForm()->createView(),
'serviceActions' => $service,
]);
}
public function parts(Request $request, MainService $mainService): Response
{
$mainService->setLang($request->getLocale());
$brands = $mainService->getBrands([26, 31]);
$routeMap = [
1 => 'ford_service_spares',
2 => 'toyota_service_spares',
4 => 'mazda_service_parts',
5 => 'lexus_service_spare_parts',
6 => 'infiniti_homepage',
8 => 'landrover_service_spare_parts',
10 => 'honda_homepage',
11 => 'peugeot_service_parts',
12 => 'nissan_service_accessories',
15 => 'citroen_service_parts',
16 => 'opel_service_spare_parts',
17 => 'yamaha_service_spare_parts',
23 => 'suzuki_service_parts',
24 => 'subaru_service_spare_parts',
42 => 'jeep_service_parts',
43 => 'mg_service_spare_parts'
];
$filteredBrands = array_values(array_filter(array_map(function ($brand) use ($routeMap) {
if (isset($routeMap[$brand['id']])) {
$brand['parts_route'] = $routeMap[$brand['id']];
return $brand;
}
return null;
}, $brands)));
return $this->serviceRender('@Portal/Service/parts.html.twig', [
'brands' => $filteredBrands,
]);
}
public function tiresHotel(Request $request, EntityManagerInterface $em): Response
{
$repository = $em->getRepository(ServiceWorkGroup::class);
$locale = $request->getLocale();
$mainCategories = $repository
->getTearHotel([
ServiceWorkGroupRepository::UID_TEAR_STORAGE
]);
$additionCategories = $repository->getTireHotelAdditionCategories();
$mainCategories = array_merge($mainCategories, $additionCategories);
$regulationDealers = $this->serviceService->getRegulationDealers($locale);
$dealers = [];
foreach ($regulationDealers as $dealer) {
if ($dealer['id'] != 7) {
$dealers[$dealer['id']] = $dealer['title'];
}
}
return $this->serviceRender('@Portal/Service/tires-hotel.html.twig', [
'mainCategories' => $mainCategories,
'additionCategories' => $additionCategories,
'callMeForm' => $this->CoreFormFactory()
->callMeForm(new Forms(), true)
->createView(),
'tiresHotelForm' => $this->CoreFormFactory()
->tiresHotelForm(new Forms(), $dealers)
->createView()
]);
}
public function carRepair(Request $request, EntityManagerInterface $em, \CoreBundle\Model\Service\ServiceWork $serviceWork): Response
{
$locale = $request->getLocale();
$service = $em->getRepository(Post::class)->getServiceActions(3);
$mainService = $serviceWork->getMainService();
$categories = $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($mainService);
$servicesCategory = [];
foreach ($categories as $category) {
$childCategories = $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($category);
if ($childCategories) {
if (!isset($servicesCategory[$category->getId()])) {
$servicesCategory[$category->getId()] = [
'category' => $category,
'subCategory' => []
];
}
foreach ($childCategories as $childCategory) {
$servicesCategory[$category->getId()]['subCategory'][$childCategory->getId()] = [
'category' => $childCategory,
'position' => $childCategory->getPosition(),
];
}
usort($servicesCategory[$category->getId()]['subCategory'], fn($a, $b) => $a['position'] <=> $b['position']);
}
}
$regulationDealers = $this->serviceService->getRegulationDealers($locale);
//unset Toyota Palmira
foreach ($regulationDealers as $key => $dealer) {
if ($dealer['id'] == 7) {
unset($regulationDealers[$key]);
$regulationDealers = array_values($regulationDealers);
}
}
return $this->serviceRender('@Portal/Service/car-repair.html.twig', [
'serviceForm' => $this->CoreFormFactory()->serviceForm(null, false, ServiceForm::BROKE_SERVICE_TYPE)->createView(),
'serviceActions' => $service,
'servicesCategory' => $servicesCategory,
'regulationDealers' => $regulationDealers,
'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active')
]);
}
public function servicePageContentDealer(Request $request, EntityManagerInterface $em, ViDiWorkerModel $viDiWorkerModel): Response
{
$requestCategory = $request->get('category');
$requestService = $request->get('service');
$requestDealer = $request->get('dealer');
$serviceActions = $em->getRepository(Post::class)->getServiceActions(3);
$category = $em->getRepository(ServicePageCategory::class)->findOneBy(['url' => $requestCategory, 'state' => true]);
if (!$category) {
throw $this->createNotFoundException('category not exists');
}
$service = $em->getRepository(ServicePageCategory::class)->findOneBy(['url' => $requestService]);
if (!$service) {
throw $this->createNotFoundException('service not exists');
}
$dealer = $em->getRepository(Dealer::class)->findOneBy(['url' => $requestDealer]);
if (!$dealer) {
throw $this->createNotFoundException('dealer not exists');
}
$dealerModeOperation = false;
$openTime = preg_replace("/[^0-9]/", '', $dealer->getOpenTime());
$closeTime = preg_replace("/[^0-9]/", '', $dealer->getCloseTime());
($openTime < date("Hi") && $closeTime > date("Hi")) ? $dealerModeOperation = true : $dealerModeOperation = false;
$department = $em->getRepository(ViDiDepartment::class)
->findOneBy(['dealer' => $dealer, 'type' => ViDiDepartmentModel::DEPARTMENT_TYPE_SERVICE]);
$workers = $viDiWorkerModel->getAllByDealer($dealer, $request->getLocale());
foreach ($workers as $key => $value) {
if ($value['department']->getType() != 2) {
unset($workers[$key]);
}
}
$pages = $em->getRepository(ServicePage::class)->getByCategory($service, $dealer);
/** @var ServicePage $page */
$jobIds = array_column($pages, 'id');
$facilities = explode(', ', $dealer->getFacilities());
$serviceWorks = $em->getRepository(ServiceWork::class)->getByJobIds($jobIds, $dealer);
$price_jobs = [];
$hour_jobs = [];
$price_parts = [];
$jobsType = [
'jobs' => [],
'jobsRegulations' => [],
'jobsModels' => []
];
/** @var ServiceWork $serviceWork */
foreach ($serviceWorks as $serviceWork) {
if (!isset($price_jobs[$serviceWork->getId()])) {
$price_jobs[$serviceWork->getId()] = 0;
}
if (!isset($price_parts[$serviceWork->getId()])) {
$price_parts[$serviceWork->getId()] = 0;
}
if (!isset($hour_jobs[$serviceWork->getId()])) {
$hour_jobs[$serviceWork->getId()] = 0;
}
foreach ($serviceWork->getJobs() as $job) {
$price_jobs[$serviceWork->getId()] += $job->getPrice();
$hour_jobs[$serviceWork->getId()] += $job->getJobHours();
}
foreach ($serviceWork->getParts() as $part) {
$price_parts[$serviceWork->getId()] += $part->getCount() * $part->getPart()->getPrice();
}
$serviceJobIds = [];
/** @var ServiceWorkJob $serviceWorkJob */
foreach ($serviceWork->getJobs() as $serviceWorkJob) {
$serviceJobIds[$serviceWorkJob->getJob()->getId()] = $serviceWorkJob->getJob()->getNameByLocale($request->getLocale());
}
$jobIdIntersect = array_intersect(array_keys($serviceJobIds), $jobIds);
if (!$jobIdIntersect) {
continue;
}
$currentJobId = array_shift($jobIdIntersect);
if (is_null($serviceWork->getVariation())) {
if (!isset($jobsType['jobs'][$serviceWork->getId()])) {
$jobsType['jobs'][$serviceWork->getId()] = [
'title' => $serviceWork->getTitle($request->getLocale()),
'service_work' => [],
];
}
$jobsType['jobs'][$serviceWork->getId()]['service_work'] = [
'regulation_id' => $serviceWork->getId(),
'jobs' => $serviceWork->getJobs(),
'parts' => $serviceWork->getParts(),
'hours' => $hour_jobs[$serviceWork->getId()],
'price_service' => round($price_jobs[$serviceWork->getId()] + $price_parts[$serviceWork->getId()])
];
} elseif ($serviceWork->getIsRegulations() == 1) {
$modelId = $serviceWork->getVariation()->getModel()->getId();
$currentJobId = $serviceWork->getMileage();
if (!isset($jobsType['jobsRegulations'][$serviceWork->getMileage()])) {
$jobsType['jobsRegulations'][$serviceWork->getMileage()] = [
'title' => $serviceWork->getMileage(),
'models' => [],
];
}
if (!isset($jobsType['jobsRegulations'][$serviceWork->getMileage()]['models'][$modelId])) {
$jobsType['jobsRegulations'][$serviceWork->getMileage()]['models'][$modelId] = [
'title' => $serviceWork->getVariation()->getModel()->getTitle(),
'model' => $serviceWork->getVariation()->getModel()->getTitle(),
'service_work' => [],
];
}
$jobsType['jobsRegulations'][$serviceWork->getMileage()]['models'][$modelId]['service_work'][$serviceWork->getId()] = [
'variation_id' => $serviceWork->getVariation()->getId(),
'regulation_id' => $serviceWork->getId(),
'hours' => $hour_jobs[$serviceWork->getId()],
'jobs' => $serviceWork->getJobs(),
'parts' => $serviceWork->getParts(),
'model' => $serviceWork->getVariation()->getModel()->getTitle(),
'year' => $serviceWork->getVariation()->getYearFrom() . '-' . $serviceWork->getVariation()->getYearTo(),
'engine' => $serviceWork->getVariation()->getFuelType()->getValue($request->getLocale()) . ' ' . number_format($serviceWork->getVariation()->getEngineVolume() / 1000, 1, '.', ''),
'transmission' => $serviceWork->getVariation()->getTransmissionType() . ' ' . $serviceWork->getVariation()->getTransmissionStepCount(),
'driveUnit' => $serviceWork->getVariation()->getDriveUnit()->getShort($request->getLocale()),
'price_service' => round($price_jobs[$serviceWork->getId()] + $price_parts[$serviceWork->getId()])
];
} else {
$Variation = $serviceWork->getVariation();
$modelId = $Variation->getModel()->getId();
if (!isset($jobsType['jobsModels'][$currentJobId])) {
$jobsType['jobsModels'][$currentJobId] = [
'title' => $serviceWork->getTitle($request->getLocale()),
'models' => [],
];
}
if (!isset($jobsType['jobsModels'][$currentJobId]['models'][$modelId])) {
$jobsType['jobsModels'][$currentJobId]['models'][$modelId] = [
'title' => $Variation->getModel()->getTitle(),
'service_work' => [],
];
}
$service_work = [
'variation_id' => $Variation->getId(),
'regulation_id' => $serviceWork->getId(),
'hours' => $hour_jobs[$serviceWork->getId()],
'jobs' => $serviceWork->getJobs(),
'parts' => $serviceWork->getParts(),
'model' => $Variation->getModel()->getTitle(),
'year' => $Variation->getYearFrom() . '-' . $Variation->getYearTo(),
'engine' => '',
'transmission' => $Variation->getTransmissionType() . ' ' . $Variation->getTransmissionStepCount(),
'driveUnit' => $Variation->getDriveUnit() ? $Variation->getDriveUnit()->getId() : null,
'price_service' => round($price_jobs[$serviceWork->getId()] + $price_parts[$serviceWork->getId()])
];
if (!is_null($Variation->getFuelType())) {
$service_work['engine'] = $Variation->getFuelType()->getValue($request->getLocale()) . ' ' . number_format($Variation->getEngineVolume() / 1000, 1, '.', '');
}
$jobsType['jobsModels'][$currentJobId]['models'][$modelId]['service_work'][$serviceWork->getId()] = $service_work;
}
}
return $this->serviceRender('@Portal/Service/service-page-content-dealer.html.twig', [
'serviceForm' => $this->CoreFormFactory()->serviceForm(null, false, ServiceForm::BROKE_SERVICE_TYPE)->createView(),
'serviceActions' => $serviceActions,
'category' => $category,
'service' => $service,
'dealerModeOperation' => $dealerModeOperation,
'dealerFacilities' => $facilities,
'dealer' => $dealer,
'department' => $department,
'workers' => $workers,
'jobsType' => $jobsType,
]);
}
public static $parts;
public function savePopupFormBodyRepair(Request $request, EntityManagerInterface $em): JsonResponse
{
$dealer = $em->getRepository(Dealer::class)->find(['id' => 41]);
$popupForm = new Forms();
$popupForm->setDateCreate(new DateTime());
$popupForm->setType(FormManager::TYPE_REPAIR_CALC);
$popupForm->setName($request->request->get('name'));
$popupForm->setPhone($request->request->get('phone'));
$popupForm->setUtm($request->request->get('utm'));
$popupForm->setDomain($request->getHost());
$params = json_encode([
'comment' => $request->request->get('comment'),
]);
$popupForm->setData($params);
$popupForm->setDealer($dealer);
$em->persist($popupForm);
$em->flush();
return new JsonResponse(['success' => true]);
}
public function initRepairCalc(Request $request, TranslatorInterface $translator): JsonResponse
{
return new JsonResponse([
1 => [
'title' => $translator->trans('service.body_repair.calc.front_bumper', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
2 => [
'title' => $translator->trans('service.body_repair.calc.front_left_fender', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
3 => [
'title' => $translator->trans('service.body_repair.calc.front_right_fender', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
4 => [
'title' => $translator->trans('service.body_repair.calc.hood', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
5 => [
'title' => $translator->trans('service.body_repair.calc.left_front_door', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
6 => [
'title' => $translator->trans('service.body_repair.calc.left_back_door', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
7 => [
'title' => $translator->trans('service.body_repair.calc.roof', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
8 => [
'title' => $translator->trans('service.body_repair.calc.right_front_door', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
9 => [
'title' => $translator->trans('service.body_repair.calc.right_back_door', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
10 => [
'title' => $translator->trans('service.body_repair.calc.trunk', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
11 => [
'title' => $translator->trans('service.body_repair.calc.back_left_fender', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
12 => [
'title' => $translator->trans('service.body_repair.calc.back_right_fender', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
13 => [
'title' => $translator->trans('service.body_repair.calc.back_bumper', [], 'portal_base'),
'price' => [
'sedan' => 4900,
'suv' => 5900,
'pickup' => 5400,
]
],
]);
}
public function saveLeadAccessory(Request $request, FormManager $formManager, EntityManagerInterface $em): JsonResponse
{
if (!$dealer = $request->get('buy_parts')['dealer']) {
return $this->json(['success' => false]);
}
$dealer = $em->getRepository(Dealer::class)->find($dealer);
if (!$dealer) {
return $this->json(['success' => false]);
}
return $formManager->saveBuyPartsForm($request, $dealer);
}
public function serviceInit(Request $request, MediaExtensionVidi $mediaExtensionVidi): JsonResponse
{
$brands = $this->vehicleRepository->getAvailBrandsInstance($request->getLocale());
foreach ($brands as &$brand) {
$brand['image'] = $mediaExtensionVidi->getPath($brand['image'], 'menu');
}
return new JsonResponse(['success' => true, 'brands' => $brands]);
}
public function serviceFormSave(Request $request, FormManager $formManager): JsonResponse
{
return $formManager->saveServiceForm($request);
}
public function accessoriesTest(Request $request): Response
{
return $this->serviceRender('@Portal/Service/accessories-test.html.twig');
}
public function byDealer(EntityManagerInterface $em): Response
{
return $this->serviceRender('@Portal/Service/by-dealer.html.twig', [
'serviceActions' => $em->getRepository(Post::class)->getServiceActions(3),
]);
}
public function byDealer2(EntityManagerInterface $em): Response
{
return $this->serviceRender('@Portal/Service/by-dealer2.html.twig', [
'serviceActions' => $em->getRepository(Post::class)->getServiceActions(3),
]);
}
public function byDealer3(EntityManagerInterface $em): Response
{
return $this->serviceRender('@Portal/Service/by-dealer3.html.twig', [
'serviceActions' => $em->getRepository(Post::class)->getServiceActions(3),
]);
}
public function byDealer4(EntityManagerInterface $em): Response
{
return $this->serviceRender('@Portal/Service/by-dealer4.html.twig', [
'serviceActions' => $em->getRepository(Post::class)->getServiceActions(3),
]);
}
public function multiConsultationForm(): Response
{
return $this->serviceRender('@Portal/Service/consultation-form.html.twig');
}
public function multiConsultationFormOnline(): Response
{
return $this->serviceRender('@Portal/Service/consultation-form-online.html.twig');
}
public function multiConsultationTestdriveForm(Request $request, EntityManagerInterface $em, $url = null)
{
$dealerId = null;
$carId = null;
if ($url) {
/** @var Vehicle $vehicle */
if ($request->get('type') == VehicleTypeEnum::IN_STOCK) {
$vehicleInStock = $em->getRepository(InStock::class)
->findOneBy(['url' => $url]);
$vehicle = $vehicleInStock && $vehicleInStock->getVehicleItem() ? $vehicleInStock->getVehicleItem()->getVehicle() : null;
} else {
$vehicle = $em->getRepository(Vehicle::class)->findOneBy(['url' => $url]);
}
if (!$vehicle || !$vehicle->getTestDrive()) {
return $this->redirectToRoute('portal_service_testdrive_form');
}
$tdVehicle = $em->getRepository(VehicleTestDrive::class)->findOneBy(['vehicle' => $vehicle, 'state' => 1]);
if (!$tdVehicle) {
return $this->redirectToRoute('portal_service_testdrive_form');
}
$dealerId = $vehicle->getDealer()->getId();
$carId = $tdVehicle->getId();
}
return $this->serviceRender('@Portal/Service/consultation-testdrive-form.html.twig', ['dealerId' => $dealerId, 'carId' => $carId]);
}
public function nightBookingService(): Response
{
return $this->serviceRender('@Portal/Service/night-booking.html.twig');
}
public function nightServiceAgreement(Request $request, EntityManagerInterface $em): Response
{
$dealerUrl = $request->get('dealerUrl');
$dealer = $em->getRepository(Dealer::class)->findOneBy(['url' => $dealerUrl]);
return $this->serviceRender('@Portal/Service/night-service-agreement.html.twig', [
'dealer' => $dealer
]);
}
public function service(Request $request, EntityManagerInterface $em, \CoreBundle\Model\Service\ServiceWork $serviceWork): Response
{
$locale = $request->getLocale();
$regulationBrands = $em->getRepository(Brand::class)->getBrandsHasRegulation();
$regulationDealers = $this->serviceService->getRegulationDealers($locale);
$technicalDiscussion = $em->getRepository(ServiceWorkGroup::class)->getHeirMainGroup('eb2b75ea-4a5d-11ef-ac14-005056a799b6', 5);
$autoRepair = $em->getRepository(ServiceWorkGroup::class)->getHeirMainGroup('c5b44242-3390-11ef-818b-005056a7775d', 5);
$bodyRepair = $em->getRepository(ServiceWorkGroup::class)->getHeirMainGroup('c5b44243-3390-11ef-818b-005056a7775d', 5);
//unset Toyota Palmira
foreach ($regulationDealers as $key => $dealer) {
if ($dealer['id'] == 7) {
unset($regulationDealers[$key]);
$regulationDealers = array_values($regulationDealers);
}
}
$generalGroup = $serviceWork->getMainService();
$subGeneralGroups = $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($generalGroup);
$maintenanceGroup = $em->getRepository(ServiceWorkGroup::class)->find(7294);
$subMaintenanceGroups = $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($maintenanceGroup);
$subGeneralGroups = array_filter($subGeneralGroups, fn($group) => $group->getId() !== 7294);
usort($subGeneralGroups, fn($a, $b) => $a->getPosition() <=> $b->getPosition());
$dealerId = null;
if ($request->query->get('dealerId')) {
$dealerId = $request->query->get('dealerId');
}
return $this->serviceRender('@Portal/Service/service.html.twig', [
'regulationBrands' => $regulationBrands,
'regulationDealers' => $regulationDealers,
'technicalDiscussion' => $technicalDiscussion,
'subGeneralGroups' => $subGeneralGroups,
'maintenanceGroup' => $maintenanceGroup,
'subMaintenanceGroups' => $subMaintenanceGroups,
'autoRepair' => $autoRepair,
'bodyRepair' => $bodyRepair,
'isModalForm' => ($request->get('_route') == 'portal_service_active'),
'dealerId' => $dealerId
]);
}
public function servicePageWorkGroupBrand(Request $request, EntityManagerInterface $em, \CoreBundle\Model\Service\ServiceWork $serviceWork,
MediaExtensionVidi $mediaExtensionVidi): Response
{
$locale = $request->getLocale();
$requestWorkGroup = $request->get('work_group');
$requestBrand = $request->get('brand');
$workGroup = $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestWorkGroup]);
if (!$workGroup) {
throw $this->createNotFoundException('category not exists');
}
$brand = $em->getRepository(Brand::class)->findOneBy(['url' => $requestBrand]);
$models = $serviceWork->getModelsByGroupAndBrand($workGroup, $brand);
$services = $serviceWork->getSubGroupsByBrand($workGroup, $brand);
$dealers = $this->serviceService->getRegulationServicesByBrand($brand, $locale);
$modifyModelsData = [];
foreach ($models as $model) {
$modifyModelsData[] = [
'id' => $model->getId(),
'title' => $model->getBrand()->getName() . ' ' . $model->getTitle(),
'url' => $model->getUrl(),
'img' => $mediaExtensionVidi->getPath($model->getImage(), 'reference')
];
}
$minPrice = $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroupBrand($workGroup, $brand);
$minWorkTime = $em->getRepository(WorkGroupRelation::class)->getJobMinTimeByGroup($workGroup);
return $this->serviceRender('@Portal/Service/work-group-brand-service.html.twig', [
'workGroup' => $workGroup,
'services' => $services,
'models' => $modifyModelsData,
'minPrice' => round($minPrice),
'minWorkTime' => $minWorkTime,
'brand' => $brand,
'dealers' => $dealers,
'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active')
]);
}
public function servicePageSubWorkGroup(Request $request, EntityManagerInterface $em, \CoreBundle\Model\Service\ServiceWork $serviceWork): Response
{
$requestWorkGroup = $request->get('work_group');
$requestSubWorkGroup = $request->get('sub_group');
$workGroup = $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestWorkGroup]);
$subWorkGroup = $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestSubWorkGroup]);
$minPrice = $em->getRepository(WorkGroupRelation::class)->getJobMInPriceByGroup($subWorkGroup);
$minWorkTime = $em->getRepository(WorkGroupRelation::class)->getJobMinTimeByGroup($subWorkGroup);
if (!$workGroup) {
throw $this->createNotFoundException('category not exists');
}
$mainGroup = $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestWorkGroup]);
$subGroups = $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($mainGroup);
$anotherGroups = [];
foreach ($subGroups as $group) {
if ($group->getId() != $workGroup->getId()) {
$anotherGroups[] = [
'title' => $group->getTitle($request->getLocale()),
'id' => $group->getId(),
'price' => $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroup($group)
];
}
}
$regulationDealers = $this->serviceService->getRegulationDealers($request->getLocale());
$brandDealerId = null;
$requestBrand = $request->get('brand');
$brand = $em->getRepository(Brand::class)->findOneBy(['url' => $requestBrand]);
if ($brand) {
$brandDealerId = $brand->getDealer()->first()->getId();
}
$brands = $serviceWork->getGroupBrands($workGroup);
foreach ($regulationDealers as $key => $dealer) {
if ($dealer['id'] == 7) {
unset($regulationDealers[$key]);
$regulationDealers = array_values($regulationDealers);
}
}
$services = [];
$selectService = '';
foreach ($regulationDealers as $dealer) {
if (isset($brandDealerId) && $dealer['id'] == $brandDealerId) {
$selectService = $dealer['title'];
}
$services[$dealer['id']] = $dealer['title'];
}
return $this->serviceRender('@Portal/Service/sub-work-group-page.html.twig', [
'workGroup' => $workGroup,
'anotherGroups' => $anotherGroups,
'subWorkGroup' => $subWorkGroup,
'minPrice' => $minPrice,
'brands' => $brands,
'minWorkTime' => $minWorkTime,
'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active'),
'callMeForm' => $this->CoreFormFactory()
->serviceConsultForm(new Forms(), $services, $selectService)
->createView(),
]);
}
public function servicePageWorkGroup(Request $request, EntityManagerInterface $em, \CoreBundle\Model\Service\ServiceWork $serviceWork)
{
$requestWorkGroup = $request->get('work_group');
$workGroup = $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestWorkGroup]);
if (!$workGroup) {
throw $this->createNotFoundException('category not exists');
}
$subWorkGroups = $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($workGroup);
$avgPrice = $em->getRepository(WorkGroupRelation::class)->getJobAvgPriceByGroup($workGroup);
$avgWorkTime = $em->getRepository(WorkGroupRelation::class)->getJobAvgTimeByGroup($workGroup);
$brands = $serviceWork->getGroupBrands($workGroup);
return $this->serviceRender('@Portal/Service/work-group-page.html.twig', [
'workGroup' => $workGroup,
'brands' => $brands,
'avgPrice' => round($avgPrice),
'avgWorkTime' => $avgWorkTime,
'services' => $subWorkGroups,
'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active')
]);
}
public function servicePageWorkGroupModelCalc(Request $request, EntityManagerInterface $em,
\CoreBundle\Model\Service\ServiceWork $serviceWork)
{
$locale = $request->getLocale();
$requestWorkGroup = $request->get('work_group');
$requestBrand = $request->get('brand');
$requestModel = $request->get('model');
$workGroup = $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestWorkGroup]);
if (!$workGroup) {
throw $this->createNotFoundException('category not exists');
}
$brand = $em->getRepository(Brand::class)->findOneBy(['url' => $requestBrand]);
$mainGroup = $serviceWork->getMainService();
$subGroups = $serviceWork->getSubGroupsByBrand($mainGroup, $brand);
$anotherGroups = [];
foreach ($subGroups as $group) {
if ($group->getId() != $group->getId()) {
$anotherGroups[] = [
'title' => $group->getTitle($locale),
'id' => $group->getId(),
'price' => $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroup($group)
];
}
}
$minWorkTime = $em->getRepository(WorkGroupRelation::class)->getJobMinTimeByGroup($workGroup);
$model = $em->getRepository(\CoreBundle\Entity\Model::class)->findOneBy(['url' => $requestModel]);
$brand = $em->getRepository(Brand::class)->findOneBy(['url' => $requestBrand]);
$dealers = $this->serviceService->getRegulationServicesByBrand($brand, $locale);
$minPrice = $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroupBrand($workGroup, $brand);
$modelsGroupWorks = $this->serviceService->getModelsByGroupWork($workGroup, $brand);
$regulationDealers = $this->serviceService->getRegulationDealers($locale);
$brandDealerId = null;
if ($brand) {
$brandDealerId = $brand->getDealer()->first()->getId();
}
foreach ($regulationDealers as $key => $dealer) {
if ($dealer['id'] == 7) {
unset($regulationDealers[$key]);
$regulationDealers = array_values($regulationDealers);
}
}
$services = [];
$selectService = '';
foreach ($regulationDealers as $dealer) {
if (isset($brandDealerId) && $dealer['id'] == $brandDealerId) {
$selectService = $dealer['title'];
}
$services[$dealer['id']] = $dealer['title'];
}
return $this->serviceRender('@Portal/Service/service-page-work-group-calc.html.twig', [
'mainGroup' => false,
'workGroup' => $workGroup,
'anotherGroups' => $anotherGroups,
'brand' => $brand,
'model' => $model,
'modelsGroupWorks' => $modelsGroupWorks ?? null,
'minPrice' => round($minPrice),
'minWorkTime' => $minWorkTime,
'dealers' => $dealers,
'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active'),
'callMeForm' => $this->CoreFormFactory()
->serviceConsultForm(new Forms(), $services, $selectService)
->createView(),
]);
}
public function servicePageWorkGroupBrandCalc(Request $request, EntityManagerInterface $em, \CoreBundle\Model\Service\ServiceWork $serviceWork): Response
{
$locale = $request->getLocale();
$requestWorkGroup = $request->get('work_group');
$requestSubGroup = $request->get('sub_group');
$requestBrand = $request->get('brand');
$workGroup = $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestSubGroup]);
if (!$workGroup) {
throw $this->createNotFoundException('category not exists');
}
$mainGroup = $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $requestWorkGroup]);
$brand = $em->getRepository(Brand::class)->findOneBy(['url' => $requestBrand]);
$minPrice = $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroupBrand($workGroup, $brand);
$minWorkTime = $em->getRepository(WorkGroupRelation::class)->getJobMinTimeByGroup($workGroup);
$subGroups = $em->getRepository(ServiceWorkGroup::class)->getServiceGroupByParent($mainGroup);
if ($brand) {
$subGroups = $serviceWork->getSubGroupsByBrand($mainGroup, $brand);
}
$anotherGroups = [];
foreach ($subGroups as $group) {
if ($group->getId() != $workGroup->getId()) {
$anotherGroups[] = [
'title' => $group->getTitle($locale),
'id' => $group->getId(),
'price' => $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroup($group)
];
}
}
$brand = $em->getRepository(Brand::class)->findOneBy(['url' => $requestBrand]);
$dealers = $this->serviceService->getRegulationServicesByBrand($brand, $locale);
$regulationDealers = $this->serviceService->getRegulationDealers($locale);
$brandDealerId = null;
if ($brand) {
$brandDealerId = $brand->getDealer()->first()->getId();
}
foreach ($regulationDealers as $key => $dealer) {
if ($dealer['id'] == 7) {
unset($regulationDealers[$key]);
$regulationDealers = array_values($regulationDealers);
}
}
$services = [];
$selectService = '';
foreach ($regulationDealers as $dealer) {
if (isset($brandDealerId) && $dealer['id'] == $brandDealerId) {
$selectService = $dealer['title'];
}
$services[$dealer['id']] = $dealer['title'];
}
$modelsGroupWorks = $this->serviceService->getModelsByGroupWork($workGroup, $brand);
return $this->serviceRender('@Portal/Service/service-page-work-group-calc.html.twig', [
'mainGroup' => $mainGroup,
'workGroup' => $workGroup,
'modelsGroupWorks' => $modelsGroupWorks ?? null,
'brand' => $brand,
'minPrice' => round($minPrice),
'minWorkTime' => $minWorkTime,
'dealers' => $dealers,
'anotherGroups' => $anotherGroups,
'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active'),
'callMeForm' => $this->CoreFormFactory()
->serviceConsultForm(new Forms(), $services, $selectService)
->createView(),
]);
}
public function servicePageWorkGroupModel(Request $request, EntityManagerInterface $em)
{
$workGroup = $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $request->attributes->get('work_group')]);
$mainGroup = $em->getRepository(ServiceWorkGroup::class)->findOneBy(['url' => $request->attributes->get('work_group')]);
$brand = $em->getRepository(Brand::class)->findOneBy(['url' => $request->attributes->get('brand')]);
$model = $em->getRepository(Model::class)->findOneBy(['url' => $request->attributes->get('model')]);
$regulationDealers = $this->serviceService->getRegulationDealers($request->getLocale());
foreach ($regulationDealers as $key => $dealer) {
if ($dealer['id'] == 7) {
unset($regulationDealers[$key]);
$regulationDealers = array_values($regulationDealers);
}
}
$services = [];
$selectService = '';
foreach ($regulationDealers as $dealer) {
if (isset($brandDealerId) && $dealer['id'] == $brandDealerId) {
$selectService = $dealer['title'];
}
$services[$dealer['id']] = $dealer['title'];
}
$serviceWorks = $em->getRepository(ServiceWork::class)
->getWorksByModelBrandAndGroup($model->getUrl(), $brand->getUrl(), $workGroup->getId());
$subGroups = $em->getRepository(ServiceWorkGroup::class)
->getServiceGroupByParentAndModel($mainGroup->getParent(), $model->getUrl());
$anotherGroups = [];
foreach ($subGroups as $group) {
if ($group->getId() != $workGroup->getId()) {
$anotherGroups[] = [
'title' => $group->getTitle($request->getLocale()),
'id' => $group->getId(),
'price' => $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroup($group)
];
}
}
$minWorkTime = $em->getRepository(WorkGroupRelation::class)->getJobMinTimeByGroup($workGroup);
$minPrice = $em->getRepository(WorkGroupRelation::class)->getJobMinPriceByGroupBrand($workGroup, $brand);
$dealers = $this->serviceService->getRegulationServicesByBrand($brand, $request->getLocale());
return $this->serviceRender('@Portal/Service/service-page-by-model.html.twig', [
'serviceWorks' => $serviceWorks,
'mainGroup' => $mainGroup,
'workGroup' => $workGroup,
'model' => $model,
'dealers' => $dealers,
'minWorkTime' => $minWorkTime,
'minPrice' => round($minPrice),
'anotherGroups' => $anotherGroups,
'brand' => $brand,
'isModalForm' => ($request->attributes->get('_route') == 'portal_service_active'),
'callMeForm' => $this->CoreFormFactory()
->serviceConsultForm(new Forms(), $services, $selectService)
->createView(),
]);
}
public function getBlogsCategoriesAction(Request $request, EntityManagerInterface $em): JsonResponse
{
$categories = $em->getRepository(BlogCategory::class)->findBy(['state' => 1]);
return new JsonResponse($this->prepareToSendCategories($categories, $request->getLocale()));
}
public function prepareToSendBlogPosts($posts, $locale, MediaExtensionVidi $mediaExtensionVidi): array
{
$jsonReadyPosts = [];
/** @var Blog $post */
foreach ($posts as $blog) {
$jsonReadyPosts[] = [
'id' => $blog->getId(),
'title' => $blog->getTitle($locale),
'views' => $blog->getViews(),
'date' => $blog->getCreated()->format('d.m.Y'),
'image' => $mediaExtensionVidi->getPath($blog->getImagePreview(), 'reference'),
'url' => $this->router->generate('portal_blog_single', ['url' => $blog->getUrl(), '_locale' => $locale]),
'categories' => array_map(function ($category) use ($locale) {
return [
'id' => $category->getId(),
'title' => $category->getTitle($locale),
];
}, $blog->getCategories()->toArray()),
];
}
return $jsonReadyPosts;
}
public function prepareToSendCategories($categories, $locale): array
{
$jsonReadyCategories = [];
/** @var BlogCategory $category */
foreach ($categories as $category) {
$jsonReadyCategories[] = [
'id' => $category->getId(),
'url' => $category->getUrl(),
'title' => $category->getTitle($locale),
];
}
return $jsonReadyCategories;
}
public function getBlogPostsAction(Request $request, EntityManagerInterface $em, MediaExtensionVidi $mediaExtensionVidi): JsonResponse
{
$category = $request->request->get('category');
$search = $request->request->get('search');
$page = $request->request->get('page', 1);
$data = $em->getRepository(Blog::class)->getBlogsByParams($category, $search, $page, 15);
$data['posts'] = $this->prepareToSendBlogPosts($data['posts'], $request->getLocale(), $mediaExtensionVidi);
return new JsonResponse($data);
}
}