<?php
namespace App\Controller;
use App\Entity\Alerte;
use App\Entity\Evenement;
use App\Entity\Evenements;
use App\Form\AlerteType;
use Doctrine\Common\Annotations\Annotation\Required;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\Annotation\Route;
class EvenementController extends AbstractController
{
private $doctrine;
public function __construct(ManagerRegistry $doctrine )
{
$this->doctrine = $doctrine;
}
/**
* @Route("/app/evenements", name="evenements_libre",methods={"GET"})
*/
public function evenements()
{
/* ************** EVENEMENTS PLACES LIBRES ********* */
$evenements = $this->doctrine->getRepository('App\Entity\Evenement')->findEvenement();
$array = [];
foreach ($evenements as $evenement){
$operation = empty($evenement->getReserveParAgent()) ? 'Libre : ' : 'Réservé : ';
$classNames = empty($evenement->getReserveParAgent()) ? 'actif' : 'desactif';
if(($evenement->getPlaceAppartientAgent() == $this->getUser()) or ((!empty($evenement->getReserveParAgent())) and ($evenement->getReserveParAgent() == $this->getUser()))){
$array[] = [
'id' => $evenement->getId(),
'title' => $operation.$evenement->getPlaceAppartientAgent()->getPlace(),
'start' => $evenement->getDateLiberee()->format('Y-m-d'),
'color' => 'silver',
'editable' => true,
'classNames' => $classNames
];
}else{
$array[] = [
'id' => $evenement->getId(),
'title' => $operation.$evenement->getPlaceAppartientAgent()->getPlace(),
'start' => $evenement->getDateLiberee()->format('Y-m-d'),
'editable' => true,
'classNames' => $classNames
];
}
}
/* ************* TOUTES ALERTES ACTIVES **********************/
$alertes = $this->doctrine->getRepository('App\Entity\Alerte')->findBy([]);
$t = [];
foreach($alertes as $alerte){
if(!empty($alerte->getUser())){
$r = $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['reserveParAgent'=>$alerte->getUser()->getId(), 'dateLiberee'=>$alerte->getDateAlerte()]);
if(empty($r)){
isset($t[$alerte->getDateAlerte()->format('Y-m-d')]) ? $t[$alerte->getDateAlerte()->format('Y-m-d')]++ : $t[$alerte->getDateAlerte()->format('Y-m-d')]=1;
}
}
}
foreach ($t as $k=>$v){
$array[] = [
'id' => $k.'_enattente',
'title' => ' '.$v. ' alerte'.($v>1?"s":"").' en attente',
'start' => $k,
'backgroundColor' => 'white',
'borderColor' => 'white',
'textColor' =>'grey',
'editable' => false,
];
}
/* ************* ALERTES ACTIVES DE AGENT CONNECTE **********************/
$alertes = $this->doctrine->getRepository('App\Entity\Alerte')->findBy(['user'=>$this->getUser()]);
foreach($alertes as $alerte){
$array[] = [
'id' => $alerte->getId().'_alerte',
'title' => ' Alerte',
'start' => $alerte->getDateAlerte()->format('Y-m-d'),
'backgroundColor' => '#e2e3e5',
'borderColor' => '#d6d8db',
'textColor' =>'#383d41',
'editable' => false,
];
}
$response = new JsonResponse($array);
return $response;
}
/**
* @Route("/app/dateLibre/{debut}/{fin}/{days}", name="date_libre")
*/
public function dateLibre($debut, $fin, $days, MailerInterface $mailer){
// Libère une place pour une journée ou une période
$em = $this->doctrine->getManager();
// La réservation sur une période ne peux pas dépasser un mois
// vérification 1 mois max
$interval = (strtotime($fin)-strtotime($debut))/86400; // 60*60*24
if($interval > 30){
$fin = date ("Y-m-d", strtotime("+30 day", strtotime($debut)));
}
while(strtotime($debut) <= strtotime($fin)){
$evmnt = new Evenement();
$evmnt->setPlaceAppartientAgent($this->getUser());
$evmnt->setDateLibereeAutomatique(false);
$err = true;
if('j' == $days) {
$totime = strtotime($debut);
$date = date('Y-m-d', $totime);
$d = new \DateTime($date);
}else{
$days_selected = explode("|", $days);
$totime = strtotime($debut);
$date = date('N', $totime);
if(in_array($date, $days_selected)){
$d = new \DateTime(date('Y-m-d', $totime));
}else{
$err = false;
}
}
if($err){
$evmntExiste = $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['placeAppartientAgent'=>$this->getUser(), 'dateLiberee'=>$d]);
if(null == $evmntExiste) {
// si évenement n existe pas
$evmnt->setDateLiberee($d);
$evmnt->setDateCreated(new \DateTime("now"));
$em->persist($evmnt);
$em->flush();
/**
* @todo Vérifier les alertes et envoyer un mail
*/
$alertes = $this->doctrine->getRepository('App\Entity\Alerte')->findBy(['dateAlerte' => $d]);
if (null != $alertes) {
foreach ($alertes as $alerte) {
$email = new TemplatedEmail();
$email->from('nepasrepondre@partenairears.fr');
$email->subject('ARS Hauts-de-France : Places de parking');
$email->to($alerte->getUser()->getEmail());
if(!empty($alerte->getUser()->getMailPerso())){
$email->addTo($alerte->getUser()->getMailPerso());
}
$template = 'Mail/confirm_alerte.html.twig';
$email->embedFromPath('build/static/images/logo_ars_hdf.png','logo','image/png');
$email->htmlTemplate($template)
->context([
'user' => $alerte->getUser(),
'date' => $d,
'place' => $this->getUser()->getPlace()
]);
$mailer->send($email);
}
}
}
}
$debut = date ("Y-m-d", strtotime("+1 day", strtotime($debut)));
}
return new Response( 'La place est libérée',Response::HTTP_OK);
}
/**
* @Route("/app/dateReserve/{evenement}/{immatriculation}/{commentaire}", name="date_reserve")
*/
public function dateReserve( $evenement, $commentaire = null, $immatriculation){
$em = $this->doctrine->getManager();
$evmnt = $this->doctrine->getRepository('App\Entity\Evenement')->find($evenement);
if(in_array('ROLE_HAB',$this->getUser()->getRoles())){
// si profil habilitation, possibilité de réserver plusieurs place pour le même jour
$evmnt->setReserveParDateCreated(new \datetime("now"));
$evmnt->setReserveParAgent($this->getUser());
$evmnt->setReserveParCommentaire($commentaire);
$evmnt->setReserveByImmatriculation($immatriculation);
$em->persist($evmnt);
$em->flush();
}elseif('' == $this->getUser()->getPlace()){
// si l'agent n'a pas de place, possibilite de faire qu'une seule réservation par jour
// je vérifie si pas déjà une réservation
$evemements = $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['reserveParAgent'=> $this->getUser(), 'dateLiberee' => $evmnt->getDateLiberee()]);
if(null == $evemements){
//je reserve
$evmnt->setReserveParDateCreated(new \datetime("now"));
$evmnt->setReserveParAgent($this->getUser());
$evmnt->setReserveParCommentaire($commentaire);
$evmnt->setReserveByImmatriculation($immatriculation);
$em->persist($evmnt);
$em->flush();
}
}else{
// si agent possède une place, possibilité de réserver qu'à condition que sa place est déjà réservée
// 1- recherche si place
$evenements = $this->doctrine->getRepository('App\Entity\Evenement')->findOneBy(['placeAppartientAgent' => $this->getUser()->getId(),'dateLiberee'=>$evmnt->getDateLiberee()]);
if(!empty($evenements->getDateLiberee())){
$evmnt->setReserveParDateCreated(new \datetime("now"));
$evmnt->setReserveParAgent($this->getUser());
$evmnt->setReserveParCommentaire($commentaire);
$evmnt->setReserveByImmatriculation($immatriculation);
$em->persist($evmnt);
$em->flush();
}
}
return new Response('Réservé');
}
/**
* @Route("/admin/actions/{agent}/", name="actionsAgents")
*/
public function actionsAgents($agent){
$info = [];
$agent = $this->doctrine->getRepository('App\Entity\User')->find($agent);
$evmnts = $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['placeAppartientAgent'=>$agent],['dateLiberee'=>'desc']);
$info['evenements'] = $evmnts;
$info['agent'] = $agent;
return $this->render("evenement/action_agent.html.twig", $info);
}
/**
* @Route("/app/actions", name="mesActions")
*/
public function actions(){
$info = [];
$actionListe = [];
$evmnts = $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['placeAppartientAgent'=>$this->getUser()],['dateLiberee'=>'desc']);
foreach ($evmnts as $evmnt) {
$alerte = $this->doctrine->getRepository('App\Entity\Alerte')->findOneBy(['user'=>$this->getUser(), 'dateAlerte'=>$evmnt->getDateLiberee()]);
$element=[
'date' => $evmnt,
'alerte' => $alerte
];
array_push($actionListe, $element);
}
$info['evenements'] = $actionListe;
return $this->render('evenement/action.html.twig', $info);
}
/**
* @Route("/app/action/delete/{profil}/{evenement}", name="deleteAction")
*/
public function deleteAction($profil, $evenement){
$info = [];
$em = $this->doctrine->getManager();
$evmnt = $this->doctrine->getRepository('App\Entity\Evenement')->find($evenement);
$em->remove($evmnt);
$em->flush();
if(1 == $profil){
// profil = user
return $this->redirectToRoute('mesActions');
}elseif(2 == $profil){
// profil = habil
return $this->redirectToRoute('actionsAgents',['agent'=>$evmnt->getAgent()->getUser()->getId()]);
}else{
// erreur
}
}
/**
* @Route("/app/reservations", name="mesReservations")
*/
public function reservation(){
$info = [];
$evmnts = $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['reserveParAgent'=>$this->getUser()],['dateLiberee'=>'desc']);
$info['evenements'] = $evmnts;
return $this->render('evenement/reservation.html.twig', $info);
}
/**
* @Route("/admin/reservations/{agent}", name="agentsReservations")
*/
public function agentsReservations($agent){
$info = [];
$agent = $this->doctrine->getRepository('App\Entity\User')->find($agent);
$evmnts = $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['reserveParAgent'=>$agent],['dateLiberee'=>'desc']);
$info['evenements'] = $evmnts;
$info['agent'] = $agent;
return $this->render('evenement/reservation_agent.html.twig', $info);
}
/**
* @Route("/app/reservation/delete/{profil}/{evenement}", name="deleteReservation")
*/
public function deleteReservation($profil, $evenement){
$info = [];
$em = $this->doctrine->getManager();
$evmnt = $this->doctrine->getRepository('App\Entity\Evenement')->find($evenement);
$agent = $evmnt->getReserveParAgent()->getId();
$evmnt->setReserveParAgent(null);
$evmnt->setReserveParDateCreated(null);
$evmnt->setReserveByImmatriculation(null);
$evmnt->setReserveParCommentaire(null);
$em->persist($evmnt);
$em->flush();
if(1 == $profil){
// profil user
return $this->redirectToRoute('mesReservations');
}elseif (2 == $profil){
// profil habil
return $this->redirectToRoute('agentsReservations',['agent'=>$agent]);
}else{
//erreur
}
}
/**
* @Route("/app/alertes", name="mesAlertes")
*/
public function mesAlertes(){
$info = [];
// liste des alertes de l agent connecté
$alertes = $this->doctrine->getRepository('App\Entity\Alerte')->findBy(['user'=>$this->getUser()],['dateAlerte'=>'desc']);
$info['alertes'] = $alertes;
return $this->render('evenement/alertes.html.twig', $info);
}
/**
* @Route("/app/addAlerte/{dateStr}", name="addAlerte")
*/
public function addAlerte($dateStr){
$em = $this->doctrine->getManager();
$totime = strtotime($dateStr);
$date = date('Y-m-d', $totime);
$d = new \DateTime($date);
// vérifie si pas de alerte
$alertes = $this->doctrine->getRepository('App\Entity\Alerte')->findBy(['user'=>$this->getUser(), 'dateAlerte' => $d]);
if(null == $alertes) {
$add = new Alerte();
$add->setUser($this->getUser());
$add->setDateCreated(new \DateTime());
$add->setDateAlerte($d);
$em->persist($add);
$em->flush();
}
}
/**
* @Route("/app/alerte/delete/{alerte}", name="deleteAlerte")
*/
public function deleteAlerte($alerte){
$info = [];
$em = $this->doctrine->getManager();
$evmnt = $this->doctrine->getRepository('App\Entity\Alerte')->find($alerte);
$em->remove($evmnt);
$em->flush();
if(empty($this->getUser()->getPlace())){
return $this->redirectToRoute('mesAlertes');
}else{
return $this->redirectToRoute('mesActions');
}
}
/**
* @Route("/app/perenne/alerte/{date}", name="alertePerenne")
*/
public function alertePerenne($date){
$new = new Alerte();
$new->setDateCreated(new \DateTime());
$new->setUser($this->getUser());
$new->setDateAlerte(new \DateTime($date));
$em = $this->doctrine->getManager();
$em->persist($new);;
$em->flush();
return $this->redirectToRoute('mesActions');
}
}