<?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 Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use FOS\RestBundle\Request\ParamFetcherInterface;
use FOS\RestBundle\Controller\Annotations\QueryParam;
use Doctrine\ORM\EntityManagerInterface;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use App\Entity\Region;
use App\Form\RegionType;
class RegionController extends AbstractController
{
protected $em;
public function __construct(EntityManagerInterface $em){
$this->em = $em;
}
/**
* @Route({
* "en": "/regions/{regionDescription}",
* "es": "/regiones/{regionDescription}",
* "de": "/regionen/{regionDescription}",
* "fr": "/regions_fr/{regionDescription}",
* "it": "/regioni/{regionDescription}",
* "pt": "/regioes/{regionDescription}",
* "cn": "/regions_cn/{regionDescription}",
* "cn2": "/regions_cn2/{regionDescription}",
* }, name="regions")
*/
public function regions(Request $request, ParamFetcherInterface $paramFetcher, string $regionDescription)
{
$repo = $this->em->getRepository(Region::class);
$region = $repo->findOneBy(['description' => $regionDescription]);
if(!$region || !$region->getIsEnabled())
throw $this->createNotFoundException('Region not found');
$regions = $repo->findAllByAvailable(null, $region->getId(), true, $request->getLocale());
if(count($regions) == 1)
return $this->redirectToRoute('recharge_packs',['region_id' => $regions[0]->getId() ]);
return $this->render('jelly/regions/index.html.twig', [
'region' => $region,
'regions' => $regions,
]);
}
/**
* @Route("/admin/regions", name="regions_list")
* @QueryParam(name="page", requirements="\d+", default=1, description="Page number.")
* @QueryParam(name="sort", requirements="e.iccid|u.amountGb|u.priceValue|u.reference|u.createdAt|u.transactedAt|us.lastName|u.customerSubscription|rp.amountGb|rp.priceValue", description="Sort.")
* @QueryParam(name="dir", requirements="asc|desc", default="asc", description="Sort direction.")
* @IsGranted("ROLE_ADMIN")
*/
public function index(Request $request, ParamFetcherInterface $paramFetcher)
{
// parameters
$page = $paramFetcher->get('page');
$sort = $paramFetcher->get('sort');
$dir = $paramFetcher->get('dir');
// query
$results_per_page = $this->getParameter('app.results_per_page');
// filters
$currentFilters = [];
if($sort){
$currentFilters['sort'] = $sort;
$currentFilters['dir'] = $dir;
}
$repo = $this->em->getRepository(Region::class);
$regions = $repo->getList($sort, $dir, $page, $results_per_page);
$totalPages = ceil(count($regions) / $results_per_page);
// * @IsGranted("ROLE_USER")
return $this->render('angle/regions/index.html.twig', [
'regions' => $regions,
'page' => $page,
'totalPages' => $totalPages,
'totalResults' => count($regions),
'currentFilters' => $currentFilters,
'results_per_page' => $results_per_page,
]);
}
/**
* @Route("/admin/region", name="regions_new", methods={"GET", "POST"})
* @Route("/admin/region/{regionId}", name="region_edit", methods={"GET", "POST"})
* @IsGranted("ROLE_ADMIN")
*/
public function detail(Request $request, ParamFetcherInterface $paramFetcher, SluggerInterface $slugger, KernelInterface $appKernel, HttpClientInterface $httpClient, $regionId = null)
{
$repository = $this->getDoctrine()->getRepository(Region::class);
if($regionId){
$region = $repository->find($regionId);
$region->setTranslatableLocale($request->getSession()->get('locale'));
$this->em->refresh($region);
} else $region = new Region;
$repository = $this->getDoctrine()->getRepository(Region::class);
$form = $this->createForm(RegionType::class, $region);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$region = $form->getData();
$this->setOrder($region);
if(!$regionId){
$slugIndex = 0;
do {
$slug = strtolower($slugger->slug($region->getDescriptionEs())) . ($slugIndex > 0 ? "-{$slugIndex}" : "");
$existingRegion = $repository->findOneBy(['description' => $slug]);
$slugIndex++;
} while ($existingRegion != null);
$region->setDescription($slug);
} else {
$slug = strtolower($slugger->slug($region->getDescriptionEs()));
}
$image = $form->get('image')->getData();
if ($image) {
$imagePath = $appKernel->getProjectDir() . "/public/imgs/regions/icons/{$slug}.jpg";
\imagejpeg(\imagecreatefromstring(\file_get_contents($image->getRealPath())), $imagePath );
}
$imageBanner = $form->get('imageBanner')->getData();
if ($imageBanner) {
$imagePath = $appKernel->getProjectDir() . "/public/imgs/regions/banners/{$slug}.jpg";
\imagejpeg(\imagecreatefromstring(\file_get_contents($imageBanner->getRealPath())), $imagePath );
}
$em = $this->getDoctrine()->getManager();
$region->setTranslatableLocale($request->getSession()->get('locale')); // change locale
$em->persist($region);
$em->flush();
$redirectToIndex = true;
// foreach ($region->getRechargePacks() as &$rechargePack) {
// if($rechargePack->getTugeDataPlan() !== null)
// continue;
// $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_values(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 {
// $redirectToIndex = false;
// $form->addError(new FormError("Se produjo un error al crear el paquete en Cronus: {$e->getMessage()}"));
// }
// }
if($redirectToIndex) return $this->redirectToRoute('regions_list');
}
return $this->render('angle/regions/detail.html.twig', [
'form' => $form->createView(),
'region' => $region,
]);
}
/**
* @Route(
* "/services/rearrange_regions.{_format}",
* name="regions_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(Region::class);
$repository->updateOrder($id, $order);
return ['ok' => true];
}
/**
* @IsGranted("ROLE_ADMIN")
* @Route(
* "/services/region.{_format}",
* name="regions_enable",
* requirements={
* "_format": "json"
* },
* methods={"POST"}
* )
*/
public function enable(Request $request)
{
$repository = $this->getDoctrine()->getRepository(Region::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];
}
private function setOrder( Region $region ){
if ( ! $region->getSortOrder() ) {
$repo = $this->getDoctrine()->getRepository(Region::class);
$region->setSortOrder( $repo->findLastOrder() + 1 );
}
return $region;
}
}