src/Controller/TeacherScheduleAdminController.php line 145

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\PaidCourseList;
  4. use App\Entity\Room;
  5. use App\Entity\TeacherSchedule;
  6. use App\Form\TeacherScheduleEditType;
  7. use App\Form\TeacherScheduleRoomEditType;
  8. use App\Form\TeacherScheduleRoomType;
  9. use App\Form\TeacherScheduleType;
  10. use App\Helper\TeacherScheduleHelper;
  11. use App\Repository\HolidayRepository;
  12. use App\Repository\PaidCourseListRepository;
  13. use App\Repository\RoomRepository;
  14. use App\Repository\ScheduleInstituteRepository;
  15. use App\Repository\TeacherRepository;
  16. use App\Repository\TeacherScheduleRepository;
  17. use App\Service\SortByWeekDay;
  18. use DateTimeImmutable;
  19. use DateTimeZone;
  20. use Doctrine\DBAL\Exception;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  23. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  24. use Symfony\Component\HttpFoundation\JsonResponse;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. /**
  29.  * @Route("/admin/teacher/schedule")
  30.  * @Security("is_granted('ROLE_SECRETARIAT')")
  31.  */
  32. class TeacherScheduleAdminController extends AbstractController
  33. {
  34.     /**
  35.      * @Route("/new/{teacherId}", name="teacher_schedule_new", methods={"GET","POST"})
  36.      */
  37.     public function new($teacherIdTeacherRepository $teacherRepository,Request $requestTeacherScheduleRepository $teacherScheduleRepositoryScheduleInstituteRepository $scheduleInstituteRepositorySortByWeekDay $sortByWeekDayEntityManagerInterface $entityManager): Response
  38.     {
  39.         $duration $request->query->get('duration') ? $request->query->get('duration') : 2700 ;
  40.         $teacher $teacherRepository->findOneBy(['id' => $teacherId]);
  41.         $results $scheduleInstituteRepository->getAllOrderStartTime($duration);
  42.         if ($request->getLocale() == 'fr'){
  43.             $schedulesInstitute $sortByWeekDay->sortScheduleInstituteByFrenchWeek($results);
  44.         }else{
  45.             $schedulesInstitute $sortByWeekDay->sortScheduleInstituteByEnglishWeek($results);
  46.         }
  47.         $teacherSchedule = new TeacherSchedule();
  48.         $form $this->createForm(TeacherScheduleType::class, $teacherSchedule, [
  49.             'locale' => $request->getLocale(),
  50.             'teacher' => $teacher,
  51.             'schedulesInstitute' => $schedulesInstitute
  52.         ]);
  53.         $form->handleRequest($request);
  54.         if ($form->isSubmitted() && $form->isValid()) {
  55.             $appUser $this->getUser();
  56.             $data $form->getData();
  57.             $choosenSchedule $teacherScheduleRepository->findOneBy([
  58.                 'teacher' => $teacher,
  59.                 'scheduleInstitute' => $data->getScheduleInstitute(),
  60.                 //'forRamadan' => $data->getForRamadan()
  61.             ]);
  62.             // vérification ouvert à la bonne date
  63.             if (strtolower($data->getFreeDate()->format('l')) != strtolower($data->getScheduleInstitute()->getDayEn())){
  64.                 $this->addFlash('error''CHOOSE THE RIGHT FREE DATE!!!!!');
  65.                 return $this->redirectToRoute('teacher_schedule_new', [
  66.                     'teacherId' => $teacherId
  67.                 ]);
  68.             }else{
  69.                 $scheduleInstituteHourgmdate('H:i',$data->getScheduleInstitute()->getStartTime());
  70.                 $date $data->getFreeDate()->format('Y-m-d');
  71.                 $createdFreeDate = new \DateTime($date.' '.$scheduleInstituteHour);
  72.                 $teacherSchedule->setFreeDate($createdFreeDate);
  73.                 $entityManager->persist($teacherSchedule);
  74.             }
  75.             /*
  76.             if ($duration == 900){
  77.                 $availableSchedule = $teacherScheduleRepository->find15MinScheduleInto45MinSchedule($teacher, $data->getScheduleInstitute(), $data->getForRamadan());
  78.                 // a faire: si planning ouvert voir si y a cours, si y a cours -> retourner erreur, si pas cours, laisser continuer pour ouvrir le creneau 15 min et fermer celui de 45
  79.             }
  80.             */
  81.             if (!$choosenSchedule) {
  82.                 $teacherSchedule->setTeacher($teacher)
  83.                                 ->setUpdateAt(new \DateTime())
  84.                                 ->setUpdateBy($appUser->getFullname())
  85.                                 ->setForRamadan($data->getForRamadan())
  86.                                 ->setIsFree(false)
  87.                                 ->setIsBlocked(false)
  88.                 ;
  89.                 $entityManager->persist($teacherSchedule);
  90.                 $entityManager->flush();
  91.                 $this->addFlash('success''schedule add with success: ADD A ROOM NOW!!!');
  92.                 return $this->redirectToRoute('admin_teacher_schedules_index', [
  93.                     'id' => $teacherId,
  94.                 ]);
  95.             }
  96.             $this->addFlash('error''Schedule already existe');
  97.             return $this->redirectToRoute('admin_teacher_schedules_index', [
  98.                 'id' => $teacherId,
  99.             ]);
  100.         }
  101.         return $this->render('admin/teacher_schedule/new.html.twig', [
  102.             'teacher' => $teacher,
  103.             'form' => $form->createView(),
  104.         ]);
  105.     }
  106.     /**
  107.      * @Route("/{id}/edit", name="teacher_schedule_edit", methods={"GET","POST"})
  108.      * @param Request $request
  109.      * @param TeacherSchedule $teacherSchedule
  110.      * @param EntityManagerInterface $em
  111.      * @param PaidCourseListRepository $paidCourseListRepository
  112.      * @return Response
  113.      */
  114.     public function edit(Request $requestTeacherSchedule $teacherScheduleEntityManagerInterface $emPaidCourseListRepository $paidCourseListRepository): Response
  115.     {
  116.         $oldRoom $teacherSchedule->getRoom();
  117.         $form $this->createForm(TeacherScheduleEditType::class, $teacherSchedule, [
  118.             'oldRoom' => $oldRoom,
  119.         ]);
  120.         $form->handleRequest($request);
  121.         if ($form->isSubmitted() && $form->isValid()) {
  122.             $appUser $this->getUser();
  123.             if ($teacherSchedule->getIsFree() == true){
  124.                 //vérifier si l'horaire est vraiment libre
  125.                 if ($teacherSchedule->getSubscriptionOrder() != null){
  126.                     $remainCourse $paidCourseListRepository->findNextCourseBeforeEditTeacherSchedule($teacherSchedule->getId());
  127.                     if ($remainCourse){
  128.                         $this->addFlash('error'"ce planning est déjà pris, il ne peut être libéré");
  129.                         $teacherSchedule->setIsFree(false)
  130.                                 ->setUpdateAt(new \DateTime())
  131.                                 ->setUpdateBy($appUser->getFullname());
  132.                         $em->persist($teacherSchedule);
  133.                         $em->flush();
  134.                         return $this->redirectToRoute('admin_teacher_schedules_index', [
  135.                             'id' => $teacherSchedule->getTeacher()->getId(),
  136.                         ]);
  137.                     }
  138.                 }
  139.             }
  140.             if ($teacherSchedule->getRoom() == null){
  141.                 $teacherSchedule->setRoom($oldRoom);
  142.             }
  143.             if ($teacherSchedule->getIsFree() == true and $teacherSchedule->getRoom() == null){
  144.                 //Ne dois pas libérer une horaire si y a pas de classe
  145.                 $this->addFlash('error'"You HAVE to add a ROOM before open this schedule");
  146.                 return $this->redirectToRoute('teacher_schedule_edit', [
  147.                     'id' => $teacherSchedule->getId(),
  148.                 ]);
  149.             }
  150.             if ($teacherSchedule->getIsBlocked() == true){
  151.                 $teacherSchedule->setRoom(null);
  152.             }
  153.             // vérification ouvert à la bonne date
  154.             if (strtolower($teacherSchedule->getFreeDate()->format('l')) != strtolower($teacherSchedule->getScheduleInstitute()->getDayEn())){
  155.                 $this->addFlash('error''CHOOSE THE RIGHT FREE DATE!!!!!');
  156.                 return $this->redirectToRoute('teacher_schedule_edit', [
  157.                     'id' => $teacherSchedule->getId()
  158.                 ]);
  159.             }else{
  160.                 $scheduleInstituteHourgmdate('H:i',$teacherSchedule->getScheduleInstitute()->getStartTime());
  161.                 $date $teacherSchedule->getFreeDate()->format('Y-m-d');
  162.                 $createdFreeDate = new \DateTime($date.' '.$scheduleInstituteHour);
  163.                 $teacherSchedule->setFreeDate($createdFreeDate);
  164.                 $em->persist($teacherSchedule);
  165.             }
  166.             $teacherSchedule->setUpdateAt(new \DateTime())
  167.                 ->setUpdateBy($appUser->getFullname());
  168.             $em->persist($teacherSchedule);
  169.             $em->flush();
  170.             $this->addFlash('success''Done with success!!');
  171.             return $this->redirectToRoute('admin_teacher_schedules_index', [
  172.                 'id' => $teacherSchedule->getTeacher()->getId(),
  173.             ]);
  174.         }
  175.         return $this->render('admin/teacher_schedule/edit.html.twig', [
  176.             'teacher_schedule' => $teacherSchedule,
  177.             'form' => $form->createView(),
  178.         ]);
  179.     }
  180.     /**
  181.      * @Route("/{id}/editRoom", name="teacher_schedule_edit_room", methods={"GET","POST"})
  182.      * @param Request $request
  183.      * @param TeacherSchedule $teacherSchedule
  184.      * @param EntityManagerInterface $em
  185.      * @param PaidCourseListRepository $paidCourseListRepository
  186.      * @return Response
  187.      */
  188.     public function editRoom(Request $requestTeacherSchedule $teacherScheduleEntityManagerInterface $em): Response
  189.     {
  190.         $form $this->createForm(TeacherScheduleRoomEditType::class, $teacherSchedule, ['action' => $this->generateUrl('teacher_schedule_edit_room', ['id' => $teacherSchedule->getId()])]);
  191.         $form->handleRequest($request);
  192.         if ($form->isSubmitted() && $form->isValid()) {
  193.             $appUser $this->getUser();
  194.             $teacherSchedule->setUpdateAt(new \DateTime())
  195.                             ->setUpdateBy($appUser->getFullname());
  196.             $em->flush();
  197. //            $this->addFlash('success', 'Done with success!!');
  198.             return new Response('<div class="alert alert-success" role="alert">
  199.                      Done with success!!
  200.                     </div>');
  201.         }
  202.         return $this->render('admin/teacher_schedule/edit.room.html.twig', [
  203.             'teacher_schedule' => $teacherSchedule,
  204.             'form' => $form->createView(),
  205.         ]);
  206.     }
  207.     /**
  208.      * @Route("/{id}/block", name="teacher_schedule_block", methods={"POST"})
  209.      * @param TeacherSchedule $teacherSchedule
  210.      * @param TeacherScheduleHelper $teacherScheduleHelper
  211.      * @return JsonResponse
  212.      */
  213.     public function makeBlocked(TeacherSchedule $teacherScheduleTeacherScheduleHelper $teacherScheduleHelperEntityManagerInterface $em): JsonResponse
  214.     {
  215.         $user  $this->getUser();
  216.         $currentDate = new \DateTime();
  217.         $limit $currentDate->modify('-5 days');
  218.         $teacherScheduleHelper->blockTeacherSchedule($teacherSchedule$user);
  219.         return $this->json(['success'=> 1'message' => 'Schedule blocked with success!']);
  220.     }
  221.     /**
  222.      * @Route("/{id}/unblock", name="teacher_schedule_unblock", methods={"POST"})
  223.      * @param TeacherSchedule $teacherSchedule
  224.      * @param TeacherScheduleHelper $teacherScheduleHelper
  225.      */
  226.     public function makeUnBlocked(TeacherSchedule $teacherScheduleTeacherScheduleHelper $teacherScheduleHelper)
  227.     {
  228.         $user  $this->getUser();
  229.         if ($teacherSchedule->getRoom() == null){
  230.             //$this->addFlash('error', "CHOSE A ROOM BEFORE UNBLOCK THE SCHEDULE!");
  231.             return $this->json(['error'=> 1'message' => 'CHOSE A ROOM BEFORE UNBLOCK THE SCHEDULE!']);
  232.             /*
  233.             return $this->redirectToRoute('admin_teacher_schedules_index', [
  234.                 'id' => $teacherSchedule->getTeacher()->getId()
  235.             ]);*/
  236.         }
  237.         $teacherScheduleHelper->unBlockTeacherSchedule($teacherSchedule$user);
  238.         return $this->json(['success'=> 1'message' => 'Schedule unBlocked with success!']);
  239.     }
  240.     /**
  241.      * @Route("/{id}", name="teacher_schedule_delete", methods={"DELETE"})
  242.      */
  243.     public function delete(Request $requestTeacherSchedule $teacherScheduleEntityManagerInterface $entityManager): Response
  244.     {
  245.         if ($this->isCsrfTokenValid('delete'.$teacherSchedule->getId(), $request->request->get('_token'))) {
  246.             $entityManager->remove($teacherSchedule);
  247.             $entityManager->flush();
  248.         }
  249.         return $this->redirectToRoute('teacher_schedule_index');
  250.     }
  251.     /**
  252.      * @Route("/availability/update", name="teacher_schedule_availability_update", methods={"GET","POST"})
  253.      */
  254.     public function addWeekToAllFreeSchedules(TeacherScheduleRepository $teacherScheduleRepositoryEntityManagerInterface $emHolidayRepository $holidayRepository)
  255.     {
  256.         $currentDate = new \DateTimeImmutable('22:58');
  257.         $holiday $holidayRepository->findOneBy([
  258.             'name' => "Ramadan"
  259.         ]);
  260.         $startHoliday $holiday->getStartAt();
  261.         $endHoliday $holiday->getEndAt();
  262.         $freeSchedules $teacherScheduleRepository->findFreeSchedulesToUpdateOneWeek($currentDate);
  263.             //Rajouter une semaine à tous les plannings libre dont la date "isfree" est AVANT la date du jour
  264.         /** @var TeacherSchedule $schedule */
  265.         foreach ($freeSchedules as $schedule){
  266.                 $oldFreeDate DateTimeImmutable::createFromMutable($schedule->getFreeDate());
  267.                 $newFreeDate $oldFreeDate->modify('+1 week');
  268.                 if ($newFreeDate $startHoliday and $newFreeDate $endHoliday){
  269.                     while ($newFreeDate $startHoliday and $newFreeDate $endHoliday){
  270.                         $newFreeDate $newFreeDate->modify('+1 week');
  271.                     }
  272.                 }
  273.                 $schedule->setFreeDate($newFreeDate)
  274.                         ->setUpdateAt(new \DateTime())
  275.                         ->setUpdateBy('cron')
  276.                 ;
  277.                 $em->persist($schedule);
  278.             }
  279.             $em->flush();
  280.             $this->addFlash('success''semaine ajoutée avec success');
  281.             return $this->redirectToRoute('superadmin_dashboard');
  282.     }
  283. }