<?php
namespace App\Controller;
use App\Entity\PaidCourseList;
use App\Entity\Room;
use App\Entity\TeacherSchedule;
use App\Form\TeacherScheduleEditType;
use App\Form\TeacherScheduleRoomEditType;
use App\Form\TeacherScheduleRoomType;
use App\Form\TeacherScheduleType;
use App\Helper\TeacherScheduleHelper;
use App\Repository\HolidayRepository;
use App\Repository\PaidCourseListRepository;
use App\Repository\RoomRepository;
use App\Repository\ScheduleInstituteRepository;
use App\Repository\TeacherRepository;
use App\Repository\TeacherScheduleRepository;
use App\Service\SortByWeekDay;
use DateTimeImmutable;
use DateTimeZone;
use Doctrine\DBAL\Exception;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/admin/teacher/schedule")
* @Security("is_granted('ROLE_SECRETARIAT')")
*/
class TeacherScheduleAdminController extends AbstractController
{
/**
* @Route("/new/{teacherId}", name="teacher_schedule_new", methods={"GET","POST"})
*/
public function new($teacherId, TeacherRepository $teacherRepository,Request $request, TeacherScheduleRepository $teacherScheduleRepository, ScheduleInstituteRepository $scheduleInstituteRepository, SortByWeekDay $sortByWeekDay, EntityManagerInterface $entityManager): Response
{
$duration = $request->query->get('duration') ? $request->query->get('duration') : 2700 ;
$teacher = $teacherRepository->findOneBy(['id' => $teacherId]);
$results = $scheduleInstituteRepository->getAllOrderStartTime($duration);
if ($request->getLocale() == 'fr'){
$schedulesInstitute = $sortByWeekDay->sortScheduleInstituteByFrenchWeek($results);
}else{
$schedulesInstitute = $sortByWeekDay->sortScheduleInstituteByEnglishWeek($results);
}
$teacherSchedule = new TeacherSchedule();
$form = $this->createForm(TeacherScheduleType::class, $teacherSchedule, [
'locale' => $request->getLocale(),
'teacher' => $teacher,
'schedulesInstitute' => $schedulesInstitute
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$appUser = $this->getUser();
$data = $form->getData();
$choosenSchedule = $teacherScheduleRepository->findOneBy([
'teacher' => $teacher,
'scheduleInstitute' => $data->getScheduleInstitute(),
//'forRamadan' => $data->getForRamadan()
]);
// vérification ouvert à la bonne date
if (strtolower($data->getFreeDate()->format('l')) != strtolower($data->getScheduleInstitute()->getDayEn())){
$this->addFlash('error', 'CHOOSE THE RIGHT FREE DATE!!!!!');
return $this->redirectToRoute('teacher_schedule_new', [
'teacherId' => $teacherId
]);
}else{
$scheduleInstituteHour= gmdate('H:i',$data->getScheduleInstitute()->getStartTime());
$date = $data->getFreeDate()->format('Y-m-d');
$createdFreeDate = new \DateTime($date.' '.$scheduleInstituteHour);
$teacherSchedule->setFreeDate($createdFreeDate);
$entityManager->persist($teacherSchedule);
}
/*
if ($duration == 900){
$availableSchedule = $teacherScheduleRepository->find15MinScheduleInto45MinSchedule($teacher, $data->getScheduleInstitute(), $data->getForRamadan());
// 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
}
*/
if (!$choosenSchedule) {
$teacherSchedule->setTeacher($teacher)
->setUpdateAt(new \DateTime())
->setUpdateBy($appUser->getFullname())
->setForRamadan($data->getForRamadan())
->setIsFree(false)
->setIsBlocked(false)
;
$entityManager->persist($teacherSchedule);
$entityManager->flush();
$this->addFlash('success', 'schedule add with success: ADD A ROOM NOW!!!');
return $this->redirectToRoute('admin_teacher_schedules_index', [
'id' => $teacherId,
]);
}
$this->addFlash('error', 'Schedule already existe');
return $this->redirectToRoute('admin_teacher_schedules_index', [
'id' => $teacherId,
]);
}
return $this->render('admin/teacher_schedule/new.html.twig', [
'teacher' => $teacher,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}/edit", name="teacher_schedule_edit", methods={"GET","POST"})
* @param Request $request
* @param TeacherSchedule $teacherSchedule
* @param EntityManagerInterface $em
* @param PaidCourseListRepository $paidCourseListRepository
* @return Response
*/
public function edit(Request $request, TeacherSchedule $teacherSchedule, EntityManagerInterface $em, PaidCourseListRepository $paidCourseListRepository): Response
{
$oldRoom = $teacherSchedule->getRoom();
$form = $this->createForm(TeacherScheduleEditType::class, $teacherSchedule, [
'oldRoom' => $oldRoom,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$appUser = $this->getUser();
if ($teacherSchedule->getIsFree() == true){
//vérifier si l'horaire est vraiment libre
if ($teacherSchedule->getSubscriptionOrder() != null){
$remainCourse = $paidCourseListRepository->findNextCourseBeforeEditTeacherSchedule($teacherSchedule->getId());
if ($remainCourse){
$this->addFlash('error', "ce planning est déjà pris, il ne peut être libéré");
$teacherSchedule->setIsFree(false)
->setUpdateAt(new \DateTime())
->setUpdateBy($appUser->getFullname());
$em->persist($teacherSchedule);
$em->flush();
return $this->redirectToRoute('admin_teacher_schedules_index', [
'id' => $teacherSchedule->getTeacher()->getId(),
]);
}
}
}
if ($teacherSchedule->getRoom() == null){
$teacherSchedule->setRoom($oldRoom);
}
if ($teacherSchedule->getIsFree() == true and $teacherSchedule->getRoom() == null){
//Ne dois pas libérer une horaire si y a pas de classe
$this->addFlash('error', "You HAVE to add a ROOM before open this schedule");
return $this->redirectToRoute('teacher_schedule_edit', [
'id' => $teacherSchedule->getId(),
]);
}
if ($teacherSchedule->getIsBlocked() == true){
$teacherSchedule->setRoom(null);
}
// vérification ouvert à la bonne date
if (strtolower($teacherSchedule->getFreeDate()->format('l')) != strtolower($teacherSchedule->getScheduleInstitute()->getDayEn())){
$this->addFlash('error', 'CHOOSE THE RIGHT FREE DATE!!!!!');
return $this->redirectToRoute('teacher_schedule_edit', [
'id' => $teacherSchedule->getId()
]);
}else{
$scheduleInstituteHour= gmdate('H:i',$teacherSchedule->getScheduleInstitute()->getStartTime());
$date = $teacherSchedule->getFreeDate()->format('Y-m-d');
$createdFreeDate = new \DateTime($date.' '.$scheduleInstituteHour);
$teacherSchedule->setFreeDate($createdFreeDate);
$em->persist($teacherSchedule);
}
$teacherSchedule->setUpdateAt(new \DateTime())
->setUpdateBy($appUser->getFullname());
$em->persist($teacherSchedule);
$em->flush();
$this->addFlash('success', 'Done with success!!');
return $this->redirectToRoute('admin_teacher_schedules_index', [
'id' => $teacherSchedule->getTeacher()->getId(),
]);
}
return $this->render('admin/teacher_schedule/edit.html.twig', [
'teacher_schedule' => $teacherSchedule,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}/editRoom", name="teacher_schedule_edit_room", methods={"GET","POST"})
* @param Request $request
* @param TeacherSchedule $teacherSchedule
* @param EntityManagerInterface $em
* @param PaidCourseListRepository $paidCourseListRepository
* @return Response
*/
public function editRoom(Request $request, TeacherSchedule $teacherSchedule, EntityManagerInterface $em): Response
{
$form = $this->createForm(TeacherScheduleRoomEditType::class, $teacherSchedule, ['action' => $this->generateUrl('teacher_schedule_edit_room', ['id' => $teacherSchedule->getId()])]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$appUser = $this->getUser();
$teacherSchedule->setUpdateAt(new \DateTime())
->setUpdateBy($appUser->getFullname());
$em->flush();
// $this->addFlash('success', 'Done with success!!');
return new Response('<div class="alert alert-success" role="alert">
Done with success!!
</div>');
}
return $this->render('admin/teacher_schedule/edit.room.html.twig', [
'teacher_schedule' => $teacherSchedule,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}/block", name="teacher_schedule_block", methods={"POST"})
* @param TeacherSchedule $teacherSchedule
* @param TeacherScheduleHelper $teacherScheduleHelper
* @return JsonResponse
*/
public function makeBlocked(TeacherSchedule $teacherSchedule, TeacherScheduleHelper $teacherScheduleHelper, EntityManagerInterface $em): JsonResponse
{
$user = $this->getUser();
$currentDate = new \DateTime();
$limit = $currentDate->modify('-5 days');
$teacherScheduleHelper->blockTeacherSchedule($teacherSchedule, $user);
return $this->json(['success'=> 1, 'message' => 'Schedule blocked with success!']);
}
/**
* @Route("/{id}/unblock", name="teacher_schedule_unblock", methods={"POST"})
* @param TeacherSchedule $teacherSchedule
* @param TeacherScheduleHelper $teacherScheduleHelper
*/
public function makeUnBlocked(TeacherSchedule $teacherSchedule, TeacherScheduleHelper $teacherScheduleHelper)
{
$user = $this->getUser();
if ($teacherSchedule->getRoom() == null){
//$this->addFlash('error', "CHOSE A ROOM BEFORE UNBLOCK THE SCHEDULE!");
return $this->json(['error'=> 1, 'message' => 'CHOSE A ROOM BEFORE UNBLOCK THE SCHEDULE!']);
/*
return $this->redirectToRoute('admin_teacher_schedules_index', [
'id' => $teacherSchedule->getTeacher()->getId()
]);*/
}
$teacherScheduleHelper->unBlockTeacherSchedule($teacherSchedule, $user);
return $this->json(['success'=> 1, 'message' => 'Schedule unBlocked with success!']);
}
/**
* @Route("/{id}", name="teacher_schedule_delete", methods={"DELETE"})
*/
public function delete(Request $request, TeacherSchedule $teacherSchedule, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('delete'.$teacherSchedule->getId(), $request->request->get('_token'))) {
$entityManager->remove($teacherSchedule);
$entityManager->flush();
}
return $this->redirectToRoute('teacher_schedule_index');
}
/**
* @Route("/availability/update", name="teacher_schedule_availability_update", methods={"GET","POST"})
*/
public function addWeekToAllFreeSchedules(TeacherScheduleRepository $teacherScheduleRepository, EntityManagerInterface $em, HolidayRepository $holidayRepository)
{
$currentDate = new \DateTimeImmutable('22:58');
$holiday = $holidayRepository->findOneBy([
'name' => "Ramadan"
]);
$startHoliday = $holiday->getStartAt();
$endHoliday = $holiday->getEndAt();
$freeSchedules = $teacherScheduleRepository->findFreeSchedulesToUpdateOneWeek($currentDate);
//Rajouter une semaine à tous les plannings libre dont la date "isfree" est AVANT la date du jour
/** @var TeacherSchedule $schedule */
foreach ($freeSchedules as $schedule){
$oldFreeDate = DateTimeImmutable::createFromMutable($schedule->getFreeDate());
$newFreeDate = $oldFreeDate->modify('+1 week');
if ($newFreeDate > $startHoliday and $newFreeDate < $endHoliday){
while ($newFreeDate > $startHoliday and $newFreeDate < $endHoliday){
$newFreeDate = $newFreeDate->modify('+1 week');
}
}
$schedule->setFreeDate($newFreeDate)
->setUpdateAt(new \DateTime())
->setUpdateBy('cron')
;
$em->persist($schedule);
}
$em->flush();
$this->addFlash('success', 'semaine ajoutée avec success');
return $this->redirectToRoute('superadmin_dashboard');
}
}