<?php
# src/EventSubscriber/EasyAdminSubscriber.php
namespace App\EventSubscriber;
use App\Entity\User;
use App\Entity\Action;
use App\Entity\Societe;
use App\Entity\TextLoi;
use App\Entity\BlogPost;
use App\Entity\TextSociete;
use Symfony\Component\Mime\Email;
use App\Repository\SocieteRepository;
use App\Repository\TextLoiRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\TextSocieteRepository;
use App\Service\Message\SendEmailMessage;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Security\Core\Security;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Messenger\MessageBusInterface;
use App\Service\Mailer\EmailFactory\AideEmailFactory;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use App\Service\Mailer\EmailFactory\NouveauTextLoiEmailFactory;
use App\Service\Mailer\EmailFactory\NouvelleActionEmailFactory;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action as ActionAdm;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterCrudActionEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityBuiltEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeCrudActionEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityUpdatedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class EasyAdminSubscriber implements EventSubscriberInterface
{
private $passwordHasher;
private $entityManager;
private $textLoiRepository;
private $security;
private $societeRepository;
private $textSocieteRepository;
private $session;
private $mailer;
private $ancienStatut;
private $parameterBag;
private $nouvelleActionEmailFactory;
private $nouveauTextLoiEmailFactory;
private $messageBus;
private $requestStack;
public function __construct(
UserPasswordHasherInterface $passwordHasher,
EntityManagerInterface $em,
TextLoiRepository $textLoiRepository,
SocieteRepository $societeRepository,
TextSocieteRepository $textSocieteRepository,
Security $security,
SessionInterface $session,
MailerInterface $mailer,
ParameterBagInterface $parameterBag,
NouvelleActionEmailFactory $nouvelleActionEmailFactory,
MessageBusInterface $messageBus,
NouveauTextLoiEmailFactory $nouveauTextLoiEmailFactory,
RequestStack $requestStack
) {
$this->nouvelleActionEmailFactory = $nouvelleActionEmailFactory;
$this->parameterBag = $parameterBag;
$this->passwordHasher = $passwordHasher;
$this->entityManager = $em;
$this->textLoiRepository = $textLoiRepository;
$this->societeRepository = $societeRepository;
$this->textSocieteRepository = $textSocieteRepository;
$this->security = $security;
$this->session = $session;
$this->mailer = $mailer;
$this->messageBus = $messageBus;
$this->requestStack = $requestStack;
$this->nouveauTextLoiEmailFactory = $nouveauTextLoiEmailFactory;
}
public static function getSubscribedEvents()
{
return [
BeforeEntityPersistedEvent::class => ['beforeEntityPersisted'],
AfterEntityPersistedEvent::class => ['afterEntityPersisted'],
BeforeEntityUpdatedEvent::class => ['beforeEntityUpdated'],
AfterEntityUpdatedEvent::class => ['afterEntityUpdated'],
AfterCrudActionEvent::class => ['afterCrudAction'],
BeforeCrudActionEvent::class => ['beforeCrudAction'],
// AfterEntityBuiltEvent::class => ['test'],
// AfterEntityBuiltEvent::class => ['test3'],
// AfterEntityBuiltEvent::class => ['testAfterEntityBuilt']
];
}
/* public function test($event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof Action) {
dd($entity);
}
}*/
public function afficheFlashMessage(AfterEntityUpdatedEvent $event)
{
$entity = $event->getEntityInstance();
dd($entity);
/* $this->sessionInterface->getFlashBag()->add(
'warning',
'Your config file is writable, it should be set read-only'
);*/
}
/* public function affecterTextGenerale(BeforeEntityPersistedEvent $event){
$entity = $event->getEntityInstance();
if ($entity instanceof TextLoi) {
if(($action == Crud::PAGE_EDIT || $action == Crud::PAGE_INDEX)) ){
}
}
}*/
public function beforeEntityPersisted(BeforeEntityPersistedEvent $event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof User) {
$this->updatePassword($entity);
}
if ($entity instanceof Societe) {
$this->updatePassword($entity->getUser());
}
}
public function beforeEntityUpdated(BeforeEntityUpdatedEvent $event)
{
$entity = $event->getEntityInstance();
/* cette instruction provoque le cryptage d'un mot de passe deja crypté
if ($entity instanceof Societe) {
$this->updatePassword($entity->getUser());
}*
/* if($entity instanceof TextSociete)
{
$id = $entity->getId();
$texts = $this->textSocieteRepository->find($id);
dd("Ancien :".$texts->getStatutConformite()."---Nouveau: ".$entity->getStatutConformite());
dd($event);
dd($entity);
}*/
}
public function updatePassword($user)
{
$user->setPassword($this->passwordHasher->hashPassword($user, $user->getPassword()));
}
public function beforeCrudAction(BeforeCrudActionEvent $event)
{
$context = $event->getAdminContext();
//dd($context);
$entity = $context->getEntity()->getName();
// dd($entity);
$action = $context->getCrud()->getCurrentAction();
if ($entity == 'TextSociete' && $action == 'edit') {
$instance = $entity = $context->getEntity()->getInstance();
$statut = $instance->getStatutConformite();
$this->ancienStatut = $statut;
// dd($statut);
// dd($instance);
}
//dd($action);
//dd($entity);
/* $currentSociete = $context->getUser()->getSociete();
//dd($action);
//dd($entity);
if ($entity == "TextLoi" && ($action == Crud::PAGE_EDIT || $action == Crud::PAGE_INDEX)) {
$entities = $this->textLoiRepository->findAll();
//dd($entities);
$liste = $this->textLoiRepository->listeTextLois($currentSociete);
foreach ($entities as $i => $text) {
// $textSoc = $this->entityManager->getRepository(TextSociete::class)->findOneBy(['societe' => $currentSociete, 'textLoi' => $text]);
if ($liste[$i]['id2'] !== null) {
$text->setAffected(true);
} else {
$text->setAffected(false);
}*/
//dd($textSoc);
/* if ($textSoc) {
$textSoc->getSociete();
$text->setSociete($textSoc->getSociete());
// dd($text);
}
else
{
$text->setSociete(null);
}*/
/* }
}*/
}
public function afterCrudAction(AfterCrudActionEvent $event)
{
//dd($event->getAdminContext()->getRequest()->query->get('crudControllerFqcn'));
$entities = $event->getResponseParameters('entities')->get('entities');
// $entities->offsetUnset(159);
// dd($entities);
// dd($event->getResponseParameters('entities')->get('entities'));//->get(159));
$context = $event->getAdminContext();
$entityName = $context->getEntity()->getName();
$user = $context->getUser();
$currentSociete = ($user instanceof \App\Entity\User) ? $user->getSociete() : null;
$roles = $user ? $user->getRoles() : [];
// $entity = $event->getEntityInstance();
//$CrudControllers = $context->getCrudControllers();
$CrudControllerFqcn = $event->getAdminContext()->getRequest()->query->get('crudControllerFqcn');
$action = $context->getCrud()->getCurrentAction();
// dd($action);
if ($action == ActionAdm::INDEX && $CrudControllerFqcn == "App\Controller\User\TextSocieteEvalueCandidatConformeCrudController") {
$keys = [];
foreach ($entities as $key => $entity) {
foreach ($entity->getFields() as $field) {
if ($field->getProperty() == "candidatConforme" && $field->getValue() == false) {
// $entities->offsetUnset($key);
$keys[] = $key;
// dd();
}
}
}
foreach ($keys as $key) {
$entities->offsetUnset($key);
}
// dd($keys);
// dd($entities);
}
/* if ($entity == "TextLoi" && $action == Crud::PAGE_INDEX) {
// $entities = $this->entityManager->getRepository(TextLoi::class)->listeTextLois($currentSociete);
$entities = $this->textLoiRepository->listeTextLois($currentSociete);
// dd($entities);
// Evoi du tableau $entities au template
$event->addResponseParameters(['liste' => $entities]);
}*/
if ($entityName == "TextLoi") {
switch ($action) {
case Crud::PAGE_DETAIL:
//dd($context->getCrud());
//dd($context->getEntity()->getInstance());
if (!in_array("ROLE_SUPER_ADMIN", $roles)) {
// dd("ici".$CrudControllers);
$textLoi = $context->getEntity()->getInstance();
// dd($textLoi->isViewedBySociete($currentSociete));
$textLoi->addVueParSociete($currentSociete);
$this->entityManager->flush();
}
break;
default:
# code...
break;
}
}
}
private function notifierSocietesNewTextLoi(TextLoi $textLoi)
{
// Add logic to notify societies about the new TextLoi
// Example: Log the notification or send an email
// $currentDate = new \DateTime();
$societes = $this->societeRepository->SocietesAvecAbonnementValide();
//$societes[0] = $this->societeRepository->find(1);
foreach ($societes as $societe) {
if ($this->parameterBag->get('app.mailing_activeted')) {
$email = $this->nouveauTextLoiEmailFactory->create($textLoi,$societe);
$this->messageBus->dispatch(
new SendEmailMessage($email) );
$this->requestStack->getSession()->getFlashBag()->add('success', 'Un email est envoyé au responsable de l\'action...');
}
else
{
$this->session->get('flashes')->add('warning', "L'envoi des messages est désactivé.");
}
}
}
public function afterEntityPersisted(AfterEntityPersistedEvent $event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof TextLoi) {
$this->affectTextLoiAuxSocietes($entity);
$this->notifierSocietesNewTextLoi($entity);
}
if ($entity instanceof Action) {
$this->sendMailToResponsable($entity, 'Nouvelle Action à réaliser');
}
if ($entity instanceof Societe) {
$this->initMaBaseWithGeneralTextes($entity);
}
}
/*
* Ajouter les textes généreaux à la base de la societé récement créée
* Créer le dossier des pièces justificatifs (realisee et efficace)
*/
private function initMaBaseWithGeneralTextes(Societe $societe)
{
//Affecter les textes généraux à la société
$generals_texts = $this->textLoiRepository->findBy(['generale' => true]);
//$socId = $entity->getId();
//dd($generals_texts);
foreach ($generals_texts as $textLoi) {
$textSociete = new TextSociete();
$textSociete->setSociete($societe);
$textSociete->setTextLoi($textLoi);
$textSociete->setStatutConformite(TextSociete::CONFORMITE_NON_EVALUE);
//$textSociete->setDateConformite(null);
$textSociete->setCreatedAt(new \DateTime());
$textSociete->setApplicabilite(TextSociete::APPLICABILITE_APPLICATION);
$textLoi->addVueParSociete($societe);
$this->entityManager->persist($textSociete);
}
$this->entityManager->flush();
$this->session->get('flashes')->add(
'success',
'La base de la société '.$societe->getName().' à été initialisée avec tous les textes généraux'
);
// Creation du dossier pj/idsoc/realisee et pj/idsoc/efficace
$id = $societe->getId();
if(!file_exists('pj/'.$id)){
mkdir('pj/'.$id,0777,true);
mkdir('pj/'.$id.'/efficace',0777,true);
mkdir('pj/'.$id.'/realisee',0777,true);
}
}
private function sendMailToResponsable(Action $action, $subject)
{
if ($this->parameterBag->get('app.mailing_activeted')) {
$email = $this->nouvelleActionEmailFactory->create($action);
$this->messageBus->dispatch(
new SendEmailMessage($email) );
// $this->session->get('flashes')->add('success', 'Votre Message a été envoyé avec succès');
// $this->addFlash('success', 'Enregistrement effectué avec succès');
$this->requestStack->getSession()->getFlashBag()->add('success', 'Un email est envoyé au responsable de l\'action...');
}
else
{
$this->session->get('flashes')->add('warning', "L'envoi des messages est désactivé.");
}
/*$email = (new Email())
->from('khediril@gmail.com')
->to($action->getEmailResponsable())
//->cc('cc@example.com')
//->bcc('bcc@example.com')
//->replyTo('fabien@example.com')
->priority(Email::PRIORITY_HIGH)
->subject($subject)
// ->text($message)
->html($message);*/
//dd($this->mailer);
/* TODO: Activé pour envoi email en csa de modification email */
///// réactiver pour envoi de mail
// $this->mailer->send($email);
// $this->session->getFlashBag()->add(
// 'success',
// 'Un Message a été envoyé au responsable de l\'action avec succés...'
//);
}
public function afterEntityUpdated(AfterEntityUpdatedEvent $event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof TextLoi) {
$this->affectTextLoiAuxSocietes($entity);
$this->session->get('flashes')->add(
'success',
'Le text de loi de Id = ' . $entity->getId() . ' a été modifié avec succés...!'
);
}
if ($entity instanceof Action) {
$this->sendMailToResponsable($entity, 'Action modifiée');
}
if ($entity instanceof TextSociete) {
$nouvStatut = $entity->getStatutConformite();
//dd("ancien : ".$this->ancienStatut." Nouveau :".$entity->getStatutConformite());
/* if($nouvStatut == $this->ancienStatut && $this->ancienStatut == TextSociete::CONFORMITE_NON_EVALUE){
$entity->setAnalyseAt(new \DateTime());
}*/
if (/*$nouvStatut == TextSociete::CONFORMITE_CONFORME &&*/$nouvStatut != $this->ancienStatut) {
$entity->setConformeAt(new \DateTime());
}
$this->entityManager->persist($entity);
$this->entityManager->flush();
}
}
public function affectTextLoiAuxSocietes($entity)
{
if ($entity->getGenerale()) {
$societes = $this->societeRepository->societeQuiNepossedePas($entity);
foreach ($societes as $soc) {
if ($soc->getUser()->getUsername() != "admin") {
$textSociete = new TextSociete();
$textSociete->setSociete($soc);
$textSociete->setTextLoi($entity);
$textSociete->setStatutConformite(TextSociete::CONFORMITE_NON_EVALUE);
$textSociete->setCreatedAt(new \DateTime());
$textSociete->setApplicabilite(TextSociete::APPLICABILITE_AVERIFIER);
$textSociete->setAddedBy($this->security->getUser());
$this->entityManager->persist($textSociete);
}
}
}
$this->entityManager->flush();
}
}