src/Controller/Vignette/VignetteController.php line 45

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\Vignette;
  4. use App\Controller\BaseController;
  5. use App\Entity\Customer\Vehicle;
  6. use App\Entity\VignetteInvoice\VignetteInvoice;
  7. use App\Manager\BitbagStatic\BlockManager;
  8. use App\Entity\Order\Order;
  9. use App\Entity\Order\OrderItem;
  10. use App\Entity\Vignette\Vignette;
  11. use App\Entity\RoadAssistance\RoadAssistance;
  12. use App\Events\VignetteEvent;
  13. use App\Manager\Cart\CartManager;
  14. use App\Manager\CountryManager;
  15. use App\Manager\Partner\PartnerManager;
  16. use App\Manager\RoadAssistance\RoadAssistanceManager;
  17. use App\Manager\Vignette\VignetteManager;
  18. use App\Model\VignetteAvailabilityModel;
  19. use App\Model\VignetteCategoryModel;
  20. use App\Service\CustomerService;
  21. use App\Service\InvoiceApiService;
  22. use App\Service\InvoiceService;
  23. use App\Service\ShoppingCartService;
  24. use App\Service\StaticPagesBitbagService;
  25. use App\Service\SystemService;
  26. use App\Service\VignetteApiService;
  27. use App\Service\VignetteOrderService;
  28. use App\Validator\VignetteFormValidator;
  29. use DateTime;
  30. use Detection\MobileDetect;
  31. use Symfony\Component\HttpFoundation\Request;
  32. use Symfony\Component\HttpFoundation\Response;
  33. use Symfony\Contracts\Translation\TranslatorInterface;
  34. use function Sentry\captureException;
  35. final class VignetteController extends BaseController
  36. {
  37.     const OP_ID 1;
  38.     const REDIRECT_LOCALE_LIST = array('tr''bg''en''hu');
  39.     public function vignetteAction(Request $requestTranslatorInterface $translator): Response
  40.     {
  41.         $guid $request->get('guid');
  42.         $renewRoVignetteVehicleId $request->get('vehicleId');
  43.         $vehicle null;
  44.         $oldVignette null;
  45.         if (!empty($renewRoVignetteVehicleId)) {
  46.             $vehicle $this->getEntityManager()->getRepository(Vehicle::class)->find($renewRoVignetteVehicleId);
  47.             $customer CustomerService::retrieveCustomerFromShopUser($this->getUser());
  48.             if (!empty($vehicle) && $customer) {
  49.                 $vehicle->setRoVignetteCategory(null);
  50.                 if (empty($customer->getId()) || ($customer->getId() !== $vehicle->getCustomer()->getId())) {
  51.                     $vehicle null;
  52.                 } else {
  53.                     $oldVignette $this->getEntityManager()->getRepository(Vignette::class)->findLatestConfirmedRoVignetteByRegistrationPlate($vehicle->getRegistrationPlate());
  54.                 }
  55.             }
  56.         }
  57.         $desktopView SystemService::checkDesktopView($request);
  58.         $render '@templates/Front/vignette.html.twig';
  59.         if ($this->isMobile && !$desktopView) {
  60.             $render '@templates/Mobile/vignette.html.twig';
  61.         }
  62.         /*$locale = $request->getLocale();
  63.         if (!$this->getUser() && $_ENV['IS_TICKETING'] === 'false') {
  64.             if ($locale !== 'ro') {
  65.                 return $this->redirect('https://www.taxeauto.ro/' . $locale . '/rovinieta');
  66.             }
  67.         }*/
  68.         $request->getSession()->remove('iframeSourceLink');
  69.         $vignetteCategories = (new VignetteCategoryModel($this->getEntityManager()))->getAllCategories();
  70.         return $this->render($render, [
  71.             'vignetteCategories' => $vignetteCategories,
  72.             'countries' => CountryManager::getActiveCountriesForRoVignette($this->getEntityManager()),
  73.             'guid' => $guid,
  74.             'vehicle' => $vehicle,
  75.             'oldValidFrom' => $oldVignette VignetteManager::retrieveRoVignetteOldValidUntil($oldVignette) : null,
  76.             'accordionBlocksAboutVignette' => StaticPagesBitbagService::getAllFilteredBlocks($this->getEntityManager(), BlockManager::BLOCK_ACCORDION_TEXT_VIGNETTE_CODE_PATTERN),
  77.             'vignetteKeywordsForSeo' => StaticPagesBitbagService::getFirstFilteredBlocks($this->getEntityManager(), BlockManager::BLOCK_SEO_META_VIGNETTE_KEYWORD_CODE_PATTERN),
  78.             'vignetteDescriptionForSeo' => StaticPagesBitbagService::getFirstFilteredBlocks($this->getEntityManager(), BlockManager::BLOCK_SEO_META_VIGNETTE_DESCRIPTION_CODE_PATTERN),
  79.             'roadAssistanceTranslations' => RoadAssistanceManager::getTranslationsForUI($translator)
  80.         ]);
  81.     }
  82.     public function removeVignetteFromOrder(Request $request): Response
  83.     {
  84.         $serializer $this->getContainer()->get('serializer');
  85.         $vignetteId $request->get('vignetteId');
  86.         $vignetteRepository $this->getDoctrine()->getRepository(Vignette::class);
  87.         $vignette $vignetteRepository->find($vignetteId);
  88.         $order $vignette->getOrder();
  89.         if ($order->getVignettes() && $order->getVignettes()->count() == 1) {
  90.             $response $serializer->serialize(array('status' => 0'message' => 'Numarul minim de viniete ramase pe comanda trebuie sa fie mai mare ca 1 dupa stergere'), 'json');
  91.             return new Response($response);
  92.         }
  93.         $order->removeVignette($vignette);
  94.         $orderItem $vignette->getOrderItem();
  95.         $this->getEntityManager()->getRepository(OrderItem::class)->deleteOrderItemById($orderItem->getId());
  96.         if ($sms $vignette->getSms()) {
  97.             $smsOrderItem $this->getEntityManager()->getRepository(OrderItem::class)->findOrderItemBySms($sms);
  98.             if ($smsOrderItem) {
  99.                 $this->getEntityManager()->getRepository(OrderItem::class)->deleteOrderItemById($smsOrderItem->getId());
  100.             }
  101.         }
  102.         $this->getDoctrine()->getManager()->flush();
  103.         $order->recalculateItemsTotal();
  104.         $order->recalculateAdjustmentsTotal();
  105.         $this->getDoctrine()->getManager()->flush();
  106.         $response $serializer->serialize(array('status' => 1'message' => 'success'), 'json');
  107.         return new Response($response);
  108.     }
  109.     public function loadVinBlock()
  110.     {
  111.         $template json_encode('error');
  112.         try {
  113.             $template $this->get('twig')
  114.                 ->render('@templates/Front/vignette/_vin_block.html.twig');
  115.             $detect = new MobileDetect();
  116.             if ($detect->isMobile()) {
  117.                 $template $this->get('twig')
  118.                     ->render('@templates/Mobile/vignette/_vin_block.html.twig');
  119.             }
  120.         } catch (\Throwable $exception) {
  121.             captureException($exception);
  122.         }
  123.         return new Response($template);
  124.     }
  125.     public function previewVignettesData(Request $request)
  126.     {
  127.         $response json_encode('fail');
  128.         $serializer $this->getContainer()->get('serializer');
  129.         $params $request->request->all();
  130.         $orderId $params['orderId'];
  131.         if ($orderId == null) {
  132.             $response $serializer->serialize('id comanda gol''json');
  133.             return new Response($response);
  134.         }
  135.         $orderRepository $this->getDoctrine()->getRepository(Order::class);
  136.         $order $orderRepository->find($orderId);
  137.         $customer $order->getCustomer();
  138.         $vignettes $order->getVignettes();
  139.         foreach ($vignettes as $key => $vignette) {
  140.             $validFrom $params['pick_date_op' $key];
  141.             $validFromDateTime = new DateTime($validFrom);
  142.             $vignette->setValidFrom($validFromDateTime);
  143.             $validUntil = new DateTime();
  144.             switch ($vignette->getAvailability()->getName()) {
  145.                 case '1 zi':
  146.                     $validUntil date('Y-m-d 23:59:59',strtotime($validFrom));
  147.                     break;
  148.                 case '7 zile':
  149.                     $validUntil date('Y-m-d 23:59:59',strtotime($validFrom ' + 6 days'));
  150.                     break;
  151.                 case '30 zile':
  152.                     $validUntil date('Y-m-d 23:59:59'strtotime($validFrom ' + 29 days'));
  153.                     break;
  154.                 case '90 zile':
  155.                     $validUntil date('Y-m-d 23:59:59'strtotime($validFrom ' + 89 days'));
  156.                     break;
  157.                 case '12 luni':
  158.                     $validUntil date('Y-m-d 23:59:59'strtotime($validFrom ' + 364 days'));
  159.                     break;
  160.                 default:
  161.                     break;
  162.             }
  163.             $validUntilDateTime = new DateTime($validUntil);
  164.             $vignette->setValidUntil($validUntilDateTime);
  165.         }
  166.         $vignettesApi VignetteApiService::getVignettesForInvoiceApi($vignettes);
  167.         $result InvoiceApiService::previewData($customer$vignettesApi);
  168.         $result json_decode($result);
  169.         if (isset($result->dload_url) && $result->dload_url) {
  170.             $response json_encode($result->dload_url);
  171.         }
  172.         return new Response($response);
  173.     }
  174.     public function getAvailabilitiesByCategoryAction(Request $request): Response
  175.     {
  176.         $id $request->get('id');
  177.         $availabilities null;
  178.         if ($id != null) {
  179.             $availabilities = (new VignetteAvailabilityModel($this->getEntityManager()))
  180.                 ->getAvailabilityForCategoryId($id);
  181.             $serializer $this->getSerializer();
  182.             $availabilities $serializer->serialize($availabilities'json');
  183.         }
  184.         return new Response($availabilities);
  185.     }
  186.     public function vignetteFormSubmitAction(Request $request): Response
  187.     {
  188.         $session $request->getSession();
  189.         $validator = new VignetteFormValidator($this->getEntityManager(), $this->getSerializer());
  190.         $request->request->set('validFrom'str_replace('-''/'$request->get('validFrom')));
  191.         $errors null;
  192.         if ($validator->checkForm($request)) {
  193.             $errors json_encode(array('success' => 1));
  194.         } else {
  195.             if ($session->has('vignetteErrors')) {
  196.                 $errors $session->get('vignetteErrors');
  197.             }
  198.         }
  199.         $session->set('previousUrl''rovinieta');
  200.         return new Response($errors);
  201.     }
  202.     public function vignetteFormSubmitApi(Request $requestTranslatorInterface $translator): Response
  203.     {
  204.         $response null;
  205.         $isRovinietaIframe $request->get('rovinietaIframe');
  206.         $request->request->set('validFrom'str_replace('-''/'$request->get('validFrom')));
  207.         $validRegistrationNumber VignetteOrderService::checkIfVignetteIsAlreadyInCart($request$this->getEntityManager());
  208.         if ($isRovinietaIframe && !$validRegistrationNumber) {
  209.             //clear cart
  210.             if (ShoppingCartService::removeVignetteFromCartByRegistrationPlate($request)){
  211.                 $validRegistrationNumber true;
  212.             }
  213.         }
  214.         $paymentProcessorIsValid CartManager::paymentProcessorCartCheckerByProduct($request->getSession(), CartManager::RO_VIGNETTES_PRODUCT_NAME$this->getEntityManager());
  215.         if ($validRegistrationNumber && $paymentProcessorIsValid) {
  216.             $vignetteEvent = new VignetteEvent();
  217.             $this->dispatcher->addListener('check.vignette', function (VignetteEvent $event) {
  218.                 $event->stopPropagation();
  219.             });
  220.             $this->dispatcher->dispatch($vignetteEventVignetteEvent::CHECK_VIGNETTE);
  221.             if ($vignetteEvent->isPropagationStopped()) {
  222.                 if ($request->request->has('vignetteSubmitForm')
  223.                     && $request->request->get('vignetteSubmitForm') == 1) {
  224.                     $response json_encode(array('success' => true));
  225.                     if (RoadAssistanceManager::isVehicleEligibleForRoadAssistance($request->request->all())
  226.                         && !RoadAssistanceManager::haveAnActiveRoadAssistanceForRegistrationPlate($request$this->getEntityManager())) {
  227.                         $roadAssistanceService $this->getContainer()->get('app.service.road_assistance.road_assistance');
  228.                         $roadAssistanceResponse $roadAssistanceService->storeNewRoadAssistanceInCart(RoadAssistance::FLAG_SOURCE_EXTRA_OPTION);
  229.                         if (!$roadAssistanceResponse['success']) {
  230.                             if ($roadAssistanceResponse['errorCode']) {
  231.                                 $this->addFlash('error'SystemService::retrieveMessage($roadAssistanceResponse['errorCode'], $translator));
  232.                             }
  233.                         }
  234.                     }
  235.                 } elseif ($request->request->has('specialErrors')) {
  236.                     $vignetteApiError $request->request->get('specialErrors');
  237.                     $response json_encode(array('vignetteApiError' => $vignetteApiError));
  238.                 }
  239.             }
  240.         } elseif (!$paymentProcessorIsValid) {
  241.             $vignetteApiError = array('payment_processor_missmatch' => 'Modalitatea de plata pentru produsul actual nu este compatibila cu cea a produselor din cos, va rugam eliminati produsele din cos sau renuntati la acest produs pentru a merge mai departe');
  242.             $apiStatusCode 400;
  243.             $response json_encode(array('vignetteApiError' => $vignetteApiError'apiStatusCode' => $apiStatusCode));
  244.         } else {
  245.             $vignetteApiError = array('alreadyInCart' => 'Already in cart');
  246.             $apiStatusCode 400;
  247.             $response json_encode(array('vignetteApiError' => $vignetteApiError'apiStatusCode' => $apiStatusCode));
  248.         }
  249.         return new Response($response);
  250.     }
  251.     public function getMonth(Request $requestTranslatorInterface $translator): Response
  252.     {
  253.         $monthNumber $request->get('month_number');
  254.         $locale $request->get('locale');
  255.         $monthName null;
  256.         if ($monthNumber != null) {
  257.             $translationMonthKey 'app.ui.month_' $monthNumber;
  258.             $monthName =  $translator->trans($translationMonthKey, [], null$locale);
  259.             $serializer $this->getSerializer();
  260.             $monthName $serializer->serialize($monthName'json');
  261.         }
  262.         return new Response($monthName);
  263.     }
  264.     public function roVignetteIframe(Request $requestTranslatorInterface $translator)
  265.     {
  266.         $partnerService $this->getContainer()->get('app.service.partner.partner');
  267.         $partnerService->verifyToken($requestPartnerManager::CAN_ISSUE_RO_VIGNETTE_INDEX);
  268.         $token['partnerPublicToken'] = $request->get(PartnerManager::SESSION_PARTNER_PUBLIC_TOKEN_NAME);
  269.         $request->getSession()->set('iframeSourceLink'$this->generateUrl('app_shop_ro_vignette_iframe'$token));
  270.         $partner $partnerService->retrievePartner($request->get('partnerPublicToken'));
  271.         $hasAlertSms = ($partner->getRole())->getCanAlertSms();
  272.         $canIssueRoadAssistance = ($partner->getRole())->getCanIssueRoadAssistance();
  273.         $guid $request->get('guid');
  274.         $desktopView SystemService::checkDesktopView($request);
  275.         $render '@templates/Front/vignette/iframe.html.twig';
  276.         if ($this->isMobile && !$desktopView) {
  277.             $render '@templates/Mobile/vignette/iframe.html.twig';
  278.         }
  279.         $vignetteCategories = (new VignetteCategoryModel($this->getEntityManager()))->getAllCategories();
  280.         PartnerManager::checkQRCodeFlow($request);
  281.         return $this->render($render, [
  282.             'vignetteCategories' => $vignetteCategories,
  283.             'countries' => CountryManager::getActiveCountriesForRoVignette($this->getEntityManager()),
  284.             'guid' => $guid,
  285.             'hasAlertSms' => $hasAlertSms,
  286.             'canIssueRoadAssistance' => $canIssueRoadAssistance,
  287.             'accordionBlocksAboutVignette' => StaticPagesBitbagService::getAllFilteredBlocks($this->getEntityManager(), BlockManager::BLOCK_ACCORDION_TEXT_VIGNETTE_CODE_PATTERN),
  288.             'vignetteKeywordsForSeo' => StaticPagesBitbagService::getFirstFilteredBlocks($this->getEntityManager(), BlockManager::BLOCK_SEO_META_VIGNETTE_KEYWORD_CODE_PATTERN),
  289.             'vignetteDescriptionForSeo' => StaticPagesBitbagService::getFirstFilteredBlocks($this->getEntityManager(), BlockManager::BLOCK_SEO_META_VIGNETTE_DESCRIPTION_CODE_PATTERN),
  290.             'roadAssistanceTranslations' => RoadAssistanceManager::getTranslationsForUI($translator),
  291.             'publicToken' => $partner->getPublicToken()
  292.         ]);
  293.     }
  294.     public function showVignettePolicyForPartner(Request $request)
  295.     {
  296.         $response = new Response(json_encode(array('status' => 0)));
  297.         $invoice $this->getDoctrine()->getRepository(VignetteInvoice::class)->findOneBy(array('order' => base64_decode($request->get('order_id'))));
  298.         if ($invoice) {
  299.             $apiInvoiceService = new InvoiceApiService();
  300.             $apiInvoiceService->getPdfByInvoice($invoice);
  301.             if ( $response $apiInvoiceService->getLastResponse()) {
  302.                 $response json_decode($response);
  303.                 if ($response->invoice_id 0) {
  304.                     $url $response->dload_url;
  305.                     $filename 'Factura';
  306.                     InvoiceService::openPdf($url$filename);
  307.                     $response = new Response(json_encode(array('status' => 1)));
  308.                 }
  309.             }
  310.         }
  311.         return $response;
  312.     }
  313. }