src/Controller/Front/TraineeController.php line 431

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use DateTime;
  4. use App\Entity\User;
  5. use App\Entity\Alert;
  6. use App\Entity\Booking;
  7. use App\Entity\Trainee;
  8. use App\Entity\SearchNote;
  9. use App\Entity\SportTrainee;
  10. use App\Form\SearchNoteType;
  11. use App\Service\BrevoService;
  12. use App\Entity\PasswordUpdate;
  13. use App\Form\NotificationType;
  14. use App\Service\ImageOptimizer;
  15. use App\Form\PasswordUpdateType;
  16. use App\Form\TraineeProfileType;
  17. use App\Form\TraineeRegisterType;
  18. use App\Repository\AgeRepository;
  19. use App\Repository\NoteRepository;
  20. use App\Repository\RoleRepository;
  21. use App\Repository\UserRepository;
  22. use App\Service\DocumentGenerator;
  23. use App\Form\SearchNoteTraineeType;
  24. use App\Form\TraineePreferenceType;
  25. use App\Repository\AlertRepository;
  26. use App\Repository\LevelRepository;
  27. use App\Repository\SportRepository;
  28. use App\EmailNotification\ToTrainee;
  29. use App\Form\TraineeShowContactType;
  30. use App\Repository\BookingRepository;
  31. use App\Repository\MessageRepository;
  32. use App\Repository\TraineeRepository;
  33. use App\Service\InternationalService;
  34. use Symfony\Component\Form\FormError;
  35. use App\Repository\LanguageRepository;
  36. use Doctrine\ORM\EntityManagerInterface;
  37. use App\Repository\NoteRequestRepository;
  38. use Knp\Component\Pager\PaginatorInterface;
  39. use Symfony\Component\HttpFoundation\Request;
  40. use Symfony\Component\HttpFoundation\Response;
  41. use Symfony\Component\Routing\Annotation\Route;
  42. use Symfony\Component\HttpFoundation\RequestStack;
  43. use Symfony\Component\String\Slugger\AsciiSlugger;
  44. use Symfony\Contracts\Translation\TranslatorInterface;
  45. use Symfony\Component\HttpFoundation\File\UploadedFile;
  46. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  47. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  48. #[Route(path'/{_locale}')]
  49. class TraineeController extends AbstractController
  50. {
  51.     private $translator;
  52.     private $imageOptimizer;
  53.     private $internationalService;
  54.     private $request;
  55.     public function __construct(TranslatorInterface $translatorImageOptimizer $imageOptimizerInternationalService $internationalServiceRequestStack $requestStack)
  56.     {
  57.         $this->translator $translator;
  58.         $this->imageOptimizer $imageOptimizer;
  59.         $this->internationalService $internationalService;
  60.         $this->request $requestStack->getCurrentRequest();
  61.     }
  62.     #[Route(path'/trainee/my-profile'name'trainee_profile')]
  63.     public function traineeProfil(SportRepository $sportRepositoryRequest $requestEntityManagerInterface $managerUserPasswordHasherInterface $passwordHasherToTrainee $toTrainee)
  64.     {
  65.         $slugger = new AsciiSlugger();
  66.         /**
  67.          * @var Trainee $trainee
  68.          */
  69.         $trainee $this->getUser();
  70.         $sports $sportRepository->findAll();
  71.         $traineeSports = [];
  72.         $oldSportsTrainee $trainee->getSports();
  73.         foreach ($oldSportsTrainee as $sportTrainee) {
  74.             $traineeSports[] = $sportTrainee->getSport();
  75.         }
  76.         foreach ($sports as $sport) {
  77.             if (!in_array($sport$traineeSports)) {
  78.                 $sportTrainee = new SportTrainee();
  79.                 $sportTrainee->setTrainee($trainee)
  80.                     ->setSport($sport);
  81.                 $trainee->addSport($sportTrainee);
  82.             }
  83.         }
  84.         $passUpdate = new PasswordUpdate();
  85.         $formPassword $this->createForm(PasswordUpdateType::class, $passUpdate);
  86.         $formNotification $this->createForm(NotificationType::class, $trainee);
  87.         $formProfile $this->createForm(TraineeProfileType::class, $trainee);
  88.         $formPreference $this->createForm(TraineePreferenceType::class, $trainee);
  89.         $formShowContact $this->createForm(TraineeShowContactType::class, $trainee);
  90.         $formPassword->handleRequest($request);
  91.         $formNotification->handleRequest($request);
  92.         $formProfile->handleRequest($request);
  93.         $formPreference->handleRequest($request);
  94.         $formShowContact->handleRequest($request);
  95.         if ($formPreference->isSubmitted() && $formPreference->isValid()) {
  96.             $sportsTrainee $trainee->getSports();
  97.             $haveSport false;
  98.             foreach ($sportsTrainee as $sportTrainee) {
  99.                 if ($sportTrainee->getLevel() === null || $sportTrainee->getLevel() == 'none') {
  100.                     $trainee->removeSport($sportTrainee);
  101.                     $manager->remove($sportTrainee);
  102.                 } else {
  103.                     $haveSport true;
  104.                     $manager->persist($sportTrainee);
  105.                 }
  106.             }
  107.             if (!$haveSport) {
  108.                 $this->addFlash(
  109.                     'error',
  110.                     $this->translator->trans("flashes.trainee_controller.need_preference")
  111.                 );
  112.                 return $this->redirectToRoute('trainee_profile');
  113.             }
  114.             $manager->flush();
  115.             $this->addFlash(
  116.                 'success',
  117.                 $this->translator->trans('flashes.trainee_controller.update_preferences')
  118.             );
  119.             return $this->redirectToRoute('trainee_profile');
  120.         }
  121.         if ($formPassword->isSubmitted() && $formPassword->isValid()) {
  122.             if (!password_verify($passUpdate->getOldPassword(), $trainee->getPassword())) {
  123.                 $formPassword->get('oldPassword')->addError(new FormError("Ce n'est pas votre de passe actuel!"));
  124.             } else {
  125.                 $newPass $passUpdate->getNewPassword();
  126.                 $hash $passwordHasher->hashPassword($trainee$newPass);
  127.                 $trainee->setPassword($hash);
  128.                 foreach ($trainee->getSports() as $sportTrainee) {
  129.                     if (!in_array($sportTrainee->getSport(), $traineeSports)) {
  130.                         $trainee->removeSport($sportTrainee);
  131.                     } else {
  132.                         $manager->persist($sportTrainee);
  133.                     }
  134.                 }
  135.                 $manager->persist($trainee);
  136.                 $manager->flush();
  137.                 $this->addFlash(
  138.                     'success',
  139.                     $this->translator->trans('flashes.trainee_controller.update_password')
  140.                 );
  141.                 $toTrainee->confirmUpdatePassword($trainee);
  142.                 return $this->redirectToRoute('trainee_profile');
  143.             }
  144.         }
  145.         if ($formProfile->isSubmitted() && $formProfile->isValid()) {
  146.             foreach ($trainee->getSports() as $sportTrainee) {
  147.                 if (!in_array($sportTrainee->getSport(), $traineeSports)) {
  148.                     $trainee->removeSport($sportTrainee);
  149.                 } else {
  150.                     $manager->persist($sportTrainee);
  151.                 }
  152.             }
  153.             $slug strtolower($slugger->slug($trainee->getFirstname() . ' ' $trainee->getLastname() . ' ' $trainee->getId(), '-'));
  154.             $trainee->setSlug($slug);
  155.             $manager->persist($trainee);
  156.             $manager->flush();
  157.             $this->addFlash(
  158.                 'success',
  159.                 $this->translator->trans('flashes.trainee_controller.update_info')
  160.             );
  161.             return $this->redirectToRoute('trainee_profile');
  162.         }
  163.         if ($formNotification->isSubmitted() && $formNotification->isValid()) {
  164.             foreach ($trainee->getSports() as $sportTrainee) {
  165.                 if (!in_array($sportTrainee->getSport(), $traineeSports)) {
  166.                     $trainee->removeSport($sportTrainee);
  167.                 } else {
  168.                     $manager->persist($sportTrainee);
  169.                 }
  170.             }
  171.             $manager->persist($trainee);
  172.             $manager->flush();
  173.             if ($trainee->getNotification() == true) {
  174.                 $this->addFlash(
  175.                     'success',
  176.                     $this->translator->trans('flashes.pro_controller.activate_notifications')
  177.                 );
  178.             } else {
  179.                 $this->addFlash(
  180.                     'success',
  181.                     $this->translator->trans('flashes.pro_controller.disable_notifications')
  182.                 );
  183.             }
  184.             return $this->redirectToRoute('trainee_profile');
  185.         }
  186.         if ($formShowContact->isSubmitted() && $formShowContact->isValid()) {
  187.              foreach ($trainee->getSports() as $sportTrainee) {
  188.                 if (!in_array($sportTrainee->getSport(), $traineeSports)) {
  189.                     $trainee->removeSport($sportTrainee);
  190.                 } else {
  191.                     $manager->persist($sportTrainee);
  192.                 }
  193.             }
  194.             $manager->persist($trainee);
  195.             $manager->flush();
  196.             $this->addFlash(
  197.                 'success',
  198.                 "L'affichage de vos coordonnées a été mis à jour."
  199.             );
  200.             return $this->redirectToRoute('trainee_profile');
  201.         }
  202.         return $this->render('front/trainee/profile.html.twig', [
  203.             'menu' => 'profile',
  204.             'formProfile' => $formProfile->createView(),
  205.             'formPreference' => $formPreference->createView(),
  206.             'formPassword' => $formPassword->createView(),
  207.             'formNotification' => $formNotification->createView(),
  208.             'formShowContact' => $formShowContact->createView(),
  209.             'sports' => $trainee->getSports(),
  210.             'trainee' => $trainee,
  211.         ]);
  212.     }
  213.     #[Route(path'/trainee/my-alerts'name'trainee_alerts')]
  214.     public function alerts(AlertRepository $alertRepository): Response
  215.     {
  216.         $trainee $this->getUser();
  217.         $alerts $alertRepository->findBy(['trainee' => $trainee]);
  218.         return $this->render('front/trainee/alerts.html.twig', [
  219.             'menu' => 'alerts',
  220.             'alerts' => $alerts
  221.         ]);
  222.     }
  223.     #[Route(path'/edit-email-activation'name'edit_email_activation')]
  224.     public function editEmailActivation(AlertRepository $alertRepositoryEntityManagerInterface $manager)
  225.     {
  226.         $id $_POST['id'];
  227.         $alert $alertRepository->find($id);
  228.         if ($alert->getEmailActivated()) {
  229.             $alert->setEmailActivated(false);
  230.         } else {
  231.             $alert->setEmailActivated(true);
  232.         }
  233.         $manager->persist($alert);
  234.         $manager->flush();
  235.         if ($alert->getEmailActivated()) {
  236.             $this->addFlash(
  237.                 'success',
  238.                 $this->translator->trans("flashes.trainee_controller.notifications_enabled")
  239.             );
  240.         } else {
  241.             $this->addFlash(
  242.                 'success',
  243.                 $this->translator->trans("flashes.trainee_controller.notifications_disabled")
  244.             );
  245.         }
  246.         return $this->redirectToRoute('trainee_alerts');
  247.     }
  248.     #[Route(path'/edit-alert'name'edit_alert')]
  249.     public function editAlert(AlertRepository $alertRepositorySportRepository $sportRepositoryAgeRepository $ageRepositoryLanguageRepository $languageRepositoryLevelRepository $levelRepositoryEntityManagerInterface $manager)
  250.     {
  251.         $id $_POST['id'];
  252.         $alert $alertRepository->find($id);
  253.         if ($_POST['title']) {
  254.             $alert->setTitle($_POST['title']);
  255.         }
  256.         if (count($_POST) > 1) {
  257.             if (!isset($_POST['country'])) {
  258.                 $alert->setCountryCode(null);
  259.             }
  260.             foreach ($alert->getSports() as $sport) {
  261.                 $alert->removeSport($sport);
  262.             }
  263.             if (isset($_POST['sports'])) {
  264.                 foreach ($_POST['sports'] as $sportId) {
  265.                     $alert->addSport($sportRepository->find($sportId));
  266.                 }
  267.             }
  268.             if (!isset($_POST['begin'])) {
  269.                 $alert->setBegin(null);
  270.             }
  271.             foreach ($alert->getAges() as $age) {
  272.                 $alert->removeAge($age);
  273.             }
  274.             if (isset($_POST['ages'])) {
  275.                 foreach ($_POST['ages'] as $ageId) {
  276.                     $alert->addAge($ageRepository->find($ageId));
  277.                 }
  278.             }
  279.             foreach ($alert->getLanguages() as $language) {
  280.                 $alert->removeLanguage($language);
  281.             }
  282.             if (isset($_POST['languages'])) {
  283.                 foreach ($_POST['languages'] as $languageId) {
  284.                     $alert->addLanguage($languageRepository->find($languageId));
  285.                 }
  286.             }
  287.             foreach ($alert->getLevels() as $level) {
  288.                 $alert->removeLevel($level);
  289.             }
  290.             if (isset($_POST['levels'])) {
  291.                 foreach ($_POST['levels'] as $levelId) {
  292.                     $alert->addLevel($levelRepository->find($levelId));
  293.                 }
  294.             }
  295.             $manager->persist($alert);
  296.             $this->addFlash(
  297.                 'success',
  298.                 $this->translator->trans("flashes.trainee_controller.alert_modified")
  299.             );
  300.         } else {
  301.             $manager->remove($alert);
  302.             $this->addFlash(
  303.                 'success',
  304.                 $this->translator->trans("flashes.trainee_controller.alert_deleted")
  305.             );
  306.         }
  307.         $manager->flush();
  308.         return $this->redirectToRoute('trainee_alerts');
  309.     }
  310.     #[Route(path'/delete-alert/{id}'name'delete_alert'requirements: ['id' => '\d+'])]
  311.     public function deleteAlert(Alert $alertEntityManagerInterface $manager)
  312.     {
  313.         $manager->remove($alert);
  314.         $manager->flush();
  315.         $this->addFlash(
  316.             'success',
  317.             $this->translator->trans("flashes.trainee_controller.alert_deleted")
  318.         );
  319.         return $this->redirectToRoute('trainee_alerts');
  320.     }
  321.     #[Route(path'/trainee/my-favorites-courses'name'trainee_courses_favorites')]
  322.     public function favoriteCourses(): Response
  323.     {
  324.         $user $this->getUser();
  325.         if ($user instanceof Trainee) {
  326.             $courses $user->getFavorites();
  327.             return $this->render('front/trainee/favorites-courses.html.twig', [
  328.                 'menu' => 'favoris',
  329.                 'courses' => $courses,
  330.                 'startingDate' => null
  331.             ]);
  332.         }
  333.     }
  334.     #[Route(path'/trainee/my-favorites-pros'name'trainee_pros_favorites')]
  335.     public function favoritePros(): Response
  336.     {
  337.         $user $this->getUser();
  338.         if ($user instanceof Trainee) {
  339.             $pros $user->getProFavorites();
  340.             return $this->render('front/trainee/favorites-pros.html.twig', [
  341.                 'menu' => 'favoris',
  342.                 'pros' => $pros,
  343.             ]);
  344.         }
  345.     }
  346.     #[route(path'/trainee/my-bookings/{status}'name'list_bookings'defaults: ['status' => null])]
  347.     public function listBookings($statusBookingRepository $bookingRepository)
  348.     {
  349.         $trainee $this->getUser();
  350.         if ($status == null) {
  351.             $status 'accepted';
  352.         }
  353.         if (in_array($status, ['accepted''pending''done''canceled'])) {
  354.             $bookings $bookingRepository->findTraineeBookingByStatus($trainee$status);
  355.         } else {
  356.             return $this->redirectToRoute('list_bookings');
  357.         }
  358.         if ($status == 'accepted') {
  359.             usort($bookings, array($this"cmp"));
  360.         }
  361.         return $this->render('/front/trainee/list-bookings.html.twig', [
  362.             'bookings' => $bookings,
  363.             'status' => $status,
  364.             'menu' => 'bookings'
  365.         ]);
  366.     }
  367.     function cmp($a$b)
  368.     {
  369.         $aBegin date_create_from_format('d.m.y'$a->getBegin());
  370.         $bBegin date_create_from_format('d.m.y'$b->getBegin());
  371.         return ($aBegin $bBegin);
  372.     }
  373.     #[Route(path'/trainee/course-bill/booking-{ref}'name'generate_course_bill')]
  374.     public function generateCourseBill($refBookingRepository $bookingRepoDocumentGenerator $documentGenerator)
  375.     {
  376.         $trainee $this->getUser();
  377.         $booking $bookingRepo->findOneBy(['ref' => $ref'trainee' => $trainee]);
  378.         if ($booking) {
  379.             try {
  380.                 $documentGenerator->generateBookingRecap($booking'trainee');
  381.                 die();
  382.             } catch (\Throwable $th) {
  383.                 $this->addFlash(
  384.                     "success",
  385.                     $this->translator->trans("flashes.pro_controller.error_occured")
  386.                 );
  387.                 return $this->redirectToRoute('list_bookings');
  388.             }
  389.         } else {
  390.             return $this->redirectToRoute('list_bookings');
  391.         }
  392.     }
  393.     #[Route(path'/trainee/given-reviews'name'trainee_note_given')]
  394.     public function noteGiven(NoteRepository $noteRepositoryPaginatorInterface $paginatorRequest $request): Response
  395.     {
  396.         $trainee $this->getUser();
  397.         $form $this->createForm(SearchNoteTraineeType::class, null, ['trainee' => $trainee]);
  398.         $form->handleRequest($request);
  399.         $searchSubmitted null;
  400.         if ($form->isSubmitted() && $form->isValid()) {
  401.             $searchSubmitted $form->getData();
  402.         }
  403.         $notes $paginator->paginate(
  404.             $noteRepository->searchTraineeGivenNotes($trainee$searchSubmitted),
  405.             $this->request->query->getInt('page'1),
  406.             15
  407.         );
  408.         return $this->render('front/trainee/note/note-given.html.twig', [
  409.             'menu' => 'note',
  410.             'trainee' => $trainee,
  411.             'form' => $form->createView(),
  412.             'notes' => $notes
  413.         ]);
  414.     }
  415.     #[Route(path'/trainee/pending-reviews'name'trainee_note_pending')]
  416.     public function notePending(MessageRepository $messageRepositoryBookingRepository $bookingRepositoryNoteRequestRepository $noteRequestRepositoryRequest $requestPaginatorInterface $paginator): Response
  417.     {
  418.         $locale $request->getLocale();
  419.         /** @var User $trainee */
  420.         $trainee $this->getUser();
  421.         $searchSubmitted null;
  422.         $nameSearch null;
  423.         $courseToken null;
  424.         $form $this->createForm(SearchNoteTraineeType::class, null, ['trainee' => $trainee]);
  425.         $form->handleRequest($request);
  426.         if ($form->isSubmitted() && $form->isValid()) {
  427.             $searchSubmitted $form->getData();
  428.             $nameSearch $searchSubmitted['name'];
  429.             $courseToken $searchSubmitted['course'] ? $searchSubmitted['course']->getToken() : '';
  430.         }
  431.         $notationMessages $messageRepository->findTraineePendingNotationMessages($trainee);
  432.         $requests = [];
  433.         foreach ($notationMessages as $message) {
  434.             $booking $bookingRepository->findOneBy(['ref' => $message->getBookingRef()]);
  435.             $requestData = [
  436.                 'id' => $message->getId(),
  437.                 'type' => 'message',
  438.                 'fullname' => $booking->getCourse()->getOwner()->getProInfo()->getFullname(),
  439.                 'photo' => $booking->getCourse()->getOwner()->getPhoto(),
  440.                 'sendingDate' => $message->getCreatedAt()->format('d/m/Y'),
  441.                 'courseName' => $booking->getCourse()->getTranslatedContent($locale)->getName(),
  442.                 'courseToken' => $booking->getCourse()->getToken(),
  443.                 'link' => $this->generateUrl('rate_course', ['_locale' => $locale'booking' => $booking->getRef()])
  444.             ];
  445.             // Appliquer les filtres de recherche
  446.             if (($nameSearch === '' || stripos($requestData['fullname'], $nameSearch) !== false) &&
  447.                 ($courseToken === '' || stripos($requestData['courseToken'], $courseToken) !== false)) {
  448.                 $requests[] = $requestData;
  449.             }
  450.         }
  451.         $noteRequests $noteRequestRepository->findBy(['email' => $trainee->getEmail(), 'status' => 'pending']);
  452.         foreach ($noteRequests as $noteRequest) {
  453.             $requestData = [
  454.                 'id' => $noteRequest->getId(),
  455.                 'type' => 'request',
  456.                 'fullname' => $noteRequest->getPro()->getProInfo()->getFullname(),
  457.                 'photo' => $noteRequest->getPro()->getPhoto(),
  458.                 'sendingDate' => $noteRequest->getCreatedAt()->format('d/m/Y'),
  459.                 'courseName' => $noteRequest->getCourse()->getTranslatedContent($locale)->getName(),
  460.                 'courseToken' => $noteRequest->getCourse()->getToken(),
  461.                 'link' => $this->generateUrl('rate_course', ['_locale' => $locale'noteRequestReference' => $noteRequest->getReference()])
  462.             ];
  463.             // Appliquer les filtres de recherche
  464.             if (($nameSearch === '' || stripos($requestData['fullname'], $nameSearch) !== false) &&
  465.                 ($courseToken === '' || stripos($requestData['courseToken'], $courseToken) !== false)) {
  466.                 $requests[] = $requestData;
  467.             }
  468.         }
  469.         // Trier les résultats par date d'envoi
  470.         usort($requests, function ($a$b) {
  471.             return strtotime($a['sendingDate']) <=> strtotime($b['sendingDate']);
  472.         });
  473.         $requests $paginator->paginate(
  474.             $requests,
  475.             $request->query->getInt('page'1),
  476.             15
  477.         );
  478.         return $this->render('front/trainee/note/pending-reviews.html.twig', [
  479.             'menu' => 'note',
  480.             'trainee' => $trainee,
  481.             'requests' => $requests,
  482.             'form' => $form->createView()
  483.         ]);
  484.     }
  485. }