src/Controller/EvenementController.php line 302

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Alerte;
  4. use App\Entity\Evenement;
  5. use App\Entity\Evenements;
  6. use App\Form\AlerteType;
  7. use Doctrine\Common\Annotations\Annotation\Required;
  8. use Doctrine\Persistence\ManagerRegistry;
  9. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpFoundation\Session\Session;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\Mailer\MailerInterface;
  16. use Symfony\Component\Mime\Email;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. class EvenementController extends AbstractController
  19. {
  20.     private $doctrine;
  21.     public function __construct(ManagerRegistry $doctrine )
  22.     {
  23.         $this->doctrine $doctrine;
  24.     }
  25.     /**
  26.      * @Route("/app/evenements", name="evenements_libre",methods={"GET"})
  27.      */
  28.     public function evenements()
  29.     {
  30.         /* ************** EVENEMENTS PLACES LIBRES ********* */
  31.         $evenements $this->doctrine->getRepository('App\Entity\Evenement')->findEvenement();
  32.         $array = [];
  33.         foreach ($evenements as $evenement){
  34.             $operation = empty($evenement->getReserveParAgent()) ? 'Libre : ' 'Réservé : ';
  35.             $classNames = empty($evenement->getReserveParAgent()) ? 'actif' 'desactif';
  36.             if(($evenement->getPlaceAppartientAgent() == $this->getUser()) or ((!empty($evenement->getReserveParAgent())) and ($evenement->getReserveParAgent() == $this->getUser()))){
  37.                 $array[] = [
  38.                     'id'    => $evenement->getId(),
  39.                     'title' => $operation.$evenement->getPlaceAppartientAgent()->getPlace(),
  40.                     'start' => $evenement->getDateLiberee()->format('Y-m-d'),
  41.                     'color' => 'silver',
  42.                     'editable' => true,
  43.                     'classNames' => $classNames
  44.                 ];
  45.             }else{
  46.                 $array[] = [
  47.                     'id'    => $evenement->getId(),
  48.                     'title' => $operation.$evenement->getPlaceAppartientAgent()->getPlace(),
  49.                     'start' => $evenement->getDateLiberee()->format('Y-m-d'),
  50.                     'editable' => true,
  51.                     'classNames' => $classNames
  52.                 ];
  53.             }
  54.         }
  55.         /* ************* TOUTES ALERTES ACTIVES **********************/
  56.         $alertes $this->doctrine->getRepository('App\Entity\Alerte')->findBy([]);
  57.         $t = [];
  58.         foreach($alertes as $alerte){
  59.             if(!empty($alerte->getUser())){
  60.                 $r $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['reserveParAgent'=>$alerte->getUser()->getId(), 'dateLiberee'=>$alerte->getDateAlerte()]);
  61.                 if(empty($r)){
  62.                     isset($t[$alerte->getDateAlerte()->format('Y-m-d')]) ? $t[$alerte->getDateAlerte()->format('Y-m-d')]++ : $t[$alerte->getDateAlerte()->format('Y-m-d')]=1;
  63.                 }
  64.             }
  65.         }
  66.         foreach ($t as $k=>$v){
  67.             $array[] = [
  68.                 'id' => $k.'_enattente',
  69.                 'title' => ' '.$v' alerte'.($v>1?"s":"").' en attente',
  70.                 'start' => $k,
  71.                 'backgroundColor' => 'white',
  72.                 'borderColor'   => 'white',
  73.                 'textColor'     =>'grey',
  74.                 'editable'      => false,
  75.             ];
  76.         }
  77.         /* ************* ALERTES ACTIVES DE AGENT CONNECTE **********************/
  78.         $alertes $this->doctrine->getRepository('App\Entity\Alerte')->findBy(['user'=>$this->getUser()]);
  79.         foreach($alertes as $alerte){
  80.             $array[] = [
  81.                 'id' => $alerte->getId().'_alerte',
  82.                 'title' => ' Alerte',
  83.                 'start' => $alerte->getDateAlerte()->format('Y-m-d'),
  84.                 'backgroundColor' => '#e2e3e5',
  85.                 'borderColor'   => '#d6d8db',
  86.                 'textColor'     =>'#383d41',
  87.                 'editable' => false,
  88.             ];
  89.         }
  90.         $response = new JsonResponse($array);
  91.         return $response;
  92.     }
  93.     /**
  94.      * @Route("/app/dateLibre/{debut}/{fin}/{days}", name="date_libre")
  95.      */
  96.     public function dateLibre($debut$fin$daysMailerInterface $mailer){
  97.         // Libère une place pour une journée ou une période
  98.         $em $this->doctrine->getManager();
  99.         // La réservation sur une période ne peux pas dépasser un mois
  100.         // vérification 1 mois max
  101.         $interval = (strtotime($fin)-strtotime($debut))/86400// 60*60*24
  102.         if($interval 30){
  103.             $fin date ("Y-m-d"strtotime("+30 day"strtotime($debut)));
  104.         }
  105.         while(strtotime($debut) <= strtotime($fin)){
  106.             $evmnt = new Evenement();
  107.             $evmnt->setPlaceAppartientAgent($this->getUser());
  108.             $evmnt->setDateLibereeAutomatique(false);
  109.             $err true;
  110.             if('j' == $days) {
  111.                 $totime strtotime($debut);
  112.                 $date date('Y-m-d'$totime);
  113.                 $d = new \DateTime($date);
  114.             }else{
  115.                 $days_selected explode("|"$days);
  116.                 $totime strtotime($debut);
  117.                 $date date('N'$totime);
  118.                 if(in_array($date$days_selected)){
  119.                     $d = new \DateTime(date('Y-m-d'$totime));
  120.                 }else{
  121.                     $err false;
  122.                 }
  123.             }
  124.             if($err){
  125.                 $evmntExiste $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['placeAppartientAgent'=>$this->getUser(), 'dateLiberee'=>$d]);
  126.                if(null == $evmntExiste) {
  127.                     // si évenement n existe pas
  128.                     $evmnt->setDateLiberee($d);
  129.                     $evmnt->setDateCreated(new \DateTime("now"));
  130.                     $em->persist($evmnt);
  131.                     $em->flush();
  132.                     /**
  133.                      * @todo Vérifier les alertes et envoyer un mail
  134.                      */
  135.                     $alertes $this->doctrine->getRepository('App\Entity\Alerte')->findBy(['dateAlerte' => $d]);
  136.                     if (null != $alertes) {
  137.                         foreach ($alertes as $alerte) {
  138.                             $email = new TemplatedEmail();
  139.                             $email->from('nepasrepondre@partenairears.fr');
  140.                             $email->subject('ARS Hauts-de-France : Places de parking');
  141.                             $email->to($alerte->getUser()->getEmail());
  142.                             if(!empty($alerte->getUser()->getMailPerso())){
  143.                                 $email->addTo($alerte->getUser()->getMailPerso());
  144.                             }
  145.                             $template 'Mail/confirm_alerte.html.twig';
  146.                             $email->embedFromPath('build/static/images/logo_ars_hdf.png','logo','image/png');
  147.                             $email->htmlTemplate($template)
  148.                                 ->context([
  149.                                     'user' => $alerte->getUser(),
  150.                                     'date' => $d,
  151.                                     'place' => $this->getUser()->getPlace()
  152.                                 ]);
  153.                             $mailer->send($email);
  154.                         }
  155.                     }
  156.                 }
  157.             }
  158.             $debut date ("Y-m-d"strtotime("+1 day"strtotime($debut)));
  159.         }
  160.         return new Response(  'La place est libérée',Response::HTTP_OK);
  161.     }
  162.     /**
  163.      * @Route("/app/dateReserve/{evenement}/{immatriculation}/{commentaire}", name="date_reserve")
  164.      */
  165.     public function dateReserve$evenement$commentaire null$immatriculation){
  166.         $em $this->doctrine->getManager();
  167.         $evmnt $this->doctrine->getRepository('App\Entity\Evenement')->find($evenement);
  168.         if(in_array('ROLE_HAB',$this->getUser()->getRoles())){
  169.             // si profil habilitation, possibilité de réserver plusieurs place pour le même jour
  170.             $evmnt->setReserveParDateCreated(new \datetime("now"));
  171.             $evmnt->setReserveParAgent($this->getUser());
  172.             $evmnt->setReserveParCommentaire($commentaire);
  173.             $evmnt->setReserveByImmatriculation($immatriculation);
  174.             $em->persist($evmnt);
  175.             $em->flush();
  176.         }elseif('' == $this->getUser()->getPlace()){
  177.             // si l'agent n'a pas de place, possibilite de faire qu'une seule réservation par jour
  178.             // je vérifie si pas déjà une réservation
  179.             $evemements $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['reserveParAgent'=>  $this->getUser(), 'dateLiberee' => $evmnt->getDateLiberee()]);
  180.             if(null == $evemements){
  181.                 //je reserve
  182.                 $evmnt->setReserveParDateCreated(new \datetime("now"));
  183.                 $evmnt->setReserveParAgent($this->getUser());
  184.                 $evmnt->setReserveParCommentaire($commentaire);
  185.                 $evmnt->setReserveByImmatriculation($immatriculation);
  186.                 $em->persist($evmnt);
  187.                 $em->flush();
  188.             }
  189.         }else{
  190.             // si agent possède une place, possibilité de réserver qu'à condition que sa place est déjà réservée
  191.             // 1- recherche si place
  192.             $evenements $this->doctrine->getRepository('App\Entity\Evenement')->findOneBy(['placeAppartientAgent' => $this->getUser()->getId(),'dateLiberee'=>$evmnt->getDateLiberee()]);
  193.             if(!empty($evenements->getDateLiberee())){
  194.                 $evmnt->setReserveParDateCreated(new \datetime("now"));
  195.                 $evmnt->setReserveParAgent($this->getUser());
  196.                 $evmnt->setReserveParCommentaire($commentaire);
  197.                 $evmnt->setReserveByImmatriculation($immatriculation);
  198.                 $em->persist($evmnt);
  199.                 $em->flush();
  200.             }
  201.         }
  202.         return new Response('Réservé');
  203.     }
  204.     /**
  205.      * @Route("/admin/actions/{agent}/", name="actionsAgents")
  206.      */
  207.     public function actionsAgents($agent){
  208.         $info = [];
  209.         $agent $this->doctrine->getRepository('App\Entity\User')->find($agent);
  210.         $evmnts $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['placeAppartientAgent'=>$agent],['dateLiberee'=>'desc']);
  211.         $info['evenements'] = $evmnts;
  212.         $info['agent'] = $agent;
  213.         return $this->render("evenement/action_agent.html.twig"$info);
  214.     }
  215.     /**
  216.      * @Route("/app/actions", name="mesActions")
  217.      */
  218.     public function actions(){
  219.         $info = [];
  220.         $actionListe = [];
  221.         $evmnts $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['placeAppartientAgent'=>$this->getUser()],['dateLiberee'=>'desc']);
  222.         foreach ($evmnts as $evmnt) {
  223.             $alerte $this->doctrine->getRepository('App\Entity\Alerte')->findOneBy(['user'=>$this->getUser(), 'dateAlerte'=>$evmnt->getDateLiberee()]);
  224.             $element=[
  225.                 'date' => $evmnt,
  226.                 'alerte' => $alerte
  227.             ];
  228.             array_push($actionListe$element);
  229.         }
  230.          $info['evenements'] = $actionListe;
  231.          return $this->render('evenement/action.html.twig'$info);
  232.     }
  233.     /**
  234.      * @Route("/app/action/delete/{profil}/{evenement}", name="deleteAction")
  235.      */
  236.     public function deleteAction($profil$evenement){
  237.         $info = [];
  238.         $em $this->doctrine->getManager();
  239.         $evmnt $this->doctrine->getRepository('App\Entity\Evenement')->find($evenement);
  240.         $em->remove($evmnt);
  241.         $em->flush();
  242.         if(== $profil){
  243.             // profil = user
  244.             return $this->redirectToRoute('mesActions');
  245.         }elseif(== $profil){
  246.             // profil = habil
  247.             return $this->redirectToRoute('actionsAgents',['agent'=>$evmnt->getAgent()->getUser()->getId()]);
  248.         }else{
  249.             // erreur
  250.         }
  251.     }
  252.     /**
  253.      * @Route("/app/reservations", name="mesReservations")
  254.      */
  255.     public function reservation(){
  256.         $info = [];
  257.         $evmnts $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['reserveParAgent'=>$this->getUser()],['dateLiberee'=>'desc']);
  258.         $info['evenements'] = $evmnts;
  259.         return $this->render('evenement/reservation.html.twig'$info);
  260.     }
  261.     /**
  262.      * @Route("/admin/reservations/{agent}", name="agentsReservations")
  263.      */
  264.     public function agentsReservations($agent){
  265.         $info = [];
  266.         $agent $this->doctrine->getRepository('App\Entity\User')->find($agent);
  267.         $evmnts $this->doctrine->getRepository('App\Entity\Evenement')->findBy(['reserveParAgent'=>$agent],['dateLiberee'=>'desc']);
  268.         $info['evenements'] = $evmnts;
  269.         $info['agent'] = $agent;
  270.         return $this->render('evenement/reservation_agent.html.twig'$info);
  271.     }
  272.     /**
  273.      * @Route("/app/reservation/delete/{profil}/{evenement}", name="deleteReservation")
  274.      */
  275.     public function deleteReservation($profil$evenement){
  276.         $info = [];
  277.         $em $this->doctrine->getManager();
  278.         $evmnt $this->doctrine->getRepository('App\Entity\Evenement')->find($evenement);
  279.         $agent $evmnt->getReserveParAgent()->getId();
  280.         $evmnt->setReserveParAgent(null);
  281.         $evmnt->setReserveParDateCreated(null);
  282.         $evmnt->setReserveByImmatriculation(null);
  283.         $evmnt->setReserveParCommentaire(null);
  284.         $em->persist($evmnt);
  285.         $em->flush();
  286.         if(== $profil){
  287.             // profil user
  288.             return $this->redirectToRoute('mesReservations');
  289.         }elseif (== $profil){
  290.             // profil habil
  291.             return $this->redirectToRoute('agentsReservations',['agent'=>$agent]);
  292.         }else{
  293.             //erreur
  294.         }
  295.     }
  296.     /**
  297.      * @Route("/app/alertes", name="mesAlertes")
  298.      */
  299.     public function mesAlertes(){
  300.         $info = [];
  301.         // liste des alertes de l agent connecté
  302.         $alertes $this->doctrine->getRepository('App\Entity\Alerte')->findBy(['user'=>$this->getUser()],['dateAlerte'=>'desc']);
  303.         $info['alertes'] = $alertes;
  304.         return $this->render('evenement/alertes.html.twig'$info);
  305.     }
  306.     /**
  307.      * @Route("/app/addAlerte/{dateStr}", name="addAlerte")
  308.      */
  309.     public function addAlerte($dateStr){
  310.         $em $this->doctrine->getManager();
  311.         $totime strtotime($dateStr);
  312.         $date date('Y-m-d'$totime);
  313.         $d = new \DateTime($date);
  314.         // vérifie si pas de alerte
  315.         $alertes $this->doctrine->getRepository('App\Entity\Alerte')->findBy(['user'=>$this->getUser(), 'dateAlerte' => $d]);
  316.         if(null == $alertes) {
  317.             $add = new Alerte();
  318.             $add->setUser($this->getUser());
  319.             $add->setDateCreated(new \DateTime());
  320.             $add->setDateAlerte($d);
  321.             $em->persist($add);
  322.             $em->flush();
  323.         }
  324.     }
  325.     /**
  326.      * @Route("/app/alerte/delete/{alerte}", name="deleteAlerte")
  327.      */
  328.     public function deleteAlerte($alerte){
  329.         $info = [];
  330.         $em $this->doctrine->getManager();
  331.         $evmnt $this->doctrine->getRepository('App\Entity\Alerte')->find($alerte);
  332.         $em->remove($evmnt);
  333.         $em->flush();
  334.        if(empty($this->getUser()->getPlace())){
  335.            return $this->redirectToRoute('mesAlertes');
  336.        }else{
  337.            return $this->redirectToRoute('mesActions');
  338.        }
  339.     }
  340.     /**
  341.      * @Route("/app/perenne/alerte/{date}", name="alertePerenne")
  342.      */
  343.     public function alertePerenne($date){
  344.         $new = new Alerte();
  345.         $new->setDateCreated(new \DateTime());
  346.         $new->setUser($this->getUser());
  347.         $new->setDateAlerte(new \DateTime($date));
  348.         $em $this->doctrine->getManager();
  349.         $em->persist($new);;
  350.         $em->flush();
  351.         return $this->redirectToRoute('mesActions');
  352.     }
  353. }