src/Controller/CourseTemplateController.php line 179

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Course;
  4. use App\Repository\CourseRepository;
  5. use Doctrine\Persistence\ManagerRegistry;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use App\Repository\CourseOccurrenceRepository;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use App\Repository\CourseOccurrenceTimeRepository;
  12. use Menke\UserBundle\Controller\AbstractClientableController;
  13. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  14. use Symfony\Component\HttpFoundation\RedirectResponse;
  15. /**
  16.  * @Route("/course/templates")
  17.  * @IsGranted("ROLE_MANAGER")
  18.  */
  19. class CourseTemplateController extends AbstractClientableController
  20. {
  21.     const LISTING_LIMIT null;
  22.     /**
  23.      * @Route("/convert/course/{courseId}/time/{timeId}", name="course-templates_convert", methods="GET")
  24.      */
  25.     public function convert(Request $request$courseIdCourseRepository $courseRepository): Response
  26.     {
  27.         return $this->render('course-template/convert.html.twig', [
  28.         ]);
  29.     }
  30.     /**
  31.      * @Route("/", name="course-templates_index", methods="GET")
  32.      */
  33.     public function index(CourseRepository $courseRepo)
  34.     {
  35.         // Fetch course templates
  36.         $courses $courseRepo->findBy([
  37.             'courseNature' => 'CourseTemplate'
  38.         ]);
  39.         return $this->render('course-template/index.html.twig', [
  40.             'courses' => $courses
  41.         ]);
  42.     }
  43.     /**
  44.      * @Route("/{id}/proposals", name="course_template_proposals", methods="GET", requirements={"id"="\d+"})
  45.      */
  46.     public function proposals(
  47.         Request $request,
  48.         Course $course,
  49.         CourseOccurrenceRepository $repo,
  50.         CourseOccurrenceTimeRepository $timesRepo
  51.     ): Response
  52.     {
  53.         $this->denyAccessUnlessGranted('ROLE_MANAGER'$course);
  54.         // Set dates
  55.         $date $request->get('date') ?? date('Y-m-d');
  56.         $dateTime = new \DateTime($date);
  57.         if (!empty($request->get('step'))) {
  58.             if ($request->get('step') == 'prev') {
  59.                 $dateTime->modify('-1 month');
  60.             }
  61.             elseif ($request->get('step') == 'next') {
  62.                 $dateTime->modify('+1 month');
  63.             }
  64.             $date $dateTime->format('Y-m-d');
  65.         }
  66.         $occurrences $repo->findByCoursePaged($course,1000);
  67.         $slots = [];
  68.         foreach ($occurrences as $occurence) {
  69.             $queryBuilder $timesRepo->createQueryBuilder('cot');
  70.             $queryBuilder
  71.                 ->leftJoin('cot.occurrence''co')
  72.                 ->andWhere('co.id = :id')
  73.                 
  74.                 ->andWhere('DATE_FORMAT(cot.start, \'%Y-%m-%d\') >= :start')
  75.                 ->andWhere('DATE_FORMAT(cot.end, \'%Y-%m-%d\') <= :end')
  76.                 ->setParameter('id'$occurence->getId())
  77.                 ->setParameter('start'$dateTime->format('Y-m-01'))
  78.                 ->setParameter('end'$dateTime->format('Y-m-t'))
  79.              
  80.                
  81.                
  82.                 
  83.             ;
  84.             $times $queryBuilder->getQuery()->getResult();
  85.             foreach ($times as $time) {
  86.                 $occurence $time->getOccurrence();
  87.                 $course $occurence->getCourse();
  88.                 $slots[$time->getStart()->format('Y-m-d')][] = [
  89.                     'id' => $time->getId(),
  90.                     'availability' => $time->getAvailability(),
  91.                     'orderItemId' => $time->getOrderItem(),
  92.                     'occurence' => [
  93.                         'id' => $occurence->getId(),
  94.                         'start' => $time->getStart()->format('Y-m-d H:i:s'),
  95.                         'end' => $time->getEnd()->format('Y-m-d H:i:s'),
  96.                     ],
  97.                     'course' => [
  98.                         'id' => $course->getId(),
  99.                         'title' => $course->getTitle(),
  100.                     ]
  101.                 ];
  102.             }
  103.         }
  104.         // Get first day
  105.         $fistDayDate = new \DateTime($dateTime->format('Y-m-01'));
  106.         $firstDay $fistDayDate->format('N');
  107.         $days $dateTime->format('t');
  108.         $weeks = [];
  109.         $dayNum 0;
  110.         for ($x 0$x 50; ++$x) {
  111.             $weekIndex floor($x 7);
  112.             $value = (($x 1) >= $firstDay && $dayNum $days) ? ++$dayNum null;
  113.             if ($x == and $dayNum >= $days) {
  114.                 break;
  115.             }
  116.             $key $dateTime->format('Y-m-' str_pad($dayNum2'0'STR_PAD_LEFT));
  117.             $weeks[$weekIndex][] = [
  118.                 'daynum' => $value,
  119.                 'proposals' => ($value && !empty($slots[$key]) ? $slots[$key] : [])
  120.             ];
  121.         }
  122.         $monthNames = [
  123.             => 'Januar',
  124.             => 'Februar',
  125.             => 'März',
  126.             => 'April',
  127.             => 'Mai',
  128.             => 'Juni',
  129.             => 'Juli',
  130.             => 'August',
  131.             => 'September',
  132.             10 => 'Oktober',
  133.             11 => 'November',
  134.             12 => 'Dezember',
  135.         ];
  136.         return $this->render('course-template/proposals.html.twig', [
  137.             'course' => $course,
  138.             'date' => $date,
  139.             'monthName' => $monthNames[$dateTime->format('n')],
  140.             'weeks' => $weeks
  141.         ]);
  142.     }
  143.     /**
  144.      * @Route("/{id}/proposals/modal/time/{timeId}/edit", name="course_template_proposals_modal_time_edit", methods="GET", requirements={"id"="\d+"})
  145.      */
  146.     public function proposalsModalTimeEdit(
  147.         Request $request,
  148.         Course $course,
  149.         CourseOccurrenceTimeRepository $timesRepo
  150.     ): Response
  151.     {
  152.         $this->denyAccessUnlessGranted('ROLE_MANAGER'$course);
  153.      
  154.         // Fetch time
  155.         $time $timesRepo->find($request->get('timeId'));
  156.         $source $this->renderView('course-template/modals/time-edit.html.twig', [
  157.             'course' => $course,
  158.             'time' => $time
  159.         ]);
  160.         return new \Symfony\Component\HttpFoundation\JsonResponse([
  161.             'modal' => $source
  162.         ]);
  163.     }
  164.     /**
  165.      * @Route("/{id}/proposals/modal/time/{timeId}/edit", name="course_template_proposals_time_update", methods="POST", requirements={"id"="\d+"})
  166.      */
  167.     public function courseOccurrencesProposalsTimeUpdate(
  168.         Request $request,
  169.         Course $course,
  170.         CourseOccurrenceTimeRepository $timesRepo,
  171.         ManagerRegistry $managerRegistry
  172.     ): Response
  173.     {
  174.         $this->denyAccessUnlessGranted('ROLE_MANAGER'$course);
  175.         // Fetch time
  176.         $time $timesRepo->find($request->get('timeId'));
  177.         $time->setNote($request->get('note'));
  178.         $time->setAvailability($request->get('availability'));
  179.         $em $managerRegistry->getManager();
  180.         $em->merge($time);
  181.         $em->flush();
  182.         return new \Symfony\Component\HttpFoundation\JsonResponse([
  183.             'dismissModal' => true,
  184.             'removeClass' => [ 'selector' => '.timeslot[data-time="' $time->getId() . '"]''className' => 'Bookable Requestable NotAvailable' ],
  185.             'addClass' => [ 'selector' => '.timeslot[data-time="' $time->getId() . '"]''className' => $time->getAvailability() ]
  186.         ]);
  187.     }
  188. /**
  189.  * @Route("/{id}/proposals/modal/time/{timeId}/unbook", name="course_template_proposals_time_unbook", methods="POST", requirements={"id"="\d+"})
  190.  */
  191. public function courseOccurrencesProposalsTimeUnbook(
  192.     Request $request,
  193.     Course $course,
  194.     CourseOccurrenceTimeRepository $timesRepo,
  195.     ManagerRegistry $managerRegistry
  196. ): RedirectResponse {
  197.     $this->denyAccessUnlessGranted('ROLE_MANAGER'$course);
  198.     // Fetch time
  199.     $time $timesRepo->find($request->get('timeId'));
  200.     if (!$time) {
  201.         return new JsonResponse(['error' => 'Time not found'], 404);
  202.     }
  203.     $time->setNote('unbooked');
  204.     $time->setAvailability('Bookable');
  205.     $time->setModified(new \DateTime());
  206.     $em $managerRegistry->getManager();
  207.     $em->merge($time);
  208.     $em->flush();
  209.     $time $timesRepo->find($request->get('timeId'));
  210.     $this->addFlash('notice''Der Termin wurde freigegeben');
  211.     return $this->redirectToRoute('course_template_proposals', [
  212.         'id' => $course->getId(),
  213.     ]);
  214.     
  215. }
  216. }