src/Controller/Front/Order/OrderController.php line 214

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front\Order;
  3. use App\Config\Coupon;
  4. use App\Config\Currency;
  5. use App\Config\InvoiceSchema;
  6. use App\Config\Pages;
  7. use App\Controller\Front\UserZone\SecurityUtilsController;
  8. use App\Entity\Order\Orders;
  9. use App\Entity\Page\Page;
  10. use App\Message\OrderInvoice;
  11. use App\Message\ThanksForOrderEmail;
  12. use Exception;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Component\HttpFoundation\RedirectResponse;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. class OrderController extends SecurityUtilsController
  19. {
  20.     private const ORDER_TEMPLATE = 'front/order/order.twig';
  21.     private const ORDER_THANKS_TEMPLATE = 'front/order/thanks.twig';
  22.     private const ORDER_ERROR_TEMPLATE = 'front/order/error.twig';
  23.     private const SUMMARY_TABLE_PATH = 'front/order/include/table/table.twig';
  24.     private const FIND_ORDERS_SELECT = 'front/offer/modals/copy/modal_content.twig';
  25.     public function showThanks(Request $request, Page $page): Response
  26.     {
  27.         return $this->render(self::ORDER_THANKS_TEMPLATE, [
  28.             'afterCreatedUser' => false
  29.         ]);
  30.     }
  31.     public function showError(Request $request, Page $page): Response
  32.     {
  33.         return $this->render(self::ORDER_ERROR_TEMPLATE);
  34.     }
  35.     public function showCreatedUser(Request $request, Page $page): Response
  36.     {
  37.         return $this->render(self::ORDER_THANKS_TEMPLATE, [
  38.             'afterCreatedUser' => true
  39.         ]);
  40.     }
  41.     /**
  42.      * @Route("/{_locale}/render/summary", name="render-summary-table", methods={"POST"})
  43.      */
  44.     public function renderSummaryTable(Request $request): Response
  45.     {
  46.         $data = $request->request->all();
  47.         $discountType = $data['discount']['type'] ?? '';
  48.         $discountId = $data['discount']['id'] ?? '';
  49.         return new JsonResponse($this->renderView(self::SUMMARY_TABLE_PATH, [
  50.             'discountType' => $discountType,
  51.             'discount' => $discountType === Coupon::DISCOUNT ?
  52.                 $this->couponDiscountProvider->getOneById($discountId) :
  53.                 $this->couponSingleUseProvider->getOneById($discountId),
  54.             'package' => $this->packageService
  55.                 ->createPackageView($this->packageProvider->getOneById($data['id'] ?? ''), $request)
  56.         ]));
  57.     }
  58.     /**
  59.      * @Route("/{_locale}/check/discount", name="check-discount", methods={"POST"})
  60.      */
  61.     public function checkDiscount(Request $request): Response
  62.     {
  63.         $data = $request->request->all();
  64.         $code = $data['code'] ?? '';
  65.         $user = $data['user'] ?? '';
  66.         $couponDiscount = $this->couponDiscountProvider->getOneByCode($code);
  67.         $couponOneUse = $this->couponSingleUseProvider->getOneByCodeAndUser($code, $user);
  68.         $response = [
  69.             'discount' => [],
  70.             'error' => true
  71.         ];
  72.         if ($couponDiscount) {
  73.             if ($couponDiscount->checkActiveUntilIsBiggerThanToday()) {
  74.                 $response = [
  75.                     'discount' => [
  76.                         'id' => $couponDiscount->getId(),
  77.                         'type' => Coupon::DISCOUNT,
  78.                     ],
  79.                     'error' => false
  80.                 ];
  81.             } else {
  82.                 $this->couponDiscountService->changeActive(false, $couponDiscount);
  83.             }
  84.         }
  85.         if ($couponOneUse) {
  86.             if ($couponOneUse->checkActiveUntilIsBiggerThanToday()) {
  87.                 $response = [
  88.                     'discount' => [
  89.                         'id' => $couponOneUse->getId(),
  90.                         'type' => Coupon::DISCOUNT_SINGLE_USED,
  91.                     ],
  92.                     'error' => false
  93.                 ];
  94.             } else {
  95.                 $this->couponSingleUseService->changeActive(false, $couponOneUse);
  96.             }
  97.         }
  98.         return new JsonResponse($response);
  99.     }
  100.     /**
  101.      * @Route("refresh_order", name="refresh-order", methods={"GET"})
  102.      */
  103.     public function refresh(Request $request): Response
  104.     {
  105.         $locale = $request->getLocale();
  106.         $dataQuery = $request->query->all();
  107.         $orderRedirectPage = $this->pageProvider->getOneByMigrationId(PAGES::ORDER_THANKS);
  108.         $url = $orderRedirectPage?->translate($locale, false)->getUrl();
  109.         $data = [
  110.             'redirect_url' => $this->generateUrl('front-page', [
  111.                 '_locale' => $locale,
  112.                 'url' => $url
  113.             ])
  114.         ];
  115.         if ($orderEntity = $this->orderProvider->getOneById($dataQuery['order'])) {
  116.             $orderEntity->generateUuid();
  117.             $this->manager->persist($orderEntity);
  118.             $this->manager->flush();
  119.             $p24Response = $this->p24Client->getTransaction($orderEntity, $data);
  120.             return new RedirectResponse($p24Response->redirectUrl());
  121.         }
  122.         return new RedirectResponse($url);
  123.     }
  124.     /**
  125.      * @Route("verify_order", name="verify-order", methods={"POST", "GET"})
  126.      */
  127.     public function verify(Request $request): Response
  128.     {
  129.         $webHook = $this->p24Client->handleWebhook();
  130.         $orderUuid = $webHook->sessionId();
  131.         $orderEntity = $this->orderProvider->getOneByUuid($orderUuid);
  132.         $this->p24Client->verify($webHook, $orderEntity);
  133.         $this->orderService->updateByVerifyOrder([
  134.             'paymentStatus' => Orders::PAYMENT_TYPE[2]['value'],
  135.             'status' => Orders::STATUS[1]['value']
  136.         ], $orderEntity);
  137.         $this->userPackageService->updateByVerifyOrder($orderEntity);
  138.         $iFirmaRequest = new Request();
  139.         $locale = $orderEntity->getCurrency() === Currency::PLN ? 'pl' : 'en';
  140.         $country = $orderEntity->getInvoice()['country'] ?? 'pl';
  141.         $iFirmaRequest->setLocale($locale);
  142.         $iFirmaRequest->request->set('order', $orderEntity->getId());
  143.         $iFirmaRequest->request->set('invoiceType', InvoiceSchema::INVOICE);
  144.         $iFirmaRequest->request->set('country', $country);
  145.         $this->IFirmaService->createInvoice($iFirmaRequest);
  146.         $invoiceEntity = $orderEntity->getInvoiceFile()->getInvoiceId() .'.pdf';
  147.         $filePath = $this->parameterBag->get('invoice') . $invoiceEntity;
  148.         $this->messageBus->dispatch(new OrderInvoice(
  149.             $orderEntity->getUser()->getEmail(),
  150.             $locale,
  151.             $filePath,
  152.             InvoiceSchema::INVOICE,
  153.             false
  154.             )
  155.         );
  156.         return new Response('ok');
  157.     }
  158.     /**
  159.      * @Route("find/by/params", name="find_orders_by_params", methods={"GET"})
  160.      */
  161.     public function findOrders(Request $request): Response
  162.     {
  163.         $offerEntity = $this->offerProvider->getEntityById($request->get('offer', null));
  164.         $locale =  $request->get('locale', 'pl');
  165.         $userPackage = $this->userPackageProvider->getOneByUserPackageOrderAndActive(
  166.             $this->getUser(),
  167.             $offerEntity?->getPackage(),
  168.             $offerEntity?->getOrder()
  169.         );
  170.         $parameters = [
  171.             'user' => $offerEntity?->getUser()?->getId(),
  172.             'isAdditionalUser' => $userPackage?->getAdditionalUser(),
  173.             'locale' => $locale,
  174.             'numberLocalization' => $offerEntity?->getOrder()?->getConfiguration()['number_location'] ?? 0,
  175.             'industry' => $offerEntity?->getCategoryId(),
  176.             'isRange' => (bool) $offerEntity?->getOrder()?->getIsRange(),
  177.         ];
  178.         $orders = $this->orderProvider->findByPackageParameters($parameters);
  179.         return new JsonResponse(
  180.             [
  181.                 'ordersView' =>  $this->renderView(self::FIND_ORDERS_SELECT, [
  182.                         'orders' => $orders,
  183.                         'message' => $this->translator
  184.                             ->trans('USER_ZONE.MY_OFFER.MODALS.COPY_NO_HAVE_ACTIVE_PACKAGE', [], null, $locale)
  185.                 ]),
  186.                 'haveOrders' => empty($orders) === false
  187.             ]
  188.         );
  189.     }
  190.     public function show(Request $request, Page $page): Response
  191.     {
  192.         $originalRequest = $request->attributes->get('originalRequest', null);
  193.         $step = $originalRequest->query->get('step', null);
  194.         $package = $originalRequest->query->get('package', null);
  195.         $isOffer = $originalRequest->query->get('isOffer', 0);
  196.         $orderOffer = $originalRequest->query->get('orderOffer', null);
  197.         $userQuery = $originalRequest->query->get('user', null);
  198.         $originalRequest->request->set('currency', $originalRequest->getLocale() === 'pl' ? Currency::PLN : Currency::EURO);
  199.         $user = null;
  200.         if ($redirect = $this->checkUserHaveBlockRole($request, $isOffer)) {
  201.             return $this->redirect($redirect);
  202.         }
  203.         if ($isOffer) {
  204.             $orderEntity = $this->orderProvider->getOneById($orderOffer);
  205.             if (is_null($orderEntity) === false) {
  206.                 if ($redirect = $this->checkOrderExperience($request, $orderEntity)) {
  207.                     return $this->redirect($redirect);
  208.                 }
  209.                 if ($redirect = $this->checkOrderNeedToAccepted($request, $orderEntity)) {
  210.                     return $this->redirect($redirect);
  211.                 }
  212.             }
  213.             if (is_null($orderOffer) === true && is_null($package) === true) {
  214.                 return $this->createResponse(PAGES::ORDER, $originalRequest);
  215.             }
  216.         } else {
  217.             if (is_null($step) === false && is_null($package) === true) {
  218.                 return $this->createResponse(PAGES::ORDER, $originalRequest);
  219.             }
  220.         }
  221.         if ($originalRequest->isMethod('POST')) {
  222.             $stepForm = (int) $originalRequest->request->get('step', null);
  223.             $paymentMethod = $originalRequest->request->get('payment', null);
  224.             $orderId = $request->request->get('order');
  225.             // 2 - Form from Summary
  226.             if ($stepForm === 2) {
  227.                 $orderEntity = $this->orderProvider->getOneById($orderId);
  228.                 if (is_null($orderEntity) === false) {
  229.                     $locale =  $orderEntity->getCurrency() === Currency::PLN ? 'pl' : 'en';
  230.                 } else {
  231.                     $locale = $originalRequest->getLocale();
  232.                 }
  233.                 try {
  234.                     if ($originalRequest->get('createdUser', null)) {
  235.                         try {
  236.                             $user = $this->userService->createAccountByOrder($originalRequest);
  237.                             $orderEntity->setUser($user);
  238.                             $this->manager->persist($orderEntity);
  239.                             $this->manager->flush();
  240.                         } catch (Exception $e){}
  241.                     } else {
  242.                         $user = $this->getUser() ?
  243.                             $this->getUser() : $this->userService->createAccountByOrder($originalRequest);
  244.                     }
  245.                    if ($isOffer) {
  246.                        $user = $this->userProvider->getUserByUsername($userQuery ?? '');
  247.                    }
  248.                     if (is_null($user) === false) {
  249.                         $originalRequest->request->set('customer', $user->getId());
  250.                         if (!$isOffer && $locale === "en") {
  251.                             $isOffer = 1;
  252.                             $paymentMethod = '1';
  253.                             if (is_null($orderEntity)) {
  254.                                 $orderEntity = $this->orderService->create($originalRequest);
  255.                             }
  256.                         }
  257.                         if ($isOffer) {
  258.                             if ($paymentMethod === '1') {
  259.                                 try {
  260.                                     $this->orderService->setNeedToAccepted($orderEntity, false);
  261.                                     $this->messageBus->dispatch(new ThanksForOrderEmail(
  262.                                             $locale,
  263.                                             $user?->getEmail()
  264.                                         )
  265.                                     );
  266.                                     $iFirmaRequest = new Request();
  267.                                     $locale = $orderEntity->getCurrency() === Currency::PLN ? 'pl' : 'en';
  268.                                     $orderUser = $orderEntity->getUser();
  269.                                     $iFirmaRequest->setLocale($locale);
  270.                                     $iFirmaRequest->request->set('country', $orderUser->getCompanyCountry());
  271.                                     $iFirmaRequest->request->set('order', $orderEntity->getId());
  272.                                     $iFirmaRequest->request->set('invoiceType', InvoiceSchema::PRO_FORM);
  273.                                     $this->IFirmaService->createInvoice($iFirmaRequest);
  274.                                     $invoiceEntity = $orderEntity->getInvoiceProFormFile()->getInvoiceId() .'.pdf';
  275.                                     $filePath = $this->parameterBag->get('invoice') . $invoiceEntity;
  276.                                     $this->messageBus->dispatch(new OrderInvoice(
  277.                                         $orderUser->getEmail(),
  278.                                         $locale,
  279.                                         $filePath,
  280.                                         InvoiceSchema::PRO_FORM,
  281.                                         false
  282.                                         )
  283.                                     );
  284.                                     return $this->createResponse(PAGES::ORDER_THANKS, $originalRequest);
  285.                                 } catch (Exception $e) {
  286.                                     $this->messageBus->dispatch(new ThanksForOrderEmail(
  287.                                         $locale,
  288.                                         $user?->getEmail()
  289.                                     ));
  290.                                     return $this->createResponse(PAGES::ORDER_ERROR, $originalRequest);
  291.                                 }
  292.                             } else {
  293.                                 return new RedirectResponse($this->p24Redirect($originalRequest, $orderEntity));
  294.                             }
  295.                         } else {
  296.                             return new RedirectResponse($this->p24Redirect($originalRequest, null));
  297.                         }
  298.                     }
  299.                 } catch (Exception $e) {
  300.                     return $this->createResponse(PAGES::ORDER_ERROR, $originalRequest);
  301.                 }
  302.             }
  303.         }
  304.         $viewParams = $this->orderFactory->createOrderViewParams($originalRequest, $package, $this->getUser());
  305.         if ((int)$viewParams['step'] === 2) {
  306.             $email = $originalRequest->request->all()['company']['invoice_data']['email'] ?? '';
  307.             $companyAddress = $originalRequest->request->all()['company']['address']['address'] ?? '';
  308.             $packageEntity = $viewParams['package'] ?? null;
  309.             $userFromDb = $this->userProvider->getOneByEmail($email);
  310.             if ($redirectToUrl = $this->checkUserExists($request, $userFromDb)) {
  311.                 return $this->cookieService->set([
  312.                     'cookieName' => 'after_link_login',
  313.                     'cookieValue' => $originalRequest->getUri(),
  314.                     'redirectToUrl' => $redirectToUrl
  315.                 ]);
  316.             }
  317.             if (is_null($this->getUser()) === false || $isOffer) {
  318.                 $user = $isOffer ? $this->userProvider->getUserByUsername($userQuery) : $this->getUser()->getEmail();
  319.                 if (is_null($user)) {
  320.                     if ($isOffer) {
  321.                         $email = $orderEntity->getConfiguration()['customerAfterAcceptOffer'] ?? '';
  322.                         $companyAddress = $this->createCompanyParamsAfterAcceptedOffer($orderEntity->getInvoice());
  323.                         $viewParams['myCompany'] = $companyAddress;
  324.                         $viewParams['myData'] = $this->createMyDataParamsAfterAcceptedOffer($originalRequest);
  325.                         if($createdUser = $originalRequest->get('createdUser')){
  326.                             $viewParams['createdUser'] = $createdUser;
  327.                         }
  328.                     }
  329.                 } else {
  330.                     $email = $isOffer ? $user->getEmail() :  $this->getUser()->getEmail();
  331.                     $companyAddress = $isOffer ?
  332.                         $user->getCompany()[0] ?? null : $this->getUser()->getCompany()[0] ?? null;
  333.                     if (is_null($companyAddress) === false) {
  334.                         $companyAddress = $companyAddress->getIsExtraInvoiceData() ?
  335.                             $companyAddress->getExtraInvoiceData()->getAddress()->getAddress()
  336.                             : $companyAddress->getInvoiceData()->getAddress()->getAddress();
  337.                     }
  338.                 }
  339.             }
  340.             if ($redirect = $this->checkEmailIsExists($request, $email)) {
  341.                 return $this->redirect($redirect);
  342.             }
  343.             if ($redirect = $this->checkPackagePrice($request, $packageEntity)) {
  344.                 return $this->redirect($redirect);
  345.             }
  346.         }
  347.         $viewParams['entity'] = $page;
  348.         return $this->render(self::ORDER_TEMPLATE, $viewParams);
  349.     }
  350.     private function createCompanyParamsAfterAcceptedOffer(array $params): array
  351.     {
  352.         return [
  353.             'name' => $params['company'] ?? '',
  354.             'nip' => $params['nip'] ?? '',
  355.             'address' => $params['street'] ?? '',
  356.             'postCode' => $params['zip_code'] ?? '',
  357.             'city' => $params['city'] ?? '',
  358.             'country' => $params['country'] ?? ''
  359.         ];
  360.     }
  361.     private function createMyDataParamsAfterAcceptedOffer(Request $request): array
  362.     {
  363.         return [
  364.             'email' => $request->get('user'),
  365.             'phone' => ''
  366.         ];
  367.     }
  368.     private function createResponse(int $key, Request $request): Response
  369.     {
  370.         $locale = $request->getLocale();
  371.         if ($key === PAGES::ORDER_THANKS) {
  372.             $page = $this->pageProvider->getOneByMigrationId(PAGES::ORDER_THANKS);
  373.         }
  374.         if ($key === PAGES::ORDER_ERROR) {
  375.             $page = $this->pageProvider->getOneByMigrationId(PAGES::ORDER_ERROR);
  376.         }
  377.         if ($key === PAGES::ORDER) {
  378.             $page = $this->pageProvider->getOneByMigrationId(PAGES::ORDER);
  379.         }
  380.         return $this->redirectToRoute('front-page', [
  381.             '_locale' => $locale,
  382.             'url' => $page->translate($locale, false)->getUrl(),
  383.         ]);
  384.     }
  385. }