<?php
namespace App\Controller;
use App\Entity\Bonus;
use App\Entity\Commission;
use App\Entity\MonthlyCommissionTotal;
use App\Entity\Orders;
use App\Entity\PasswordResetRequest;
use App\Entity\User;
use App\Entity\Paiement;
use App\Entity\UserGift;
use App\Form\PasswordResetRequestClientType;
use App\Form\RegistrationStep1Type;
use App\Form\RegistrationStep2Type;
use App\Form\UserModifType;
use App\Repository\OrdersRepository;
use App\Repository\PaiementRepository;
use App\Repository\UserGiftRepository;
use App\Service\WooCommerceApiService;
use Psr\Log\LoggerInterface;
use Symfony\Component\Finder\Exception\AccessDeniedException;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
use Symfony\Component\String\Slugger\SluggerInterface;
use App\Service\UserStatusUpdater;
class DefaultController extends AbstractController
{
private $wooCommerceApiService;
private $userStatusUpdater;
private $entityManager;
private $security;
private $userRepository;
private $orderRepository;
public function __construct (UserRepository $userRepository,OrdersRepository $orderRepository , LoggerInterface $logger,WooCommerceApiService $wooCommerceApiService, Security $security , UserStatusUpdater $userStatusUpdater, EntityManagerInterface $entityManager)
{
$this->userStatusUpdater = $userStatusUpdater;
$this->entityManager = $entityManager;
$this->security = $security;
$this->wooCommerceApiService = $wooCommerceApiService;
$this->logger = $logger;
$this->userRepository = $userRepository;
$this->orderRepository = $orderRepository;
}
/**
* @Route("/", name="app_default")
*/
public function index(Security $security ): Response
{
$user = $this->security->getUser();
if (!$user) {
return $this->redirectToRoute('app_login');
}
$now = new \DateTime();
setlocale(LC_TIME, 'fr_FR');
$nomDuMois = strftime('%B', $now->getTimestamp()); // Nom du mois en français
$userId = $this->getUser()->getId(); // Assurez-vous que votre système d'authentification est configuré
$totalAmount = $this->getDoctrine()->getRepository(Commission::class)->findTotalAmountForUserThisMonth($userId);
$totalorder = $this->getDoctrine()->getRepository(Orders::class)->findTotalForUserAndMonthbyindex($userId);
$commissionTotal = $this->getDoctrine()->getRepository(MonthlyCommissionTotal::class)->findTotalAmountForUserThisMonthnytotalcommmossion($userId);
$totalbounus = $this->getDoctrine()->getRepository(Bonus::class)->findTotalAmountForUserThisMonthnytotalcommmossibonus($userId);
$totalPayments = $this->getDoctrine()->getRepository(Paiement::class)->findTotalPaymentsForUser($userId);
$totalewalete = $commissionTotal + $totalbounus -$user->getBalance() - $totalPayments;
$bonus = $this->getDoctrine()->getRepository(Bonus::class)->findBy(['user' => $user]);
$currentMonthStart = new \DateTime('first day of this month 00:00:00');
$children = $this->userRepository->findChildrenOfUser($user);
$childrenWithOrdersThisMonth = 0;
$totalOrdersAmountThisMonth = 0;
foreach ($children as $child) {
$childOrdersThisMonth = $this->orderRepository->findOrdersForUserSince($child, $currentMonthStart);
if (!empty($childOrdersThisMonth)) {
$childrenWithOrdersThisMonth++;
foreach ($childOrdersThisMonth as $order) {
$totalOrdersAmountThisMonth += $order->getTotal(); // Assurez-vous que votre entité Order a une méthode getAmount
}
}
}
return $this->render('default/index.html.twig', [
'mobth'=> $currentMonthStart,
'totalcommandemonthbyuser'=>$totalOrdersAmountThisMonth,
'childrenWithOrdersThisMonth' => $childrenWithOrdersThisMonth,
"mesbounus"=>$bonus,
'ewallete'=>$totalewalete,
'totalcommmande'=>$totalorder,
'totalcommission'=>$totalAmount,
'mois'=> $nomDuMois,
'controller_name' => 'DefaultController',
]);
}
/**
* @Route("/registration_success", name="registration_success")
*/
public function registration_success(SessionInterface $session,Security $security): Response
{
$userSuccess = $session->get('user_success');
$session->remove('user_success');
return $this->render('default/success.html.twig', [
'user' => $userSuccess,
]);
}
/**
* @Route("/register/{step}", name="register")
*/
public function register(SluggerInterface $slugger,UserRepository $userRepository,Request $request , EntityManagerInterface $em, SessionInterface $session, UserPasswordHasherInterface $passwordHasher , int $step = 1)
{
$user = $session->get('user', new User());
$passwordfinal = $user->getPlainPassword();
$formType = $step === 1 ? RegistrationStep1Type::class : RegistrationStep2Type::class;
$form = $this->createForm($formType, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$session->set('user', $user);
if ($step < 2) {
return $this->redirectToRoute('register', ['step' => $step + 1]);
} else {
if ($user->getPlainPassword()) {
$password = $passwordHasher->hashPassword($user, $user->getPlainPassword());
$user->setPassword($password)
->eraseCredentials();
}
$user->setDateaffiliate(new \DateTime());
$user->setAnnuler(0);
$user->setReferral($this->security->getUser());
$userRepository->add($user, true);
if ($user->getReferral()) {
$sponsor = $userRepository->find($user->getReferral());
if ($sponsor) {
$this->userStatusUpdater->updateStatus($sponsor);
$this->entityManager->persist($sponsor);
$this->entityManager->flush();
}
}
$year = (new \DateTime())->format('y');
$user->setMatrecul('BC'.$year.$user->getId());
$session->set('registrationData', $form->getData());
$brochureFile = $form->get('picture')->getData();
if ($brochureFile) {
$originalFilename = pathinfo($brochureFile->getClientOriginalName(), PATHINFO_FILENAME);
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename.'-'.uniqid().'.'.$brochureFile->guessExtension();
// Move the file to the directory where brochures are stored
try {
$brochureFile->move(
$this->getParameter('profile_categorie'),
$newFilename
);
} catch (FileException $e) {
}
$user->setPicture($newFilename);
}
$woocommerceData = [
'email' => $user->getEmail(),
'first_name' => $user->getMatrecul(),
'last_name' => $user->getCin(),
'username' => $user->getCin(),
'password' => $passwordfinal,
];
try {
$woocommerceCustomer = $this->wooCommerceApiService->createCustomer($woocommerceData);
} catch (\Exception $e) {
$this->logger->error("Erreur lors de la création du client WooCommerce: " . $e->getMessage());
}
$userRepository->add($user, true);
$em->persist($user);
$em->flush();
// Nettoyage de la session
$session->remove('user');
$session->set('user_success', [
'firstName' => $user->getFirstName(),
'lastName' => $user->getLastName(),
'email' => $user->getEmail(),
'code'=>$user->getMatrecul(),
'pleinpassword'=>$passwordfinal
]);
return $this->redirectToRoute('registration_success');
}
}
return $this->render('default/Registration.html.twig', [
'form' => $form->createView(),
'step' => $step,
'totalSteps' => 2
]);
}
public function buildTree(UserRepository $userRepository, $userId, $level = 0, $maxLevel = 3, $isAdmin = false)
{
if ($isAdmin) {
$maxLevel = PHP_INT_MAX;
}
$rootUser = $userRepository->find($userId);
if ($level > $maxLevel) {
return [];
}
$children = $userRepository->findChildrenByUserId($userId);
$tree = [];
foreach ($children as $child) {
$tree[] = [
'racine' => $rootUser,
'user' => $child,
'level' => $level,
'children' => $this->buildTree($userRepository, $child->getId(), $level + 1, $maxLevel, $isAdmin) // Passez $isAdmin à l'appel récursif
];
}
return $tree;
}
/**
* @Route("/user/tree", name="user_tree")
*/
public function showUserTree(UserRepository $userRepository): Response
{
$user = $this->security->getUser();
$isAdmin = in_array('ROLE_ADMIN', $user->getRoles());
if (!$user) {
return $this->redirectToRoute('app_login');
}
$tree = $this->buildTree($userRepository, $user, 0, 3, $isAdmin);
return $this->render('default/tree.html.twig', [
'tree' => $tree,
]);
}
/**
* @Route("/user/treevertical", name="user_tree_vertical")
*/
public function showUserTreevertical(UserRepository $userRepository): Response
{
$user = $this->security->getUser();
$isAdmin = in_array('ROLE_ADMIN', $user->getRoles());
if (!$user) {
return $this->redirectToRoute('app_login');
}
$tree = $this->buildTree($userRepository, $user, 0, 3, $isAdmin);
$flatList = [];
$totals = [];
$this->prepareFlatListWithLevels($tree, 0, $flatList, $totals);
return $this->render('default/treevertical.html.twig', [
'flatList' => $flatList,
'totals' => $totals,
]);
}
private function prepareFlatListWithLevels($tree, $level = 0, &$result = [], &$totals = [])
{
foreach ($tree as $node) {
$node['level'] = $level;
$result[] = $node;
$totals[$level] = ($totals[$level] ?? 0) + 1;
if (!empty($node['children'])) {
$this->prepareFlatListWithLevels($node['children'], $level + 1, $result, $totals);
}
}
}
/**
* @Route("/edit-profile", name="app_user_edit_profile", methods={"GET", "POST"})
*/
public function edit(SluggerInterface $slugger,Request $request, UserRepository $userRepository, UserPasswordHasherInterface $passwordHasher): Response
{
// Obtient l'utilisateur connecté
$user = $this->security->getUser();
if (!$user) {
// Redirige l'utilisateur s'il n'est pas connecté
return $this->redirectToRoute('app_login');
}
$form = $this->createForm(UserModifType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($user->getPlainPassword()) {
$password = $passwordHasher->hashPassword($user, $user->getPlainPassword());
$user->setPassword($password)
->eraseCredentials();
}
$brochureFile = $form->get('picture')->getData();
// this condition is needed because the 'brochure' field is not required
// so the PDF file must be processed only when a file is uploaded
if ($brochureFile) {
$originalFilename = pathinfo($brochureFile->getClientOriginalName(), PATHINFO_FILENAME);
// this is needed to safely include the file name as part of the URL
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename.'-'.uniqid().'.'.$brochureFile->guessExtension();
// Move the file to the directory where brochures are stored
try {
$brochureFile->move(
$this->getParameter('profile_categorie'),
$newFilename
);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
}
$user->setPicture($newFilename);
}
$userRepository->add($user, true);
return $this->redirectToRoute('app_user_profile', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('user/edit.html.twig', [
'user' => $user,
'form' => $form,
]);
}
/**
* @Route("/profile", name="app_user_profile", methods={"GET"})
*/
public function show(UserRepository $userRepository): Response
{
$uderid = $this->security->getUser();
$user = $userRepository->find($uderid);
return $this->render('user/show.html.twig', [
'user' => $user,
]);
}
/**
* @Route("/mes-commandes", name="mes_commandes_connecter")
*/
public function mesCommandes(OrdersRepository $orderRepository): Response
{
$user = $this->getUser();
if (!$user) {
throw new AccessDeniedException('Vous devez être connecté pour accéder à cette page.');
}
$orders = $orderRepository->findOrdersForUserInDateRange($user);
return $this->render('default/mesCommandes.html.twig', [
'orders' => $orders,
]);
}
/**
* @Route("/mes-paiements", name="mes_paiements")
*/
public function mesPaiements(PaiementRepository $paiementRepository): Response
{
$user = $this->getUser();
if (!$user) {
throw new AccessDeniedException('Vous devez être connecté pour accéder à cette page.');
}
$paiements = $paiementRepository->findByUser($user);
return $this->render('default/mespaiement.html.twig', [
'paiements' => $paiements,
]);
}
/**
* @Route("/mes-Super-cadeaux", name="mes_suppper_cade")
*/
public function myUnpaidGifts(UserGiftRepository $giftRepository)
{
$user = $this->getUser();
$unpaidGifts = $giftRepository->findUnpaidGiftsForUser($user->getId());
return $this->render('default/mescadeaux.html.twig', [
'gifts' => $unpaidGifts,
]);
}
/**
* @Route("/password-reset", name="password_reset_request_new")
*/
public function requestPasswordResetnew(Request $request, EntityManagerInterface $entityManager, TokenGeneratorInterface $tokenGenerator): Response
{
$form = $this->createForm(PasswordResetRequestClientType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
// Assurez-vous que votre UserRepository implémente la méthode findOneByDetails
$data = $form->getData();
// Utilisez les données pour trouver l'utilisateur correspondant
$user = $entityManager->getRepository(User::class)->findOneBy([
'Cin' => $data['Cin'],
'datenaissance' => $data['dateNaissance'],
'matrecul' => $data['matricule'],
]);
if ($user) {
$existingRequest = $entityManager->getRepository(PasswordResetRequest::class)->findLatestRequestByCin($data['Cin']);
if ($existingRequest) {
$this->addFlash('error', 'Une demande de réinitialisation a déjà été faite pour ce CIN.');
}else{
$resetRequest = new PasswordResetRequest();
$resetRequest->setUser($user);
$resetRequest->setToken($tokenGenerator->generateToken());
$resetRequest->setCreatedAt(new \DateTime());
$resetRequest->setExpiresAt((new \DateTime())->modify('+10 day'));
$resetRequest->setTerminer(0);
$entityManager->persist($resetRequest);
$entityManager->flush();
$this->addFlash('success', 'Une demande de réinitialisation de mot de passe a été envoyée.');
// return $this->redirectToRoute('app_home'); // Redirigez vers une route appropriée
}
}else {
$this->addFlash('error', 'Vérifier les informations fournies.');
}
}
return $this->render('default/changepassword.html.twig', [
'form' => $form->createView(),
]);
}
}