<?php
namespace DcSiteBundle\Controller\Volvo;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Component\FormManager;
use CoreBundle\Component\MailManager;
use CoreBundle\Entity\Vehicles\Vehicle;
use CoreBundle\Factory\Vehicle as VehicleFactory;
use CoreBundle\Model\Api\OnlineService\ApiServer1C;
use CoreBundle\Model\Post;
use CoreBundle\Model\Vehicles\Repository;
use CoreBundle\Model\WinnerRate;
use CoreBundle\Services\MediaExtensionVidi;
use DcSiteBundle\Entity\ReplacementCarCondition;
use DcSiteBundle\Entity\SalesContract;
use DcSiteBundle\Entity\TermsMaintenance;
use DcSiteBundle\Services\ActionsService;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use PortalBundle\Model\SeoMetaTag;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\RouterInterface;
use Twig\Environment;
class MainController extends BaseController
{
public function __construct(WinnerRate $winnerRate, 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($winnerRate, $coreFormFactory, $seoMetaTag, $requestStack, $router, $formManager, $em, $apiServer1C, $session, $filesystem, $mediaExtensionVidi, $vehicleRepository, $vehicleFactory, $twig);
}
public function redirectVolvo(): RedirectResponse
{
return $this->redirectToRoute('volvo_homepage', [], 301);
}
public function seveTempForm(Request $request, MailerInterface $mailer): JsonResponse
{
$data = $request->request->all();
$body = '<html>
<body>
<h3>Заказ электрокар Volvo XC40 Rechar</h3>
<p>Имя: ' . $data['name'] . '
<p>Телефон: ' . $data['phone'] . '</p>
<p>Email: ' . $data['email'] . '</p>
</body>
</html>';
$massage = (new Email())
->subject('Заказ электрокар Volvo XC40 Rechar')
->to('sales@airport.volvocarsdealer.com', 'web-leads@vidi.ua')
->from('info@vidi.ua')
->html($body);
$mailer->send($massage);
return $this->json(['success' => true]);
}
public function index(Request $request, ActionsService $actionsService): Response
{
$actionsService->setLocale($request->getLocale());
$groups = [];
$cars = $this->vehicleRepository->getNewByDealer($this->getDealer());
$cars = array_reduce($cars, function ($rows, $row) use ($request, &$groups) {
try {
$row = $this->vehicleFactory->createByEntity($row);
if (empty($row)) {
return $rows;
}
$groupId = $row->getCategory()->getId();
$groups[$groupId] = [
'id' => $groupId,
'name' => $row->getCategory()->getTitle($request->getLocale()),
'inner' => $row->getCategory()->getUrl()
];
$rows[$groupId][] = [
'vehicleId' => $row->getVehicleId(),
'modelName' => $row->getModelName(),
'price' => round($row->price()),
'url' => $row->getUrl(),
'image' => $row->getPreviewPath('reference'),
'image_webp' => $row->getPreviewPathWebp('reference')
];
return $rows;
} catch (Exception $e) {
return $rows;
}
}, []);
return $this->baseVolvoRender('@DcSite/Volvo/Main/index.html.twig', [
'cars' => $cars,
'groups' => $groups,
'carActions' => $actionsService->getActions($this->getDealer(), null, Post::ACTION_TYPE_CAR),
'serviceActions' => $actionsService->getActions($this->getDealer(), null, Post::ACTION_TYPE_SERVICE)
]);
}
public function notFound(Request $request): ?Response
{
$Response = new Response();
$Response->setStatusCode(Response::HTTP_NOT_FOUND);
return $this->baseVolvoRender('@DcSite/Volvo/404.html.twig', ['_locale' => $request->getLocale()], $Response);
}
public function specialOffers(): ?Response
{
$saleActions = $this->em->getRepository(\CoreBundle\Entity\Post::class)->getActionsByDealer($this->getDealer(), Post::ACTION_TYPE_CAR);
$serviceActions = $this->em->getRepository(\CoreBundle\Entity\Post::class)->getActionsByDealer($this->getDealer(), Post::ACTION_TYPE_SERVICE);
return $this->baseVolvoRender('@DcSite/Volvo/Special-offers/special-offers.html.twig', [
'service' => $serviceActions,
'sale' => $saleActions,
]);
}
public function specialOffersSingle(Post $postModel, $url): ?Response
{
$special = $postModel->initByUrl($this->getDealer(), $url);
return $this->baseVolvoRender('@DcSite/Volvo/Special-offers/special-offers-single.html.twig', [
'post' => $special,
]);
}
public function menuInit(Request $request): JsonResponse
{
$cars = $this->vehicleRepository->getNewByDealer($this->getDealer());
$data = [];
$groups = [];
/** @var $car Vehicle */
foreach ($cars as $car) {
$vModel = $this->vehicleFactory->createByEntity($car);
if (!$vModel) {
continue;
}
$carId = $vModel->getVehicleId();
$groupId = $vModel->getCategory()->getId();
$groups[$groupId] = [
'id' => $groupId,
'name' => $vModel->getCategory()->getTitle($request->getLocale()),
'technical' => $vModel->getCategory()->getUrl(),
];
$data[] = [
'id' => $carId,
'groupId' => $groupId,
'position' => $vModel->getPosition(),
'groupName' => $vModel->getCategory()->getTitle($request->getLocale()),
'groupTech' => $vModel->getCategory()->getUrl(),
'name' => $vModel->getFullName(),
'preview' => $this->mediaExtensionVidi->getPath($vModel->getPreview(), 'big'),
'preview_webp' => $this->mediaExtensionVidi->pathWebp($vModel->getPreview(), 'reference'),
'price' => number_format($vModel->price()),
'slogan' => $vModel->getSlogan($request->getLocale()),
'fuelRate' => $vModel->getFuelRateMixed(),
'url' => $vModel->getUrl(),
'link' => $this->router->generate('volvo_card_car', ['url' => $vModel->getUrl()]),
'configuratorPath' => $this->router->generate('volvo_card_car_configuraion', ['url' => $vModel->getUrl()]),
];
}
usort($data, fn($a, $b) => $a['position'] <=> $b['position']);
return $this->json(['success' => true, 'data' => $data, 'groups' => $groups, 'date' => date('d.m.Y')]);
}
public function conditionOfSales(): ?Response
{
$filesByType = $this->em->getRepository(SalesContract::class)->getFilesByTypes($this->getDealer());
return $this->baseVolvoRender('@DcSite/Volvo/condition-of-sales.html.twig', [
'filesByType' => $filesByType,
]);
}
public function termsMaintenance(): ?Response
{
$files = $this->em->getRepository(TermsMaintenance::class)->findBy(['dealer' => $this->getDealer()], ['begin_date' => 'ASC']);
return $this->baseVolvoRender('@DcSite/Volvo/terms-maintenance.html.twig', [
'mainFile' => array_pop($files),
'files' => $files,
'dealer' => $this->getDealer(),
]);
}
public function termsReplacement(): ?Response
{
$files = $this->em->getRepository(ReplacementCarCondition::class)->findBy(['dealer' => $this->getDealer()], ['begin_date' => 'DESC']);
return $this->baseVolvoRender('@DcSite/Volvo/Terms/terms-providing-replacement-car.html.twig', [
'files' => $files,
]);
}
public function volvoTour($sending): ?Response
{
return $this->baseVolvoRender('@DcSite/Volvo/Landing/landing-tour.html.twig', compact('sending'));
}
public function volvoTourSave(Request $request, MailManager $mailManager): RedirectResponse
{
$result = $mailManager->processVolvoTour($request->request->all());
return $this->redirectToRoute('volvo_tour', ['sending' => $result ? 'success' : 'test']);
}
public function volvoTour17($sending): ?Response
{
return $this->baseVolvoRender('@DcSite/Volvo/Landing/landing-tour-17.html.twig', compact('sending'));
}
public function volvoTour17Save(Request $request, MailManager $mailManager): RedirectResponse
{
$result = $mailManager->processVolvoTour($request->request->all());
return $this->redirectToRoute('volvo_tour_17', ['sending' => $result ? 'success' : 'test']);
}
}