src/Controller/DefaultController.php line 494

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Bonus;
  4. use App\Entity\Commission;
  5. use App\Entity\MonthlyCommissionTotal;
  6. use App\Entity\Orders;
  7. use App\Entity\PasswordResetRequest;
  8. use App\Entity\User;
  9. use App\Entity\Paiement;
  10. use App\Entity\UserGift;
  11. use App\Form\PasswordResetRequestClientType;
  12. use App\Form\RegistrationStep1Type;
  13. use App\Form\RegistrationStep2Type;
  14. use App\Form\UserModifType;
  15. use App\Repository\OrdersRepository;
  16. use App\Repository\PaiementRepository;
  17. use App\Repository\UserGiftRepository;
  18. use App\Service\WooCommerceApiService;
  19. use Psr\Log\LoggerInterface;
  20. use Symfony\Component\Finder\Exception\AccessDeniedException;
  21. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  22. use Symfony\Component\HttpFoundation\JsonResponse;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use App\Repository\UserRepository;
  25. use Doctrine\ORM\EntityManagerInterface;
  26. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  29. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  30. use Symfony\Component\Routing\Annotation\Route;
  31. use Symfony\Component\Security\Core\Security;
  32. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  33. use Symfony\Component\String\Slugger\SluggerInterface;
  34. use App\Service\UserStatusUpdater;
  35. class DefaultController extends AbstractController
  36. {
  37.     private $wooCommerceApiService;
  38.     private $userStatusUpdater;
  39.     private $entityManager;
  40.     private $security;
  41.     private $userRepository;
  42.     private $orderRepository;
  43.     public function __construct (UserRepository $userRepository,OrdersRepository $orderRepository ,  LoggerInterface $logger,WooCommerceApiService $wooCommerceApiServiceSecurity $security UserStatusUpdater $userStatusUpdaterEntityManagerInterface $entityManager)
  44.     {
  45.         $this->userStatusUpdater $userStatusUpdater;
  46.         $this->entityManager $entityManager;
  47.         $this->security $security;
  48.         $this->wooCommerceApiService $wooCommerceApiService;
  49.         $this->logger $logger;
  50.         $this->userRepository $userRepository;
  51.         $this->orderRepository $orderRepository;
  52.     }
  53.     /**
  54.      * @Route("/", name="app_default")
  55.      */
  56.     public function index(Security $security ): Response
  57.     {
  58.         $user $this->security->getUser();
  59.         if (!$user) {
  60.             return $this->redirectToRoute('app_login');
  61.         }
  62.         $now = new \DateTime();
  63.         setlocale(LC_TIME'fr_FR');
  64.         $nomDuMois strftime('%B'$now->getTimestamp()); // Nom du mois en français
  65.         $userId $this->getUser()->getId(); // Assurez-vous que votre système d'authentification est configuré
  66.         $totalAmount $this->getDoctrine()->getRepository(Commission::class)->findTotalAmountForUserThisMonth($userId);
  67.         $totalorder $this->getDoctrine()->getRepository(Orders::class)->findTotalForUserAndMonthbyindex($userId);
  68.         $commissionTotal $this->getDoctrine()->getRepository(MonthlyCommissionTotal::class)->findTotalAmountForUserThisMonthnytotalcommmossion($userId);
  69.         $totalbounus $this->getDoctrine()->getRepository(Bonus::class)->findTotalAmountForUserThisMonthnytotalcommmossibonus($userId);
  70.         
  71.         $totalPayments $this->getDoctrine()->getRepository(Paiement::class)->findTotalPaymentsForUser($userId);
  72.         $totalewalete $commissionTotal $totalbounus  -$user->getBalance()  - $totalPayments;
  73.         $bonus $this->getDoctrine()->getRepository(Bonus::class)->findBy(['user' => $user]);
  74.         $currentMonthStart = new \DateTime('first day of this month 00:00:00');
  75.         $children $this->userRepository->findChildrenOfUser($user);
  76.         $childrenWithOrdersThisMonth 0;
  77.         $totalOrdersAmountThisMonth 0;
  78.         foreach ($children as $child) {
  79.             $childOrdersThisMonth $this->orderRepository->findOrdersForUserSince($child$currentMonthStart);
  80.             if (!empty($childOrdersThisMonth)) {
  81.                 $childrenWithOrdersThisMonth++;
  82.                 foreach ($childOrdersThisMonth as $order) {
  83.                     $totalOrdersAmountThisMonth += $order->getTotal(); // Assurez-vous que votre entité Order a une méthode getAmount
  84.                 }
  85.             }
  86.         }
  87.         return $this->render('default/index.html.twig', [
  88.             'mobth'=>  $currentMonthStart,
  89.             'totalcommandemonthbyuser'=>$totalOrdersAmountThisMonth,
  90.             'childrenWithOrdersThisMonth' => $childrenWithOrdersThisMonth,
  91.             "mesbounus"=>$bonus,
  92.             'ewallete'=>$totalewalete,
  93.             'totalcommmande'=>$totalorder,
  94.             'totalcommission'=>$totalAmount,
  95.              'mois'=> $nomDuMois,
  96.             'controller_name' => 'DefaultController',
  97.         ]);
  98.     }
  99.    /**
  100.      * @Route("/registration_success", name="registration_success")
  101.      */
  102.     public function registration_success(SessionInterface $session,Security $security): Response
  103.     {
  104.         $userSuccess $session->get('user_success');
  105.         $session->remove('user_success');
  106.         return $this->render('default/success.html.twig', [
  107.             'user' => $userSuccess,
  108.         ]);
  109.     }
  110.     /**
  111.      * @Route("/register/{step}", name="register")
  112.      */
  113.     public function register(SluggerInterface $slugger,UserRepository $userRepository,Request $request EntityManagerInterface $emSessionInterface $session,  UserPasswordHasherInterface $passwordHasher int $step 1)
  114.     {
  115.         $user $session->get('user', new User());
  116.         $passwordfinal $user->getPlainPassword();
  117.         $formType $step === RegistrationStep1Type::class : RegistrationStep2Type::class;
  118.         $form $this->createForm($formType$user);
  119.         $form->handleRequest($request);
  120.         if ($form->isSubmitted() && $form->isValid()) {
  121.             $session->set('user'$user);
  122.             if ($step 2) {
  123.                 return $this->redirectToRoute('register', ['step' => $step 1]);
  124.             } else {
  125.                 if ($user->getPlainPassword()) {
  126.                     $password $passwordHasher->hashPassword($user$user->getPlainPassword());
  127.                     $user->setPassword($password)
  128.                         ->eraseCredentials();
  129.                 }
  130.                 $user->setDateaffiliate(new \DateTime());
  131.                 $user->setAnnuler(0);
  132.                 $user->setReferral($this->security->getUser());
  133.                 $userRepository->add($usertrue);
  134.                 if ($user->getReferral()) {
  135.                     $sponsor $userRepository->find($user->getReferral());
  136.                     if ($sponsor) {
  137.                         $this->userStatusUpdater->updateStatus($sponsor);
  138.                         $this->entityManager->persist($sponsor);
  139.                         $this->entityManager->flush();
  140.                     }
  141.                 }
  142.                 $year = (new \DateTime())->format('y');
  143.                 $user->setMatrecul('BC'.$year.$user->getId());
  144.                 $session->set('registrationData'$form->getData());
  145.                 $brochureFile $form->get('picture')->getData();
  146.                 if ($brochureFile) {
  147.                     $originalFilename pathinfo($brochureFile->getClientOriginalName(), PATHINFO_FILENAME);
  148.                     $safeFilename $slugger->slug($originalFilename);
  149.                     $newFilename $safeFilename.'-'.uniqid().'.'.$brochureFile->guessExtension();
  150.                     // Move the file to the directory where brochures are stored
  151.                     try {
  152.                         $brochureFile->move(
  153.                             $this->getParameter('profile_categorie'),
  154.                             $newFilename
  155.                         );
  156.                     } catch (FileException $e) {
  157.                     }
  158.                     $user->setPicture($newFilename);
  159.                 }
  160.                 $woocommerceData = [
  161.                     'email' => $user->getEmail(),
  162.                     'first_name' => $user->getMatrecul(),
  163.                     'last_name' => $user->getCin(),
  164.                     'username' => $user->getCin(),
  165.                     'password' => $passwordfinal,
  166.                 ];
  167.                 try {
  168.                     $woocommerceCustomer $this->wooCommerceApiService->createCustomer($woocommerceData);
  169.                                     } catch (\Exception $e) {
  170.                     $this->logger->error("Erreur lors de la création du client WooCommerce: " $e->getMessage());
  171.                 }
  172.                 $userRepository->add($usertrue);
  173.                 $em->persist($user);
  174.                 $em->flush();
  175.                 // Nettoyage de la session
  176.                 $session->remove('user');
  177.                 $session->set('user_success', [
  178.                     'firstName' => $user->getFirstName(),
  179.                     'lastName' => $user->getLastName(),
  180.                     'email' => $user->getEmail(),
  181.                     'code'=>$user->getMatrecul(),
  182.                     'pleinpassword'=>$passwordfinal
  183.                 ]);
  184.                 return $this->redirectToRoute('registration_success');
  185.                           }
  186.         }
  187.         return $this->render('default/Registration.html.twig', [
  188.             'form' => $form->createView(),
  189.             'step' => $step,
  190.             'totalSteps' => 2
  191.         ]);
  192. }
  193.     public function buildTree(UserRepository $userRepository$userId$level 0$maxLevel 3$isAdmin false)
  194.     {
  195.         if ($isAdmin) {
  196.             $maxLevel PHP_INT_MAX;
  197.         }
  198.         $rootUser $userRepository->find($userId);
  199.         if ($level $maxLevel) {
  200.             return [];
  201.         }
  202.         $children $userRepository->findChildrenByUserId($userId);
  203.         $tree = [];
  204.         foreach ($children as $child) {
  205.             $tree[] = [
  206.                 'racine' => $rootUser,
  207.                 'user' => $child,
  208.                 'level' => $level,
  209.                 'children' => $this->buildTree($userRepository$child->getId(), $level 1$maxLevel$isAdmin// Passez $isAdmin à l'appel récursif
  210.             ];
  211.         }
  212.         return $tree;
  213.     }
  214.     /**
  215.      * @Route("/user/tree", name="user_tree")
  216.      */
  217.     public function showUserTree(UserRepository $userRepository): Response
  218.     {
  219.         $user $this->security->getUser();
  220.         $isAdmin in_array('ROLE_ADMIN'$user->getRoles());
  221.         if (!$user) {
  222.             return $this->redirectToRoute('app_login');
  223.         }
  224.         $tree $this->buildTree($userRepository$user03$isAdmin);
  225.         return $this->render('default/tree.html.twig', [
  226.             'tree' => $tree,
  227.         ]);
  228.     }
  229.     /**
  230.      * @Route("/user/treevertical", name="user_tree_vertical")
  231.      */
  232.     public function showUserTreevertical(UserRepository $userRepository): Response
  233.     {
  234.         $user $this->security->getUser();
  235.         $isAdmin in_array('ROLE_ADMIN'$user->getRoles());
  236.         if (!$user) {
  237.             return $this->redirectToRoute('app_login');
  238.         }
  239.         $tree $this->buildTree($userRepository$user03$isAdmin);
  240.         $flatList = [];
  241.         $totals = [];
  242.         $this->prepareFlatListWithLevels($tree0$flatList$totals);
  243.         return $this->render('default/treevertical.html.twig', [
  244.             'flatList' => $flatList,
  245.             'totals' => $totals,
  246.         ]);
  247.     }
  248.     private function prepareFlatListWithLevels($tree$level 0, &$result = [], &$totals = [])
  249.     {
  250.         foreach ($tree as $node) {
  251.             $node['level'] = $level;
  252.             $result[] = $node;
  253.             $totals[$level] = ($totals[$level] ?? 0) + 1;
  254.             if (!empty($node['children'])) {
  255.                 $this->prepareFlatListWithLevels($node['children'], $level 1$result$totals);
  256.             }
  257.         }
  258.     }
  259.     /**
  260.      * @Route("/edit-profile", name="app_user_edit_profile", methods={"GET", "POST"})
  261.      */
  262.     public function edit(SluggerInterface $slugger,Request $requestUserRepository $userRepositoryUserPasswordHasherInterface $passwordHasher): Response
  263.     {
  264.         // Obtient l'utilisateur connecté
  265.         $user $this->security->getUser();
  266.         if (!$user) {
  267.             // Redirige l'utilisateur s'il n'est pas connecté
  268.             return $this->redirectToRoute('app_login');
  269.         }
  270.         $form $this->createForm(UserModifType::class, $user);
  271.         $form->handleRequest($request);
  272.         if ($form->isSubmitted() && $form->isValid()) {
  273.             if ($user->getPlainPassword()) {
  274.                 $password $passwordHasher->hashPassword($user$user->getPlainPassword());
  275.                 $user->setPassword($password)
  276.                     ->eraseCredentials();
  277.             }
  278.             $brochureFile $form->get('picture')->getData();
  279.             // this condition is needed because the 'brochure' field is not required
  280.             // so the PDF file must be processed only when a file is uploaded
  281.             if ($brochureFile) {
  282.                 $originalFilename pathinfo($brochureFile->getClientOriginalName(), PATHINFO_FILENAME);
  283.                 // this is needed to safely include the file name as part of the URL
  284.                 $safeFilename $slugger->slug($originalFilename);
  285.                 $newFilename $safeFilename.'-'.uniqid().'.'.$brochureFile->guessExtension();
  286.                 // Move the file to the directory where brochures are stored
  287.                 try {
  288.                     $brochureFile->move(
  289.                         $this->getParameter('profile_categorie'),
  290.                         $newFilename
  291.                     );
  292.                 } catch (FileException $e) {
  293.                     // ... handle exception if something happens during file upload
  294.                 }
  295.                 $user->setPicture($newFilename);
  296.             }
  297.             $userRepository->add($usertrue);
  298.             return $this->redirectToRoute('app_user_profile', [], Response::HTTP_SEE_OTHER);
  299.         }
  300.         return $this->renderForm('user/edit.html.twig', [
  301.             'user' => $user,
  302.             'form' => $form,
  303.         ]);
  304.     }
  305.     /**
  306.      * @Route("/profile", name="app_user_profile", methods={"GET"})
  307.      */
  308.     public function show(UserRepository $userRepository): Response
  309.     {
  310.         $uderid $this->security->getUser();
  311.         $user $userRepository->find($uderid);
  312.         return $this->render('user/show.html.twig', [
  313.             'user' => $user,
  314.         ]);
  315.     }
  316. /**
  317. * @Route("/mes-commandes", name="mes_commandes_connecter")
  318. */
  319.     public function mesCommandes(OrdersRepository  $orderRepository): Response
  320.     {
  321.         $user $this->getUser();
  322.         if (!$user) {
  323.             throw new AccessDeniedException('Vous devez être connecté pour accéder à cette page.');
  324.         }
  325.         $orders $orderRepository->findOrdersForUserInDateRange($user);
  326.         return $this->render('default/mesCommandes.html.twig', [
  327.             'orders' => $orders,
  328.         ]);
  329.     }
  330.     /**
  331.      * @Route("/mes-paiements", name="mes_paiements")
  332.      */
  333.     public function mesPaiements(PaiementRepository $paiementRepository): Response
  334.     {
  335.         $user $this->getUser();
  336.         if (!$user) {
  337.             throw new AccessDeniedException('Vous devez être connecté pour accéder à cette page.');
  338.         }
  339.         $paiements $paiementRepository->findByUser($user);
  340.         return $this->render('default/mespaiement.html.twig', [
  341.             'paiements' => $paiements,
  342.         ]);
  343.     }
  344.     /**
  345.      * @Route("/mes-Super-cadeaux", name="mes_suppper_cade")
  346.      */
  347.     public function myUnpaidGifts(UserGiftRepository  $giftRepository)
  348.     {
  349.         $user $this->getUser();
  350.         $unpaidGifts $giftRepository->findUnpaidGiftsForUser($user->getId());
  351.         return $this->render('default/mescadeaux.html.twig', [
  352.             'gifts' => $unpaidGifts,
  353.         ]);
  354.     }
  355.     /**
  356.      * @Route("/password-reset", name="password_reset_request_new")
  357.      */
  358.     public function requestPasswordResetnew(Request $requestEntityManagerInterface $entityManagerTokenGeneratorInterface $tokenGenerator): Response
  359.     {
  360.         $form $this->createForm(PasswordResetRequestClientType::class);
  361.         $form->handleRequest($request);
  362.         if ($form->isSubmitted() && $form->isValid()) {
  363.             $data $form->getData();
  364.             // Assurez-vous que votre UserRepository implémente la méthode findOneByDetails
  365.             $data $form->getData();
  366.             // Utilisez les données pour trouver l'utilisateur correspondant
  367.             $user $entityManager->getRepository(User::class)->findOneBy([
  368.                 'Cin' => $data['Cin'],
  369.                 'datenaissance' => $data['dateNaissance'],
  370.                 'matrecul' => $data['matricule'],
  371.             ]);
  372.             if ($user) {
  373.                 $existingRequest $entityManager->getRepository(PasswordResetRequest::class)->findLatestRequestByCin($data['Cin']);
  374.                 if ($existingRequest) {
  375.                     $this->addFlash('error''Une demande de réinitialisation a déjà été faite pour ce CIN.');
  376.                 }else{
  377.                     $resetRequest = new PasswordResetRequest();
  378.                     $resetRequest->setUser($user);
  379.                     $resetRequest->setToken($tokenGenerator->generateToken());
  380.                     $resetRequest->setCreatedAt(new \DateTime());
  381.                     $resetRequest->setExpiresAt((new \DateTime())->modify('+10 day'));
  382.                     $resetRequest->setTerminer(0);
  383.                     $entityManager->persist($resetRequest);
  384.                     $entityManager->flush();
  385.                     $this->addFlash('success''Une demande de réinitialisation de mot de passe a été envoyée.');
  386.                     // return $this->redirectToRoute('app_home'); // Redirigez vers une route appropriée
  387.                 }
  388.                 }else {
  389.                 $this->addFlash('error''Vérifier  les informations fournies.');
  390.             }
  391.         }
  392.         return $this->render('default/changepassword.html.twig', [
  393.             'form' => $form->createView(),
  394.         ]);
  395.     }
  396. }