src/Controller/Vignette/VignetteController.php line 59

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