<?php
namespace App\Controller;
use App\Entity\Programa;
use App\Entity\Solicitud;
use App\Entity\SolicitudLog;
use App\Entity\Subscription;
use App\Entity\User;
use App\Form\PassresetType;
use App\Form\SolicitudLogType;
use App\Form\UserProfileType;
use App\Libs\Constantes;
use Doctrine\ORM\EntityManagerInterface;
use Stripe\BillingPortal\Session;
use Stripe\Stripe;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
class AccountController extends AbstractController
{
private $em;
private $hasher;
private $promo_code = null;
/**
* @var RequestStack
*/
private $stack;
public function __construct(EntityManagerInterface $em, UserPasswordHasherInterface $hasher, RequestStack $stack)
{
$this->hasher = $hasher;
$this->em = $em;
$this->stack = $stack;
}
/**
* @Route("/account", name="app_account")
*/
public function index(): Response
{
$u = $this->getUser();
if($this->stack->getSession()->get('passReset')) return $this->redirectToRoute('app_password');
if(Constantes::ENV == 'dev' && !in_array('ROLE_SUPER_ADMIN', $this->getUser()->getRoles())){
return $this->render('security/maint.html.twig', [
'last_username' => '', 'error' => '',
'promo_code' => null,
]);
}
// dd($u);
$rs = []; $rsols = [];
$sols = $this->em->getRepository(Solicitud::class)->findBy(['abierta' => 1, 'user' => $u]);
if($sols){
foreach ($sols as $sol){
$rsols[] = $sol;
}
}
$subs = $this->em->getRepository(Subscription::class)->findUserVisible($u);
if($subs){
// dd($subs);
foreach ($subs as $sub){
// $sub = new Subscription();
if($sub->getProducto()->getPrograma()->getIsPublico()){
$expiresAt = $sub->getExpiresAt()->format('d M Y');
$rs[$sub->getSubscriptionStatus()->getContent()][] = [
'user' => $sub->getUser()->getNombre(),
'expira' => $expiresAt,
'programa' => $sub->getProducto()->getPrograma(),
'img' => $sub->getProducto()->getPrograma()->getImageName(),
];
}
}
}
return $this->render('account/index.html.twig', [
'controller_name' => 'AccountController',
'rs' => $rs,
'rsols' => $rsols,
'isnew' => $u->getResetPin(),
'promo_code' => $this->promo_code,
'user' => $u
]);
}
/**
* @Route("/profile", name="app_profile")
*/
public function profile(Request $request): Response
{
$u = $this->getUser();
$rs = [];
// dump($u);exit();
// $user = $this->em->getRepository(User::class)->findOneBy(['tel1' => $u->getUserIdentifier()]);
$f = $this->createForm(UserProfileType::class, $u);
$f->handleRequest($request);
if($f->isSubmitted() && $f->isValid()){
$d = $f->getData();
$this->em->persist($d);
$this->em->flush();
}
//dump($f->createView());exit();
return $this->render('account/profile.html.twig', [
'controller_name' => 'AccountController',
'rs' => $rs,
'form' => $f->createView(),
'promo_code' => $this->promo_code
]);
}
/**
* @Route("/solicitud/{id}", name="app_solicitud")
*/
public function solicitud($id, Request $request): Response
{
$u = $this->getUser();
$sol = $this->em->getRepository(Solicitud::class)->find($id);
if($sol){
$f = $this->createForm(SolicitudLogType::class);
$f->handleRequest($request);
if($f->isSubmitted() && $f->isValid()){
$d = $f->getData();
$l = new SolicitudLog();
$l->setSolicitud($sol)->setCreatedAt(new \DateTimeImmutable())->setUser($u)->setContent($d->getContent())
->setAutorizarRespuesta(false);
// dd($l);
$this->em->persist($l);
$this->em->flush();
$this->addFlash('success', 'Mensaje enviado.');
}
}else{
$this->addFlash('danger', 'Solicitud no Existe');
return $this->redirectToRoute('app_account');
}
//dump($f->createView());exit();
return $this->render('account/solicitud.html.twig', [
'controller_name' => 'AccountController',
'sol' => $sol,
'form' => $f->createView(),
'promo_code' => $this->promo_code
]);
}
/**
* @Route("/password", name="app_password")
*/
public function password(Request $request): Response
{
$u = $this->getUser();
// dump($u);exit();
$user = $this->em->getRepository(User::class)->findOneBy(['tel1'=>$u->getUserIdentifier()]);
$rs = [];
$flash = '';
$f = $this->createForm(PassresetType::class, $u);
$f->handleRequest($request);
if ($f->isSubmitted() && $f->isValid()) {
$this->stack->getSession()->remove('passReset');
$p = $f->getData();
$hash = $this->hasher->hashPassword($user, $p->getPlainPassword());
$p->setPassword($hash)
->setPlainPassword('')->setResetPin(0);
try {
$this->em->persist($p);
$this->em->flush();
$this->addFlash('success', 'Contraseña/Pin cambiado con éxito.');
return $this->redirectToRoute('app_account');
} catch (\Exception $e) {
$this->addFlash('danger', $e->getMessage());
}
}
return $this->render('account/password.html.twig', [
'controller_name' => 'AccountController',
'rs' => $rs,
'flash' => $flash,
'form' => $f->createView(),
'promo_code' => $this->promo_code
]);
}
/**
* @Route("/historial", name="app_historial")
*/
public function historial(Request $request): Response
{
$u = $this->em->getRepository(User::class)->find($this->getUser());
if($u->getStripeId()){
Stripe::setApiKey(Constantes::API_KEY);
try{
$session = Session::create([
'customer' => $u->getStripeId(),
'return_url' => 'https://computechapps.com/account'
]);
return $this->redirect($session->url);
}catch (\Exception $e){
// dump($e->getMessage());exit();
return $this->redirectToRoute('app_account');
}
}
return $this->redirectToRoute('app_account');
}
}