src/Controller/DefaultController.php line 77

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Constants\MailEventConstants;
  4. use App\Constants\OperatorTypeConstants;
  5. use App\Constants\OrderStatusConstants;
  6. use App\Constants\PageTypeConstant;
  7. use App\Constants\UserIpConstants;
  8. use App\Entity\Operator;
  9. use App\Entity\PhoneNumber;
  10. use App\Entity\Tariff;
  11. use App\Repository\OrderRepository;
  12. use App\Service\CompanyService;
  13. use App\Service\KyivstarService;
  14. use App\Service\LifecellPhoneNumberService;
  15. use App\Service\MailService;
  16. use App\Service\PhoneNumberService;
  17. use App\Service\QrService;
  18. use App\Service\UserIpService;
  19. use Doctrine\ORM\EntityManagerInterface;
  20. use Doctrine\Persistence\ManagerRegistry;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  23. use Symfony\Component\HttpClient\HttpClient;
  24. use Symfony\Component\HttpFoundation\Cookie;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use Symfony\Contracts\Translation\TranslatorInterface;
  29. use NumberToWords\NumberToWords;
  30. use Symfony\Contracts\HttpClient\HttpClientInterface;
  31. use GuzzleHttp\Client;
  32. class DefaultController extends AbstractController
  33. {
  34.     #[Route(path'/'name'index_page')]
  35.     public function mainAction(Request $requestManagerRegistry $managerRegistryCompanyService $companyServiceKyivstarService $kyivstarServiceLifecellPhoneNumberService $lifeServiceMailService $mailService): Response
  36.     {
  37.         $company $request->get('companyInner') ;
  38.         $randomOperators $companyService->showRandomOperators($company);
  39.         $kyivstarIp explode(';'$this->getParameter('kyivstar.ips'));
  40.         $ip $request->getClientIp();
  41.         $env $this->getParameter('app.env');
  42.         $operators $managerRegistry->getRepository(Operator::class)->getByCompany($request->get('companyInner'), $randomOperators);
  43.         $manager $managerRegistry->getManager();
  44.         foreach ($operators as $k => $operator) {
  45.             if ($operator->getType() === OperatorTypeConstants::KYIVSTAR) {
  46. //                if ($env == 'prod' && !empty($kyivstarIp) && !in_array($ip, $kyivstarIp)) {
  47. //                    unset($operators[$k]);
  48. //                } else
  49.                 if ($operator->isServerActive() && !$kyivstarService->esimIsActive($company)) {
  50.                     $operator->setIsServerActive(false);
  51.                     $operator->setConnectionError(true);
  52.                     $manager->persist($operator);
  53.                     $manager->flush();
  54.                     try {
  55.                         $mailService->sendEmailToAdmins(MailEventConstants::KYIVSTAR_CONNECTION_ERRORnullnull, ['company' => $company]);
  56.                     } catch (\Exception $e) {
  57.                         $kyivstarService->logger->error($e->getMessage());
  58.                     }
  59.                 }
  60.             } elseif ($operator->getType() === OperatorTypeConstants::LIFECELL) {
  61.                 if ($operator->isServerActive() && !$lifeService->isApiAvailable($company)) {
  62.                     $operator->setIsServerActive(false);
  63.                     $operator->setConnectionError(true);
  64.                     $manager->persist($operator);
  65.                     $manager->flush();
  66.                     $mailService->sendEmailToAdmins(MailEventConstants::LIFECELL_CONNECTION_ERRORnullnull, ['company' => $request->get('companyInner')]);
  67.                 }
  68.             }
  69.         }
  70.         return $this->render('pages/main/main.html.twig', ['page'=>PageTypeConstant::INDEX,'operators' => $operators]);
  71.     }
  72.     #[Route(path'/operators/{slug}'name'operator_tariff_page')]
  73.     public function tariffChoiceAction(Request $requestManagerRegistry $managerRegistryUserIpService $userIpServiceKyivstarService $kyivstarService): Response
  74.     {
  75.         $operator $managerRegistry->getRepository(Operator::class)->getOneByCompany($request->get('slug'), $request->get('companyInner'));
  76.         if (!$operator) {
  77.             throw $this->createNotFoundException();
  78.         }
  79.         $userIpService->createUserIpData(UserIpConstants::OPERATOR_CHOICE$request, ['operator' => $operator]);
  80.         $tariffs $managerRegistry->getRepository(Tariff::class)->getByOperator($operator$request->get('companyInner'));
  81.         return $this->render('pages/tarif_choice/tarif_choice.html.twig', ['tariffs' => $tariffs'page'=>PageTypeConstant::TARIFF_CHOICE,'operator' => $operator]);
  82.     }
  83.     #[Route(path'/tariff-select/{tariff}'name'tariff_selected_page')]
  84.     public function tariffSelectedAction(Request $requestManagerRegistry $managerRegistryUserIpService $userIpService): Response
  85.     {
  86.         $tariff $managerRegistry->getRepository(Tariff::class)->getOneByCompany($request->get('tariff'), $request->get('companyInner'));
  87.         if (!$tariff) {
  88.             throw $this->createNotFoundException();
  89.         }
  90.         $userIpService->createUserIpData(UserIpConstants::TARIFF_CHOICE$request, ['tariff' => $tariff]);
  91.         $user $this->getUser();
  92.         if (!$user) {
  93.             $response $this->redirectToRoute('registration_page');
  94.             $response->headers->setCookie(new Cookie('tariffSelected'$tariff->getId(), time() + (365 24 60 60)));
  95.         } else {
  96.             if ($user->getEmailVerifiedAt()) {
  97.                 return $this->redirectToRoute('tariff_phones_page', ['tariff'=>$tariff->getId()]);
  98.             }
  99.             $response $this->redirectToRoute('tariff_phones_page', ['tariff'=>$tariff->getId()]);
  100.             $response->headers->setCookie(new Cookie('tariffSelected'$tariff->getId(), time() + (365 24 60 60)));
  101.         }
  102.         return $response;
  103.     }
  104.     #[Route(path'/how-it-works'name'how_it_works')]
  105.     public function howItWorksAction(Request $requestManagerRegistry $managerRegistry): Response
  106.     {
  107.         return $this->render('pages/how_it_works/how_it_works.html.twig', ['page'=>PageTypeConstant::HOW_IT_WORKS_PAGE]);
  108.     }
  109.     #[Route(path'/tariffs/{tariff}'name'tariff_phones_page')]
  110.     public function tariffPhonesAction(Request $requestManagerRegistry $managerRegistryPhoneNumberService $phoneNumberServiceLifecellPhoneNumberService $lifeServiceKyivstarService $kyivstarService): Response
  111.     {
  112.         $user $this->getUser();
  113.         $tariff $managerRegistry->getRepository(Tariff::class)->getOneByCompany($request->get('tariff'), $request->get('companyInner'));
  114.         if (!$user || !$tariff || !$tariff->getOperator()) {
  115.             throw $this->createNotFoundException();
  116.         }
  117.         $esimPresence null;
  118.         $hasPhones true;
  119.         $phones = [];
  120.         $operator $tariff->getOperator();
  121.         if ($operator->getType() == OperatorTypeConstants::LIFECELL) {
  122.             $esimPresence $lifeService->checkEsimPresence();
  123.             if ($esimPresence === true) {
  124.                 $phones $phoneNumberService->getPhoneNumbersByTariff($tariff$user);
  125.                 $phoneNumber $phones['result'];
  126.                 if ($phoneNumber instanceof PhoneNumber) {
  127.                     return $this->redirectToRoute('accept_number', ['id' => $phoneNumber->getId()]);
  128.                 }
  129.                 if (!empty($phones['apiUnavailable'])) {
  130.                     $esimPresence false;
  131.                 } else {
  132.                     $hasPhones false;
  133.                 }
  134.             } elseif ($esimPresence === null) {
  135.                 $esimPresence true;
  136.                 $hasPhones false;
  137.             }
  138.         } elseif ($operator->getType() == OperatorTypeConstants::KYIVSTAR) {
  139.             if ($kyivstarService->esimIsActive()) {
  140.                 $phones $phoneNumberService->getPhoneNumbersByTariff($tariff$user);
  141.             }
  142.         } else {
  143.             $phones $phoneNumberService->getPhoneNumbersByTariff($tariff$user);
  144.         }
  145.         return $this->render('@App/pages/number_choice/number_choice.html.twig', [
  146.             'page' => PageTypeConstant::PHONE_CHOICE,
  147.             'phones' => $phones,
  148.             'operator' => $operator,
  149.             'tariff' => $tariff,
  150.             'esimPresence' => $esimPresence,
  151.             'hasPhones' => $hasPhones
  152.         ]);
  153.     }
  154.     #[Route(path'/accept/{id}'name'accept_number')]
  155.     public function acceptNumberAction(PhoneNumber $phoneNumberRequest $requestEntityManagerInterface $entityManagerTranslatorInterface $translatorOrderRepository $orderRepository): Response
  156.     {
  157.         $user $this->getUser();
  158.         if (!$user) {
  159.             throw $this->createNotFoundException();
  160.         }
  161.         $now = new \DateTime();
  162.         $phoneIsLocked $user != $phoneNumber->getLockedUser() && $now $phoneNumber->getUnfreezeTime();
  163.         if ($orderPayed $orderRepository->findOneBy(['phoneNumber' => $phoneNumber'user'=> $user'status' => [OrderStatusConstants::PAYED]])) {
  164.             return $this->redirectToRoute('order_get_page', ['reference' => $orderPayed->getReference()]);
  165.         }
  166.         $order $orderRepository->findOneBy(['phoneNumber' => $phoneNumber'user'=> $user'status' => [OrderStatusConstants::SEND_TO_PAYMENTOrderStatusConstants::PAYMENT_ERROROrderStatusConstants::PENDING]]);
  167.         $tariff $phoneNumber->getTariff();
  168.         $operator $phoneNumber->getOperator();
  169.         if (!$tariff || !$entityManager->getRepository(Tariff::class)->getOneByCompany($tariff->getId(), $request->get('companyInner'))) {
  170.             throw $this->createNotFoundException();
  171.         }
  172.         if ($phoneIsLocked || !$phoneNumber->getActive()) {
  173.             $this->addFlash('phone_number_error'$translator->trans('phone_number_is_locked', [], 'validators'));
  174.             return $this->redirectToRoute('tariff_phones_page', ['tariff' => $phoneNumber->getTariff()->getId()]);
  175.         }
  176.         $canPayOrderAt null;
  177.         $paymentDisabled false;
  178.         if ($operator->getType() != OperatorTypeConstants::LIFECELL) {
  179.             if (!$order) {
  180.                 $phoneNumber->lockPhoneNumber($user);
  181.                 $entityManager->flush();
  182.             }
  183.         } else {
  184.             $unfreezeTime = clone $phoneNumber->getUnfreezeTime();
  185.             if ($unfreezeTime $now) {
  186.                 $canPayOrderAt false;
  187.                 $paymentDisabled true;
  188.             } else {
  189.                 $dateDiff $now->diff($unfreezeTime);
  190.                 $minutes $dateDiff->days 24 60;
  191.                 $minutes += $dateDiff->60;
  192.                 $minutes += $dateDiff->i;
  193.                 $canPayOrderAt = ['minutes' => $minutes'seconds' => $dateDiff->s];
  194.                 $unfreezeTime->modify('-7 minutes -30 seconds');
  195.                 if ($unfreezeTime $now) {
  196.                     $paymentDisabled true;
  197.                 }
  198.             }
  199.         }
  200.         return $this->render('@App/pages/accept_number/accept_number.html.twig', [
  201.             'page' => PageTypeConstant::PAYMENT_PAGE,
  202.             'user' => $user,
  203.             'order' => $order,
  204.             'operator' => $operator,
  205.             'paymentDisabled' => $paymentDisabled,
  206.             'canPayOrderAt' => $canPayOrderAt,
  207.             'phoneNumber' => $phoneNumber,
  208.         ]);
  209.     }
  210. }