src/Controller/TennisCourtAvailabilityController.php line 507

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\TennisBookings;
  4. use App\Entity\TennisCoachCalendar;
  5. use App\Entity\TennisCourtAvailability;
  6. use App\Entity\User;
  7. use App\Entity\Weather;
  8. use App\Form\SearchOnPeriodType;
  9. use App\Form\TennisBookingsType;
  10. use App\Form\TennisCourtAvailabilityType;
  11. use App\Form\UserType;
  12. use App\Repository\ClientCourtTimesRepository;
  13. use App\Repository\CmsRepository;
  14. use App\Repository\CourtSurfaceRepository;
  15. use App\Repository\DefaultTennisPlayerAvailabilityHoursRepository;
  16. use App\Repository\PaymentsRepository;
  17. use App\Repository\SettingsRepository;
  18. use App\Repository\TennisBookingsRepository;
  19. use App\Repository\TennisCourtAvailabilityRepository;
  20. use App\Repository\TennisVenuesDistancesRepository;
  21. use App\Repository\TennisVenuesRepository;
  22. use App\Repository\UserRepository;
  23. use App\Repository\WeatherRepository;
  24. use App\Services\ActiveAceifyClient;
  25. use App\Services\CourtLeadTime;
  26. use App\Services\CourtSurfaceAndFloodlights;
  27. use App\Services\CourtUsageStatistics;
  28. use App\Services\FindUnreleasedCourtsByVenueByDate;
  29. use App\Services\GoogleApiDistanceCount;
  30. use App\Services\LatestScrapeTime;
  31. use App\Services\ScrapeService;
  32. use App\Services\TowerHamletBookingEngine;
  33. use App\Services\UnreleasedCourtsByVenueByDate;
  34. use App\Services\Venues;
  35. use Doctrine\ORM\EntityManagerInterface;
  36. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  37. use Symfony\Component\HttpFoundation\Request;
  38. use Symfony\Component\HttpFoundation\Response;
  39. use Symfony\Component\Mailer\MailerInterface;
  40. use Symfony\Component\Mime\Email;
  41. use Symfony\Component\Routing\Annotation\Route;
  42. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  43. use Symfony\Component\Security\Core\Security;
  44. /**
  45.  * @Route("/tenniscourt/availability")
  46.  */
  47. class TennisCourtAvailabilityController extends AbstractController
  48. {
  49.     /**
  50.      * @Route("/index/{sort}", name="tennis_court_availability_index", methods={"GET"},defaults={"sort"=null})
  51.      */
  52.     public function index(Request                           $requestActiveAceifyClient $activeAceifyClientUnreleasedCourtsByVenueByDate $unreleasedCourtsByVenueByDate,
  53.                           TennisVenuesDistancesRepository   $tennisVenuesDistancesRepository$sort,
  54.                           TennisCourtAvailabilityRepository $tennisCourtAvailabilityRepositoryTennisVenuesRepository $tennisVenuesRepository,
  55.                           CourtSurfaceAndFloodlights        $courtSurfaceAndFloodlights,
  56.                           Security                          $securityGoogleApiDistanceCount $googleApiDistanceCountClientCourtTimesRepository $clientCourtTimesRepository): Response
  57.     {
  58.         $client_court_times $clientCourtTimesRepository->findAll();
  59.         $logged_user $security->getUser();
  60.         $week 'week1';
  61.         if ($request->query->get('week')) {
  62.             $week $request->query->get('week');
  63.         }
  64.         $message '';
  65.         if ($request->query->get('message')) {
  66.             $message $request->query->get('message');
  67.         }
  68.         $hours = [];
  69.         for ($i 7$i <= 23$i++) {
  70.             $hours[$i]['hour'] = $i ':00';
  71.             $hours[$i]['sort'] = $i;
  72.         }
  73.         $minDate $request->query->get('minDate');
  74.         $maxDate $request->query->get('maxDate');
  75.         $today = new \DateTime('now');
  76.         $todayHour $today->format('H') + 1;
  77.         $tomorrow = new \DateTime('tomorrow');
  78.         $weekday $today->format('N') - 1;
  79.         $lastMonday = new \DateTime($today->format('Y-m-d'));
  80.         $lastMonday->modify('-' $weekday ' days');
  81.         $nextSunday = new \DateTime($lastMonday->format('Y-m-d'));
  82.         $nextSunday->modify('+6 days');
  83.         $daysRemainingThisWeek $weekday;
  84.         $dateRange '';
  85.         $monday2 = new \DateTime($lastMonday->format('Y-m-d'));
  86.         $monday3 = new \DateTime($lastMonday->format('Y-m-d'));
  87.         $sunday2 = new \DateTime($nextSunday->format('Y-m-d'));
  88.         $sunday3 = new \DateTime($nextSunday->format('Y-m-d'));
  89.         $monday2->modify('+7 days');
  90.         $monday3->modify('+14 days');
  91.         $sunday2->modify('+7 days');
  92.         $sunday3->modify('+14 days');
  93.         if ($minDate && $maxDate) {
  94.             if (date_diff(new \DateTime($minDate), new \DateTime($maxDate))->days <= 1) {
  95.                 if ($minDate == $today->format('Y-m-d')) {
  96.                     $dateRange 'Today';
  97.                 } else {
  98.                     $dateRange 'Tomorrow';
  99.                 }
  100.                 $dates = [];
  101.                 for ($i 0$i 1$i++) {
  102.                     $next_date = new \DateTime($minDate);
  103.                     $next_date->modify($i 'days');
  104.                     $dates[$i] = $next_date;
  105.                 }
  106.             } else {
  107.                 if ($minDate == $today->format('Y-m-d')) {
  108.                     $dates = [];
  109.                     $dates[0] = new \DateTime($minDate);
  110.                     $dateRange "This Week";
  111.                     for ($i 1$i $daysRemainingThisWeek$i++) {
  112.                         $next_date = new \DateTime($minDate);
  113.                         $next_date->modify($i 'days');
  114.                         $dates[$i] = $next_date;
  115.                     }
  116.                 } else {
  117.                     if ($monday2->format('Y-m-d') == $minDate) {
  118.                         $dateRange 'Next Week';
  119.                     } elseif ($monday3->format('Y-m-d') == $minDate) {
  120.                         $dateRange 'Following Week';
  121.                     }
  122.                     $dates = [];
  123.                     $dates[0] = new \DateTime($minDate);
  124.                     for ($i 1$i <= 6$i++) {
  125.                         $next_date = new \DateTime($minDate);
  126.                         $next_date->modify($i 'days');
  127.                         $dates[$i] = $next_date;
  128.                     }
  129.                 }
  130.             }
  131.         } else {
  132.             $dates = [];
  133.             for ($i 0$i 1$i++) {
  134.                 $next_date = new \DateTime($today->format('Y-m-d'));
  135.                 $next_date->modify($i 'days');
  136.                 $dates[$i] = $next_date;
  137.             }
  138.         }
  139.         $tennis_venues $tennisVenuesRepository->findBy([
  140.             'isActive' => true
  141.         ]);
  142.         if ($sort == 'Home') {
  143.             $tennis_venues = [];
  144.             $venuesbyUserdistance $tennisVenuesDistancesRepository->getSortedVenueByUserAndDistanceHome($activeAceifyClient->findClient($logged_user));
  145.             foreach ($venuesbyUserdistance as $venue) {
  146.                 $tennis_venues[] = $venue->getVenue();
  147.             }
  148.         }
  149.         if ($sort == 'Work') {
  150.             $tennis_venues = [];
  151.             $venuesbyUserdistance $tennisVenuesDistancesRepository->getSortedVenueByUserAndDistanceWork($activeAceifyClient->findClient($logged_user));
  152.             foreach ($venuesbyUserdistance as $venue) {
  153.                 $tennis_venues[] = $venue->getVenue();
  154.             }
  155.         }
  156.         return $this->render('tennis_court_availability/index.html.twig', [
  157.             'tennis_venues' => $tennis_venues,
  158.             'sample_venue' => $tennisVenuesRepository->findOneBy([
  159.                 'venue' => 'Bethnal Green Gardens'
  160.             ]),
  161.             'tennis_court_availabilities' => $tennisCourtAvailabilityRepository->findAll(),
  162.             'client_court_times' => $client_court_times,
  163.             'dates' => $dates,
  164.             'hours' => $hours,
  165.             'today' => $today,
  166.             'minDate' => $request->query->get('minDate'),
  167.             'maxDate' => $request->query->get('maxDate'),
  168.             'lastMonday' => $lastMonday,
  169.             'nextSunday' => $nextSunday,
  170.             'monday2' => $monday2,
  171.             'monday3' => $monday3,
  172.             'sunday2' => $sunday2,
  173.             'sunday3' => $sunday3,
  174.             'week' => $week,
  175.             'now' => $today,
  176.             'show_icon' => 'Yes',
  177.             'tomorrow' => $tomorrow,
  178.             'todayHour' => $todayHour,
  179.             'dateRange' => $dateRange
  180.         ]);
  181.     }
  182.     /**
  183.      * @Route("/tennis_court_availability_daily_detail/index/{venue}/{date}", name="tennis_court_availability_daily_detail", methods={"GET"} )
  184.      */
  185.     public function indexDailyDetail(int $venuestring $dateActiveAceifyClient $activeAceifyClientUnreleasedCourtsByVenueByDate $unreleasedCourtsByVenueByDateRequest $requestTennisVenuesDistancesRepository $tennisVenuesDistancesRepositoryTennisCourtAvailabilityRepository $tennisCourtAvailabilityRepositoryTennisVenuesRepository $tennisVenuesRepositorySecurity $securityGoogleApiDistanceCount $googleApiDistanceCountClientCourtTimesRepository $clientCourtTimesRepository): Response
  186.     {
  187.         $tennis_venue $tennisVenuesRepository->find($venue);
  188.         $number_of_courts $tennis_venue->getNumberOfCourts();
  189.         $client_court_times $clientCourtTimesRepository->findAll();
  190.         $hours = [];
  191.         for ($i 7$i <= 23$i++) {
  192.             $hours[$i]['hour'] = $i ':00';
  193.             $hours[$i]['sort'] = $i;
  194.         }
  195.         $today = new \DateTime('now');
  196.         $todayHour = (int)($today->format('H')) + 2;
  197.         $date = new \DateTime($date);
  198.         return $this->render('tennis_court_availability/indexSingleVenue.html.twig', [
  199.             'tennis_venue' => $tennis_venue,
  200.             'number_of_courts' => $number_of_courts,
  201.             'tennis_court_availabilities' => $tennisCourtAvailabilityRepository->findBy([
  202.                 'venue' => $venue,
  203.                 'date' => $date,
  204.             ]),
  205.             'client_court_times' => $client_court_times,
  206.             'hours' => $hours,
  207.             'today' => $today,
  208.             'now' => $today,
  209.             'show_icon' => 'Yes',
  210.             'date' => $date,
  211.             'todayHour' => $todayHour
  212.         ]);
  213.     }
  214.     /**
  215.      * @Route("/usage/statistics", name="tennis_court_availability_usage_statistics", methods={"GET"},defaults={"sort"=null})
  216.      */
  217.     public function usageStatistics(Request $requestCourtUsageStatistics $courtUsageStatisticsTennisCourtAvailabilityRepository $tennisCourtAvailabilityRepositoryTennisVenuesRepository $tennisVenuesRepository): Response
  218.     {
  219.         $filterStart null;
  220.         $filterEnd null;
  221.         if (!empty($request->query->get('search_on_period')['startAt']) &&
  222.             !empty($request->query->get('search_on_period')['endAt'])
  223.         ) {
  224.             $filterStart = new \DateTime($request->query->get('search_on_period')['startAt']);
  225.             $filterEnd = new \DateTime($request->query->get('search_on_period')['endAt']);
  226.         }
  227.         $form $this->createForm(SearchOnPeriodType::class);
  228.         $form->handleRequest($request);
  229.         $now = new \DateTime();
  230.         $dateStartAt '2023-01-01';
  231.         $dateEndtAt $now->format('Y') . '-01-01';
  232.         $startAt = new \DateTime($dateStartAt);
  233.         $endAt = new \DateTime($dateEndtAt);
  234.         $endAt->modify('+1 year');
  235.         $interval = new \DateInterval('P1Y');
  236.         $annualDatePeriod = new \DatePeriod($startAt$interval$endAt);
  237.         $lastYear = new \DateTime('now');
  238.         $lastYear->modify('- 1 year');
  239.         $interval = new \DateInterval('P1M');
  240.         $monthlyDatePeriod = new \DatePeriod(new \DateTime('2023-01-01'), $interval, new \DateTime('2023-12-31'));
  241.         $days = ['Mon''Tue''Wed''Thu''Fri''Sat''Sun'];
  242.         $hours = [];
  243.         for ($i 7$i <= 23$i++) {
  244.             $hours[$i]['hour'] = $i;
  245.             $hours[$i]['sort'] = $i;
  246.         }
  247.         $tennis_venues $tennisVenuesRepository->findBy([
  248.             'isActive' => true
  249.         ]);
  250.         return $this->render('tennis_court_availability/usage_statistics_index.html.twig', [
  251.             'annual_date_period' => $annualDatePeriod,
  252.             'monthly_date_period' => $monthlyDatePeriod,
  253.             'tennis_venues' => $tennis_venues,
  254.             'tennis_court_availabilities' => $tennisCourtAvailabilityRepository->findAll(),
  255.             'days' => $days,
  256.             'hours' => $hours,
  257.             'form' => $form->createView(),
  258.             'filterStart' => $filterStart,
  259.             'filterEnd' => $filterEnd
  260.         ]);
  261.     }
  262.     /**
  263.      * @Route("/leadtime/statistics", name="tennis_court_availability_leadtime_statistics", methods={"GET"},defaults={"sort"=null})
  264.      */
  265.     public function leadTimeStatistics(Request $requestCourtLeadTime $courtLeadTimeCourtUsageStatistics $courtUsageStatisticsTennisCourtAvailabilityRepository $tennisCourtAvailabilityRepositoryTennisVenuesRepository $tennisVenuesRepository): Response
  266.     {
  267.         $filterStart null;
  268.         $filterEnd null;
  269.         if (!empty($request->query->get('search_on_period')['startAt']) &&
  270.             !empty($request->query->get('search_on_period')['endAt'])
  271.         ) {
  272.             $filterStart = new \DateTime($request->query->get('search_on_period')['startAt']);
  273.             $filterEnd = new \DateTime($request->query->get('search_on_period')['endAt']);
  274.         }
  275.         $form $this->createForm(SearchOnPeriodType::class);
  276.         $form->handleRequest($request);
  277.         $now = new \DateTime();
  278.         $dateStartAt '2023-01-01';
  279.         $dateEndtAt $now->format('Y') . '-01-01';
  280.         $startAt = new \DateTime($dateStartAt);
  281.         $endAt = new \DateTime($dateEndtAt);
  282.         $endAt->modify('+1 year');
  283.         $interval = new \DateInterval('P1Y');
  284.         $annualDatePeriod = new \DatePeriod($startAt$interval$endAt);
  285.         $lastYear = new \DateTime('now');
  286.         $lastYear->modify('- 1 year');
  287.         $interval = new \DateInterval('P1M');
  288.         $monthlyDatePeriod = new \DatePeriod(new \DateTime('2023-01-01'), $interval, new \DateTime('2023-12-31'));
  289.         $days = ['Mon''Tue''Wed''Thu''Fri''Sat''Sun'];
  290.         $hours = [];
  291.         for ($i 7$i <= 23$i++) {
  292.             $hours[$i]['hour'] = $i;
  293.             $hours[$i]['sort'] = $i;
  294.         }
  295.         $tennis_venues $tennisVenuesRepository->findBy([
  296.             'isActive' => true
  297.         ]);
  298.         return $this->render('tennis_court_availability/leadtime_statistics_index.html.twig', [
  299.             'annual_date_period' => $annualDatePeriod,
  300.             'monthly_date_period' => $monthlyDatePeriod,
  301.             'tennis_venues' => $tennis_venues,
  302.             'tennis_court_availabilities' => $tennisCourtAvailabilityRepository->findAll(),
  303.             'days' => $days,
  304.             'hours' => $hours,
  305.             'form' => $form->createView(),
  306.             'filterStart' => $filterStart,
  307.             'filterEnd' => $filterEnd
  308.         ]);
  309.     }
  310.     /**
  311.      * @Route("/leadtimes/calculate/leadtimes", name="tennis_court_availability_calculate_leadtime_statistics", methods={"GET"},defaults={"sort"=null})
  312.      */
  313.     public function calculateLeadTimeStatistics(CourtLeadTime $courtLeadTime): Response
  314.     {
  315.         $courtLeadTime->returnCourtLeadTime();
  316.         return $this->redirectToRoute('tennis_court_availability_leadtime_statistics');
  317.     }
  318.     /**
  319.      * @Route("/leadtimes/delete/leadtimes", name="tennis_court_availability_delete_leadtime_statistics", methods={"GET"},defaults={"sort"=null})
  320.      */
  321.     public function deleteLeadTimeStatistics(TennisCourtAvailabilityRepository $tennisCourtAvailabilityRepositoryEntityManagerInterface $manager): Response
  322.     {
  323.         $courts $tennisCourtAvailabilityRepository->findAll();
  324.         foreach ($courts as $court) {
  325.             $court->setLeadTime(null);
  326.             $court->setSnapUpTime(null);
  327.         }
  328.         $manager->flush();
  329.         return $this->redirectToRoute('tennis_court_availability_leadtime_statistics');
  330.     }
  331.     /**
  332.      * @Route("/add/future/slots", name="tennis_court_availability_add_future_slots", methods={"GET","POST"})
  333.      */
  334.     public function addFutureSlots(Request $requestSettingsRepository $settingsRepositoryTennisVenuesRepository $tennisVenuesRepositoryTennisCourtAvailabilityRepository $tennisCourtAvailabilityRepository): Response
  335.     {
  336.         $venues $tennisVenuesRepository->findBy([
  337.             'isActive' => true
  338.         ]);
  339.         $futureCourtAvailabilityDaysCount $settingsRepository->find('1')->getFutureCourtAvailabilityDaysCount();
  340.         foreach ($venues as $venue) {
  341.             $number_of_courts_at_venue $venue->getNumberOfCourts();
  342.             $startDate = new \DateTime('now');
  343.             for ($dateCounter 1$dateCounter <= $futureCourtAvailabilityDaysCount$dateCounter++) {
  344.                 if ($dateCounter == 1) {
  345.                     $date = clone $startDate;
  346.                 } else {
  347.                     $startDate $startDate->modify("+1 day");
  348.                     $date = clone $startDate;
  349.                 }
  350.                 for ($courtNumber 1$courtNumber <= $number_of_courts_at_venue$courtNumber++) {
  351.                     for ($i 7$i <= 23$i++) {
  352.                         $previousRecord $tennisCourtAvailabilityRepository->findBy([
  353.                             'date' => $date,
  354.                             'hour' => $i,
  355.                             'venue' => $venue,
  356.                             'courtNumber' => $courtNumber
  357.                         ]);
  358.                         if (!$previousRecord) {
  359.                             $tennisCourtAvailability = new TennisCourtAvailability();
  360.                             $tennisCourtAvailability->setScrapedAt(null)
  361.                                 ->setAvailable(0)
  362.                                 ->setDate($date)
  363.                                 ->setHour($i)
  364.                                 ->setVenue($venue)
  365.                                 ->setCourtNumber($courtNumber);
  366.                             $entityManager $this->getDoctrine()->getManager();
  367.                             $entityManager->persist($tennisCourtAvailability);
  368.                             $entityManager->flush();
  369.                         }
  370.                     }
  371.                 }
  372.             }
  373.         }
  374.         return $this->redirectToRoute('tennis_court_availability_index');
  375.     }
  376.     /**
  377.      * @Route("/add/past/slots", name="tennis_court_availability_populate_history", methods={"GET","POST"})
  378.      */
  379.     public function addPastSlots(Request $requestTennisVenuesRepository $tennisVenuesRepositoryTennisCourtAvailabilityRepository $tennisCourtAvailabilityRepository): Response
  380.     {
  381.         $venues $tennisVenuesRepository->findBy([
  382.             'isActive' => true
  383.         ]);
  384.         foreach ($venues as $venue) {
  385.             $today = new \DateTime('now');
  386.             $today2 = new \DateTime('now');
  387.             $startDate $today->modify('-30  days');
  388.             $scrapeStartDate $today2->modify('-35  days');
  389.             for ($dateCounter 1$dateCounter <= 40$dateCounter++) {
  390.                 $date $startDate->modify(+' days');
  391.                 $scraped_date $scrapeStartDate->modify(+' days');
  392.                 for ($i 7$i <= 22$i++) {
  393.                     for ($j 1$j 5$j++) {
  394.                         $previousRecord $tennisCourtAvailabilityRepository->findBy([
  395.                             'date' => $date,
  396.                             'hour' => $i,
  397.                             'venue' => $venue,
  398.                             'courtNumber' => $j
  399.                         ]);
  400.                         if (!$previousRecord) {
  401.                             $available rand(03);
  402.                             $cost null;
  403.                             if ($available == 1) {
  404.                                 $cost rand(412);
  405.                             }
  406.                             $tennisCourtAvailability = new TennisCourtAvailability();
  407.                             $tennisCourtAvailability->setScrapedAt(null)
  408.                                 ->setAvailable($available)
  409.                                 ->setCourtCost($cost)
  410.                                 ->setDate($date)
  411.                                 ->setHour($i)
  412.                                 ->setVenue($venue)
  413.                                 ->setCourtNumber($j)
  414.                                 ->setScrapedAt($scraped_date);
  415.                             $entityManager $this->getDoctrine()->getManager();
  416.                             $entityManager->persist($tennisCourtAvailability);
  417.                             $entityManager->flush();
  418.                         }
  419.                     }
  420.                 }
  421.             }
  422.         }
  423.         return $this->redirectToRoute('tennis_court_availability_index');
  424.     }
  425.     /**
  426.      * @Route("/delete/all", name="tennis_court_availability_delete_all", methods={"GET"})
  427.      */
  428.     public
  429.     function deleteAll(TennisCourtAvailabilityRepository $tennisCourtAvailabilityRepository): Response
  430.     {
  431.         $allEntries $tennisCourtAvailabilityRepository->findAll();
  432.         foreach ($allEntries as $allEntry) {
  433.             $entityManager $this->getDoctrine()->getManager();
  434.             $entityManager->remove($allEntry);
  435.             $entityManager->flush();
  436.         }
  437.         return $this->redirectToRoute('tennis_court_availability_index');
  438.     }
  439.     /**
  440.      * @Route("/scrape/{venue}/{date}", name="tennis_court_availability_scrape", methods={"GET"})
  441.      */
  442.     public
  443.     function scrapeCourtAvailability(Request $request$venuestring $dateTennisVenuesRepository $tennisVenuesRepositoryTennisCourtAvailabilityRepository $tennisCourtAvailabilityRepositoryScrapeService $scrapeService): Response
  444.     {
  445.         $referer $request->headers->get('referer');
  446.         if ($venue == 'All') {
  447.             if ($date == 'All') {
  448.                 $scrapeService->CreateCourtAvailability();
  449.             } else {
  450.                 $scrapeService->CreateCourtAvailability(null$date);
  451.             }
  452.         } else {
  453.             if ($date == 'All') {
  454.                 $scrapeService->CreateCourtAvailability($venuenull);
  455.             } else {
  456.                 $scrapeService->CreateCourtAvailability($venue$date);
  457.             }
  458.         }
  459.         return $this->redirect($referer);
  460.     }
  461.     /**
  462.      * @Route("/{id}", name="tennis_court_availability_show", methods={"GET"})
  463.      */
  464.     public
  465.     function show(TennisCourtAvailability $tennisCourtAvailability): Response
  466.     {
  467.         return $this->render('tennis_court_availability/show.html.twig', [
  468.             'tennis_court_availability' => $tennisCourtAvailability,
  469.         ]);
  470.     }
  471.     /**
  472.      * @Route("/{id}/edit", name="tennis_court_availability_edit", methods={"GET","POST"})
  473.      */
  474.     public
  475.     function edit(Request $requestTennisCourtAvailability $tennisCourtAvailability): Response
  476.     {
  477.         $form $this->createForm(TennisCourtAvailabilityType::class, $tennisCourtAvailability);
  478.         $form->handleRequest($request);
  479.         if ($form->isSubmitted() && $form->isValid()) {
  480.             $this->getDoctrine()->getManager()->flush();
  481.             return $this->redirectToRoute('tennis_court_availability_index');
  482.         }
  483.         return $this->render('tennis_court_availability/edit.html.twig', [
  484.             'tennis_court_availability' => $tennisCourtAvailability,
  485.             'form' => $form->createView(),
  486.         ]);
  487.     }
  488.     /**
  489.      * @Route("/{id}", name="tennis_court_availability_delete", methods={"POST"})
  490.      */
  491.     public
  492.     function delete(Request $requestTennisCourtAvailability $tennisCourtAvailability): Response
  493.     {
  494.         if ($this->isCsrfTokenValid('delete' $tennisCourtAvailability->getId(), $request->request->get('_token'))) {
  495.             $entityManager $this->getDoctrine()->getManager();
  496.             $entityManager->remove($tennisCourtAvailability);
  497.             $entityManager->flush();
  498.         }
  499.         return $this->redirectToRoute('tennis_court_availability_index');
  500.     }
  501.     /**
  502.      * @Route("/courtcalendarstatusrainedoff/{date}/{hour}/{action}", name="tennis_court_calendar_set_status_rained_off", methods={"GET","POST"})
  503.      */
  504.     public
  505.     function courtstatusRainedOff(string $dateint $hourRequest $requeststring $actionTennisCourtAvailabilityRepository $tennisCourtAvailabilityRepositoryEntityManagerInterface $manager): Response
  506.     {
  507.         $referer $request->headers->get('Referer');
  508.         $sessions $tennisCourtAvailabilityRepository->findBy([
  509.             'date' => new \DateTime($date),
  510.             'hour' => $hour
  511.         ]);
  512.         foreach ($sessions as $session) {
  513.             if ($session->getPlayer()) {
  514.                 $session->setStatus($action);
  515.             }
  516.         }
  517.         $manager->flush();
  518.         return $this->redirect($referer);
  519.     }
  520.     /**
  521.      * @Route("/email/reminders", name="court_bookings_email_reminders", methods={"GET","POST"})
  522.      */
  523.     public
  524.     function emailReminders(CmsRepository $cmsRepositoryTennisCourtAvailabilityRepository $tennisCourtAvailabilityRepositoryMailerInterface $mailer)
  525.     {
  526.         $tomorrow = new \DateTime('tomorrow');
  527.         $bookings $tennisCourtAvailabilityRepository->findBy([
  528.             'date' => $tomorrow
  529.         ]);
  530.         foreach ($bookings as $booking) {
  531.             if ($booking->getPlayer()) {
  532.                 $Sendto $booking->getPlayer()->getUser()->getEmail();
  533.                 $date $booking->getDate();
  534.                 $hour $booking->getHour();
  535.                 $courtNumber $booking->getCourtNumber();
  536.                 $html $this->renderView('court_booked_confirmed_email.html.twig', [
  537.                     'booking' => $booking
  538.                 ]);
  539.                 $email = (new Email())
  540.                     ->from($cmsRepository->find('1')->getCompanyEmail())
  541.                     ->to('sjwn71@gmail.com')
  542.                     ->subject("Court booked. Date: " $date->format('D d-M-y') . " at " $hour ":00h. Court: " $courtNumber)
  543.                     ->html($html);
  544.                 $mailer->send($email);
  545.             }
  546.         }
  547.         return $this->redirectToRoute('tennis_court_availability_index');
  548.     }
  549.     /**
  550.      * @Route("/delete/delete_all", name="court_times_delete_all", methods={"GET"})
  551.      */
  552.     public
  553.     function deleteAllCourtTime(TennisCourtAvailabilityRepository $tennisCourtAvailabilityRepositoryEntityManagerInterface $entityManager): Response
  554.     {
  555.         $allCourtTimes $tennisCourtAvailabilityRepository->findAll();
  556.         foreach ($allCourtTimes as $allCourtTime) {
  557.             $entityManager->remove($allCourtTime);
  558.             $entityManager->flush();
  559.         }
  560.         return $this->redirectToRoute('tennis_court_availability_index');
  561.     }
  562. }