src/Controller/HomeController.php line 58

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Client;
  4. use App\Entity\ClientContact;
  5. use App\Entity\MailDelivery;
  6. use App\Entity\SettingsRol;
  7. use App\Entity\ToDoLogs;
  8. use App\Entity\User;
  9. use App\Entity\WidgetNotes;
  10. use App\Form\WidgetNotesType;
  11. use App\MDS\VenuesBundle\Entity\Reservation;
  12. use App\MDS\VenuesBundle\Entity\ReservationLoungeDetails;
  13. use App\MDS\VenuesBundle\Entity\ReservationLoungeSimple;
  14. use App\MDS\VenuesBundle\Entity\ReservationVisit;
  15. use App\Service\CalendarService;
  16. use App\Service\UserNotificationService;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\HttpFoundation\Session\Session;
  23. use Symfony\Component\HttpFoundation\JsonResponse;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. use Google_Client;
  26. use Google_Service_Calendar;
  27. use Doctrine\ORM\Query;
  28. class HomeController extends AbstractController
  29. {
  30.     private $googleCalendar;
  31.     private $translator;
  32.     private UserNotificationService $userNotificationService;
  33.     public function __construct(TranslatorInterface $translatorUserNotificationService $userNotificationService)
  34.     {
  35.         $redirectUri 'https://' . ($_SERVER['HTTP_HOST'] ?? '') . '/calendar/token';
  36.         $client = new Google_Client();
  37.         $client->setApplicationName('Google Calendar API');
  38.         $client->setClientId('YOUR_GOOGLE_CLIENT_ID');
  39.         $client->setClientSecret('YOUR_GOOGLE_CLIENT_SECRET');
  40.         $client->setRedirectUri($redirectUri);
  41.         $client->addScope(Google_Service_Calendar::CALENDAR);
  42.         $guzzle = new \GuzzleHttp\Client(['curl' => [CURLOPT_SSL_VERIFYPEER => false]]);
  43.         $client->setHttpClient($guzzle);
  44.         $this->googleCalendar $client;
  45.         $this->translator $translator;
  46.         $this->userNotificationService $userNotificationService;
  47.     }
  48.     /**
  49.      * @Route("/", name="homepage")
  50.      */
  51.     public function index(EntityManagerInterface $em): Response
  52.     {
  53.         $tz   = new \DateTimeZone('Europe/Madrid');
  54.         $from = (new \DateTimeImmutable('today'$tz))->setTime(00);
  55.         $to   $from->modify('+30 days')->setTime(235959);
  56.         /** =======================
  57.          *  RESERVAS (próx. 30 días) — SIN JOIN
  58.          *  ======================= */
  59.         $rowsR $em->createQueryBuilder()
  60.             ->select('r')
  61.             ->from(Reservation::class, 'r')
  62.             ->where('r.dateEnd >= :from AND r.dateStart <= :to')
  63.             ->setParameter('from'$from)
  64.             ->setParameter('to'$to)
  65.             ->orderBy('r.dateStart''ASC')
  66.             ->getQuery()->getResult(Query::HYDRATE_ARRAY);
  67.         $upcomingReservationsTbl = [];
  68.         foreach ($rowsR as $r) {
  69.             // fechas (acepta camelCase o snake_case)
  70.             $dsRaw $r['dateStart'] ?? $r['date_start'] ?? null;
  71.             $deRaw $r['dateEnd']   ?? $r['date_end']   ?? null;
  72.             $ds $dsRaw instanceof \DateTimeInterface $dsRaw : ($dsRaw ? new \DateTimeImmutable($dsRaw) : null);
  73.             $de $deRaw instanceof \DateTimeInterface $deRaw : ($deRaw ? new \DateTimeImmutable($deRaw) : null);
  74.             // sala(s): primero loungeName; si no, name de ReservationLoungeDetails
  75.             $rooms   = [];
  76.             $rlsRows $em->createQueryBuilder()
  77.                 ->select('rls''rld')
  78.                 ->from(ReservationLoungeSimple::class, 'rls')
  79.                 ->leftJoin(ReservationLoungeDetails::class, 'rld''WITH''rld.id = rls.idLounge')
  80.                 ->where('rls.idReservation = :rid')
  81.                 ->setParameter('rid'$r['id'])
  82.                 ->getQuery()->getResult(Query::HYDRATE_ARRAY);
  83.             foreach ($rlsRows as $row) {
  84.                 $rls $row['rls'] ?? null;
  85.                 $rld $row['rld'] ?? null;
  86.                 $name $row['loungeName'] ?? null;
  87.                 if ($name) { $rooms[$name] = true; }
  88.             }
  89.             $upcomingReservationsTbl[] = [
  90.                 'title'     => $r['title'] ?? '(sin título)',
  91.                 'dateStart' => $ds,
  92.                 'dateEnd'   => $de,
  93.                 'room'      => $rooms implode(', 'array_keys($rooms)) : '-',
  94.             ];
  95.         }
  96.         /** ===================
  97.          *  VISITAS (próx. 30 días) — SIN JOIN
  98.          *  =================== */
  99.         $rowsV $em->createQueryBuilder()
  100.             ->select('v')
  101.             ->from(ReservationVisit::class, 'v')
  102.             ->where('v.dateEnd >= :from AND v.dateStart <= :to')
  103.             ->setParameter('from'$from)
  104.             ->setParameter('to'$to)
  105.             ->orderBy('v.dateStart''ASC')
  106.             ->getQuery()->getResult(Query::HYDRATE_ARRAY);
  107.         $upcomingVisitsTbl = [];
  108.         foreach ($rowsV as $v) {
  109.             $dsRaw $v['dateStart'] ?? $v['date_start'] ?? null;
  110.             $deRaw $v['dateEnd']   ?? $v['date_end']   ?? null;
  111.             $ds $dsRaw instanceof \DateTimeInterface $dsRaw : ($dsRaw ? new \DateTimeImmutable($dsRaw) : null);
  112.             $de $deRaw instanceof \DateTimeInterface $deRaw : ($deRaw ? new \DateTimeImmutable($deRaw) : null);
  113.             // nombre sala desde ReservationLoungeDetails por idLounge
  114.             $roomName '-';
  115.             $idLounge $v['idLounge'] ?? $v['id_lounge'] ?? null;
  116.             if ($idLounge) {
  117.                 $rld $em->getRepository(ReservationLoungeDetails::class)->find($idLounge);
  118.                 if ($rld && method_exists($rld'getName') && $rld->getName()) {
  119.                     $roomName $rld->getName();
  120.                 }
  121.             }
  122.             $upcomingVisitsTbl[] = [
  123.                 'title'     => $v['title'] ?? '(sin título)',
  124.                 'dateStart' => $ds,
  125.                 'dateEnd'   => $de,
  126.                 'room'      => $roomName,
  127.             ];
  128.         }
  129.         $this->userNotificationService->checkRecentNotifications($this->getUser());
  130.         $notifications $this->userNotificationService->getForModal($this->getUser());
  131.         return $this->render('home/index.html.twig', [
  132.             'upcomingReservations' => $upcomingReservationsTbl,
  133.             'upcomingVisits'       => $upcomingVisitsTbl,
  134.             'from'                 => $from,
  135.             'to'                   => $to,
  136.             'notifications'         => $notifications
  137.         ]);
  138.     }
  139.     /**
  140.      * @Route("/calendar/global/visits", name="calendar_global_visits", methods={"GET"})
  141.      */
  142.     public function globalVisits(Request $requestCalendarService $calendar): JsonResponse
  143.     {
  144.         $from = ($s $request->query->get('start'))
  145.             ? new \DateTimeImmutable($s) : new \DateTimeImmutable('first day of this month 00:00');
  146.         $to = ($e $request->query->get('end'))
  147.             ? new \DateTimeImmutable($e) : new \DateTimeImmutable('last day of next month 23:59');
  148.         $events $calendar->getVisitsForCalendar(nullnull$from$to);
  149.         return new JsonResponse($events);
  150.     }
  151.     /**
  152.      * @Route("/calendar/global/reservations", name="calendar_global_reservations", methods={"GET"})
  153.      */
  154.     public function globalReservations(Request $requestCalendarService $calendar): JsonResponse
  155.     {
  156.         $from = ($s $request->query->get('start'))
  157.             ? new \DateTimeImmutable($s) : new \DateTimeImmutable('first day of this month 00:00');
  158.         $to = ($e $request->query->get('end'))
  159.             ? new \DateTimeImmutable($e) : new \DateTimeImmutable('last day of next month 23:59');
  160.         $events $calendar->getReservationsForCalendar(nullnull$from$to);
  161.         return new JsonResponse($events);
  162.     }
  163.     /**
  164.      * @Route("/connectGoogle", name="homepage_connect_google")
  165.      */
  166.     public function connectGoogle(Request $request): Response
  167.     {
  168.         $session = new Session();
  169.         $token $session->get('tokenGoogleCalendar');
  170.         if ($token) {
  171.             $this->googleCalendar->setAccessToken($token);
  172.         }
  173.         if ($this->googleCalendar->isAccessTokenExpired()) {
  174.             if ($this->googleCalendar->getRefreshToken()) {
  175.                 $this->googleCalendar->fetchAccessTokenWithRefreshToken(
  176.                     $this->googleCalendar->getRefreshToken()
  177.                 );
  178.             } else {
  179.                 return $this->redirect($this->googleCalendar->createAuthUrl());
  180.             }
  181.         }
  182.         return $this->redirectToRoute('homepage');
  183.     }
  184.     /**
  185.      * @Route("/ChangeLanguage/{lang}", name="change_language")
  186.      */
  187.     public function changeLanguage(Request $requeststring $lang): Response
  188.     {
  189.         $this->translator->setLocale($lang);
  190.         $request->getSession()->set('_locale'$lang);
  191.         return $this->redirect($request->headers->get('referer'));
  192.     }
  193.     /**
  194.      * @Route("/calendar-full", name="calendar_full")
  195.      */
  196.     public function calendarFull(Request $request): Response
  197.     {
  198.         $token $request->request->get('token');
  199.         $em    $this->getDoctrine()->getManager();
  200.         $user  $em->getRepository(User::class)->findOneByAccessKey($token);
  201.         $userId $user->getId();
  202.         // Prepare WidgetNotes form
  203.         $wnotes = new WidgetNotes();
  204.         $wnotes->setDateAt(new \DateTime());
  205.         $form $this->createForm(WidgetNotesType::class, $wnotes, [
  206.             'action' => $this->generateUrl('widget_notes_create'),
  207.             'method' => 'POST',
  208.         ]);
  209.         // ToDo alerts
  210.         $countTodo $em->getRepository(ToDoLogs::class)
  211.             ->createQueryBuilder('td')
  212.             ->select('COUNT(td.id)')
  213.             ->where('td.readed = FALSE')
  214.             ->andWhere('td.ownerToDoLog = :user')
  215.             ->setParameter('user'$userId)
  216.             ->getQuery()
  217.             ->getSingleScalarResult();
  218.         $alertTodo = (int) $countTodo;
  219.         return $this->render('home/calendar-fullscreen.html.twig', [
  220.             'alertTodo' => $alertTodo,
  221.             'form'      => $form->createView(),
  222.             'user'      => $userId,
  223.             'token'     => $token,
  224.         ]);
  225.     }
  226.     /**
  227.      * @Route("/external/calendar-reservation", name="calendar_external_reservation")
  228.      */
  229.     public function externalCalendar(): Response
  230.     {
  231.         return $this->render('home/calendar-reservation.html.twig');
  232.     }
  233. }