src/Controller/User/VPN/Service/ServiceController.php line 511

Open in your IDE?
  1. <?php
  2. namespace App\Controller\User\VPN\Service;
  3. use App\Entity\Generic\User;
  4. use App\Entity\Telegram\AgentPublicBot\Bot;
  5. use App\Entity\VPN\Service\Plan;
  6. use App\Entity\VPN\Service\Service;
  7. use App\Form\VPN\Service\Service\LimitedOcServType;
  8. use App\Form\VPN\Service\Service\LimitedOpenType;
  9. use App\Form\VPN\Service\Service\LimitedV2rayType;
  10. use App\Form\VPN\Service\Service\LimitedVipType;
  11. use App\Form\VPN\Service\Service\RollbackType;
  12. use App\Form\VPN\Service\Service\UnlimitedOcServType;
  13. use App\Form\VPN\Service\Service\UnlimitedOpenType;
  14. use App\Form\VPN\Service\Service\UnlimitedV2rayType;
  15. use App\Repository\VPN\V2ray\ServerRepository;
  16. use App\Service\TransactionService;
  17. use App\Service\Util\ByteConvert;
  18. use App\Service\Util\DynamicPriceCalculation;
  19. use App\Service\VPN\Service\ServiceService;
  20. use App\ViewModel\VPN\Service\ServiceViewModel;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use Doctrine\Persistence\ManagerRegistry;
  23. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  24. use Symfony\Component\Form\Extension\Core\Type\TextType;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\RequestStack;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. #[Route('/panel/user/vpn/service')]
  30. class ServiceController extends AbstractController
  31. {
  32.     public ServiceService $service;
  33.     public ?Request $request;
  34.     public TransactionService $transaction;
  35.     public EntityManagerInterface $em;
  36.     public DynamicPriceCalculation $dynamicPriceCalculation;
  37.     public function __construct(ServiceService $serviceRequestStack $requestStackEntityManagerInterface $emTransactionService $transactionDynamicPriceCalculation $dynamicPriceCalculation)
  38.     {
  39.         $this->dynamicPriceCalculation $dynamicPriceCalculation;
  40.         $this->em $em;
  41.         $this->transaction $transaction;
  42.         $this->service $service;
  43.         $this->request $requestStack->getCurrentRequest();
  44.     }
  45.     #[Route('/'name'app_panel_user_vpn_service_index'methods: ['GET'])]
  46.     public function index(Request $request): Response
  47.     {
  48.         /**
  49.          * @var User $user
  50.          */
  51.         $user $this->getUser();
  52.         if ($user->getConnectedTelegramUserId() === null || $user->getConnectedTelegramUserId() === []) {
  53.             $this->addFlash('error''لطفا ابتدا حساب خود را به تلگرام متصل فرمایید');
  54.             return $this->redirectToRoute('app_user_dashboard');
  55.         }
  56.         $info = new ServiceViewModel($request);
  57.         $data $this->service->getListUser($info$user);
  58.         return $this->render('panel/pages/user/vpn/service/list.html.twig', [
  59.             'paginator' => $data,
  60.             'currentPage' => 'app_panel_user_vpn_service_index',
  61.             'parameters' => $info,
  62.             'filters' => $this->getFilters(),
  63.             'lists' => $this->getLists(),
  64.         ]);
  65.     }
  66.     public function getFilters(): array
  67.     {
  68.         $userBots $this->getDoctrine()->getRepository(Bot::class)->findBy(['active' => 1'owner' => $this->getUser()]);
  69.         $botsList = [];
  70.         $botsList[] = ['name' => 'همه''value' => 'all'];
  71.         foreach ($userBots as $item) {
  72.             $botsList[] = ['name' => $item->getDescription(), 'value' => $item->getId()];
  73.         }
  74.         return [
  75.             [
  76.                 'name' => 'clientId',
  77.                 'type' => 'text',
  78.                 'label' => 'شناسه سرویس',
  79.                 'class' => '',
  80.                 'value' => $this->request->get('clientId')
  81.             ],
  82.             [
  83.                 'name' => 'username',
  84.                 'type' => 'text',
  85.                 'label' => 'نام کاربری',
  86.                 'class' => '',
  87.                 'value' => $this->request->get('username')
  88.             ],
  89.             [
  90.                 'name' => 'botId',
  91.                 'type' => 'radio',
  92.                 'label' => 'ربات تلگرام',
  93.                 'class' => '',
  94.                 'radio' => $botsList,
  95.                 'value' => $this->request->get('botId')
  96.             ],
  97.             [
  98.                 'name' => 'active',
  99.                 'type' => 'radio',
  100.                 'label' => 'وضعیت',
  101.                 'class' => '',
  102.                 'radio' => [
  103.                     ['name' => 'همه''value' => 'all'],
  104.                     ['name' => 'فعال''value' => 'true'],
  105.                     ['name' => 'غیرفعال''value' => 'false'],
  106.                 ],
  107.                 'value' => $this->request->get('active')
  108.             ],
  109.             [
  110.                 'name' => 'serviceType',
  111.                 'type' => 'radio',
  112.                 'label' => 'نوع سرویس',
  113.                 'class' => '',
  114.                 'radio' => [
  115.                     ['name' => 'همه''value' => 'all'],
  116.                     ['name' => 'حجمی''value' => 'sized'],
  117.                     ['name' => 'نامحدود''value' => 'unlimited'],
  118.                 ],
  119.                 'value' => $this->request->get('serviceType')
  120.             ],
  121.             [
  122.                 'name' => 'protocol',
  123.                 'type' => 'radio',
  124.                 'label' => 'نوع پروتکل',
  125.                 'class' => '',
  126.                 'radio' => [
  127.                     ['name' => 'همه''value' => 'all'],
  128.                     ['name' => 'V2ray''value' => 'v2ray'],
  129.                     ['name' => 'OpenVPN''value' => 'open'],
  130.                     ['name' => 'Cisco''value' => 'ocserv'],
  131.                     ['name' => 'VIP مولتی''value' => 'vip'],
  132.                 ],
  133.                 'value' => $this->request->get('protocol')
  134.             ],
  135.         ];
  136.     }
  137.     public function getLists(): array
  138.     {
  139.         $array = [
  140.             [
  141.                 'name' => 'v1ListService',
  142.                 'label' => 'سرویس',
  143.                 'class' => '',
  144.                 'type' => 'serviceDetail',
  145.                 'mobile' => true
  146.             ],
  147.             [
  148.                 'name' => 'v2InfoService',
  149.                 'label' => 'اطلاعات دسترسی',
  150.                 'class' => '',
  151.                 'type' => 'serviceSubDetail',
  152.                 'withoutPassword' => 'app_vpn_service_panel_no_password',
  153.                 'withPassword' => 'app_vpn_service_panel_no_password',
  154.                 'mobile' => true,
  155.                 'charge' => 'app_panel_user_vpn_service_charge',
  156. //                'rollback' => 'app_panel_user_vpn_service_rollback',
  157.                 'status' => 'app_panel_user_vpn_service_status',
  158.                 'disableHourly' => 'app_panel_user_vpn_service_index',
  159.                 'enableHourly' => 'app_panel_user_vpn_service_index',
  160.                 'username' => 'app_panel_user_vpn_service_edit'
  161.             ],
  162.         ];
  163.         return $array;
  164.     }
  165.     #[Route('/new'name'app_panel_user_vpn_service_new'methods: ['GET''POST'])]
  166.     public function new(Request $requestByteConvert $byteConvertServerRepository $serverRepository\App\Repository\VPN\OpenVPN\ServerRepository $openServerREpo\App\Repository\VPN\OcServ\ServerRepository $ocServerRepository): Response
  167.     {
  168. //        die('فروش موقتا بسته شد... برای اطلاع از زمان باز شدن کانال تلگرام را دنبال فرمایید ... @tehrannetofficial');
  169.         /**
  170.          * @var User $user
  171.          */
  172.         $user $this->getUser();
  173.         /**
  174.          * @var User $user
  175.          */
  176.         $user $this->getUser();
  177.         if ($user->getConnectedTelegramUserId() === null || $user->getConnectedTelegramUserId() === []) {
  178.             $this->addFlash('error''لطفا ابتدا حساب خود را به تلگرام متصل فرمایید');
  179.             return $this->redirectToRoute('app_user_dashboard');
  180.         }
  181.         $formTypes = [
  182.             'sizedVip' => LimitedVipType::class,
  183.             'sizedV2ray' => LimitedV2rayType::class,
  184.             'unlimitedV2ray' => UnlimitedV2rayType::class,
  185.             'sizedOcServ' => LimitedOcServType::class,
  186.             'unlimitedOcServ' => UnlimitedOcServType::class,
  187.             'sizedOpen' => LimitedOpenType::class,
  188.             'unlimitedOpen' => UnlimitedOpenType::class,
  189.         ];
  190.         $forms = [];
  191.         foreach ($formTypes as $formName => $formClass) {
  192.             switch ($formName) {
  193.                 case 'unlimitedV2ray':
  194.                     $locations = [];
  195.                     foreach ($serverRepository->findBy(['active' => 1]) as $server) {
  196.                         $locations[$this->countryCodeToFlag($server->getCountry()->getCode()) . $server->getCountry()->getTitle()] = $server->getCountry()->getCode();
  197.                     }
  198.                     $form $this->createForm($formClassnull, [
  199.                         'clientId' => $this->service->getFreeClientId(),
  200.                         'locations' => $locations
  201.                     ]);
  202.                     break;
  203.                 case 'unlimitedOcServ':
  204.                     $locations = [];
  205.                     foreach ($ocServerRepository->findBy(['active' => 1]) as $server) {
  206.                         $locations[$this->countryCodeToFlag($server->getCountry()->getCode()) . $server->getCountry()->getTitle()] = $server->getCountry()->getCode();
  207.                     }
  208.                     $form $this->createForm($formClassnull, [
  209.                         'clientId' => $this->service->getFreeClientId(),
  210.                         'locations' => $locations
  211.                     ]);
  212.                     break;
  213.                 case 'unlimitedOpen':
  214.                     $locations = [];
  215.                     foreach ($openServerREpo->findBy(['active' => 1]) as $server) {
  216.                         $locations[$this->countryCodeToFlag($server->getCountry()->getCode()) . $server->getCountry()->getTitle()] = $server->getCountry()->getCode();
  217.                     }
  218.                     $form $this->createForm($formClassnull, [
  219.                         'clientId' => $this->service->getFreeClientId(),
  220.                         'locations' => $locations
  221.                     ]);
  222.                     break;
  223.                 case 'sizedV2ray':
  224.                 case 'sizedOpen':
  225.                 case 'sizedOcServ':
  226.                 case 'sizedVip':
  227.                     $form $this->createForm($formClassnull, [
  228.                         'clientId' => $this->service->getFreeClientId()
  229.                     ]);
  230.                     break;
  231.             }
  232.             $form->handleRequest($request);
  233.             switch ($formName) {
  234.                 case 'sizedVip':
  235.                 case 'sizedV2ray':
  236.                 case 'unlimitedV2ray':
  237.                 case 'sizedOcServ':
  238.                 case 'unlimitedOcServ':
  239.                 case 'sizedOpen':
  240.                 case 'unlimitedOpen':
  241.                     if ($form->isSubmitted() && $form->isValid()) {
  242.                         $queryArray $form->getData();
  243.                         unset($queryArray['username']);
  244.                         unset($queryArray['password']);
  245.                         $queryArray['size'] = $byteConvert->toByte($queryArray['size'] . 'GB');
  246.                         $queryArray['active'] = 1;
  247.                         $targetPlan $this->em->getRepository(Plan::class)->findOneBy($queryArray);
  248.                         if (!$targetPlan) {
  249.                             $this->addFlash('error''این بسته در حال حاضر ارائه نمیشود');
  250.                             return $this->redirectToRoute('app_panel_user_vpn_service_new');
  251.                         }
  252. //                        var_dump($queryArray);die;
  253. //                      TODO:Check User Interest Rate For Price
  254. //                        $price = $targetPlan->getPrice();
  255.                         $price $this->dynamicPriceCalculation->calculatePrice($user$targetPlan);
  256.                         $allBalance $user->getWallet() + $user->getGiftWallet();
  257.                         if ($allBalance >= $price){
  258.                             if ($user->getWallet() < $price) {
  259.                                 $neededPrice $price $user->getWallet();
  260.                                 $user->setGiftWallet($user->getGiftWallet() - $neededPrice);
  261.                                 $this->transaction->createTransaction($user$neededPrice,
  262.                                     "دریافت مبلغ از کیف پول هدیه"
  263.                                     10null0null'gift');
  264.                             }
  265.                             $serviceData $form->getData();
  266.                             $serviceData['clientId'] = $form->get('clientId')->getData();
  267.                             if ($form->has('country')) {
  268. //                                var_dump($form->get('country')->getData());die;
  269.                                 $country $form->get('country')->getData() ?: null;
  270.                             } else {
  271.                                 $country 'all';
  272.                             }
  273.                             $service $this->service->createService($targetPlan$serviceData$user$country);
  274.                             $this->transaction->createTransaction($user$price,
  275.                                 "خرید سرویس جدید {$service->getClientId()}"
  276.                                 00null,  0,  nullnull,  0nulltrue 'VPN');
  277.                             $this->addFlash('success''سرویس مد نظر با موفقیت ثبت شد');
  278.                             return $this->redirectToRoute('app_panel_user_vpn_service_index');
  279.                         }else {
  280.                             $this->addFlash('error''موجودی کیف پول شما با جمع کیف پول هدیه کافی نمی باشد');
  281.                             return $this->redirectToRoute('app_panel_user_vpn_service_new');
  282.                         }
  283.                     }
  284.                     break;
  285.                 default:
  286.                     // Handle any default case if necessary
  287.                     break;
  288.             }
  289.             $forms[$formName] = $form->createView();
  290.         }
  291.         return $this->render('panel/pages/user/vpn/service/enter.html.twig', [
  292.             'sizedVipForm' => $forms['sizedVip'] ?? '',
  293.             'sizedV2rayForm' => $forms['sizedV2ray'] ?? '',
  294.             'unlimitedV2rayForm' => $forms['unlimitedV2ray'] ?? '',
  295.             'sizedOcServForm' => $forms['sizedOcServ'] ?? '',
  296.             'unlimitedOcServForm' => $forms['unlimitedOcServ'] ?? '',
  297.             'sizedOpenForm' => $forms['sizedOpen'] ?? '',
  298.             'unlimitedOpenForm' => $forms['unlimitedOpen'] ?? '',
  299.         ]);
  300.     }
  301.     #[Route('/charge/{id}'name'app_panel_user_vpn_service_charge'methods: ['GET''POST'])]
  302.     public function charge(Request $requestByteConvert $byteConvertServerRepository $serverRepository\App\Repository\VPN\OpenVPN\ServerRepository $openServerREpo\App\Repository\VPN\OcServ\ServerRepository $ocServerRepositoryService $service)
  303.     {
  304. //die('فروش موقتا بسته شد... برای اطلاع از زمان باز شدن کانال تلگرام را دنبال فرمایید ... @tehrannetofficial');
  305.         /**
  306.          * @var User $user
  307.          */
  308.         $user $this->getUser();
  309. //        var_dump($user->getWallet());die;
  310.         $formTypes = [
  311.             'sizedVip' => LimitedVipType::class,
  312.             'sizedV2ray' => LimitedV2rayType::class,
  313.             'unlimitedV2ray' => UnlimitedV2rayType::class,
  314.             'sizedOcServ' => LimitedOcServType::class,
  315.             'unlimitedOcServ' => UnlimitedOcServType::class,
  316.             'sizedOpen' => LimitedOpenType::class,
  317.             'unlimitedOpen' => UnlimitedOpenType::class,
  318.         ];
  319.         $forms = [];
  320.         foreach ($formTypes as $formName => $formClass) {
  321.             switch ($formName) {
  322.                 case 'unlimitedV2ray':
  323.                     $locations = [];
  324.                     foreach ($serverRepository->findBy(['active' => 1]) as $server) {
  325.                         $locations[$this->countryCodeToFlag($server->getCountry()->getCode()) . $server->getCountry()->getTitle()] = $server->getCountry()->getCode();
  326.                     }
  327.                     $form $this->createForm($formClassnull, [
  328.                         'clientId' => $service->getClientId(),
  329.                         'locations' => $locations
  330.                     ]);
  331.                     break;
  332.                 case 'unlimitedOcServ':
  333.                     $locations = [];
  334.                     foreach ($ocServerRepository->findBy(['active' => 1]) as $server) {
  335.                         $locations[$this->countryCodeToFlag($server->getCountry()->getCode()) . $server->getCountry()->getTitle()] = $server->getCountry()->getCode();
  336.                     }
  337.                     $form $this->createForm($formClassnull, [
  338.                         'clientId' => $service->getClientId(),
  339.                         'locations' => $locations
  340.                     ]);
  341.                     break;
  342.                 case 'unlimitedOpen':
  343.                     $locations = [];
  344.                     foreach ($openServerREpo->findBy(['active' => 1]) as $server) {
  345.                         $locations[$this->countryCodeToFlag($server->getCountry()->getCode()) . $server->getCountry()->getTitle()] = $server->getCountry()->getCode();
  346.                     }
  347.                     $form $this->createForm($formClassnull, [
  348.                         'clientId' => $service->getClientId(),
  349.                         'locations' => $locations
  350.                     ]);
  351.                     break;
  352.                 case 'sizedV2ray':
  353.                 case 'sizedOpen':
  354.                 case 'sizedOcServ':
  355.                 case 'sizedVip':
  356.                     $form $this->createForm($formClassnull, [
  357.                         'clientId' => $service->getClientId(),
  358.                     ]);
  359.                     break;
  360.             }
  361.             $form->remove('username');
  362.             $form->remove('password');
  363.             $form->remove('note');
  364.             $form->handleRequest($request);
  365.             switch ($formName) {
  366.                 case 'sizedV2ray':
  367.                 case 'sizedVip':
  368.                 case 'unlimitedV2ray':
  369.                 case 'sizedOcServ':
  370.                 case 'unlimitedOcServ':
  371.                 case 'sizedOpen':
  372.                 case 'unlimitedOpen':
  373.                     if ($form->isSubmitted() && $form->isValid()) {
  374.                         $queryArray $form->getData();
  375. //                        unset($queryArray['username']);
  376. //                        unset($queryArray['password']);
  377.                         $queryArray['size'] = $byteConvert->toByte($queryArray['size'] . 'GB');
  378.                         $queryArray['active'] = 1;
  379.                         $targetPlan $this->em->getRepository(Plan::class)->findOneBy($queryArray);
  380.                         if (!$targetPlan) {
  381.                             $this->addFlash('error''این بسته در حال حاضر ارائه نمیشود');
  382.                             return $this->redirectToRoute('app_panel_user_vpn_service_charge', ['id' => $service->getId()]);
  383.                         }
  384. //                      TODO:Check User Interest Rate For Price
  385.                         $buyPrice $this->dynamicPriceCalculation->calculatePrice($user$targetPlan);
  386.                         if ($user->getWallet() >= $buyPrice) {
  387.                             $serviceData $form->getData();
  388.                             $serviceData['clientId'] = $form->get('clientId')->getData();
  389.                             $this->service->chargeService($service$targetPlan$serviceData$user);
  390.                             $this->transaction->createTransaction($user$buyPrice"تمدید سرویس {$service->getClientId()}",
  391.                                 00null,  0,  nullnull,  0nulltrue 'VPN'
  392.                             );
  393.                             $this->addFlash('success''سرویس مد نظر با موفقیت تمدید شد');
  394.                             return $this->redirectToRoute('app_panel_user_vpn_service_index');
  395.                         } else {
  396.                             $this->addFlash('error''موجودی کیف پول شما کافی نمی باشد');
  397.                             return $this->redirectToRoute('app_panel_user_vpn_service_charge', ['id' => $service->getId()]);
  398.                         }
  399.                     }
  400.                     break;
  401.                 default:
  402.                     // Handle any default case if necessary
  403.                     break;
  404.             }
  405.             $forms[$formName] = $form->createView();
  406.         }
  407.         return $this->render('panel/pages/user/vpn/service/enter.html.twig', [
  408.             'sizedVipForm' => $forms['sizedVip'] ?? '',
  409.             'sizedV2rayForm' => $forms['sizedV2ray'] ?? '',
  410.             'unlimitedV2rayForm' => $forms['unlimitedV2ray'] ?? '',
  411.             'sizedOcServForm' => $forms['sizedOcServ'] ?? '',
  412.             'unlimitedOcServForm' => $forms['unlimitedOcServ'] ?? '',
  413.             'sizedOpenForm' => $forms['sizedOpen'] ?? '',
  414.             'unlimitedOpenForm' => $forms['unlimitedOpen'] ?? '',
  415.             'charge' => 1
  416.         ]);
  417.     }
  418.     #[Route('/edit/{id}'name'app_panel_user_vpn_service_edit'methods: ['GET''POST'])]
  419.     public function edit(Request $requestByteConvert $byteConvertServerRepository $serverRepository\App\Repository\VPN\OpenVPN\ServerRepository $openServerREpo\App\Repository\VPN\OcServ\ServerRepository $ocServerRepositoryService $service)
  420.     {
  421.         /**
  422.          * @var User $user
  423.          */
  424.         $user $this->getUser();
  425.         $form $this->createFormBuilder()
  426.             ->add('username'TextType::class, [
  427.                 'label' => 'نام کاربری',
  428.                 'data' => $service->getUsername()
  429.             ])->getForm();
  430.         $form->handleRequest($request);
  431.         if ($form->isSubmitted() && $form->isValid()) {
  432.             $service->setUsername($form->get('username')->getData());
  433.             $this->em->flush();
  434.             $this->addFlash('success''بروز شد');
  435.             return $this->redirectToRoute('app_panel_user_vpn_service_index');
  436.         }
  437.         return $this->render('panel/pages/user/vpn/service/edit.html.twig', [
  438.             'form' => $form->createView()
  439.         ]);
  440.     }
  441.     #[Route('/status/{id}'name'app_panel_user_vpn_service_status'methods: ['GET''POST'])]
  442.     public function changeStatus(Service $service)
  443.     {
  444.         if (!$service->isActive()) {
  445.             $this->addFlash('error''سرویس به پایان رسیده است نمیتواند وضعیتش تغییر پیدا کند');
  446.             return $this->redirectToRoute('app_panel_user_vpn_service_index');
  447.         }
  448.         $service->setIsEnabled(!$service->isEnabled());
  449.         $this->em->persist($service);
  450.         $this->em->flush();
  451.         return $this->redirectToRoute('app_panel_user_vpn_service_index');
  452.     }
  453.     #[Route('/rollback/{id}'name'app_panel_user_vpn_service_rollback'methods: ['GET''POST'])]
  454.     public function rollback(Service $serviceRequest $request)
  455.     {
  456.         $form $this->createForm(RollbackType::class);
  457.         $form->handleRequest($request);
  458.         if ($form->isSubmitted() && $form->isValid()) {
  459.             $service->setActive(0);
  460.             $service->setRollbackNote($form->get('reason')->getData());
  461.             $this->transaction->createTransaction($service->getOwner(), $service->getTotalPrice(), 1'مرجوع سرویس با شناسه : ' $service->getClientId(), $service'rollback'0);
  462.             $this->addFlash('success''با موفقیت انجام شد');
  463.             return $this->redirectToRoute('app_panel_user_vpn_service_index');
  464.         }
  465.         return $this->render('panel/pages/user/vpn/service/rollback.html.twig', [
  466.             'form' => $form->createView(),
  467.             'rollback' => 1
  468.         ]);
  469.     }
  470.     #[Route('/get-price-ajax'name'app_panel_user_vpn_service_get_price_ajax'methods: ['GET''POST'])]
  471.     public function getPriceAjax(ByteConvert $byteConvertRequest $request)
  472.     {
  473.         /**
  474.          * @var User $user
  475.          */
  476.         $user $this->getUser();
  477.         $queryArray $request->request->all();
  478.         unset($queryArray['country']);
  479.         unset($queryArray['password']);
  480.         unset($queryArray['username']);
  481.         unset($queryArray['price']);
  482.         unset($queryArray['_token']);
  483.         $queryArray['size'] = $byteConvert->toByte($queryArray['size'] . 'GB');
  484.         $queryArray['active'] = 1;
  485.         unset($queryArray['host']);
  486.         $targetPlan $this->em->getRepository(Plan::class)->findOneBy($queryArray);
  487. //        return $this->json(['res' => $queryArray]);
  488.         if (!$targetPlan) {
  489.             return $this->json(['message' => 'این بسته در حال حاضر ارائه نمیشود']);
  490.         } else {
  491.             if ($targetPlan->getServiceType() === 'unlimited') {
  492.                 $price $this->dynamicPriceCalculation->calculatePrice($user$targetPlan);
  493.                 return $this->json(['message' =>
  494.                     'با احتساب نمایندگی سطح ' .
  495.                     $this->dynamicPriceCalculation->getUserLevel($user$targetPlan)
  496.                     .
  497.                     ' شما قیمت : ' .
  498.                     number_format($price) .
  499.                     ' تومان'
  500.                 ]);
  501.             } else {
  502.                 $price $this->dynamicPriceCalculation->calculatePrice($user$targetPlan);
  503.                 return $this->json(['message' =>
  504.                     'با احتساب نمایندگی سطح ' .
  505.                     $this->dynamicPriceCalculation->getUserLevel($user$targetPlan)
  506.                     .
  507.                     ' شما قیمت از ' .
  508.                     number_format($targetPlan->getPrice()) . ' تومان' .
  509.                     ' به ' .
  510.                     number_format($price) .
  511.                     ' تومان' .
  512.                     ' کاهش یافت'
  513.                 ]);
  514.             }
  515.         }
  516.     }
  517.     public function countryCodeToFlag($countryCode)
  518.     {
  519.         // Convert country code to uppercase
  520.         $countryCode strtoupper($countryCode);
  521.         // Offset between uppercase ASCII and regional indicator symbols
  522.         $offset 127397;
  523.         // Convert each character of the country code to its flag emoji equivalent
  524.         $flagEmoji '';
  525.         for ($i 0$i strlen($countryCode); $i++) {
  526.             $flagEmoji .= $this->emoji_convert_unicode(ord($countryCode[$i]) + $offset);
  527.         }
  528.         return $flagEmoji;
  529.     }
  530. // Function to convert Unicode code point to emoji character
  531.     public function emoji_convert_unicode($unicode)
  532.     {
  533.         return mb_convert_encoding('&#' intval($unicode) . ';''UTF-8''HTML-ENTITIES');
  534.     }
  535. }