<?php
namespace App\Controller;
use App\Entity\TennisVenues;
use App\Entity\User;
use App\Form\ImportType;
use App\Form\TennisVenuesType;
use App\Repository\TennisBookingsRepository;
use App\Repository\TennisVenuesDistancesRepository;
use App\Repository\TennisVenuesRepository;
use App\Repository\UserRepository;
use App\Services\DistanceToVenueByPlayer;
use App\Services\ScrapeMyCourtsStaticData;
use App\Services\TennisVenueImportService;
use App\Services\UserImportService;
use App\Services\VenueFavouritesByPlayer;
use Doctrine\ORM\EntityManagerInterface;
use JeroenDesloovere\VCard\VCard;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Csv;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\String\Slugger\SluggerInterface;
/**
* @Route("/tennisvenues")
*/
class TennisVenuesController extends AbstractController
{
/**
* @Route("/index", name="tennis_venues_index", methods={"GET"})
*/
public function index(TennisVenuesRepository $tennisVenuesRepository, TennisVenuesDistancesRepository $tennisVenuesDistancesRepository, VenueFavouritesByPlayer $venueFavouritesByPlayer, Security $security): Response
{
$venues = $tennisVenuesRepository->findAll();
$user = $security->getUser();
$distances = $tennisVenuesDistancesRepository->findBy([
'user' => $user]);
$favoured_venues = [];
if ($user != null) {
$favoured_venues = $user->getTennisVenues();
}
return $this->render('tennis_venues/index.html.twig', [
'sample_venue' => $tennisVenuesRepository->findOneBy([
'venue' => 'Bethnal Green Gardens'
]),
'tennis_venues' => $venues,
'user' => $user,
'favoured_venues' => $favoured_venues,
'show_icon' => 'No',
'booking_engine' => 'All'
]);
}
/**
* @Route("/index/{booking_engine}", name="tennis_venues_index_by_booking_engine", methods={"GET"})
*/
public function indexBySystem(Request $request, string $booking_engine, TennisVenuesRepository $tennisVenuesRepository, TennisVenuesDistancesRepository $tennisVenuesDistancesRepository, VenueFavouritesByPlayer $venueFavouritesByPlayer, Security $security): Response
{
$venues = $tennisVenuesRepository->findBy([
'bookingEngine' => $booking_engine
]);
$user = $security->getUser();
$distances = $tennisVenuesDistancesRepository->findBy([
'user' => $user]);
$favoured_venues = [];
if ($user != null) {
$favoured_venues = $user->getTennisVenues();
}
return $this->render('tennis_venues/index.html.twig', [
'sample_venue' => $tennisVenuesRepository->findOneBy([
'venue' => 'Bethnal Green Gardens'
]),
'tennis_venues' => $venues,
'user' => $user,
'favoured_venues' => $favoured_venues,
'show_icon' => 'No',
'booking_engine' => $booking_engine
]);
}
/**
* @Route("/map", name="tennis_venues_map", methods={"GET"})
*/
public function map(TennisVenuesRepository $tennisVenuesRepository, TennisVenuesDistancesRepository $tennisVenuesDistancesRepository, VenueFavouritesByPlayer $venueFavouritesByPlayer, Security $security): Response
{
$venues = $tennisVenuesRepository->findAll();
$gpsCentreLocationLatitude = 51.5075;
$gpsCentreLocationLongitude = -0.1808;
$gpsCentreLocationZoom = 12.2;
return $this->render('tennis_venues/venues_map.html.twig', [
'tennis_venues' => $venues,
'gpsCentreLocationLatitude' => $gpsCentreLocationLatitude,
'gpsCentreLocationLongitude' => $gpsCentreLocationLongitude,
'gpsCentreLocationZoom' => $gpsCentreLocationZoom,
]);
}
/**
* @Route("/new", name="tennis_venues_new", methods={"GET","POST"})
*/
public function new(Request $request): Response
{
$tennisVenue = new TennisVenues();
$form = $this->createForm(TennisVenuesType::class, $tennisVenue);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($tennisVenue);
$entityManager->flush();
return $this->redirectToRoute('tennis_venues_index');
}
return $this->render('tennis_venues/new.html.twig', [
'tennis_venue' => $tennisVenue,
'form' => $form->createView(),
]);
}
/**
* @Route("/show/{id}", name="tennis_venues_show", methods={"GET"})
*/
public function show(TennisVenues $tennisVenue): Response
{
return $this->render('tennis_venues/show.html.twig', [
'tennis_venue' => $tennisVenue,
]);
}
/**
* @Route("/venue_address/{id}", name="venue_address", methods={"GET"})
*/
public function venueAddress(TennisVenues $tennisVenue): Response
{
return $this->render('tennis_venues/venue_address.html.twig', [
'tennis_venue' => $tennisVenue,
]
);
}
/**
* @Route("/edit/{id}", name="tennis_venues_edit", methods={"GET","POST"})
* //
** @\Sensio\Bundle\FrameworkExtraBundle\Configuration\Security("is_granted('ROLE_ADMIN')")
*/
public function edit(Request $request, TennisVenues $tennisVenue, Security $security): Response
{
date_default_timezone_set('Europe/London');
$logged_user = $security->getUser();
$now = new \DateTime('now');
$form = $this->createForm(TennisVenuesType::class, $tennisVenue);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($form->has('photo1')) {
$photo1 = $form->get('photo1')->getData();
if ($photo1) {
$originalFilename = pathinfo($photo1->getClientOriginalName(), PATHINFO_FILENAME);
$newFilename = $tennisVenue->getVenue() . '1.' . $photo1->guessExtension();
$previous_file = $this->getParameter('venue_photos_directory') . $newFilename;
if (file_exists($previous_file)) {
unlink($previous_file);
}
$photo1->move(
$this->getParameter('venue_photos_directory'),
$newFilename
);
$tennisVenue->setPhoto1($newFilename);
}
}
if ($form->has('photo2')) {
$photo2 = $form->get('photo2')->getData();
if ($photo2) {
$originalFilename = pathinfo($photo2->getClientOriginalName(), PATHINFO_FILENAME);
$newFilename = $tennisVenue->getVenue() . '2.' . $photo2->guessExtension();
$previous_file = $this->getParameter('venue_photos_directory') . $newFilename;
if (file_exists($previous_file)) {
unlink($previous_file);
}
$photo2->move(
$this->getParameter('venue_photos_directory'),
$newFilename
);
$tennisVenue->setPhoto2($newFilename);
}
}
$tennisVenue->setLastEditedAt($now);
$tennisVenue->setLastEditedBy($logged_user);
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('tennis_venues_index');
}
return $this->render('tennis_venues/edit.html.twig', [
'tennis_venue' => $tennisVenue,
'form' => $form->createView(),
]);
}
/**
* @Route("/ActiveInactive/{id}", name="tennis_venues_active_inactive", methods={"GET","POST"})
* @\Sensio\Bundle\FrameworkExtraBundle\Configuration\Security("is_granted('ROLE_ADMIN')")
*/
public function toggleOnOffActiveInactive(Request $request, TennisVenues $tennisVenue, EntityManagerInterface $manager): Response
{
$referer = $request->headers->get("referer");
if ($tennisVenue->getIsActive() == 1) {
$tennisVenue->setIsActive(0);
} else {
$tennisVenue->setIsActive(1);
}
$manager->flush();
return $this->redirect($referer);
}
/**
* @Route("/DetailsChecked/{id}", name="tennis_venues_details_checked", methods={"GET","POST"})
* @\Sensio\Bundle\FrameworkExtraBundle\Configuration\Security("is_granted('ROLE_ADMIN')")
*/
public function toggleOnOffDetailsChecked(Request $request, TennisVenues $tennisVenue, EntityManagerInterface $manager): Response
{
$referer = $request->headers->get("referer");
if ($tennisVenue->getDetailsChecked() == 1) {
$tennisVenue->setDetailsChecked(0);
} else {
$tennisVenue->setDetailsChecked(1);
}
$manager->flush();
return $this->redirect($referer);
}
/**
* @Route("/ActivateOrDeactivateAll/{flag}", name="tennis_venues_activate_or_deactivate_all", methods={"GET","POST"})
* @\Sensio\Bundle\FrameworkExtraBundle\Configuration\Security("is_granted('ROLE_ADMIN')")
*/
public function toggleOnOffIsaactive(Request $request, $flag, TennisVenuesRepository $tennisVenuesRepository, EntityManagerInterface $manager): Response
{
$referer = $request->headers->get("referer");
$venues = $tennisVenuesRepository->findAll();
if ($flag == "activate") {
foreach ($venues as $venue) {
$venue->setIsActive('1');
}
};
if ($flag == "deactivate") {
foreach ($venues as $venue) {
$venue->setIsActive('0');
}
};
$manager->flush();
return $this->redirect($referer);
}
/**
* @Route("/Reset/AllVenuesToTBA/", name="tennis_venues_reset_all_venues_to_TBA", methods={"GET","POST"})
* @\Sensio\Bundle\FrameworkExtraBundle\Configuration\Security("is_granted('ROLE_ACEIFY')")
*/
public function resetAllVenuesTBA(Request $request, TennisVenuesRepository $tennisVenuesRepository, Security $security, EntityManagerInterface $manager): Response
{
$now = new \DateTime('now');
$logged_user = $security->getUser();
$referer = $request->headers->get("referer");
$venues = $tennisVenuesRepository->findAll();
$venuesNotChecked = [];
foreach ($venues as $venue) {
if ($venue->getDetailsChecked() != '1') {
$venuesNotChecked[] = $venue;
}
}
foreach ($venuesNotChecked as $venueNotChecked) {
$venueNotChecked->setTubeStation(null);
$venueNotChecked->setMembersClub('Public');
$venueNotChecked->setToilet('TBA');
$venueNotChecked->setParking('TBA');
$venueNotChecked->setFloodlights('TBA');
$venueNotChecked->setDetailsChecked('0');
$venueNotChecked->setIndoorCourts('TBA');
$venueNotChecked->setNumberOfCourts('25');
$venueNotChecked->setTravelDirections(null);
$venueNotChecked->setTelNumber(null);
$venueNotChecked->setEmail(null);
$venueNotChecked->setAllowFutureReservations('Yes');
$venueNotChecked->setEmail(null);
$venueNotChecked->setLastEditedBy($logged_user);
$venueNotChecked->setLastEditedAt($now);
$venueNotChecked->setClubDescription(null);
}
$manager->flush();
return $this->redirect($referer);
}
/**
* @Route("/FutureReservationsOnOff/{id}", name="tennis_venues_future_reservations_toggle", methods={"GET","POST"})
* @\Sensio\Bundle\FrameworkExtraBundle\Configuration\Security("is_granted('ROLE_ACEIFY')")
*/
public function toggleFutureReservationsOnOff(Request $request, TennisVenues $tennisVenue, EntityManagerInterface $manager): Response
{
if ($tennisVenue->getAllowFutureReservations() == 1) {
$tennisVenue->setAllowFutureReservations(0);
} elseif ($tennisVenue->getAllowFutureReservations() == 0) {
$tennisVenue->setAllowFutureReservations(true);
} else {
$tennisVenue->setAllowFutureReservations(true);
}
$manager->flush();
return $this->redirectToRoute('tennis_venues_index');
}
/**
* @Route("/delete/{id}", name="tennis_venues_delete", methods={"POST"})
*/
public function delete(Request $request, TennisVenues $tennisVenue): Response
{
if ($this->isCsrfTokenValid('delete' . $tennisVenue->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($tennisVenue);
$entityManager->flush();
}
return $this->redirectToRoute('tennis_venues_index');
}
/**
* @Route("/create/Vcardvenue/{id}", name="create_vcard_venue")
*/
public function createVcardVenue(int $id, TennisVenuesRepository $tennisVenuesRepository)
{
$venue = $tennisVenuesRepository->find($id);
$vcard = new VCard();
$venueFirstName = $venue->getVenue();
$venueLastName = "Tennis Courts";
$company = "TennisFinder - Courts";
$notes =
'Courts: ' . $venue->getNumberOfCourts() .
'\nIndoor/Outdoor: ' . $venue->getIndoorCourts() .
'\nFloodlights: ' . $venue->getFloodlights() .
'\nParking: ' . $venue->getParking() .
'\nToilet: ' . $venue->getToilet() .
'\nComments: ' . $venue->getClubDescription();
$address = $venue->getAddress();
$addressCity = $venue->getAddressCity();
$addressPostCode = $venue->getAddressPostcode();
$addressCountry = $venue->getAddressCountry();
$weblink = $venue->getWebLink();
$vcard->addName($venueLastName, $venueFirstName);
$vcard->addEmail($venue->getEmail())
->addPhoneNumber($venue->getTelNumber(), 'work')
->addCompany($company)
->addAddress('', '', $address, $addressCity, '', $addressPostCode, $addressCountry, 'WORK')
->addNote($notes)
->addURL($weblink);
$vcard->download();
return new Response(null);
}
/**
* @Route("/club_description/{id}", name="club_description", methods={"GET"})
*/
public function club_description($id, TennisVenues $tennisVenues, TennisVenuesRepository $tennisVenuesRepository): Response
{
$venue = $tennisVenuesRepository->find($id);
return $this->render('home/club_description.html.twig', [
'venue' => $venue
]);
}
/**
* @Route ("/tennis_venues/export/", name="tennis_venues_export" )
*/
public function exportTennisVenues(Request $request, TennisVenuesRepository $tennisVenuesRepository)
{
$data = [];
$venue_list = $tennisVenuesRepository->findAll();
$fileName = 'tennis_venues_export.csv';
$exported_date = new \DateTime('now');
$exported_date = $exported_date->format('d-M-Y h:m');
$count = 0;
foreach ($venue_list as $venue) {
$detailChecked = 0;
$isActive = 0;
if ($venue->getDetailsChecked() == 1) {
$detailChecked = 1;
}
if ($venue->getIsActive() == 1) {
$isActive = 1;
}
$data[] = [
$venue->getVenue(),
$venue->getShortCode(),
$isActive,
$detailChecked,
$venue->getEmail(),
$venue->getTelNumber(),
$venue->getNumberOfCourts(),
$venue->getLondonRegion(),
$venue->getAddress(),
$venue->getAddressCity(),
$venue->getAddressPostcode(),
$venue->getAddressCountry(),
$venue->getLongitude(),
$venue->getLatitude(),
$venue->getMapLink(),
$venue->getTubeStation(),
$venue->getMembersClub(),
$venue->getIndoorCourts(),
$venue->getCourtSurface(),
$venue->getFloodlights(),
$venue->getParking(),
$venue->getToilet(),
$venue->getTravelDirections(),
$venue->getAllowFutureReservations(),
$venue->getPhoto1(),
$venue->getPhoto2(),
$venue->getWebLink(),
$venue->getBookingEngine(),
$venue->getBookingUrl(),
$venue->getClubDescription(),
];
}
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Tennis Venues');
$sheet->getCell('A1')->setValue('Venue');
$sheet->getCell('B1')->setValue('ShortCode');
$sheet->getCell('C1')->setValue('IsActive');
$sheet->getCell('D1')->setValue('Details Checked');
$sheet->getCell('E1')->setValue('Email');
$sheet->getCell('F1')->setValue('Tel Number');
$sheet->getCell('G1')->setValue('Number of Courts');
$sheet->getCell('H1')->setValue('London Region');
$sheet->getCell('I1')->setValue('Address');
$sheet->getCell('J1')->setValue('Address City');
$sheet->getCell('K1')->setValue('Postcode');
$sheet->getCell('L1')->setValue('Country');
$sheet->getCell('M1')->setValue('Longitude');
$sheet->getCell('N1')->setValue('Latitude');
$sheet->getCell('O1')->setValue('MapLink');
$sheet->getCell('P1')->setValue('Tube Station');
$sheet->getCell('Q1')->setValue('Members');
$sheet->getCell('R1')->setValue('Indoor');
$sheet->getCell('S1')->setValue('CourtSurface');
$sheet->getCell('T1')->setValue('Floodlights');
$sheet->getCell('U1')->setValue('Parking');
$sheet->getCell('V1')->setValue('Toilet');
$sheet->getCell('W1')->setValue('Travel Directions');
$sheet->getCell('X1')->setValue('Allow Future Reservations');
$sheet->getCell('Y1')->setValue('Photo 1');
$sheet->getCell('Z1')->setValue('Photo 2');
$sheet->getCell('AA1')->setValue('Weblink');
$sheet->getCell('AB1')->setValue('Booking Engine');
$sheet->getCell('AC1')->setValue('Booking URL');
$sheet->getCell('AD1')->setValue('Club Description');
$sheet->fromArray($data, null, 'A2', true);
$total_rows = $sheet->getHighestRow();
$writer = new Csv($spreadsheet);
$response = new StreamedResponse(function () use ($writer) {
$writer->save('php://output');
});
$response->headers->set('Content-Type', 'application/vnd.ms-excel');
$response->headers->set('Content-Disposition', sprintf('attachment;filename="%s"', $fileName));
$response->headers->set('Cache-Control', 'max-age=0');
return $response;
}
/**
* @Route("/tennis_venues/import/ ", name="tennis_venues_import")
*/
public function tennisVenuesImport(Request $request, SluggerInterface $slugger, TennisVenuesRepository $tennisVenuesRepository, TennisVenueImportService $tennisVenueImportService): Response
{
$form = $this->createForm(ImportType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$importFile = $form->get('File')->getData();
if ($importFile) {
$originalFilename = pathinfo($importFile->getClientOriginalName(), PATHINFO_FILENAME);
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename . '.' . 'csv';
try {
$importFile->move(
$this->getParameter('import_tennis_venue_directory'),
$newFilename
);
} catch (FileException $e) {
die('Import failed');
}
$tennisVenueImportService->import($newFilename);
return $this->redirectToRoute('tennis_venues_index');
}
}
return $this->render('admin/import/index.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/delete/delete_all", name="tennis_venues_delete_all", methods={"GET"})
*/
public
function deleteAllBookings(TennisVenuesRepository $tennisVenuesRepository, EntityManagerInterface $entityManager): Response
{
$venues = $tennisVenuesRepository->findAll();
foreach ($venues as $venue) {
$entityManager->remove($venue);
$entityManager->flush();
}
return $this->redirectToRoute('tennis_venues_index');
}
/**
* @Route("/{id}/{photo}/deletephoto", name="tennis_venue_delete_photo")
*/
public function deleteTennisVenuePhoto(Request $request, int $photo, TennisVenues $tennisVenues, EntityManagerInterface $entityManager)
{
$referer = $request->headers->get('referer');
if ($photo == 1) {
$file = $this->getParameter('venue_photos_directory') . $tennisVenues->getPhoto1();
if (file_exists($file)) {
unlink($file);
}
$tennisVenues->setPhoto1(null);
}
if ($photo == 2) {
$file = $this->getParameter('venue_photos_directory') . $tennisVenues->getPhoto2();
if (file_exists($file)) {
unlink($file);
}
$tennisVenues->setPhoto2(null);
}
$entityManager->flush();
return $this->redirect($referer);
}
/**
* @Route("/{id}/{photo}/viewphoto", name="venue_viewphoto")
*/
public function viewVenuePhoto(int $id, int $photo, TennisVenues $tennisVenues)
{
if ($photo == 1) {
$imagename = $tennisVenues->getPhoto1();
}
if ($photo == 2) {
$imagename = $tennisVenues->getPhoto2();
}
return $this->render('tennis_venues/image.html.twig', ['imagename' => $imagename, 'tennis_venue' => $tennisVenues]);
}
/**
* @Route("/scrape/static_data_my_courts", name="tennis_venues_scrape_static_data_my_courts", methods={"GET"})
*/
public
function scrapeMyCourtsStaticData(TennisVenuesRepository $tennisVenuesRepository, ScrapeMyCourtsStaticData $scrapeMyCourtsStaticData, EntityManagerInterface $entityManager): Response
{
$scrapeMyCourtsStaticData->content();
return $this->redirectToRoute('tennis_venues_index');
}
}