<?php
namespace DcSiteBundle\Controller\Toyota;
use AcquiringBundle\Entity\Order;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Component\FormManager;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\Forms;
use CoreBundle\Entity\Model;
use CoreBundle\Entity\ServicePage;
use CoreBundle\Factory\Vehicle as VehicleFactory;
use CoreBundle\Model\Api\OnlineService\ApiServer1C;
use CoreBundle\Model\Vehicles\Repository;
use CoreBundle\Model\ViDiDepartmentModel;
use CoreBundle\Model\ViDiWorkerModel;
use CoreBundle\Services\MediaExtensionVidi;
use DcSiteBundle\Entity\OnlineServiceBooking;
use DcSiteBundle\Entity\Part;
use DcSiteBundle\Model\Form\ServiceForm;
use DcSiteBundle\Services\RentVehicleService;
use DcSiteBundle\Services\ServicePageService;
use DcSiteBundle\Services\VehicleService;
use Doctrine\ORM\EntityManagerInterface;
use MyBundle\Service\OrderService;
use PortalBundle\Model\SeoMetaTag;
use stdClass;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\RouterInterface;
use Twig\Environment;
class ServiceController extends BaseController
{
public function __construct(CoreFormFactory $coreFormFactory, SeoMetaTag $seoMetaTag, RequestStack $requestStack, RouterInterface $router, FormManager $formManager, EntityManagerInterface $em, ApiServer1C $apiServer1C, SessionInterface $session, Filesystem $filesystem, MediaExtensionVidi $mediaExtensionVidi, Repository $vehicleRepository, VehicleFactory $vehicleFactory, Environment $twig)
{
parent::__construct($coreFormFactory, $seoMetaTag, $requestStack, $router, $formManager, $em, $apiServer1C, $session, $filesystem, $mediaExtensionVidi, $vehicleRepository, $vehicleFactory, $twig);
}
public function signIn(Request $request, ServicePageService $servicePageService): ?Response
{
switch ($request->get('serviceType')) {
case 'guarantee':
$defType = ServiceForm::BROKE_SERVICE_TYPE;
break;
case 'body-repair':
$defType = ServiceForm::BODY_SERVICE_TYPE;
break;
default:
$defType = null;
}
$serviceForm = $this->CoreFormFactory()->serviceForm(null, true, $defType);
$services = $servicePageService->getServiceByDealer($this->getDealer());
return $this->baseToyotaRender('@DcSite/Toyota/Service/sign-in.html.twig', [
'serviceForm' => $serviceForm->createView(),
'dealerName' => $this->getDealer()->getBrand()->getName(),
'services' => $services,
]);
}
public function servicePage(Request $request, ServicePageService $servicePageService, ViDiWorkerModel $viDiWorkerModel): ?Response
{
/** @var ServicePage $servicePage */
$servicePage = $this->em->getRepository(ServicePage::class)->findOneBy(['dealer' => $this->getDealer(), 'state' => true, 'url' => $request->get('url')]);
if (!$servicePage) {
throw $this->createNotFoundException('service page not exists');
}
$pageServiceJobs = $servicePageService->getPageServiceJobByPage($this->getDealer());
$pageNearbyService = $servicePageService->getServiceByNearbyService($this->getDealer(), $servicePage);
$facilities = explode(', ', $this->getDealer()->getFacilities());
$workers = $viDiWorkerModel->getAllByDealer($this->getDealer(), $request->getLocale());
$departmentService = array_filter($workers, fn($row) => $row['department']->getId() === 29);
$departmentService = array_values($departmentService);
$departmentService = $departmentService[0] ?? [];
return $this->baseToyotaRender('@DcSite/Toyota/Service/service-page.html.twig', [
'servicePage' => $servicePage,
'pageServiceJobs' => $pageServiceJobs,
'pageNearbyService' => $pageNearbyService,
'dealerFacilities' => $facilities,
'departmentService' => $departmentService,
]);
}
public function express(Request $request): Response
{
//TODO need some documentation
return $this->baseToyotaRender('@DcSite/Toyota/Service/express.html.twig');
}
public function guarantee(Request $request): Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/guarantee.html.twig');
}
public function extendedWarranty(Request $request): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/extended-warranty.html.twig');
}
public function assistance(Request $request): Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/assistance.html.twig');
}
public function tireHotel(Request $request): Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/tire-hotel.html.twig', [
'tireHotelOrder' => $this->CoreFormFactory()->serviceForm()->createView(),
]);
}
public function bodyRepair(): Response
{
$repairPhotoForm = $this->CoreFormFactory()->repairPhotoForm();
return $this->baseToyotaRender('@DcSite/Toyota/Service/body-repair.html.twig', [
'repairPhotoForm' => $repairPhotoForm->createView(),
]);
}
public function spares(): Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/spares.html.twig', [
'spareForm' => $this->CoreFormFactory()->buySparePartsForm($this->getDealer())->createView(),
]);
}
public function loyalty(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/loyalty.html.twig');
}
public function searchPart(Request $request): JsonResponse
{
$search = $request->request->get('searchString');
$dealerId = $request->request->get('dealer');
if ($dealerId) {
$dealer = $this->em->getRepository(Dealer::class)->find($dealerId);
} else {
$dealer = $this->getDealer();
}
$part = $this->em->getRepository(Part::class)
->findOneBy(['dealer' => $dealer, 'number' => $search, 'state' => 1]);
if (!$part) {
return new JsonResponse(['success' => false]);
}
//TODO remove magic numbers
return new JsonResponse(['success' => true, 'data' => [
'isInStock' => $part->getCount() > 0,
'price' => $part->getPrice(),
'id' => $part->getId(),
'title' => $part->getNameByLocale($request->getLocale()),
]]);
}
public function tuning(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/tuning.html.twig',
[
'form' => $this
->CoreFormFactory()
->fbDefQuestionForm(
'Заказ тюнинга',
ViDiDepartmentModel::DEPARTMENT_TYPE_SERVICE,
null,
$this->getDealer())->createView(),
]
);
}
public function accessoriesTest(): Response
{
$userId = $this->getUser()
? $this->getUser()->getId()
: null;
$dealerId = $this->getDealer()->getId();
return $this->baseToyotaRender('@DcSite/Toyota/Service/accessories-test.html.twig',
compact('dealerId', 'userId'));
}
public function regulations(VehicleService $vehicleService): ?Response
{
$models = $vehicleService->getModelsForRegulationsTo($this->getDealer());
return $this->baseToyotaRender('@DcSite/Toyota/Service/regulation-to.html.twig', [
'dealer' => $this->getDealer(),
'models' => $models,
]);
}
public function regulationsModel($model): ?Response
{
$model = $this->em->getRepository(Model::class)->findOneBy(['url' => $model]);
if (!$model) {
throw new NotFoundHttpException();
}
return $this->baseToyotaRender('@DcSite/Toyota/Service/regulation-to-single.html.twig', [
'model' => $model->getId(),
'modelTitle' => $model->getTitle(),
]);
}
public function multiConsultationEnter(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/consultation.html.twig');
}
public function multiConsultationForm(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/consultation-form.html.twig');
}
public function multiConsultationFormOnline(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/consultation-form-online.html.twig');
}
public function multiConsultationTestdriveForm(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/consultation-testdrive-form.html.twig');
}
public function gasEquipment(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/gas-equipment.html.twig');
}
// Oil
public function motorOils(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/motor-oils.html.twig');
}
public function oil5w30(Request $request): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/motor-oils-5w-30.html.twig', [
'spareForm' => $this->CoreFormFactory()->buySparePartsForm($this->getDealer())->createView(),
]);
}
//TODO need some documentation for this numbers
// 1
public function afeOw16(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/motor-oils-afe-ow-16.html.twig');
}
// 2
public function afeOw20(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/motor-oils-afe-ow-20.html.twig');
}
// 3
public function pfeOw30(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/motor-oils-pfe-ow-30.html.twig');
}
// 4
public function fuelEconomy5w30(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/motor-oils-fuel-economy-5w-30.html.twig');
}
// 5
public function premiumFuelEconomy5w30(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/motor-oils-prem-fuel-economy-5w-30.html.twig');
}
// 6
public function sae5w40(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/motor-oils-sae-5w-40.html.twig');
}
// transmission oil
public function transmissionOils(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/transmission-oils.html.twig');
}
// 1
public function sae75w90gl5(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/transmission-oils-sae-75w-90-gl5.html.twig');
}
// 2
public function sae75w90gl4(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/transmission-oils-sae-75w-90-gl4.html.twig');
}
// 3
public function lsdSae85w90(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/transmission-oils-lsd-sae-85w-90.html.twig');
}
// 4
public function lt75w85Sae75w85(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/transmission-oils-lt-75w-85-sae-75w-85.html.twig');
}
// 5
public function hypoidGearLsdSae85w90(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/transmission-oils-hypoid-gear-lsd-sae-85w-90.html.twig');
}
// 6
public function lf75w(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/transmission-oils-lf-75w.html.twig');
}
// 7
public function dexron3(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/transmission-oils-dexron-3.html.twig');
}
// 8
public function t4(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/transmission-oils-t-4.html.twig');
}
// 9
public function ws(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/transmission-oils-ws.html.twig');
}
public function cvtFe(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/transmission-oils-cvt-fe.html.twig');
}
public function mobService(Request $request): Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/mobile-service.html.twig', [
'serviceForm' => $this->CoreFormFactory()->serviceForm()->createView(),
]);
}
public function manuals(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/manuals.html.twig');
}
public function mobilityOptions(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/mobility-options.html.twig');
}
public function nightServiceAgreement(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/night-service-agreement.html.twig', [
'dealer' => $this->getDealer()
]);
}
public function replacementCar(): ?Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Service/replacement-car.html.twig');
}
public function replacementCarSingle(Request $request): Response
{
$booking = null;
if ($request->get('bookingId')) {
$booking = $this->em->getRepository(OnlineServiceBooking::class)->find($request->get('bookingId'));
}
if ($request->get('hash')) {
$order = $this->em->getRepository(Order::class)->findOneBy(['hash' => $request->get('hash')]);
}
$form = $this->CoreFormFactory()
->callMeForm(new Forms(), true);
$form->get('dealer')->setData($this->getDealer());
return $this->baseToyotaRender('@DcSite/Toyota/Service/replacement-car-single.html.twig', [
'booking' => $booking,
'dealer' => $this->getDealer(),
'order' => isset($order) ? $order->getId() : null,
'callMeFormPopUp' => $form->createView()
]);
}
public function orderForRentCar(OrderService $orderService): JsonResponse
{
return $this->json($orderService->createOrderWithoutUserForRentCar($this->getDealer()));
}
public function getAvailableRentCar(RentVehicleService $rentVehicleService): JsonResponse
{
$result = $rentVehicleService->getRentCarFrom1C($this->getDealer());
if (!$result) {
$result = new stdClass();
$result->success = false;
} else {
$result->success = true;
}
return new JsonResponse($result);
}
public function saveReplacementCarForm(Request $request, RentVehicleService $rentVehicleService): JsonResponse
{
$rentVehicleService->saveForm(
$this->getDealer(),
$request->request->all(),
$request->getHost());
return new JsonResponse([
'success' => true,
]);
}
}