<?php
namespace App\EventSubscriber;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Psr\Log\LoggerInterface;
use App\Entity\UserEleveCredit;
use App\Entity\UserEleveCreditConsommation;
use App\Event\InscriptionCoursEvent;
use App\Event\DisponibiliteEvent;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mailer\MailerInterface;
class ActiviteEventSubscriber implements EventSubscriberInterface
{
private $logger;
private $eleve_cacher;
private $dispo_cacher;
private $cours_cacher;
private $entityManager;
private $mailer;
public function __construct(LoggerInterface $lifecycleLogger,
EntityManagerInterface $entityManager, \App\Cacher\ApiEleveCacher $eleve_cacher, \App\Cacher\PreSetCacher $cacher, MailerInterface $mailer)
{
$this->logger = $lifecycleLogger;
$this->eleve_cacher = $eleve_cacher;
$cacher->setItemName('disponibilite');
$this->dispo_cacher = clone $cacher;
$cacher->setItemName('cours');
$this->cours_cacher = clone $cacher;
$this->entityManager = $entityManager;
$this->mailer = $mailer;
}
public static function getSubscribedEvents() : array
{
return [
InscriptionCoursEvent::COMMENTED => 'onComment',
InscriptionCoursEvent::CREATED => 'onSubscribe',
InscriptionCoursEvent::DELETED => 'onUnSubscribe',
DisponibiliteEvent::CREATED => 'onAdd',
DisponibiliteEvent::DELETED => 'onRemove',
DisponibiliteEvent::UPDATED => 'onChange',
];
}
public function onSubscribe (InscriptionCoursEvent $Event) {
$ici = new \DateTimeZone('Europe/Paris');
$entityManager = $this->entityManager;
$inscription = $Event->getInscription();
$dispo = $Event->getDisponibilite();
$prof = $Event->getProf();
$eleve = $Event->getEleve();
$credit = $entityManager->getRepository(UserEleveCredit::class)->findOneByCategorieAndUser($dispo->getCategorie(), $inscription->getUser());
/* création de la consommation */
$conso = new UserEleveCreditConsommation;
$conso->setQuantite($dispo->getHours());
$conso->setCredit($credit);
$conso->setUtilisationCours($inscription);
$inscription->setUserEleveCreditConsommation($conso);
$entityManager->persist($conso);
/* Mise à jour des crédits généraux de l'utilisateur */
$credit->expendsPoints($conso->getQuantite());
$entityManager->persist($credit);
$entityManager->flush();
$debut = $dispo->getDebut();
$debut->modify('+'. $ici->getOffset($debut) .' seconds');
/* prévenir quelqu'un? */
$this->eleve_cacher->delete($Event->getEleve());
$this->dispo_cacher->delete($Event->getDisponibilite());
$this->mailer->send((new TemplatedEmail())
// ->to('gabriel@pyreweb.com')
->to($prof->getEMail())
->subject('Créneau réservé')
->htmlTemplate('enseignant/mail/reservation.html.twig')
->context([
'user'=>$prof,
'enseignant'=>$prof,
'eleve'=>$eleve,
'dispo'=>$dispo,
'inscription'=>$inscription,
]));
$this->mailer->send((new TemplatedEmail())
// ->to('gabriel@pyreweb.com')
->to($eleve->getEMail())
->subject('Créneau réservé')
->htmlTemplate('eleve/mail/reservation.html.twig')
->context([
'user'=>$eleve,
'enseignant'=>$prof,
'eleve'=>$eleve,
'dispo'=>$dispo,
'inscription'=>$inscription,
]));
$debut->modify('-'. $ici->getOffset($debut) .' seconds');
}
public function onUnSubscribe (InscriptionCoursEvent $Event) {
$ici = new \DateTimeZone('Europe/Paris');
$entityManager = $this->entityManager;
$inscription = $Event->getInscription();
$conso = $inscription->getUserEleveCreditConsommation();
$dispo = $Event->getDisponibilite();
$credit = $entityManager->getRepository(UserEleveCredit::class)->findOneByCategorieAndUser($dispo->getCategorie(), $inscription->getUser());
$prof = $Event->getProf();
$eleve = $Event->getEleve();
/* Mise à jour des crédits généraux de l'utilisateur */
$credit->redeemPoints($conso->getQuantite());
$entityManager->persist($credit);
$entityManager->flush();
/* prévenir quelqu'un? */
$this->eleve_cacher->delete($Event->getEleve());
$this->dispo_cacher->delete($Event->getDisponibilite());
$debut = $dispo->getDebut();
$debut->modify('+'. $ici->getOffset($debut) .' seconds');
$this->mailer->send((new TemplatedEmail())
// ->to('gabriel@pyreweb.com')
->to($prof->getEMail())
->subject('Réservation annulée')
->htmlTemplate('enseignant/mail/annulation.html.twig')
->context([
'user'=>$prof,
'enseignant'=>$prof,
'eleve'=>$eleve,
'dispo'=>$dispo,
'inscription'=>$inscription,
]));
$this->mailer->send((new TemplatedEmail())
// ->to('gabriel@pyreweb.com')
->to($eleve->getEMail())
->subject('Réservation annulée')
->htmlTemplate('eleve/mail/annulation.html.twig')
->context([
'user'=>$eleve,
'enseignant'=>$prof,
'eleve'=>$eleve,
'dispo'=>$dispo,
'inscription'=>$inscription,
]));
$debut->modify('-'. $ici->getOffset($debut) .' seconds');
}
public function onComment (InscriptionCoursEvent $Event) {
/* prévenir quelqu'un? */
$this->cours_cacher->delete($Event->getInscription());
}
public function onRemove (DisponibiliteEvent $Event) {
/* désinscrire les élèves? */
/* prévenir quelqu'un? */
$this->dispo_cacher->delete($Event->getDisponibilite());
}
public function onChange (DisponibiliteEvent $Event) {
/* désinscrire les élèves? */
/* prévenir quelqu'un? */
$this->dispo_cacher->delete($Event->getDisponibilite());
}
public function onAdd (DisponibiliteEvent $Event) {
/* prévenir quelqu'un? */
$this->dispo_cacher->delete($Event->getDisponibilite());
}
}