<?php
namespace App\Controller;
use App\Entity\Abonnement;
use App\Entity\Souscription;
use App\Form\AbonnementType;
use App\Form\AbonnementFrontType;
use App\Repository\AbonnementRepository;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\User;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer;
use App\Form\SouscriptionType;
#[Route('/abonnement')]
class AbonnementController extends AbstractController
{
#[Route('/new/souscription', name: 'souscription_new')]
public function newsouscription(Request $request, EntityManagerInterface $em): Response
{
// Création de l'entité vide
$souscription = new Souscription();
// Création du formulaire
$form = $this->createForm(SouscriptionType::class, $souscription);
// Gestion de la requête
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// On peut récupérer les données du formulaire
// $typeAbonnement = $souscription->getTypeabonnement();
// $paymentMethod = $souscription->getPaymentMethod();
// Persistance en base de données
$em->persist($souscription);
$em->flush();
// Message flash de succès
$this->addFlash('success', 'Souscription créée avec succès !');
// Redirection vers une route (ex : liste des abonnements)
return $this->redirectToRoute('abonnement_new');
}
// Rendu du formulaire dans la vue
return $this->render('abonnement/newsouscription.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/all/abonnements', name: 'app_all_abonnement_index', methods: ['GET'])]
public function AllAbonnements(AbonnementRepository $abonnementRepository): Response
{
$this->denyAccessUnlessGranted('ROLE_SUPER_ADMIN');
return $this->render('abonnement/all.html.twig', [
'abonnements' => $abonnementRepository->findAll(),
]);
}
#[Route('/mesabonnements', name: 'app_mes_abonnement_index', methods: ['GET'])]
public function MesAbonnements(AbonnementRepository $abonnementRepository): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
$abonnements = $abonnementRepository->createQueryBuilder('u')
->join('u.userabonnee', 'e')
// ->join('e.entreprise', 'd')
->where('e = :creator')
->setParameter('creator', $this->getUser())
->getQuery()
->getResult();
return $this->render('abonnement/mesabonnements.html.twig', [
'abonnements' => $abonnements, //abonnementRepository->findAll(),
]);
}
#[Route('/', name: 'app_abonnement_index', methods: ['GET'])]
public function index(AbonnementRepository $abonnementRepository): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
$user = $this->getUser();
// 🔹 Vérifie abonnement et rôle
if (!$user->isOkAbonnement() && in_array('ROLE_ADMIN', $user->getRoles(), false)) {
// Redirection admin avec abonnement actif
$this->addFlash('error', 'Vous n\'êtes pas autorisé à accéder à cette page, veuillez vous abonner d\'abord.');
return $this->redirectToRoute('souscription_new');
}
$abonnements = $abonnementRepository->createQueryBuilder('u')
->join('u.userabonnee', 'e')
// ->join('e.entreprise', 'd')
->where('e = :creator')
->setParameter('creator', $this->getUser())
->getQuery()
->getResult();
return $this->render('abonnement/index.html.twig', [
'abonnements' => $abonnements, //abonnementRepository->findAll(),
]);
}
public function getUserDetails(string $username): Response
{
$user = $this->userRepository->findUserByUsername($username);
if (!$user) {
return new Response('Utilisateur non trouvé');
}
$fullName = $user->getFirstName() . ' ' . $user->getLastName();
return new Response('Nom complet : ' . $fullName);
}
#[Route('/abonnement/nouvel', name: 'app_abonnement_nouvel')]
public function nouvel(Request $request, EntityManagerInterface $entityManager): Response
{
$this->denyAccessUnlessGranted('ROLE_SUPER_ADMIN');
try {
$abonnement = new Abonnement();
$form = $this->createForm(AbonnementType::class, $abonnement);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Récupérer la durée (non mappée à l'entité)
$duree = (int) $form->get('duree')->getData(); // ex: 1, 3, 6, 12
$userabonnee = $form->get('userabonnee')->getData();
if ($duree == null){
$this->addFlash('error', 'Erreur : il faut choisir une durée d\'abonnement.');
return $this->redirectToRoute('souscription_new');
}
else{
$dernierAbonnement = $entityManager->createQueryBuilder()
->select('a')
->from(\App\Entity\Abonnement::class, 'a')
->where('a.userabonnee = :userId')
->setParameter('userId', $userabonnee)
->orderBy('a.dateabonnement', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
// dd($dernierAbonnement);
if (($dernierAbonnement) && ($dernierAbonnement->getDateResiliation() < new \DateTime())) {
$dateDebut = new \DateTime(); // maintenant
} else if (($dernierAbonnement) && ($dernierAbonnement->getDateResiliation() > new \DateTime())){
// aucun abonnement trouvé
$dateDebut = $dernierAbonnement->getDateResiliation();
}
else {
$dateDebut = new \DateTime(); // maintenant
}
// Récupérer la date de début
// $dateDebut = $abonnement->getDateabonnement();
// Cloner la date (évite de modifier la même instance)
$dateFin = (clone $dateDebut)->modify("+{$duree} months");
}
// Définir la date de fin sur l'entité
$entityManager->persist($abonnement);
$abonnement->setDateabonnement($dateDebut);
$abonnement->setDateresiliation($dateFin);
$abonnement->setUserprofile($abonnement->getUserabonnee()->getUsername());
$entityManager->flush();
$this->addFlash('success', 'Abonnement enregistré avec succès');
return $this->redirectToRoute('app_abonnement_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('abonnement/new.html.twig', [
'abonnement' => $abonnement,
'form' => $form,
]);
} catch (\Throwable $e) {
// Simuler le rendu debug
$renderer = new HtmlErrorRenderer(true); // true = debug ON
$error = $renderer->render($e);
return new Response($error->getMessage(), $error->getStatusCode(), $error->getHeaders());
}
}
#[Route('/new', name: 'app_abonnement_new', methods: ['GET', 'POST'])]
public function new(Request $request, EntityManagerInterface $entityManager): Response
{
$this->denyAccessUnlessGranted('ROLE_SUPER_ADMIN');
$abonnement = new Abonnement();
$form = $this->createForm(AbonnementType::class, $abonnement);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->persist($abonnement);
$abonnement->setUserprofile($abonnement->getUserabonnee()->getUsername());
$entityManager->flush();
return $this->redirectToRoute('app_abonnement_index', [], Response::HTTP_SEE_OTHER);
}
/*
return $this->renderForm('abonnement/new.html.twig', [
'abonnement' => $abonnement,
'form' => $form,
]);*/
$response = $this->render('abonnement/new.html.twig', ['abonnement' => $abonnement,
'form' => $form,]);
$response->headers->set('Cache-Control', 'no-cache, no-store, must-revalidate');
return $response;
}
#[Route('/souscrire', name: 'app_abonnement_front_new', methods: ['GET', 'POST'])]
public function newfront(Request $request, EntityManagerInterface $entityManager): Response
{
$abonnement = new Abonnement();
$form1 = $this->createForm(AbonnementFrontType::class, $abonnement);
$form1->handleRequest($request);
if ($form1->isSubmitted() && $form1->isValid()) {
$entityManager->persist($abonnement);
$entityManager->flush();
//dd($this->getUser()->getId());
return $this->redirectToRoute('app_user_profile_show', ['id'=> $this->getUser()->getId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('abonnement/newfront.html.twig', [
'abonnement' => $abonnement,
'form1' => $form1,
]);
}
#[Route('/{id}', name: 'app_abonnement_show', methods: ['GET'])]
public function show(Abonnement $abonnement,Security $security, UserRepository $userRepository,AbonnementRepository $abonnementRepository): Response
{
$user = $security->getUser();
if (!$user) {
throw $this->createAccessDeniedException('Veuillez vous connecter.');
}
$userp = $userRepository->findBy(['username' => $user->getUsername()]);
//dd($userp);
foreach ($userp as $usera) {
$namecomplet = $usera->getPrenom().' '.$usera->getNom(); // Vérifiez que $product est bien un objet
}
return $this->render('abonnement/show.html.twig', [
'abonnement' => $abonnement,
'namecomplet' => $namecomplet,
]);
}
#[Route('/abonnement/{id}/modifier-livraisons', name: 'abonnement_modifier_livraisons', methods: ['POST'])]
public function modifierNombreLivraisons(Request $request, Abonnement $abonnement, EntityManagerInterface $em): Response
{
$nombre = (int) $request->request->get('nombreLivraisons');
if ($nombre < 0) {
$this->addFlash('danger', 'Le nombre de livraisons doit être supérieur ou égal à 0.');
return $this->redirectToRoute('app_abonnement_show', ['id' => $abonnement->getId()]);
}
$abonnement->setNombrelivraison($nombre);
if ($abonnement->getNombrelivraison() >= $abonnement->getTypeabonnement() -> getCaracteristiquestypeabonnement()->getNbreliv()) {
$abonnement->setStatutAbonnement('closed');
$abonnement->setDateresiliation(new \DateTime('now'));
# code...
}
$em->flush();
$this->addFlash('success', 'Nombre de livraisons mis à jour avec succès !');
return $this->redirectToRoute('app_abonnement_show', ['id' => $abonnement->getId()]);
}
#[Route('/{id}/edit', name: 'app_abonnement_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Abonnement $abonnement, EntityManagerInterface $entityManager): Response
{
$this->denyAccessUnlessGranted('ROLE_SUPER_ADMIN');
$form = $this->createForm(AbonnementType::class, $abonnement);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->flush();
return $this->redirectToRoute('app_abonnement_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('abonnement/edit.html.twig', [
'abonnement' => $abonnement,
'form' => $form,
]);
}
#[Route('/{id}', name: 'app_abonnement_delete', methods: ['POST'])]
public function delete(Request $request, Abonnement $abonnement, EntityManagerInterface $entityManager): Response
{
$this->denyAccessUnlessGranted('ROLE_SUPER_ADMIN');
if ($this->isCsrfTokenValid('delete'.$abonnement->getId(), $request->request->get('_token'))) {
$entityManager->remove($abonnement);
$entityManager->flush();
}
return $this->redirectToRoute('app_abonnement_index', [], Response::HTTP_SEE_OTHER);
}
}