<?php
namespace App\Service;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Notification;
use App\Enum\NotificationActionEnum;
use App\Enum\NotificationTypeEnum;
use App\Enum\NotificationEnum;
use App\Repository\UserRepository;
use App\Repository\NotificationRepository;
use App\Repository\NotificationTypeRepository;
use App\Repository\UtilisateurMineRepository;
use App\Repository\LogRepository;
use App\Service\MailerService;
use App\Service\FormulaireService;
/*
* SERVICE de notifications
* TODO compléter
*
* une notification de type mail se voit attribuer le sujet du mail en libelle, le body en contenu et la cible du mail en user.
*/
class NotificationService
{
private $repo_notification;
public function __construct(
NotificationRepository $repo_notification, NotificationTypeRepository $repo_type_notification,
UtilisateurMineRepository $repo_user_res,
MailerService $mailerService, FormulaireService $serv_form, UserRepository $repo_user,
EntityManagerInterface $entityManager, LogRepository $repo_log) {
$this->entityManager = $entityManager;
$this->repo_notification = $repo_notification;
$this->repo_type_notification = $repo_type_notification;
$this->repo_user = $repo_user;
$this->repo_user_res = $repo_user_res;
$this->repo_log = $repo_log;
$this->serv_form = $serv_form;
$this->mailerService = $mailerService;
}// function
/*
* Ajout d'une notification
* Action permet de determiner le type
*
* Apres chaque persist de notification la methode actionNotification est appelée
* et le type détermine la suite des opérations
*/
public function addNotification($infos, $action = NotificationActionEnum::DEFAULT)
{
switch ($action) {
default:
case NotificationActionEnum::DEFAULT:
$notification = new Notification();
$type = $this->repo_type_notification->find($infos['type']);
$notification->setNotificationType($type);
$notification->setLibelle($infos['libelle']); //Sujet
$notification->setContenu($infos['contenu']); //Contenu
if ($infos['url'] != null && $infos['url'] != "") {
$notification->setUrl($infos['url']); // Url si définie
}// if
$notification->setUser($infos['user']);
$notification->setMine($infos['mine']);
$this->entityManager->persist($notification);
break;
case NotificationActionEnum::NEW_USER:
/*
$notification = new Notification();
//les nouveaux users génères une notif de type mail (genre bienvenu)
$type = $this->repo_type_notification->find(NotificationTypeEnum::E_MAIL);
$notification->setNotificationType($type);
$notification->setLibelle(NotificationEnum::BIENVENUE['sujet'] . $infos->getPrenom());
$notification->setContenu(NotificationEnum::BIENVENUE['content']);
$notification->setUser($infos['user']); // TODO conditionner en fonction du role du user (peut etre)
$notification->setMine($infos['mine']);
$this->entityManager->persist($notification); */
break;
case NotificationActionEnum::MAIL:
$notification = new Notification();
$type = $this->repo_type_notification->find(NotificationTypeEnum::E_MAIL);
$notification->setNotificationType($type);
$notification->setLibelle($infos['libelle']); //Sujet
$notification->setContenu($infos['contenu']); //Contenu
$notification->setUser($infos['user']);
$notification->setMine($infos['mine']);
$this->entityManager->persist($notification);
break;
// 20220428 - LGA - Ajout d'une notification pour tous les utilisateurs d'une mine à la création prospect
case NotificationActionEnum::NEW_PROSPECT:
$mine = $infos['mine'];
$user = $infos['user'];
$type = $this->repo_type_notification->findOneBy(["name" => "inapp"]);
$libelle = $infos['libelle'];
$contenu = $infos['contenu'];
$url = $infos['url'];
$listUtilisateursRes = $this->repo_user_res->findBy(["mine" => $mine->getId()]);
foreach($listUtilisateursRes as $userRes) {
// Envoi des notifications à tous les utilisateurs de la mine autre que l'utilisateur connecté
if ($user->getId() != $userRes->getUser()->getId()) {
$notification = new Notification();
$notification->setNotificationType($type);
$notification->setLibelle($libelle); //Sujet
$notification->setContenu($contenu); //Contenu
$notification->setUrl($url); //url
$notification->setUser($userRes->getUser());
$notification->setMine($mine);
$this->entityManager->persist($notification);
}// if
}// foreach
break;
// 20220428 - LGA - Ajout d'une notification pour tous les utilisateurs concernés par un événement
case NotificationActionEnum::EVENEMENT:
$evenement = $infos['evenement'];
$user = $infos['user'];
$type = $infos['type'];
$libelle = $infos['libelle'];
$contenu = $infos['contenu'];
$url = $infos['url'];
$listUtilisateursEvt = [];
foreach($listUtilisateursEvt as $userEvt) {
// Envoi d'une notification aux utilisateurs concernés par l'événement sauf utilisateur courant
if ($userEvt->getUser()->getId() != $user->getId()) {
$notification = new Notification();
$notification->setNotificationType($type);
$notification->setLibelle($libelle); //Sujet
$notification->setContenu($contenu); //Contenu
if ($url != null && $url != "") {
$notification->setUrl($url); // Url si définie
}// if
$notification->setUser($userEvt->getUser());
$this->entityManager->persist($notification);
}// if
}// foreach
break;
}// switch
$this->entityManager->flush();
return 0;
}// function
/*
* ?
*/
public function actionNotification($notification)
{
$typeId = $notification->getNotificationType()->getId();
if ($typeId == NotificationTypeEnum::E_MAIL) {
$this->mailerService->sendEmail($notification->getLibelle(), $notification->getUser()->getEmail(), $notification->getContenu());
}// if
return true;
}
/*
* Notification lue
*/
public function valideNotification($notifId)
{
$notification = $this->repo_notification->find($notifId);
if (!$notification) {
return false;
};
$notification->setDateLue(new \DateTime());
$this->entityManager->flush();
return true;
}
/**
* Notifications d'un utilisateur par mine
*/
public function getAllByResAndUser($mine, $user) {
return $this->repo_notification->findBy([
"mine" => $mine,
"user" => $user,
"notificationType" => $this->repo_type_notification->find(\App\Enum\NotificationTypeEnum::IN_APP)
], ['createdAt' => 'DESC']);
}// function
/**
* Conversion de la liste des notifications pour ajax
* 20220428 - LGA - Ajout "order by" createdAt
* 20220505 - LGA - Ajout gestion mine
* @return array
*/
public function getNonLuesForJsonByRes($mine, $user) {
$liste = $this->repo_notification->findBy(
[
"mine" => $mine,
"user" => $user,
"dateLue" => null
],
[
"createdAt" => "ASC",
]);
$tableau = [];
foreach ($liste as $element) {
$ligne = [];
$ligne["date"] = $element->getCreatedAt()->format('Y-m-d H:i');
$ligne["id"] = $element->getId();
$ligne["notification_type"] = $element->getNotificationType()->getId();
if ($element->getContenu() != null && $element->getContenu() != "") {
$ligne["message"] = $element->getLibelle()." - ".$element->getContenu();
} else {
$ligne["message"] = $element->getLibelle();
}// if
$ligne["url"] = $element->getUrl();
$ligne["user"] = $this->repo_user->find($element->getCreatedBy())->getPrenom()." ".$this->repo_user->find($element->getCreatedBy())->getNom();
array_push($tableau, $ligne);
}// foreach
return $tableau;
}// function
/**
* Notifications par user
*/
public function getAllByUser($user) {
return $this->repo_notification->findBy([
"user" => $user,
"notificationType" => $this->repo_type_notification->find(\App\Enum\NotificationTypeEnum::IN_APP)
], ['createdAt' => 'DESC']);
}// function
/**
* Conversion de la liste des notifications pour ajax
* 20220428 - LGA - Ajout "order by" createdAt
* @return array
*/
public function getNonLuesForJson($user) {
$liste = $this->repo_notification->findBy(["user" => $user, "dateLue" => null ], ["createdAt" => "ASC"]);
$tableau = [];
foreach ($liste as $element) {
$ligne = [];
$ligne["date"] = $element->getCreatedAt()->format('Y-m-d H:i');
$ligne["id"] = $element->getId();
$ligne["notification_type"] = $element->getNotificationType()->getId();
if ($element->getContenu() != null && $element->getContenu() != "") {
$ligne["message"] = $element->getLibelle()." - ".$element->getContenu();
} else {
$ligne["message"] = $element->getLibelle();
}// if
$ligne["url"] = $element->getUrl();
array_push($tableau, $ligne);
}// foreach
return $tableau;
}// function
}// class