<?php
namespace DcSiteBundle\Controller\Yamaha;
use CoreBundle\Component\FormManager;
use CoreBundle\Entity\Forms;
use CoreBundle\Entity\Vehicles\Vehicle;
use CoreBundle\Model\Api\AutoRia\AutoRia;
use CoreBundle\Model\Vehicles\VehicleType;
use DateTime;
use DcSiteBundle\Entity\OperatingManuals;
use DcSiteBundle\Form\Type\YamahaLeasingType;
use DcSiteBundle\Form\Type\YamahaWinterType;
use DcSiteBundle\Model\Form\ServicesOrderForm;
use DcSiteBundle\Services\RentVehicleService;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\OptimisticLockException;
use Exception;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Twig\Error\Error;
use Twig_Error_Loader;
use Twig_Error_Runtime;
use Twig_Error_Syntax;
class ServiceController extends MainController
{
private $rentVehicleService;
public function __construct(RentVehicleService $rentVehicleService)
{
$this->rentVehicleService = $rentVehicleService;
}
public function service(Request $request)
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/service.html.twig');
}
public function boatsService(Request $request)
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/boats-service.html.twig');
}
public function motoService(Request $request)
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/moto-service.html.twig');
}
public function motoServiceGeneral()
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/moto-service-general.html.twig');
}
public function recordingService(Request $request)
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/recording-service.html.twig', [
'serviceForm' => $this->CoreFormFactory()->serviceForm(null, null, null, 1)->createView(),
]);
}
public function gluingProtectiveFilmService(Request $request)
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/gluing-protective-film-service.html.twig', [
'serviceForm' => $this->get('core.form.factory')->servicesOrderForm(ServicesOrderForm::GLUING_FILM, $request->getLocale())->createView(),
]);
}
public function towTruckService(Request $request)
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/tow-truck.html.twig', [
'serviceForm' => $this->get('core.form.factory')->servicesOrderForm(ServicesOrderForm::TOW_TRUCK, $request->getLocale())->createView(),
]);
}
public function warranty(Request $request)
{
return $this->baseYamahaRender('@DcSite/Yamaha/Services/warranty-obligations.html.twig');
}
public function CommissionTechnology(Request $request)
{
$technique = $this->get('core.model.vehicles.repository')->getUsedByDealer($this->getDealer());
$craftedTech = [];
/** @var Vehicle $tech */
foreach ($technique as $tech) {
$techModel = $this->get('core.factory.vehicle')->createByEntity($tech);
if (!$techModel) {
continue;
}
$craftedTech[] = [
"id" => $techModel->getVehicleId(),
"title" => $techModel->getFullName(),
"price" => $techModel->price(),
"year" => $techModel->getYear(),
'mileage' => $techModel->getMileage(),
"link" => $techModel->getUrl(),
"image" => $this->get('sonata.media.twig.extension')->getPath($tech->getPreview(), 'small')
];
}
return $this->baseYamahaRender('@DcSite/Yamaha/CommissionTechnology/catalog.html.twig', [
'tech' => $craftedTech,
'commissionForm' => $this->get('core.form.factory')->commissionTechnologyForm()->createView()
]);
}
public function CommissionModel(Request $request, $url)
{
$vehicle = $this->get('core.factory.vehicle')->createByUrl($url, $this->getDealer());
if (!$vehicle) {
throw new NotFoundHttpException();
}
$forms = new Forms();
$forms->setVehicle($vehicle->getVehicleEntity());
$forms->setDealer($this->getDealer());
return $this->baseYamahaRender('@DcSite/Yamaha/CommissionTechnology/model-card.html.twig', [
'car' => $vehicle,
'buyForm' => $this->get('core.form.factory')->buyForm($forms, $vehicle->getVehicleEntity(), null, null, true)->createView(),
]);
}
/**
* @param Request $request
* @return Response
* @throws Error
* @throws Twig_Error_Loader
* @throws Twig_Error_Runtime
* @throws Twig_Error_Syntax
*/
public function winterStorage(Request $request)
{
$form = $this->get('form.factory')->create(YamahaWinterType::class, null, [
'servicesType' => ServicesOrderForm::WINTER_STORAGE,
'locale' => $request->getLocale(),
'translator' => $this->get('translator'),
'ga_events' => [
'event_category' => 'winter_save',
'event_label' => 'bike',
]
]);
return $this->baseYamahaRender('@DcSite/Yamaha/Service/winter-storage.html.twig', [
'callbackForm' => $form->createView(),
]);
}
/**
* @param Request $request
* @return JsonResponse
* @throws OptimisticLockException
* @throws NonUniqueResultException
*/
public function winterStorageForm(Request $request)
{
$feedbackEntity = new Forms();
$feedbackEntity->setDateCreate(new DateTime());
$feedbackEntity->setType(FormManager::TYPE_SERVICES_ORDER);
$form = $this->get('form.factory')->create(YamahaWinterType::class, $feedbackEntity, [
'servicesType' => ServicesOrderForm::WINTER_STORAGE,
'locale' => $request->getLocale(),
'translator' => $this->get('translator'),
'ga_events' => [
'event_category' => 'winter_save',
'event_label' => 'bike',
]
]);
$data = $request->request->get($form->getName());
$sToken = $token = false;
$captchaData = [];
if (isset($data['captcha'])) {
$captcha = $data['captcha'];
$captchaData = explode('#', $captcha);
}
if ($captchaData && count($captchaData) == 2) {
$key = $captchaData[0];
$token = $captchaData[1];
$sToken = $this->get('session')->get($key);
}
if ((!$sToken || $sToken != $token)) {
return new JsonResponse(['success' => false, 'error' => 'captcha token']);
}
$form->handleRequest($request);
$isValid = $form->isValid();
if (!$isValid) {
foreach ($form->getErrors() as $error) {
if ($error->getOrigin()->getName() == 'captcha' && count($form->getErrors()) == 1) {
$isValid = true;
}
}
}
if ($form->isSubmitted() && $isValid) {
$feedbackEntity->setDealer($this->getDealer());
$this->getDoctrine()->getManager()->persist($feedbackEntity);
$this->getDoctrine()->getManager()->flush();
return new JsonResponse(['success' => true]);
}
return new JsonResponse(['success' => false, 'errors' => $this->getErrorsFromForm($form)]);
}
public function SaveLeasingForm(Request $request)
{
$feedbackEntity = new Forms();
$feedbackEntity->setDateCreate(new DateTime());
$feedbackEntity->setType(FormManager::TYPE_SERVICES_ORDER);
$form = $this->get('form.factory')->create(YamahaLeasingType::class, $feedbackEntity, [
'servicesType' => ServicesOrderForm::LEASING,
'locale' => $request->getLocale(),
'translator' => $this->get('translator'),
]);
$data = $request->request->get($form->getName());
$sToken = $token = false;
$captchaData = [];
if (isset($data['captcha'])) {
$captcha = $data['captcha'];
$captchaData = explode('#', $captcha);
}
if ($captchaData && count($captchaData) == 2) {
$key = $captchaData[0];
$token = $captchaData[1];
$sToken = $this->get('session')->get($key);
}
if ((!$sToken || $sToken != $token)) {
return new JsonResponse(['success' => false, 'error' => 'captcha token']);
}
$form->handleRequest($request);
$isValid = $form->isValid();
if (!$isValid) {
foreach ($form->getErrors() as $error) {
if ($error->getOrigin()->getName() == 'captcha' && count($form->getErrors()) == 1) {
$isValid = true;
}
}
}
if ($form->isSubmitted() && $isValid) {
$feedbackEntity->setDealer($this->getDealer());
$this->getDoctrine()->getManager()->persist($feedbackEntity);
$this->getDoctrine()->getManager()->flush();
return new JsonResponse(['success' => true]);
}
return new JsonResponse(['success' => false, 'errors' => $this->CoreFormFactory()->getErrorsFromForm($form)]);
}
/**
* @param Request $request
* @return Response
* @throws Error
* @throws Twig_Error_Loader
* @throws Twig_Error_Runtime
* @throws Twig_Error_Syntax
* @throws NonUniqueResultException
*/
public function spareParts(Request $request)
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/spare-parts.html.twig', [
'findPartForm' => $this->get('core.form.factory')->findPartForm($this->getDealer())->createView(),
]);
}
public function tradeIn(Request $request)
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/trade-in.html.twig', [
'vehicleType' => AutoRia::getAutoRiaVehicleType(VehicleType::MOTO_TYPE) ,
'formType' => FormManager::TYPE_TRADE_IN_FORM
]);
}
public function tireFitting(Request $request)
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/tire-fitting.html.twig');
}
/**
* Форма оценки качества
*
* @return Response
* @throws Error
* @throws Twig_Error_Loader
* @throws Twig_Error_Runtime
* @throws Twig_Error_Syntax
*/
public function serviceFeedback()
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/service-feedback.html.twig');
}
/**
* Обработка формы оценки качества
*
* @param Request $request
* @return JsonResponse
*/
public function SaveQualityControlForm(Request $request)
{
$Token = $this->get('security.token_storage')->getToken();
$User = $Token && $Token->getUser() != 'anon.' ? $Token->getUser() : null;
$qualityControl = new Forms();
$qualityControl->setUser($User);
$qualityControl->setDomain($request->getHost());
$qualityControl->setDateCreate(new DateTime());
$qualityControl->setType(FormManager::TYPE_QUALITY_CONTROL);
$qualityControl->setPhone($request->request->get('phone'));
$qualityControl->setName($User ? $User->getUsername() : $Token->getUser());
$qualityControl->setDealer($this->getDealer());
$data = [
'comment' => $request->get('comment'),
'phone' => $request->get('phone'),
'recommendQuality' => $request->get('recommendQuality'),
'serviceQuality' => $request->get('serviceQuality'),
'termsQuality' => $request->get('termsQuality'),
'costQuality' => $request->get('costQuality'),
];
$qualityControl->setData(json_encode($data));
try {
$this->getDoctrine()->getManager()->persist($qualityControl);
$this->getDoctrine()->getManager()->flush();
} catch (Exception $e) {
return new JsonResponse(['success' => false, 'message' => $e->getMessage()]);
}
return new JsonResponse(['success' => true]);
}
//see https://ypec-sss.yamaha-motor.co.jp/ypec/ypec/b2c/html5/app/en_GB/parts-search/index.html
public function searchPart(Request $request)
{
$search = $request->request->get('searchString');
$part = $this->getDoctrine()
->getRepository(\DcSiteBundle\Entity\Part::class)
->findOneBy(['dealer' => $this->getDealer(), 'number' => $search]);
if (!$part) {
return new JsonResponse(['success' => false]);
}
return new JsonResponse(
[
'success' => true,
'data' =>
[
'isInStock' => $part->getCount() > 0,
'price' => $part->getPrice(),
'id' => $part->getId(),
'title' => $part->getNameByLocale($request->getLocale()),
]
]
);
}
public function nightServiceAgreement()
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/night-service-agreement.html.twig', [
'dealer' => $this->getDealer()
]);
}
// Yamaha Experience
public function experience()
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/experience.html.twig');
}
public function aboutDay(Request $request)
{
$dealer = $this->getDealer();
$rentRideVehicle = $this->rentVehicleService->getRentRideVehicle($dealer, $request->getLocale());
return $this->baseYamahaRender('@DcSite/Yamaha/Service/about-day.html.twig', [
'rentRideVehicle' => $rentRideVehicle,
'sendQuestionForm' => $this->CoreFormFactory()->sendQuestionForm(null, $this->getDealer(), null, 9)->createView(),
]);
}
public function aboutSchool(Request $request)
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/about-school.html.twig',
[
'serviceOrderFormPopUp' => $this->CoreFormFactory()->servicesOrderForm(ServicesOrderForm::MOTO_SCHOOL, $request->getLocale())->createView(),
]);
}
public function aboutTours()
{
$dealer = $this->getDealer();
$tourRoutes = $this->getDoctrine()->getRepository(\DcSiteBundle\Entity\TourRoutes::class)->findBy(['dealer' => $dealer, 'state' => true]);
return $this->baseYamahaRender('@DcSite/Yamaha/Service/about-tours.html.twig', [
'tourRoutes' => $tourRoutes
]);
}
public function aboutToursSingle($url)
{
$dealer = $this->getDealer();
$tourRoute = $this->getDoctrine()->getRepository(\DcSiteBundle\Entity\TourRoutes::class)->findOneBy(['dealer' => $dealer, 'state' => true, 'url' => $url]);
if (!$tourRoute) {
throw new NotFoundHttpException();
}
return $this->baseYamahaRender('@DcSite/Yamaha/Service/about-tour-single.html.twig', [
'tourRoute' => $tourRoute,
'sendQuestionForm' => $this->CoreFormFactory()->sendQuestionForm(null, $this->getDealer(), null, 10)->createView(),
]);
}
public function rental(Request $request)
{
$dealer = $this->getDealer();
$rentMotoVehicle = $this->rentVehicleService->getRentMotoVehicle($dealer, $request->getLocale());
return $this->baseYamahaRender('@DcSite/Yamaha/Service/yamaha-rental.html.twig', [
'rentVehicle' => $rentMotoVehicle,
'sendQuestionForm' => $this->CoreFormFactory()->sendQuestionForm(null, $this->getDealer(), null, 11)->createView(),
]);
}
public function getAccessoriesUrlByType($vehicle): ?string
{
switch ($vehicle->getGroup()->getId()) {
case 3:
$accessoriesUrl = 'motorcycles';
break;
case 11:
$accessoriesUrl = 'scooters';
break;
case 18:
case 13:
$accessoriesUrl = 'atv-side-by-side';
break;
case 22:
$accessoriesUrl = 'marine';
break;
case 47:
$accessoriesUrl = 'ebikes';
break;
default:
$accessoriesUrl = null;
}
return $accessoriesUrl;
}
public function commissionSales()
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/commission-sales.html.twig', [
'vehicleType' => AutoRia::getAutoRiaVehicleType(VehicleType::MOTO_TYPE) ,
'formType' => FormManager::TYPE_COMMISSION_TECHNOLOGY
]);
}
public function buyOut()
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/buy-out.html.twig', [
'vehicleType' => AutoRia::getAutoRiaVehicleType(VehicleType::MOTO_TYPE) ,
'formType' => FormManager::TYPE_REDEMPTION
]);
}
public function manuals()
{
return $this->baseYamahaRender('@DcSite/Yamaha/Service/manuals.html.twig', [
'manuals' => $this->getDoctrine()->getRepository(OperatingManuals::class)->findBy(
['dealer' => 16, 'state' => 1],
['position' => 'ASC']),
]);
}
}