<?php
namespace App\Service;
use App\Entity\GpReminder;
use App\MDS\GreenPatioBundle\Entity\Reservation;
use App\MDS\GreenPatioBundle\Entity\ReservationDeposit;
use App\MDS\GreenPatioBundle\Entity\ReservationLoungeSimple;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\RouterInterface;
final class AlertService
{
private $em;
private $session;
private $router;
public function __construct(EntityManagerInterface $em, SessionInterface $session, RouterInterface $router)
{
$this->em = $em;
$this->session = $session;
$this->router = $router;
}
/**
* Para cargar las alertas de los usuarios de GP
* @param $user User
*/
public function loadGpAlerts($user)
{
$gpReminders = $this->em->getRepository(GpReminder::class)->findBy(['user' => $user]);
$data = [];
foreach ($gpReminders as $gpReminder) {
// Solo se muestran las alertas a las que les quedan dos días o menos y no mostrar las que ya pasaron
if ($gpReminder->getReminderAt() < new \DateTime('now') || $gpReminder->getReminderAt()->diff(new \DateTime())->days > 2) {
continue;
}
$data[] = [
'type' => 'reminder',
'title' => $gpReminder->getReminder(),
];
}
// Comprobar si los expedientes del usuario tienen depositos, si no tienen se le avisa
$reservation = $this->em->getRepository(Reservation::class)->findBy(['createdBy' => $user->getId(), 'status' => ['Bloqueo', 'Confirmed', 'Cotizado']]);
foreach ($reservation as $res) {
$lounge = $this->em->getRepository(ReservationLoungeSimple::class)->findOneBy(['idReservation' => $res->getId()]);
if (!$lounge || $lounge->getDateEnd() < new \DateTime('now')) {
continue;
}
$deposit = $this->em->getRepository(ReservationDeposit::class)->findOneBy(['reservationId' => $res->getId()]);
if (!$deposit) {
$data[] = [
'type' => 'link',
'title' => 'No se ha realizado el depósito de la reserva: ' . $res->getId() . ' - ' . $res->getTitle(),
'url' => $this->router->generate('reservations_greenpatio_edit_simple', ['id' => $res->getId()]),
];
}
}
// Cogemos los reservations que estan en estado Bloqueo y la fecha del campo days le quedan 3 días o menos
$reservations = $this->em->getRepository(Reservation::class)->createQueryBuilder('r')
->where('r.status = :status')
->andWhere('r.days > :hoy')
->setParameter('status', 'Bloqueo')
->setParameter('hoy', new \DateTime('now'))
->getQuery()
->getResult();
foreach ($reservations as $reserva) {
if ($reserva->getDays()->diff(new \DateTime())->days > 3) {
continue;
}
$data[] = [
'type' => 'link',
'title' => 'La reserva ' . $reserva->getId() . ' - ' . $reserva->getTitle() . ' está a punto de desbloquearse',
'url' => $this->router->generate('reservations_greenpatio_edit_simple', ['id' => $reserva->getId()]),
];
}
$this->loadAlerts($data);
}
/**
* Carga las alertas en la vista de los calendarios de lo que tiene que hacer el usuario
* @param $data array
*/
private function loadAlerts($data)
{
// Carga las alertas
foreach ($data as $link) {
$message = '';
if ($link['type'] == 'link') {
$message = '<a href="' . $link['url'] . '" target="_blank">' . $link['title'] . '</a>';
} else if ($link['type'] == 'reminder') {
$message = $link['title'];
}
$this->session->getFlashBag()->add('notification', $message);
}
}
}