src/Controller/DashboardController.php line 47

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Pack;
  4. use App\Repository\PackRepository;
  5. use App\Repository\PaiementRepository;
  6. use App\Services\InvestmentService;
  7. use App\Services\Sendmail;
  8. use App\Services\StatsService;
  9. use App\Service\NotificationService;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Mailer\MailerInterface;
  15. use Symfony\Component\Mime\Address;
  16. use Symfony\Component\Mime\Email;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. class DashboardController extends AbstractController
  19. {
  20.     public function __construct(
  21.         private StatsService $statsService,
  22.         private InvestmentService $investmentService,
  23.         private Sendmail $sendmail,
  24.         private PackRepository $packRepository,
  25.         private PaiementRepository $paiementRepository,
  26.         private NotificationService $notificationService
  27.     ) {
  28.     }
  29.     #[Route('/'name'app_acceuil')]
  30.     public function acceuil(Request $request): Response
  31.     {
  32.         $stats $this->statsService->getAdminStats();
  33.         return $this->render('acceuil/index.html.twig', [
  34.             'paramettre' => $stats['paramettre'],
  35.             'promotion' => $this->packRepository->findBy(['promotion' => true]),
  36.             'pack1' => $this->packRepository->findBy(['niveauPack' => 1]),
  37.             'pack2' => $this->packRepository->findBy(['niveauPack' => 2])
  38.         ]);
  39.     }
  40.     #[Route('/space/dasbord'name'app_dashboard')]
  41.     public function index(): Response
  42.     {
  43.         if (!$this->getUser()->isOneConnexion()) {
  44.             return $this->redirectToRoute('app_completer_profile');
  45.         }
  46.         $data $this->statsService->getDashboardData($this->getUser()->getId());
  47.         return $this->render('dashboard/index.html.twig', [
  48.             'achaters' => $data['packAcheter'],
  49.             'promotion' => $data['promotion'],
  50.             'solde' => $data['solde'],
  51.             'nbrpackActive' => $data['nbrPackAcheterActive'],
  52.             'nbrpackAcheter' => $data['nbrPackAcheter'],
  53.             'paiement' => $data['paiement'],
  54.             'personne' => $data['personne'],
  55.             'paramettre' => $data['paramettre']
  56.         ]);
  57.     }
  58.     #[Route('/infor/pack/{id}'name'app_info_pack')]
  59.     public function infoPack(Request $request,Pack $pack)
  60.     {
  61.         $form $this->createFormBuilder(null, [
  62.             'action' => $this->generateUrl('app_investir',['id' => $pack->getId()]),
  63.             'method' => 'POST',
  64.         ])->getForm();
  65.         $paiement=$this->paiementRepository->findAll();
  66.         $html$this->renderView('dashboard/investirModal.html.twig',[
  67.             'pack'=>$pack,
  68.             'paiement'=>$paiement,
  69.             'form'=>$form
  70.         ]);
  71.         return new JsonResponse(['html' =>  $html]);
  72.     }
  73.     #[Route('/investir/{id}'name'app_investir')]
  74.     public function investir(Request $requestPack $pack): Response
  75.     {
  76.         $nbrPack = (int) $request->request->get('nbrPack'0);
  77.         $paiement $request->request->get('paiement');
  78.         if ($nbrPack <= 0) {
  79.             $this->addFlash('error''Le nombre de packs doit être supérieur à 0');
  80.             return $this->redirectToRoute('app_liste_pack');
  81.         }
  82.         try {
  83.             $this->investmentService->createPurchases($pack$this->getUser(), $nbrPack);
  84.             
  85.             // Créer une notification pour l'utilisateur
  86.             try {
  87.                 $montantTotal $this->investmentService->calculateTotalAmount($pack$nbrPack);
  88.                 $this->notificationService->createPurchaseNotification($this->getUser(), $nbrPack$montantTotal);
  89.             } catch (\Exception $e) {
  90.                 error_log('Erreur création notification achat: ' $e->getMessage());
  91.             }
  92.             
  93.             return $this->redirectToRoute('app_paiement', [
  94.                 'pack' => $pack->getId(),
  95.                 'type' => $paiement,
  96.                 'nbr' => $nbrPack
  97.             ]);
  98.         } catch (\InvalidArgumentException $e) {
  99.             $this->addFlash('error'$e->getMessage());
  100.             return $this->redirectToRoute('app_liste_pack');
  101.         }
  102.     }
  103.     #[Route('/space/paiement/{pack}/{type}/{nbr}'name'app_paiement')]
  104.     public function paiement(Request $requestPack $packint $typeint $nbr): Response
  105.     {
  106.         $paiement $this->paiementRepository->find($type);
  107.         
  108.         if (!$paiement) {
  109.             throw $this->createNotFoundException('Méthode de paiement introuvable');
  110.         }
  111.         $data $this->statsService->getDashboardData($this->getUser()->getId());
  112.         $montant $this->investmentService->calculateTotalAmount($pack$nbr);
  113.         try {
  114.             $this->sendmail->sendEmailCommande(
  115.                 $this->getUser()->getUserIdentifier(),
  116.                 $data['personne'],
  117.                 $pack,
  118.                 $nbr,
  119.                 $montant
  120.             );
  121.         } catch (\Exception $e) {
  122.             // Log l'erreur mais continue l'affichage
  123.             // En production, utiliser un logger
  124.         }
  125.         return $this->render('dashboard/paiement.html.twig', [
  126.             'solde' => $data['solde'],
  127.             'nbrpackActive' => $data['nbrPackAcheterActive'],
  128.             'nbrpackAcheter' => $data['nbrPackAcheter'],
  129.             'paiement' => $paiement,
  130.             'nbr' => $nbr,
  131.             'packcommander' => $pack,
  132.             'montant' => $montant,
  133.             'personne' => $data['personne'],
  134.             'paramettre' => $data['paramettre']
  135.         ]);
  136.     }
  137.     #[Route('/space/liste/pack'name'app_liste_pack')]
  138.     public function listepack(Request $request): Response
  139.     {
  140.         $data $this->statsService->getDashboardData($this->getUser()->getId());
  141.         return $this->render('dashboard/listePack.html.twig', [
  142.             'solde' => $data['solde'],
  143.             'nbrpackActive' => $data['nbrPackAcheterActive'],
  144.             'nbrpackAcheter' => $data['nbrPackAcheter'],
  145.             'pack1' => $data['pack1'],
  146.             'pack2' => $data['pack2'],
  147.             'personne' => $data['personne'],
  148.             'paramettre' => $data['paramettre']
  149.         ]);
  150.     }
  151.     #[Route('/space/retrait'name'app_retrait')]
  152.     public function retrait(Request $request): Response
  153.     {
  154.         $data $this->statsService->getDashboardData($this->getUser()->getId());
  155.         return $this->render('dashboard/retrait.html.twig', [
  156.             'solde' => $data['solde'],
  157.             'nbrpackActive' => $data['nbrPackAcheterActive'],
  158.             'nbrpackAcheter' => $data['nbrPackAcheter'],
  159.             'paiement' => $data['paiement'],
  160.             'packcommander' => $this->packRepository->findAll(),
  161.             'personne' => $data['personne'],
  162.             'paramettre' => $data['paramettre']
  163.         ]);
  164.     }
  165.     #[Route('/space/confirmation'name'app_confirmation')]
  166.     public function confirmation(Request $requestMailerInterface $mailer): Response
  167.     {
  168.         $data $this->statsService->getDashboardData($this->getUser()->getId());
  169.         $montant $request->request->get('montant');
  170.         $paiementId $request->request->get('paiement');
  171.         $paiementAdresse $request->request->get('adresse');
  172.         
  173.         if (!$montant || !$paiementId || !$paiementAdresse) {
  174.             $this->addFlash('error''Tous les champs sont obligatoires');
  175.             return $this->redirectToRoute('app_retrait');
  176.         }
  177.         $paiementNom $this->paiementRepository->find($paiementId);
  178.         
  179.         if (!$paiementNom) {
  180.             throw $this->createNotFoundException('Méthode de paiement introuvable');
  181.         }
  182.         try {
  183.             // Lire les valeurs depuis les variables d'environnement .env avec valeurs par défaut
  184.             $fromEmail $_ENV['MAILER_FROM_EMAIL'] ?? 'avaservice@allgroupe.com';
  185.             $fromName $_ENV['MAILER_FROM_NAME'] ?? 'AvaService';
  186.             $toEmail $_ENV['MAILER_TO_EMAIL'] ?? 'avaservice@allgroupe.com';
  187.             
  188.             $email = (new Email())
  189.                 ->from(new Address($fromEmail$fromName))
  190.                 ->to($toEmail)
  191.                 ->subject('Demande de retrait - ' $data['personne']->getNom() . ' ' $data['personne']->getPrenom())
  192.                 ->html('
  193.                     <h3>Nouvelle demande de retrait</h3>
  194.                     <p><strong>Nom:</strong> ' htmlspecialchars($data['personne']->getNom()) . '</p>
  195.                     <p><strong>Prénom:</strong> ' htmlspecialchars($data['personne']->getPrenom()) . '</p>
  196.                     <p><strong>Pays:</strong> ' htmlspecialchars($data['personne']->getPays()) . '</p>
  197.                     <p><strong>Téléphone:</strong> ' htmlspecialchars($data['personne']->getTel()) . '</p>
  198.                     <p><strong>Sexe:</strong> ' htmlspecialchars($data['personne']->getSex()) . '</p>
  199.                     <p><strong>Email:</strong> ' htmlspecialchars($this->getUser()->getUserIdentifier()) . '</p>
  200.                     <hr>
  201.                     <p><strong>Montant:</strong> ' htmlspecialchars($montant) . ' $</p>
  202.                     <p><strong>Type de paiement:</strong> ' htmlspecialchars($paiementNom->getNomPaiement()) . '</p>
  203.                     <p><strong>Adresse de retrait:</strong> ' htmlspecialchars($paiementAdresse) . '</p>
  204.                 ');
  205.             $mailer->send($email);
  206.             $this->addFlash('success''Demande de retrait envoyée avec succès');
  207.         } catch (\Exception $e) {
  208.             $this->addFlash('error''Erreur lors de l\'envoi de l\'email');
  209.         }
  210.         return $this->render('dashboard/comfirmation.html.twig', [
  211.             'solde' => $data['solde'],
  212.             'nbrpackActive' => $data['nbrPackAcheterActive'],
  213.             'nbrpackAcheter' => $data['nbrPackAcheter'],
  214.             'paiement' => $data['paiement'],
  215.             'packcommander' => $this->packRepository->findAll(),
  216.             'personne' => $data['personne'],
  217.             'paramettre' => $data['paramettre']
  218.         ]);
  219.     }
  220. }