src/Controller/LevelTest/LevelTestController.php line 63

Open in your IDE?
  1. <?php
  2. namespace App\Controller\LevelTest;
  3. use App\Entity\Gender;
  4. use App\Entity\Holiday;
  5. use App\Entity\PaidCourseList;
  6. use App\Entity\Subject;
  7. use App\Entity\UserPlacementTest;
  8. use App\Helper\CourseHelper;
  9. use App\Helper\LevelPlacementTestHelper;
  10. use App\Notification\EmailNotification\LevelTestEmailNotification;
  11. use App\Notification\SlackNotification\LevelTestSlackNotification;
  12. use App\Order\OrderHelper;
  13. use App\Repository\ChildRepository;
  14. use App\Repository\HolidayRepository;
  15. use App\Repository\PaidCourseListRepository;
  16. use App\Repository\SessionOrderRepository;
  17. use App\Repository\SessionRegistrationDateRepository;
  18. use App\Repository\SubjectRepository;
  19. use App\Repository\TeacherRepository;
  20. use App\Repository\TeacherScheduleRepository;
  21. use App\Repository\UserPlacementTestRepository;
  22. use App\Repository\UserRepository;
  23. use App\Service\ActiveCampaignHelper;
  24. use App\Service\Currency\CurrencyChangeService;
  25. use DateTimeImmutable;
  26. use Doctrine\ORM\EntityManagerInterface;
  27. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  28. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  29. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  30. use Symfony\Component\HttpFoundation\RedirectResponse;
  31. use Symfony\Component\HttpFoundation\Request;
  32. use Symfony\Component\HttpFoundation\Response;
  33. use Symfony\Component\Routing\Annotation\Route;
  34. /**
  35.  * @Route("/user/placement/test")
  36.  * @Security("is_granted('ROLE_USER')")
  37.  */
  38. class LevelTestController extends AbstractController
  39. {
  40.     /**
  41.      * @Route("/{gender}/{tag}", name="test_placement", defaults={"tag": "alKaamil"}, methods={"GET","POST"})
  42.      * @ParamConverter("gender", options={"mapping": {"gender" : "name"}})
  43.      * @param Gender $gender
  44.      * @param $tag
  45.      * @param SubjectRepository $subjectRepository
  46.      * @param Request $request
  47.      * @param TeacherRepository $teacherRepository
  48.      * @param OrderHelper $orderHelper
  49.      * @param TeacherScheduleRepository $teacherScheduleRepository
  50.      * @param LevelPlacementTestHelper $levelPlacementTestHelper
  51.      * @param SessionOrderRepository $sessionOrderRepository
  52.      * @param UserRepository $userRepository
  53.      * @param UserPlacementTestRepository $userPlacementTestRepository
  54.      * @return RedirectResponse|Response
  55.      */
  56.     public function placementTest(Gender $gender$tagSubjectRepository $subjectRepositoryRequest $requestTeacherRepository $teacherRepositoryOrderHelper $orderHelper,
  57.                                   TeacherScheduleRepository  $teacherScheduleRepositoryLevelPlacementTestHelper $levelPlacementTestHelperSessionOrderRepository $sessionOrderRepository,
  58.                                   UserRepository $userRepositoryUserPlacementTestRepository $userPlacementTestRepositorySessionRegistrationDateRepository $sessionRegistrationDateRepository,
  59.                                   ChildRepository $childRepositoryHolidayRepository $holidayRepositoryCurrencyChangeService $currencyChangeService)
  60.     {
  61.         $free false;
  62.         $hadPurchasedTest null;
  63.         /** @var Holiday $holiday */
  64.         $holiday $holidayRepository->findBy([
  65.             'name' => 'Ramadan'
  66.         ]);
  67.         $startHoliday $holiday[0]->getStartAt();
  68.         $endHoliday $holiday[0]->getEndAt();
  69.         $currentDate = new \DateTime();
  70.         $subject $subjectRepository->findOneBy([
  71.             'tagName' => $tag
  72.         ]);
  73.         $limitRegistrationDateForSubject $sessionRegistrationDateRepository->findOneBy([
  74.             'subject' => $subject
  75.         ]);
  76.         $limitRegistrationDate $limitRegistrationDateForSubject->getCloseRegistrationDate();
  77.         $programName $request->getLocale() == 'fr' $subject->getName() : $subject->getNameEn();
  78.         $email strtolower($request->query->get('email'));
  79.         $sessionOrderId $request->get('sessionorderid');
  80.         if ($email){
  81.             $user $userRepository->findOneBy([
  82.                 'email' => $email
  83.             ]);
  84.             $currentSessionOrder $sessionOrderRepository->getCurrentSessionOrderForOneUserForPlacementTest($sessionOrderId$tag);
  85.             if ($userPlacementTestRepository->findTestWithoutDate()){
  86.                 $hadPurchasedTestArray $userPlacementTestRepository->findTestWithoutDate();
  87.                     foreach ($hadPurchasedTestArray as $element ) {
  88.                         if ( $email == $element->getUser()->getEmail() ) {
  89.                             $hadPurchasedTest $element;
  90.                         }
  91.                     }
  92.                 $free true;
  93.             }
  94.             if (!$currentSessionOrder and !$hadPurchasedTest){
  95.                 $this->addFlash('error'"Vous ne pouvez pas réserver un test gratuitement, merci de contacter le secretariat");
  96.                 return $this->redirectToRoute('user_dashboard', [
  97.                     '_locale' => $request->getLocale()
  98.                 ]);
  99.             }
  100.         }else{
  101.             $user $this->getUser();
  102.             $currentSessionOrder =$sessionOrderRepository->getNewSessionOrderForOneUserForPlacementTest($user$tag);
  103.         }
  104.         if ($currentSessionOrder){
  105.             $havePlacementTestForThisOrder $userPlacementTestRepository->findOneBy([
  106.                 'sessionOrder' => $currentSessionOrder,
  107.                 'participant' => $currentSessionOrder->getParticipant(),
  108.                 'isCanceledbyUs' => false
  109.             ]);
  110.             if ($havePlacementTestForThisOrder){
  111.                 $this->addFlash('error'"Vous avez déjà réservé un test de niveau pour cette session");
  112.                 return $this->redirectToRoute('user_dashboard', [
  113.                     '_locale' => $request->getLocale()]);
  114.             }else{
  115.                 $free true;
  116.             }
  117.             $wasInPreviousSession $sessionOrderRepository->findStudentInPreviousSession($user$tag);
  118.             if ($wasInPreviousSession){
  119.                 $this->addFlash('error'"Vous étiez déjà élève d'une précédente session, vous n'avez donc pas besoin de passer un test de niveau (Sauf si vous n'avez pas assisté au test de fin de session et devez valider votre niveau pour la prochaine session).");
  120.                 $free false;
  121.             }
  122.         }
  123.         //TODO trouver si élève est inscrit à un groupe
  124.         //TODO Definir si son inscription correspond bien à la dernière période (ou date debut de session plus petite que date du jour)
  125.         //TODO définir s'il n'a pas déjà un testPlacement pour cette sessionOrder (canceledbyUs false, si c'est canceldbyus true il aura droit d'acceder pour reprendre un RDV)
  126.         if (!$subject){
  127.             $this->addFlash('error'"Le programme demandé n'existe pas");
  128.             return $this->redirectToRoute('user_dashboard', [
  129.                 '_locale' => $request->getLocale()
  130.             ]);
  131.         }
  132.         if ($currentDate $startHoliday and $currentDate $endHoliday) {
  133.             $freeTeachers $teacherRepository->findTeachersWithFreeSchedulesBySubjectAndGenderForTestForRamadan$subject->getId(), $gender->getId());
  134.         }else{
  135.             $freeTeachers $teacherRepository->findTeachersWithFreeSchedulesBySubjectAndGenderForTest$subject->getId(), $gender->getId(), $limitRegistrationDate);
  136.         }
  137.         $currency $currencyChangeService->getCurrencyChangeForView($request);
  138.         $error false;
  139.         $price round($currency['currencyRate']);
  140.         if ($request->isMethod('POST')) {
  141.             $token $request->request->get('stripeToken');
  142.             $chosenScheduleId $request->request->get('teacherScheduleId');
  143.             if (isset($currentSessionOrder)){
  144.                 $participant $currentSessionOrder->getParticipant();
  145.             }else {
  146.                 //$participant = $request->request->get('participant');
  147.                 $currentSessionOrder null;
  148.                 $selectedStudentId$request->request->get('select-student');
  149.                 if ($selectedStudentId == $user->getId()){
  150.                     $participant null;
  151.                 }else{
  152.                     $participant $childRepository->findOneBy([
  153.                         'id' => $selectedStudentId
  154.                     ]);
  155.                 }
  156.             }
  157.             if (!$chosenScheduleId){
  158.                 $this->addFlash('error''Merci de choisir un horaire');
  159.                 if ($email){
  160.                     return $this->redirectToRoute('test_placement', [
  161.                         'gender' => $gender,
  162.                         'tag' => $tag,
  163.                         'email' => $email,
  164.                         'sessionorderid' => $sessionOrderId,
  165.                         '_locale' => $request->getLocale()
  166.                     ]);
  167.                 }else{
  168.                     return $this->redirectToRoute('test_placement', [
  169.                         'gender' => $gender,
  170.                         'tag' => $tag,
  171.                         '_locale' => $request->getLocale()
  172.                     ]);
  173.                 }
  174.             }
  175.             $chosenSchedule $teacherScheduleRepository->findOneBy(['id' => $chosenScheduleId]);
  176.             if ($free == false){
  177.                 try {
  178.                     $invoice $orderHelper->chargeLevelTest($token$price$chosenSchedule$user);
  179.                     $stripeCustomerId $invoice->customer;
  180.                 } catch(\Stripe\Exception\CardException $e) {
  181.                     //error_log("A payment error occurred: {$e->getError()->message}");
  182.                     $error 'Il y a un problème pour charger votre carte: '.$e->getError()->message;
  183.                 } catch (\Stripe\Exception\InvalidRequestException $e) {
  184.                     $error 'Il y a un problème pour charger votre carte: '.$e->getError()->message;
  185.                 } catch (\Exception $e) {
  186.                     //error_log("Another problem occurred, maybe unrelated to Stripe.");
  187.                     $error 'Il y a un problème pour charger votre carte: '.$e;
  188.                 }
  189.             }else{
  190.                 $stripeCustomerId "free";
  191.                 $price 0;
  192.             }
  193.             if (!$error){
  194.                 if ($hadPurchasedTest){
  195.                     $userPlacementTest $hadPurchasedTest;
  196.                 }else{
  197.                     $userPlacementTest $levelPlacementTestHelper->createLevelPlacementTestInDatabase($stripeCustomerId,$user$price$subject$participant$currentSessionOrder);
  198.                 }
  199.                 $levelTestCourse $levelPlacementTestHelper->createNewCourseForTest($chosenSchedule,$userPlacementTest);
  200.                 //add 1 week to chosen schedule
  201.                 $levelPlacementTestHelper->addOneWeekToChosenSchedule($chosenSchedule);
  202.                 //Send notifications To student and admin
  203.                 $levelPlacementTestHelper->sendNotifications($userPlacementTest$levelTestCourse);
  204.                 /*
  205.                 $activeCampaignContact = $activeCampaignHelper->getOrCreateContact($userPlacementTest);
  206.                 $activeCampaignHelper->addTagsToContact(["buy".$tag."Test"], $activeCampaignContact);
  207.                 */
  208. //TODO MODIFIER AFFICHAGE DASHBOARD ADMIN ET PROF **OKKK**
  209. //TODO PAGE MODIF NIVEAU APRES TEST (A LA PLACE DU RAPPORT DE COURS) **OKKK**
  210. //TODO VOIR COMMENT FAIRE POUR BOOKER TEST SANS PAYER (SI ENVOI DIRECTEMEMENT PAR EMAIL) **OKKK**
  211. //TODO MODIFIER PAGE COURSES POUR AFFICHIER TEST NIVEAU **OKKK**
  212. //TODO PAGE MODIFIER RESERVATION (+ 24H) **OKKK**
  213. //TODO MODIFIER EMAIL ENVOI CONFIRMATION COURS COLLECTIF POUR RESERVER UN TEST DE NIVEAU (SI PAS DEJA FAIT ET SI A PAS FAIT SON EXAM A LA PRECEDENTE SESSION) **OKKK** --A améliorer avec un email séparé en flitrant pour envoyer uniquement à la bonne personne--
  214. //TODO ENVOI EMAIL RESULTAT À L'ELEVE **OKKK***
  215. //TODO CRONMAIL POUR RAPPEL RESULTAT PAS DONNÉ **OKKK***
  216. //TODO TESTER ACHAT TOUS LES COURS POUR VOIR SI RIEN DE CASSÉ
  217.                 $this->addFlash('success'"Votre test a été reservé avec succes !");
  218.                 return $this->redirectToRoute('user_courses', [
  219.                     '_locale' => $request->getLocale()
  220.                 ]);
  221.             }else{
  222.                 $this->addFlash('error'$error);
  223.                 return $this->redirectToRoute('test_placement', [
  224.                     'gender' => $gender,
  225.                     'tag' => $tag,
  226.                     '_locale' => $request->getLocale()
  227.                 ]);
  228.             }
  229.         }
  230.         return $this->render('user_placement_test/book.html.twig', [
  231.             'subject' => $subject,
  232.             'teachers' => $freeTeachers,
  233.             'stripe_public_key' => $this->getParameter('stripe_public_key'),
  234.             'errorCard' => $error,
  235.             'price' => $price,
  236.             'free' => $free,
  237.             'dateLimitForTest' => $limitRegistrationDate $limitRegistrationDate->format('Y-m-d H:i') : new \DateTime('Y-m-d H:i'),
  238.             'dateLimitRegistration' => $limitRegistrationDateForSubject,
  239.             'user' => $this->getUser(),
  240.             'currency' => $currency
  241.         ]);
  242.     }
  243.     /**
  244.      * @Route("/{gender}/{tag}/{testId}/{courseId}/edit", name="test_placement_edit")
  245.      * @ParamConverter("gender", options={"mapping": {"gender" : "name"}})
  246.      * @param Gender $gender
  247.      * @param Subject $subject
  248.      * @param UserPlacementTest $userPlacementTest
  249.      * @param PaidCourseList $courseList
  250.      * @param TeacherRepository $teacherRepository
  251.      * @param Request $request
  252.      * @param TeacherScheduleRepository $teacherScheduleRepository
  253.      * @param LevelPlacementTestHelper $levelPlacementTestHelper
  254.      * @return RedirectResponse|Response
  255.      */
  256.     public function editLevelTestSchedule(Gender $gender,$tag$testId$courseIdTeacherRepository $teacherRepositoryRequest $requestTeacherScheduleRepository $teacherScheduleRepositoryLevelPlacementTestHelper $levelPlacementTestHelperSubjectRepository $subjectRepositoryUserPlacementTestRepository $userPlacementTestRepositoryPaidCourseListRepository $paidCourseListRepositorySessionRegistrationDateRepository $sessionRegistrationDateRepository)
  257.     {
  258.         $free true;
  259.         $price 0;
  260.         $error null;
  261.         $userPlacementTest $userPlacementTestRepository->findOneBy([
  262.             'id' => $testId
  263.         ]);
  264.         $oldLevelTestCourse $paidCourseListRepository->findOneBy([
  265.             'id' => $courseId
  266.         ]);
  267.         
  268.         if (!$oldLevelTestCourse or !$userPlacementTest){
  269.             $this->addFlash('error''Aucun test trouvé, contactez le secrétariat');
  270.             return $this->redirectToRoute('user_courses', [
  271.                 '_locale' => $request->getLocale()
  272.             ]);
  273.         }
  274.         $currentDate = new \DateTime();
  275.         $courseDate DateTimeImmutable::createFromMutable($oldLevelTestCourse->getCourseDate());
  276.         $limit $courseDate->modify('-1 day');
  277.         if ($currentDate $limit and $oldLevelTestCourse->getIsCanceled() == false){
  278.             $this->addFlash('error''Il est trop tard pour modifier le rendez-vous. Celui-ci aura lieu dans moins de 24h');
  279.             return $this->redirectToRoute('user_courses', [
  280.                 '_locale' => $request->getLocale()
  281.             ]);
  282.         }
  283.         $subject $subjectRepository->findOneBy([
  284.             'tagName' => $tag
  285.         ]);
  286.         $limitRegistrationDateForSubject $sessionRegistrationDateRepository->findOneBy([
  287.             'subject' => $subject
  288.         ]);
  289.         $limitRegistrationDate $limitRegistrationDateForSubject->getCloseRegistrationDate();
  290.         $freeTeachers $teacherRepository->findTeachersWithFreeSchedulesBySubjectAndGenderForTest$subject->getId(), $gender->getId(), $limitRegistrationDate);
  291.         if ($request->isMethod('POST')) {
  292.             $chosenScheduleId $request->request->get('teacherScheduleId');
  293.             if (!$chosenScheduleId){
  294.                 $this->addFlash('error''Merci de choisir un horaire');
  295.                 return $this->redirectToRoute('test_placement_edit', [
  296.                     'gender' => $gender,
  297.                     'tag' => $subject->getTagName(),
  298.                     'testId' => $testId,
  299.                     'courseId' => $courseId,
  300.                     '_locale' => $request->getLocale()
  301.                 ]);
  302.             }
  303.             $chosenSchedule $teacherScheduleRepository->findOneBy(['id' => $chosenScheduleId]);
  304.             $levelTestCourse $levelPlacementTestHelper->createNewCourseForTest($chosenSchedule,$userPlacementTest);
  305.             //add 1 week to chosen schedule
  306.             $levelPlacementTestHelper->addOneWeekToChosenSchedule($chosenSchedule);
  307.             //delete old testCourse + remette planning à dispo
  308.             $levelPlacementTestHelper->deleteOldTestCourse($oldLevelTestCourse);
  309.             //Send notifications To student and admin
  310.             $levelPlacementTestHelper->sendNotifications($userPlacementTest$levelTestCourse$oldLevelTestCourse);
  311.             $this->addFlash('success'"Votre rendez-vous a été modifié avec succes !");
  312.             return $this->redirectToRoute('user_courses', [
  313.                 '_locale' => $request->getLocale()
  314.             ]);
  315.         }
  316.         return $this->render('user_placement_test/book.html.twig', [
  317.             'subject' => $subject,
  318.             'teachers' => $freeTeachers,
  319.             'stripe_public_key' => $this->getParameter('stripe_public_key'),
  320.             'errorCard' => $error,
  321.             'price' => $price,
  322.             'free' => $free,
  323.         ]);
  324.     }
  325. }