<?php
// src/Controller/LuckyController.php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use FOS\RestBundle\Request\ParamFetcherInterface;
use FOS\RestBundle\Controller\Annotations\QueryParam;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Component\Form\FormError;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\RechargePack;
use App\Entity\Region;
use App\Entity\Country;
use App\Entity\Esim;
use App\Entity\TugeEsim;
use App\Entity\AiraloEsim;
use App\Form\RechargePackType;
use App\Logic\AiraloLogic;
use App\Helper\SettingsHelper;
class RechargePackController extends AbstractController
{
protected $em;
protected $httpClient;
public function __construct(EntityManagerInterface $em, HttpClientInterface $httpClient){
$this->em = $em;
$this->httpClient = $httpClient;
}
/**
* @Route({
* "en": "/recharge-packs",
* "es": "/paquetes-de-recarga",
* "de": "/aufladepakete",
* "fr": "/packs-de-recharge",
* "it": "/pacchetti-di-ricarica",
* "pt": "/pacotes-de-recarga",
* "cn": "/recharge-packs_cn",
* "cn2": "/recharge-packs_cn2",
* }, name="recharge_packs")
* @QueryParam(name="region_id", requirements="\d+", default=null, nullable=true, strict=true, description="Region Id.")
* @QueryParam(name="esim_id", requirements="\d+", default=null, nullable=true, strict=true, description="Esim Id.")
* @QueryParam(name="tuge_esim_id", requirements="\d+", default=null, nullable=true, strict=true, description="Tuge Esim Id.")
* @QueryParam(name="airalo_esim_id", requirements="\d+", default=null, nullable=true, strict=true, description="Airalo Esim Id.")
*/
public function index(Request $request, ParamFetcherInterface $paramFetcher, SettingsHelper $settingsHelper, AiraloLogic $airaloLogic)
{
$regionId = $paramFetcher->get('region_id');
$esimId = $paramFetcher->get('esim_id');
$tugeEsimId = $paramFetcher->get('tuge_esim_id');
$airaloEsimId = $paramFetcher->get('airalo_esim_id');
$priceValueInPesos = $request->cookies->has('country') && $request->cookies->get('country') == 'ar';
$region = null;
if($regionId) {
$region = $this->em->getReference(Region::class, $regionId);
$region->setTranslatableLocale($request->getLocale());
$this->em->refresh($region);
if(!$region)
throw $this->createNotFoundException('Region not found');
}
$rechargePacks = [];
$rechargePacksCallSms = [];
$esim = null;
if(!$regionId || $region->getIsEnabled()){
if($esimId || $tugeEsimId || $airaloEsimId) {
if($tugeEsimId)
$esim = $this->em->getReference(TugeEsim::class, $tugeEsimId);
else if($airaloEsimId)
$esim = $this->em->getReference(AiraloEsim::class, $airaloEsimId);
else
$esim = $this->em->getReference(Esim::class, $esimId);
if(!$this->getUser())
throw $this->createAccessDeniedException('Esim does not belong to user');
if( !$esim->getPurchaseTransaction() || $esim->getPurchaseTransaction()->getUser()->getId() != $this->getUser()->getId() )
throw $this->createAccessDeniedException('Esim does not belong to user');
if(!$esim)
throw $this->createNotFoundException('Esim not found');
}
$repo = $this->em->getRepository(RechargePack::class);
if($esim){
if($esim->getClassName() == 'AiraloEsim'){
$rechargePacks = [];
$response = $airaloLogic->fetchTopupPlansForEsim($esim);
$data = $response['data'];
foreach ($data as $package) {
if ( $rechargePack = $repo->findByAiraloProductCode($package['id'], true, $request->getLocale()) )
$rechargePacks[] = $rechargePack;
}
} else if ($esim->getClassName() == 'TugeEsim') {
$rechargePacks = $repo->findByTugeProductCode($esim->getPurchaseTransaction()->getRechargePack()->getTugeDataPlan()->getProductCode(), true, $request->getLocale());
} else {
$rechargePacks = $repo->findAllByAvailable(true, $esim->getRegion(), true, false, false, null, $request->getLocale(), 'data');
$rechargePacksCallSms = $repo->findAllByAvailable(true, $esim->getRegion(), true, false, false, null, $request->getLocale(), 'call_sms');
}
}
else {
$rechargePacks = $repo->findAllByAvailable(true, $region, true, true, false, null, $request->getLocale(), 'data');
$rechargePacksCallSms = $repo->findAllByAvailable(true, $region, true, true, false, null, $request->getLocale(), 'call_sms');
}
}
$countriesRepo = $this->em->getRepository(Country::class);
foreach($rechargePacks as &$rechargePack){
$region = $rechargePack->getRegion();
$countries = $countriesRepo->findByRegion($region, $request->getLocale());
$region->setTranslatedCountries($countries);
}
// * @IsGranted("ROLE_USER")
return $this->render('jelly/recharge_packs/index.html.twig', [
'region' => $region,
'esim' => $esim,
'rechargePacks' => $rechargePacks,
'rechargePacksCallSms' => $rechargePacksCallSms,
'simActivationPriceValue' => $esimId ? null : $settingsHelper->getSetting('simActivationPriceValue' . ($priceValueInPesos ? 'InPesos' : '')),
]);
}
/**
* @Route("/admin/recharge-packs", name="recharge_packs_list")
* @QueryParam(name="page", requirements="\d+", default=1, description="Page number.")
* @QueryParam(name="sort", requirements="e.iccid|u.lastName|r.descriptionEs|e.createdAt", description="Sort.")
* @QueryParam(name="dir", requirements="asc|desc", default="asc", description="Sort direction.")
* @QueryParam(name="region_id", requirements="\d+", default=null, nullable=true, strict=true, description="Region Id.")
* @QueryParam(name="amount_gb", requirements="\d+", default=null, nullable=true, strict=true, description="Amount GB.")
* @QueryParam(name="length_days", requirements="\d+", default=null, nullable=true, strict=true, description="Length in days.")
* @IsGranted("ROLE_ADMIN")
*/
public function adminIndex(Request $request, ParamFetcherInterface $paramFetcher)
{
// parameters
$page = $paramFetcher->get('page');
$sort = $paramFetcher->get('sort');
$dir = $paramFetcher->get('dir');
$regionId = $paramFetcher->get('region_id');
$amountGb = $paramFetcher->get('amount_gb');
$lengthDays = $paramFetcher->get('length_days');
// query
$results_per_page = $this->getParameter('app.results_per_page');
// filters
$currentFilters = [];
if($sort){
$currentFilters['sort'] = $sort;
$currentFilters['dir'] = $dir;
}
$currentFilters['region_id'] = $regionId;
$currentFilters['amount_gb'] = $amountGb;
$repo = $this->em->getRepository(RechargePack::class);
$repoRegions = $this->em->getRepository(Region::class);
$rechargePacks = $repo->getList($sort, $dir, $page, $results_per_page, $regionId, $amountGb, $lengthDays);
if($lengthDays && is_numeric($lengthDays) && $lengthDays > 0){
foreach($rechargePacks as &$rechargePack){
$rechargePack->setLengthInDays($lengthDays);
}
$this->em->flush();
return $this->redirectToRoute('recharge_packs_list', $currentFilters);
}
$totalPages = ceil(count($rechargePacks) / $results_per_page);
$regions = $repoRegions->findAllByAvailable(null, null, true);
// * @IsGranted("ROLE_USER")
return $this->render('angle/recharge_packs/index.html.twig', [
'rechargePacks' => $rechargePacks,
'page' => $page,
'totalPages' => $totalPages,
'totalResults' => count($rechargePacks),
'currentFilters' => $currentFilters,
'results_per_page' => $results_per_page,
'regions' => $regions,
]);
}
/**
* @Route("/admin/recharge-pack", name="recharge_packs_new", methods={"GET", "POST"})
* @Route("/admin/recharge-pack/{rechargePackId}", name="recharge_packs_edit", methods={"GET", "POST"})
* @QueryParam(name="currentPage", requirements="\d+", default=null, nullable=true, description="Current page.")
* @IsGranted("ROLE_ADMIN")
*/
public function detail(Request $request, ParamFetcherInterface $paramFetcher, HttpClientInterface $httpClient, $rechargePackId = null)
{
$currentPage = $paramFetcher->get('currentPage');
$repository = $this->getDoctrine()->getRepository(RechargePack::class);
$rechargePack = new RechargePack;
if($rechargePackId){
$rechargePack = $repository->find($rechargePackId) ;
if(!$rechargePack)
throw $this->createNotFoundException();
$rechargePack->setTranslatableLocale($request->getSession()->get('locale'));
$this->em->refresh($rechargePack);
}
$form = $this->createForm(RechargePackType::class, $rechargePack);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$rechargePack = $form->getData();
$this->setOrder($rechargePack);
// if(!$rechargePack->getTugeDataPlan()){
// try {
// $clientResponse = $httpClient->request(
// 'POST',
// "https://ws.telna.com/ds/u/distributorPPUService/v1/{$this->getParameter('telna_distributor_id')}/inventory/48096/packageType"
// , [ "headers" => ["RequestId" => time(), "Content-type" => "application/json"], "json" =>
// [
// 'activationTimeAllowanceInSeconds' => 3600
// , 'activationType' => 'LU'
// , 'dataUsageAllowanceInBytes' => (int) round($rechargePack->getAmountGb() * 1024 * 1024 * 1024)
// , 'dataUsageAllowanceType' => 'LIMITED'
// , 'dateEarliestActivation' => (new \Datetime)->getTimestamp() * 1000
// , 'dateEarliestAvailable' => (new \Datetime)->getTimestamp() * 1000
// , 'dateLatestAvailable' => (new \Datetime)->modify('+10 year')->getTimestamp() * 1000
// , 'name' => "beconnected_REGION_{$rechargePack->getRegion()->getId()}_{$rechargePack->getAmountGb()}_GB_{$rechargePack->getLengthInDays()}_DAYS"
// , 'smsUsageAllowanceInNums' => 0
// , 'smsUsageAllowanceType' => 'LIMITED'
// , 'supportedCountries' => array_map(function(&$country){ return $country->getCountryCode(); }, $rechargePack->getRegion()->getCountries()->toArray() )
// , 'timeAllowanceInSeconds' => $rechargePack->getLengthInDays() * 86400
// , 'voiceUsageAllowanceInSeconds' => 0
// , 'voiceUsageAllowanceType' => 'LIMITED'
// ]
// ]
// );
// $content = $clientResponse->toArray();
// if(is_array($content) && array_key_exists("packageTypeId", $content)) {
// $rechargePack->setPackageTypeId($content["packageTypeId"]);
// $em = $this->getDoctrine()->getManager();
// $em->persist($rechargePack);
// $em->flush();
// } else {
// $form->addError(new FormError("Se produjo un error al crear el paquete en Cronus: {$e->getMessage()}"));
// }
// return $this->redirectToRoute('recharge_packs_list');
// } catch( \Exception $e) {
// $form->addError(new FormError("Se produjo un error al crear el paquete en Cronus: {$e->getMessage()}"));
// }
// } else {
$em = $this->getDoctrine()->getManager();
$rechargePack->setTranslatableLocale($request->getSession()->get('locale')); // change locale
$em->persist($rechargePack);
$em->flush();
return $this->redirectToRoute('recharge_packs_list', ['currentPage' => $currentPage]);
// }
}
$tiendaNubeProducts = $this->getTiendaNubeProductsByCategpry("18018973");
return $this->render('angle/recharge_packs/detail.html.twig', [
'form' => $form->createView(),
'rechargePack' => $rechargePack,
'tiendaNubeProducts' => $tiendaNubeProducts,
'currentPage' => $currentPage,
]);
}
/**
* @Route(
* "/services/rearrange_recharge_packs.{_format}",
* name="recharge_packs_rearrange",
* defaults={
* "_format": "json",
* }
* )
//* @Method({"POST"})
* @IsGranted("ROLE_ADMIN")
*/
public function rearrangeAction(Request $request)
{
$id = $request->request->get('id');
$order = $request->request->get('order');
$repository = $this->getDoctrine()->getRepository(RechargePack::class);
$repository->updateOrder($id, $order);
return ['ok' => true];
}
/**
* @IsGranted("ROLE_ADMIN")
* @Route(
* "/services/recharge_pack.{_format}",
* name="recharge_packs_enable",
* requirements={
* "_format": "json"
* },
* methods={"POST"}
* )
*/
public function enable(Request $request)
{
$repository = $this->getDoctrine()->getRepository(RechargePack::class);
$id = $request->query->get('id');
$enable = $request->query->get('enable') == "true";
if($id){
$entity = $repository->findOneById($id);
$em = $this->getDoctrine()->getManager();
$entity->setIsEnabled($enable);
$em->flush();
}
return ['ok' => true];
}
/**
* @IsGranted("ROLE_ADMIN")
* @Route(
* "/services/tiendanube_variants.{_format}",
* name="tiendanube_variants",
* requirements={
* "_format": "json"
* },
* methods={"GET"}
* )
*/
public function tiendaNubeVariants(Request $request)
{
$id = $request->query->get('id');
$headers = [
"Authentication: bearer {$this->getParameter('tiendanube_token')}",
'Accept: application/json',
'Content-type: application/json',
'User-Agent: beconnected (grago@blkpos.com)',
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.tiendanube.com/v1/861454/products/{$id}/variants?fields=id,values");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = json_decode(curl_exec($ch), true);
return ['ok' => true, 'variants' => $response];
}
private function setOrder( RechargePack $rechargePack ){
if ( ! $rechargePack->getSortOrder() ) {
$repo = $this->getDoctrine()->getRepository(RechargePack::class);
$rechargePack->setSortOrder( $repo->findLastOrder() + 1 );
}
return $rechargePack;
}
private function getTiendaNubeProductsByCategpry($categoryId){
$headers = [
"Authentication: bearer {$this->getParameter('tiendanube_token')}",
'Accept: application/json',
'Content-type: application/json',
'User-Agent: beconnected (grago@blkpos.com)',
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.tiendanube.com/v1/861454/products?category_id={$categoryId}&fields=id,name&per_page=200");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = json_decode(curl_exec($ch));
return $response;
}
private function getTiendaNubeCategories(){
$headers = [
"Authentication: bearer {$this->getParameter('tiendanube_token')}",
'Accept: application/json',
'Content-type: application/json',
'User-Agent: beconnected (grago@blkpos.com)',
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.tiendanube.com/v1/861454/categories?fields=id,name");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = json_decode(curl_exec($ch));
return $response;
}
}