src/Controller/RechargePackController.php line 59

Open in your IDE?
  1. <?php
  2. // src/Controller/LuckyController.php
  3. namespace App\Controller;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\Routing\Annotation\Route;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Contracts\Translation\TranslatorInterface;
  9. use Symfony\Component\Validator\Validator\ValidatorInterface;
  10. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  11. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
  12. use FOS\RestBundle\Request\ParamFetcherInterface;
  13. use FOS\RestBundle\Controller\Annotations\QueryParam;
  14. use Symfony\Contracts\HttpClient\HttpClientInterface;
  15. use Symfony\Component\Form\FormError;
  16. use Doctrine\ORM\EntityManagerInterface;
  17. use App\Entity\RechargePack;
  18. use App\Entity\Region;
  19. use App\Entity\Country;
  20. use App\Entity\Esim;
  21. use App\Entity\TugeEsim;
  22. use App\Entity\AiraloEsim;
  23. use App\Form\RechargePackType;
  24. use App\Logic\AiraloLogic;
  25. use App\Helper\SettingsHelper;
  26. class RechargePackController extends AbstractController
  27. {
  28.     protected $em;
  29.     protected $httpClient;
  30.     public function __construct(EntityManagerInterface $emHttpClientInterface $httpClient){
  31.         $this->em $em;
  32.         $this->httpClient $httpClient;
  33.     }
  34.     /**
  35.     * @Route({
  36.      *     "en": "/recharge-packs",
  37.      *     "es": "/paquetes-de-recarga",
  38.      *     "de": "/aufladepakete",
  39.      *     "fr": "/packs-de-recharge",
  40.      *     "it": "/pacchetti-di-ricarica",
  41.      *     "pt": "/pacotes-de-recarga",
  42.      *     "cn": "/recharge-packs_cn",
  43.      *     "cn2": "/recharge-packs_cn2",
  44.      * }, name="recharge_packs")
  45.     * @QueryParam(name="region_id", requirements="\d+", default=null, nullable=true, strict=true, description="Region Id.")
  46.     * @QueryParam(name="esim_id", requirements="\d+", default=null, nullable=true, strict=true, description="Esim Id.")
  47.     * @QueryParam(name="tuge_esim_id", requirements="\d+", default=null, nullable=true, strict=true, description="Tuge Esim Id.")
  48.     * @QueryParam(name="airalo_esim_id", requirements="\d+", default=null, nullable=true, strict=true, description="Airalo Esim Id.")
  49.      */    
  50.     public function index(Request $requestParamFetcherInterface $paramFetcherSettingsHelper $settingsHelperAiraloLogic $airaloLogic)
  51.     {
  52.         $regionId $paramFetcher->get('region_id');
  53.         $esimId $paramFetcher->get('esim_id');
  54.         $tugeEsimId $paramFetcher->get('tuge_esim_id');
  55.         $airaloEsimId $paramFetcher->get('airalo_esim_id');
  56.         $priceValueInPesos $request->cookies->has('country') && $request->cookies->get('country') == 'ar';
  57.         $region null;
  58.         
  59.         if($regionId) {
  60.             $region $this->em->getReference(Region::class, $regionId);
  61.             $region->setTranslatableLocale($request->getLocale());
  62.             $this->em->refresh($region);
  63.             if(!$region)
  64.                 throw $this->createNotFoundException('Region not found');
  65.         }
  66.         $rechargePacks = [];
  67.         $rechargePacksCallSms = [];
  68.         $esim null;
  69.         if(!$regionId || $region->getIsEnabled()){
  70.     
  71.             if($esimId || $tugeEsimId || $airaloEsimId) {
  72.                 if($tugeEsimId)
  73.                     $esim $this->em->getReference(TugeEsim::class, $tugeEsimId);
  74.                 else if($airaloEsimId)
  75.                     $esim $this->em->getReference(AiraloEsim::class, $airaloEsimId);
  76.                 else
  77.                     $esim $this->em->getReference(Esim::class, $esimId);
  78.                 if(!$this->getUser())
  79.                     throw $this->createAccessDeniedException('Esim does not belong to user');
  80.                 if(  !$esim->getPurchaseTransaction() || $esim->getPurchaseTransaction()->getUser()->getId() != $this->getUser()->getId() )
  81.                     throw $this->createAccessDeniedException('Esim does not belong to user');
  82.                 if(!$esim)
  83.                     throw $this->createNotFoundException('Esim not found');
  84.             }
  85.             $repo $this->em->getRepository(RechargePack::class);
  86.             if($esim){
  87.                 
  88.                 if($esim->getClassName() == 'AiraloEsim'){
  89.                     $rechargePacks = [];
  90.                     $response $airaloLogic->fetchTopupPlansForEsim($esim);
  91.                     $data $response['data'];
  92.                     foreach ($data as $package) {
  93.                         if ( $rechargePack $repo->findByAiraloProductCode($package['id'], true$request->getLocale()) )
  94.                             $rechargePacks[] = $rechargePack;
  95.                     }
  96.                 } else if ($esim->getClassName() == 'TugeEsim') {
  97.                     $rechargePacks $repo->findByTugeProductCode($esim->getPurchaseTransaction()->getRechargePack()->getTugeDataPlan()->getProductCode(), true$request->getLocale());    
  98.                 } else {
  99.                     $rechargePacks $repo->findAllByAvailable(true$esim->getRegion(), truefalsefalsenull$request->getLocale(), 'data');    
  100.                     $rechargePacksCallSms $repo->findAllByAvailable(true$esim->getRegion(), truefalsefalsenull$request->getLocale(), 'call_sms');    
  101.                 }
  102.                 
  103.             }
  104.             else  {
  105.                 $rechargePacks $repo->findAllByAvailable(true$regiontruetruefalsenull$request->getLocale(), 'data');
  106.                 $rechargePacksCallSms $repo->findAllByAvailable(true$regiontruetruefalsenull$request->getLocale(), 'call_sms');
  107.             }
  108.         }
  109.         $countriesRepo $this->em->getRepository(Country::class);
  110.         foreach($rechargePacks as &$rechargePack){
  111.             $region $rechargePack->getRegion();
  112.             $countries $countriesRepo->findByRegion($region$request->getLocale());    
  113.             $region->setTranslatedCountries($countries);                
  114.         }
  115.                 
  116. //     * @IsGranted("ROLE_USER")
  117.         return $this->render('jelly/recharge_packs/index.html.twig', [
  118.             'region' => $region,
  119.             'esim' => $esim,
  120.             'rechargePacks' => $rechargePacks,        
  121.             'rechargePacksCallSms' => $rechargePacksCallSms,        
  122.             'simActivationPriceValue' => $esimId null $settingsHelper->getSetting('simActivationPriceValue' . ($priceValueInPesos 'InPesos' '')),
  123.         ]);
  124.     }
  125.     /**
  126.     * @Route("/admin/recharge-packs", name="recharge_packs_list")
  127.      * @QueryParam(name="page", requirements="\d+", default=1, description="Page number.")
  128.      * @QueryParam(name="sort", requirements="e.iccid|u.lastName|r.descriptionEs|e.createdAt", description="Sort.")
  129.      * @QueryParam(name="dir", requirements="asc|desc", default="asc", description="Sort direction.")         
  130.     * @QueryParam(name="region_id", requirements="\d+", default=null, nullable=true, strict=true, description="Region Id.")
  131.     * @QueryParam(name="amount_gb", requirements="\d+", default=null, nullable=true, strict=true, description="Amount GB.")
  132.     * @QueryParam(name="length_days", requirements="\d+", default=null, nullable=true, strict=true, description="Length in days.")
  133.     * @IsGranted("ROLE_ADMIN")
  134.      */    
  135.     public function adminIndex(Request $requestParamFetcherInterface $paramFetcher)
  136.     {
  137.         // parameters
  138.         $page $paramFetcher->get('page');
  139.         $sort $paramFetcher->get('sort');
  140.         $dir $paramFetcher->get('dir');
  141.         $regionId $paramFetcher->get('region_id');
  142.         $amountGb $paramFetcher->get('amount_gb');
  143.         $lengthDays $paramFetcher->get('length_days');
  144.         // query
  145.         $results_per_page $this->getParameter('app.results_per_page');        
  146.         // filters
  147.         $currentFilters = [];
  148.         if($sort){
  149.             $currentFilters['sort'] = $sort;
  150.             $currentFilters['dir'] = $dir;          
  151.         } 
  152.         $currentFilters['region_id'] = $regionId;
  153.         $currentFilters['amount_gb'] = $amountGb;
  154.         $repo $this->em->getRepository(RechargePack::class);
  155.         $repoRegions $this->em->getRepository(Region::class);
  156.         $rechargePacks $repo->getList($sort$dir$page$results_per_page$regionId$amountGb$lengthDays);
  157.         if($lengthDays && is_numeric($lengthDays) && $lengthDays 0){
  158.             foreach($rechargePacks as &$rechargePack){
  159.                 $rechargePack->setLengthInDays($lengthDays);
  160.             }
  161.             $this->em->flush();
  162.             return $this->redirectToRoute('recharge_packs_list'$currentFilters);
  163.         }
  164.         $totalPages ceil(count($rechargePacks) / $results_per_page);
  165.     
  166.         $regions $repoRegions->findAllByAvailable(nullnulltrue);        
  167. //     * @IsGranted("ROLE_USER")
  168.         return $this->render('angle/recharge_packs/index.html.twig', [
  169.             'rechargePacks' => $rechargePacks,        
  170.             'page' => $page,
  171.             'totalPages' => $totalPages,
  172.             'totalResults' =>  count($rechargePacks),            
  173.             'currentFilters' => $currentFilters,
  174.             'results_per_page' => $results_per_page,
  175.             'regions' => $regions,
  176.         ]);
  177.     }    
  178.    /**
  179.      * @Route("/admin/recharge-pack", name="recharge_packs_new", methods={"GET", "POST"})
  180.      * @Route("/admin/recharge-pack/{rechargePackId}", name="recharge_packs_edit", methods={"GET", "POST"})
  181.      * @QueryParam(name="currentPage", requirements="\d+", default=null, nullable=true, description="Current page.")
  182.      * @IsGranted("ROLE_ADMIN")
  183.     */    
  184.     public function detail(Request $requestParamFetcherInterface $paramFetcherHttpClientInterface $httpClient$rechargePackId null)
  185.     {
  186.         $currentPage $paramFetcher->get('currentPage');
  187.         $repository $this->getDoctrine()->getRepository(RechargePack::class);
  188.         $rechargePack = new RechargePack;
  189.         if($rechargePackId){
  190.             $rechargePack $repository->find($rechargePackId)            ;
  191.             if(!$rechargePack)
  192.                 throw $this->createNotFoundException();
  193.             $rechargePack->setTranslatableLocale($request->getSession()->get('locale'));
  194.             $this->em->refresh($rechargePack);
  195.         }
  196.         $form $this->createForm(RechargePackType::class, $rechargePack);
  197.         $form->handleRequest($request);
  198.         if ($form->isSubmitted() && $form->isValid()) {
  199.             $rechargePack $form->getData();
  200.             $this->setOrder($rechargePack);
  201.             // if(!$rechargePack->getTugeDataPlan()){
  202.             //     try {
  203.             //         $clientResponse = $httpClient->request(
  204.             //                     'POST',
  205.             //                     "https://ws.telna.com/ds/u/distributorPPUService/v1/{$this->getParameter('telna_distributor_id')}/inventory/48096/packageType"
  206.             //                     , [ "headers" => ["RequestId" => time(), "Content-type" => "application/json"], "json" => 
  207.             //                         [
  208.             //                             'activationTimeAllowanceInSeconds' => 3600
  209.             //                             , 'activationType' => 'LU'
  210.             //                             , 'dataUsageAllowanceInBytes' => (int) round($rechargePack->getAmountGb() * 1024 * 1024 * 1024)
  211.             //                             , 'dataUsageAllowanceType' => 'LIMITED'
  212.             //                             , 'dateEarliestActivation' => (new \Datetime)->getTimestamp() * 1000
  213.             //                             , 'dateEarliestAvailable' => (new \Datetime)->getTimestamp() * 1000
  214.             //                             , 'dateLatestAvailable' => (new \Datetime)->modify('+10 year')->getTimestamp() * 1000
  215.             //                             , 'name' => "beconnected_REGION_{$rechargePack->getRegion()->getId()}_{$rechargePack->getAmountGb()}_GB_{$rechargePack->getLengthInDays()}_DAYS"
  216.             //                             , 'smsUsageAllowanceInNums' => 0
  217.             //                             , 'smsUsageAllowanceType' => 'LIMITED'
  218.             //                             , 'supportedCountries' => array_map(function(&$country){ return $country->getCountryCode(); }, $rechargePack->getRegion()->getCountries()->toArray() )
  219.             //                             , 'timeAllowanceInSeconds' => $rechargePack->getLengthInDays() * 86400
  220.             //                             , 'voiceUsageAllowanceInSeconds' => 0
  221.             //                             , 'voiceUsageAllowanceType' => 'LIMITED'
  222.             //                         ] 
  223.             //                       ]
  224.             //                 );
  225.             
  226.             //         $content = $clientResponse->toArray();
  227.             //         if(is_array($content) && array_key_exists("packageTypeId", $content)) {
  228.             //             $rechargePack->setPackageTypeId($content["packageTypeId"]);                    
  229.                         
  230.             //             $em = $this->getDoctrine()->getManager();
  231.             //             $em->persist($rechargePack);
  232.             //             $em->flush();
  233.             //         } else {
  234.             //             $form->addError(new FormError("Se produjo un error al crear el paquete en Cronus: {$e->getMessage()}"));                
  235.             //         }
  236.             //         return $this->redirectToRoute('recharge_packs_list');
  237.             //     } catch( \Exception $e) {
  238.             //         $form->addError(new FormError("Se produjo un error al crear el paquete en Cronus: {$e->getMessage()}"));                
  239.             //     }
  240.             // } else {
  241.                 $em $this->getDoctrine()->getManager();
  242.                 $rechargePack->setTranslatableLocale($request->getSession()->get('locale')); // change locale
  243.                 $em->persist($rechargePack);
  244.                 $em->flush();
  245.                 return $this->redirectToRoute('recharge_packs_list', ['currentPage' => $currentPage]);
  246.             // }
  247.         }
  248.         $tiendaNubeProducts $this->getTiendaNubeProductsByCategpry("18018973");
  249.         return $this->render('angle/recharge_packs/detail.html.twig', [
  250.             'form' => $form->createView(),
  251.             'rechargePack' => $rechargePack,
  252.             'tiendaNubeProducts' => $tiendaNubeProducts,
  253.             'currentPage' => $currentPage,
  254.         ]);
  255.     }   
  256.     /**
  257.      * @Route(
  258.      *     "/services/rearrange_recharge_packs.{_format}", 
  259.      *     name="recharge_packs_rearrange",
  260.      *     defaults={
  261.      *         "_format": "json",
  262.      *     }
  263.      * )
  264.      //* @Method({"POST"})     
  265.      * @IsGranted("ROLE_ADMIN")     
  266.      */
  267.     public function rearrangeAction(Request $request)
  268.     {
  269.         $id $request->request->get('id');
  270.         $order $request->request->get('order');
  271.         $repository $this->getDoctrine()->getRepository(RechargePack::class);
  272.         
  273.         $repository->updateOrder($id$order);
  274.         return ['ok' => true];
  275.         
  276.     }     
  277.     
  278.      /**
  279.      * @IsGranted("ROLE_ADMIN")     
  280.      * @Route(
  281.      *    "/services/recharge_pack.{_format}", 
  282.      *     name="recharge_packs_enable",
  283.      *     requirements={
  284.      *         "_format": "json"
  285.      *     },
  286.      *     methods={"POST"}
  287.      * )
  288.      */
  289.     public function enable(Request $request)
  290.     {        
  291.      
  292.         $repository $this->getDoctrine()->getRepository(RechargePack::class);
  293.         $id $request->query->get('id');
  294.         $enable $request->query->get('enable') == "true";
  295.         
  296.         if($id){
  297.             $entity $repository->findOneById($id);
  298.             
  299.             $em $this->getDoctrine()->getManager();
  300.             $entity->setIsEnabled($enable);
  301.             $em->flush();
  302.         }
  303.         return ['ok' => true];
  304.     }     
  305.      /**
  306.      * @IsGranted("ROLE_ADMIN")     
  307.      * @Route(
  308.      *    "/services/tiendanube_variants.{_format}", 
  309.      *     name="tiendanube_variants",
  310.      *     requirements={
  311.      *         "_format": "json"
  312.      *     },
  313.      *     methods={"GET"}
  314.      * )
  315.      */
  316.     public function tiendaNubeVariants(Request $request)
  317.     {        
  318.      
  319.         $id $request->query->get('id');
  320.         $headers = [
  321.             "Authentication: bearer {$this->getParameter('tiendanube_token')}",
  322.             'Accept: application/json',
  323.             'Content-type: application/json',
  324.             'User-Agent: beconnected (grago@blkpos.com)',
  325.         ];
  326.         $ch curl_init();
  327.         curl_setopt($chCURLOPT_URL"https://api.tiendanube.com/v1/861454/products/{$id}/variants?fields=id,values");
  328.         curl_setopt($chCURLOPT_RETURNTRANSFER1);
  329.         curl_setopt($chCURLOPT_HTTPHEADER$headers);
  330.         $response json_decode(curl_exec($ch), true);
  331.         return ['ok' => true'variants' => $response];
  332.     }         
  333.     private function setOrderRechargePack $rechargePack ){
  334.         if ( ! $rechargePack->getSortOrder() ) {
  335.             $repo $this->getDoctrine()->getRepository(RechargePack::class);      
  336.             $rechargePack->setSortOrder$repo->findLastOrder() + );
  337.         }
  338.         return $rechargePack;
  339.     }
  340.     private function getTiendaNubeProductsByCategpry($categoryId){
  341.         $headers = [
  342.             "Authentication: bearer {$this->getParameter('tiendanube_token')}",
  343.             'Accept: application/json',
  344.             'Content-type: application/json',
  345.             'User-Agent: beconnected (grago@blkpos.com)',
  346.         ];
  347.         $ch curl_init();
  348.         curl_setopt($chCURLOPT_URL"https://api.tiendanube.com/v1/861454/products?category_id={$categoryId}&fields=id,name&per_page=200");
  349.         curl_setopt($chCURLOPT_RETURNTRANSFER1);
  350.         curl_setopt($chCURLOPT_HTTPHEADER$headers);
  351.         $response json_decode(curl_exec($ch));
  352.         return $response;
  353.     }
  354.     private function getTiendaNubeCategories(){
  355.         $headers = [
  356.             "Authentication: bearer {$this->getParameter('tiendanube_token')}",
  357.             'Accept: application/json',
  358.             'Content-type: application/json',
  359.             'User-Agent: beconnected (grago@blkpos.com)',
  360.         ];
  361.         $ch curl_init();
  362.         curl_setopt($chCURLOPT_URL"https://api.tiendanube.com/v1/861454/categories?fields=id,name");
  363.         curl_setopt($chCURLOPT_RETURNTRANSFER1);
  364.         curl_setopt($chCURLOPT_HTTPHEADER$headers);
  365.         $response json_decode(curl_exec($ch));
  366.         return $response;
  367.     }    
  368. }