<?php
namespace App\Controller;
use App\Constants\MailEventConstants;
use App\Constants\OperatorTypeConstants;
use App\Constants\OrderStatusConstants;
use App\Constants\PageTypeConstant;
use App\Constants\UserIpConstants;
use App\Entity\Operator;
use App\Entity\PhoneNumber;
use App\Entity\Tariff;
use App\Repository\OrderRepository;
use App\Service\CompanyService;
use App\Service\KyivstarService;
use App\Service\LifecellPhoneNumberService;
use App\Service\MailService;
use App\Service\PhoneNumberService;
use App\Service\QrService;
use App\Service\UserIpService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
use NumberToWords\NumberToWords;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use GuzzleHttp\Client;
class DefaultController extends AbstractController
{
#[Route(path: '/', name: 'index_page')]
public function mainAction(Request $request, ManagerRegistry $managerRegistry, CompanyService $companyService, KyivstarService $kyivstarService, LifecellPhoneNumberService $lifeService, MailService $mailService): Response
{
$company = $request->get('companyInner') ;
$randomOperators = $companyService->showRandomOperators($company);
$kyivstarIp = explode(';', $this->getParameter('kyivstar.ips'));
$ip = $request->getClientIp();
$env = $this->getParameter('app.env');
$operators = $managerRegistry->getRepository(Operator::class)->getByCompany($request->get('companyInner'), $randomOperators);
$manager = $managerRegistry->getManager();
foreach ($operators as $k => $operator) {
if ($operator->getType() === OperatorTypeConstants::KYIVSTAR) {
// if ($env == 'prod' && !empty($kyivstarIp) && !in_array($ip, $kyivstarIp)) {
// unset($operators[$k]);
// } else
if ($operator->isServerActive() && !$kyivstarService->esimIsActive($company)) {
$operator->setIsServerActive(false);
$operator->setConnectionError(true);
$manager->persist($operator);
$manager->flush();
try {
$mailService->sendEmailToAdmins(MailEventConstants::KYIVSTAR_CONNECTION_ERROR, null, null, ['company' => $company]);
} catch (\Exception $e) {
$kyivstarService->logger->error($e->getMessage());
}
}
} elseif ($operator->getType() === OperatorTypeConstants::LIFECELL) {
if ($operator->isServerActive() && !$lifeService->isApiAvailable($company)) {
$operator->setIsServerActive(false);
$operator->setConnectionError(true);
$manager->persist($operator);
$manager->flush();
$mailService->sendEmailToAdmins(MailEventConstants::LIFECELL_CONNECTION_ERROR, null, null, ['company' => $request->get('companyInner')]);
}
}
}
return $this->render('pages/main/main.html.twig', ['page'=>PageTypeConstant::INDEX,'operators' => $operators]);
}
#[Route(path: '/operators/{slug}', name: 'operator_tariff_page')]
public function tariffChoiceAction(Request $request, ManagerRegistry $managerRegistry, UserIpService $userIpService, KyivstarService $kyivstarService): Response
{
$operator = $managerRegistry->getRepository(Operator::class)->getOneByCompany($request->get('slug'), $request->get('companyInner'));
if (!$operator) {
throw $this->createNotFoundException();
}
$userIpService->createUserIpData(UserIpConstants::OPERATOR_CHOICE, $request, ['operator' => $operator]);
$tariffs = $managerRegistry->getRepository(Tariff::class)->getByOperator($operator, $request->get('companyInner'));
return $this->render('pages/tarif_choice/tarif_choice.html.twig', ['tariffs' => $tariffs, 'page'=>PageTypeConstant::TARIFF_CHOICE,'operator' => $operator]);
}
#[Route(path: '/tariff-select/{tariff}', name: 'tariff_selected_page')]
public function tariffSelectedAction(Request $request, ManagerRegistry $managerRegistry, UserIpService $userIpService): Response
{
$tariff = $managerRegistry->getRepository(Tariff::class)->getOneByCompany($request->get('tariff'), $request->get('companyInner'));
if (!$tariff) {
throw $this->createNotFoundException();
}
$userIpService->createUserIpData(UserIpConstants::TARIFF_CHOICE, $request, ['tariff' => $tariff]);
$user = $this->getUser();
if (!$user) {
$response = $this->redirectToRoute('registration_page');
$response->headers->setCookie(new Cookie('tariffSelected', $tariff->getId(), time() + (365 * 24 * 60 * 60)));
} else {
if ($user->getEmailVerifiedAt()) {
return $this->redirectToRoute('tariff_phones_page', ['tariff'=>$tariff->getId()]);
}
$response = $this->redirectToRoute('tariff_phones_page', ['tariff'=>$tariff->getId()]);
$response->headers->setCookie(new Cookie('tariffSelected', $tariff->getId(), time() + (365 * 24 * 60 * 60)));
}
return $response;
}
#[Route(path: '/how-it-works', name: 'how_it_works')]
public function howItWorksAction(Request $request, ManagerRegistry $managerRegistry): Response
{
return $this->render('pages/how_it_works/how_it_works.html.twig', ['page'=>PageTypeConstant::HOW_IT_WORKS_PAGE]);
}
#[Route(path: '/tariffs/{tariff}', name: 'tariff_phones_page')]
public function tariffPhonesAction(Request $request, ManagerRegistry $managerRegistry, PhoneNumberService $phoneNumberService, LifecellPhoneNumberService $lifeService, KyivstarService $kyivstarService): Response
{
$user = $this->getUser();
$tariff = $managerRegistry->getRepository(Tariff::class)->getOneByCompany($request->get('tariff'), $request->get('companyInner'));
if (!$user || !$tariff || !$tariff->getOperator()) {
throw $this->createNotFoundException();
}
$esimPresence = null;
$hasPhones = true;
$phones = [];
$operator = $tariff->getOperator();
if ($operator->getType() == OperatorTypeConstants::LIFECELL) {
$esimPresence = $lifeService->checkEsimPresence();
if ($esimPresence === true) {
$phones = $phoneNumberService->getPhoneNumbersByTariff($tariff, $user);
$phoneNumber = $phones['result'];
if ($phoneNumber instanceof PhoneNumber) {
return $this->redirectToRoute('accept_number', ['id' => $phoneNumber->getId()]);
}
if (!empty($phones['apiUnavailable'])) {
$esimPresence = false;
} else {
$hasPhones = false;
}
} elseif ($esimPresence === null) {
$esimPresence = true;
$hasPhones = false;
}
} elseif ($operator->getType() == OperatorTypeConstants::KYIVSTAR) {
if ($kyivstarService->esimIsActive()) {
$phones = $phoneNumberService->getPhoneNumbersByTariff($tariff, $user);
}
} else {
$phones = $phoneNumberService->getPhoneNumbersByTariff($tariff, $user);
}
return $this->render('@App/pages/number_choice/number_choice.html.twig', [
'page' => PageTypeConstant::PHONE_CHOICE,
'phones' => $phones,
'operator' => $operator,
'tariff' => $tariff,
'esimPresence' => $esimPresence,
'hasPhones' => $hasPhones
]);
}
#[Route(path: '/accept/{id}', name: 'accept_number')]
public function acceptNumberAction(PhoneNumber $phoneNumber, Request $request, EntityManagerInterface $entityManager, TranslatorInterface $translator, OrderRepository $orderRepository): Response
{
$user = $this->getUser();
if (!$user) {
throw $this->createNotFoundException();
}
$now = new \DateTime();
$phoneIsLocked = $user != $phoneNumber->getLockedUser() && $now < $phoneNumber->getUnfreezeTime();
if ($orderPayed = $orderRepository->findOneBy(['phoneNumber' => $phoneNumber, 'user'=> $user, 'status' => [OrderStatusConstants::PAYED]])) {
return $this->redirectToRoute('order_get_page', ['reference' => $orderPayed->getReference()]);
}
$order = $orderRepository->findOneBy(['phoneNumber' => $phoneNumber, 'user'=> $user, 'status' => [OrderStatusConstants::SEND_TO_PAYMENT, OrderStatusConstants::PAYMENT_ERROR, OrderStatusConstants::PENDING]]);
$tariff = $phoneNumber->getTariff();
$operator = $phoneNumber->getOperator();
if (!$tariff || !$entityManager->getRepository(Tariff::class)->getOneByCompany($tariff->getId(), $request->get('companyInner'))) {
throw $this->createNotFoundException();
}
if ($phoneIsLocked || !$phoneNumber->getActive()) {
$this->addFlash('phone_number_error', $translator->trans('phone_number_is_locked', [], 'validators'));
return $this->redirectToRoute('tariff_phones_page', ['tariff' => $phoneNumber->getTariff()->getId()]);
}
$canPayOrderAt = null;
$paymentDisabled = false;
if ($operator->getType() != OperatorTypeConstants::LIFECELL) {
if (!$order) {
$phoneNumber->lockPhoneNumber($user);
$entityManager->flush();
}
} else {
$unfreezeTime = clone $phoneNumber->getUnfreezeTime();
if ($unfreezeTime < $now) {
$canPayOrderAt = false;
$paymentDisabled = true;
} else {
$dateDiff = $now->diff($unfreezeTime);
$minutes = $dateDiff->days * 24 * 60;
$minutes += $dateDiff->h * 60;
$minutes += $dateDiff->i;
$canPayOrderAt = ['minutes' => $minutes, 'seconds' => $dateDiff->s];
$unfreezeTime->modify('-7 minutes -30 seconds');
if ($unfreezeTime < $now) {
$paymentDisabled = true;
}
}
}
return $this->render('@App/pages/accept_number/accept_number.html.twig', [
'page' => PageTypeConstant::PAYMENT_PAGE,
'user' => $user,
'order' => $order,
'operator' => $operator,
'paymentDisabled' => $paymentDisabled,
'canPayOrderAt' => $canPayOrderAt,
'phoneNumber' => $phoneNumber,
]);
}
}