<?php
namespace App\Service;
use App\Entity\Historique;
use App\Entity\InfosSuivi;
use App\Entity\Lot;
use App\Entity\Programme;
use App\Entity\Prospect;
use App\Entity\Impression;
use App\Entity\Utilisateur;
use App\Repository\ProspectRepository;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Address;
use App\Repository\UtilisateurRepository;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
class Notification
{
protected $doctrine;
protected $container;
protected $mailer;
protected $utilisateurRepository;
protected $prospectRepository;
protected $router;
private $creationPdf;
private $em;
public function __construct(ContainerInterface $container, ManagerRegistry $doctrine, MailerInterface $mailer, UtilisateurRepository $utilisateurRepository, ProspectRepository $prospectRepository, UrlGeneratorInterface $router, CreationPdf $creationPdf, EntityManagerInterface $em)
{
$this->container = $container;
$this->doctrine = $doctrine;
$this->mailer = $mailer;
$this->utilisateurRepository = $utilisateurRepository;
$this->prospectRepository = $prospectRepository;
$this->router = $router;
$this->creationPdf = $creationPdf;
$this->em = $em;
}
public function alertInterne(Prospect $prospect, Impression $impression, Lot $lot, UtilisateurRepository $utilisateurRepository)
{
$utilisateurs = $utilisateurRepository->findBy( ['notification' => true]);
$destinataires = [];
foreach($utilisateurs as $utilisateur){
$destinataires[] = new Address($utilisateur->getEmail());
}
$email = (new TemplatedEmail())
->from(new Address('mailer@zada.ai', 'Élise Bala'))
->replyTo($prospect->getEmprunteurEmail())
->to(...$destinataires)
->subject($prospect->getEntreprise() . ' : nouveau retour de prospect')
->htmlTemplate('emails/email_impression.html.twig')
->context([
'prospect' => $prospect,
'impression' => $impression,
'lot' => $lot
])
;
try {
$this->mailer->send($email);
return true;
} catch (TransportExceptionInterface $e) {
return false;
}
}
public function alertVisite(Prospect $prospect, UtilisateurRepository $utilisateurRepository, string $senderEmail, Historique $lastHistorique)
{
$SUPERADMINs = $utilisateurRepository->createQueryBuilder('u')
->where('u.email LIKE :email')
->andWhere('u.notification = true')
->setParameters(['email' => $senderEmail])
->getQuery()
->getResult();
$destinataires = [];
foreach ($SUPERADMINs as $SUPERADMIN) {
$destinataires[] = new Address($SUPERADMIN->getEmail());
}
$destinataires = array_unique($destinataires, SORT_REGULAR);
$email = (new TemplatedEmail())
->replyTo($prospect->getEmprunteurEmail())
->to(...$destinataires)
->subject($prospect->getEntreprise() . ' : nouvelle visite')
->htmlTemplate('emails/email_visite.html.twig')
->context([
'prospect' => $prospect,
'lastHistorique' => $lastHistorique
]);
$email->from(new Address('mailer@zada.ai', 'LK1'));
$email->getHeaders()->addTextHeader('X-Transport', 'main');
$infoSuivi = new InfosSuivi();
$infoSuivi->setUtilisateur($prospect->getAuteur());
$infoSuivi->addProspect($prospect);
$infoSuivi->setHistorique($lastHistorique);
$infoSuivi->setType('visite');
$infoSuivi->setDescription('[prospect] a [visite] son espace public.');
$infoSuivi->setDate(new \DateTime());
$infoSuivi->setLu(false);
$this->em->persist($infoSuivi);
$this->em->flush();
try {
$this->mailer->send($email);
return true;
} catch (TransportExceptionInterface $e) {
return false;
}
}
public function alertProspect(Prospect $prospect, Request $request)
{
$subject = $request->request->get('_mail_subject');
$message = $request->request->get('_mail_message');
$addCopy = $request->request->get('_mail_copy');
if(isset($addCopy)){
$emailCopy = $prospect->getCoEmprunteurEmail();
}
$emailUser = $this->container->get('security.token_storage')->getToken()->getUser()->getEmail();
$email = (new TemplatedEmail())
->to($prospect->getEmprunteurEmail())
->replyTo($emailUser)
->subject($subject)
->htmlTemplate('emails/email_layout.html.twig')
->context([
'prospect' => $prospect,
'message' => $message,
])
;
if(isset($emailCopy)){
$email->addCc($emailCopy);
}
switch ($emailUser) {
case 'ebala@lk1.fr':
$email->from(new Address('ebala@lk1.fr', 'Élise Bala LK1 Immobilier'));
$email->getHeaders()->addTextHeader('X-Transport', 'ebala');
break;
case 'amerulla@lk1.fr':
$email->from(new Address('amerulla@lk1.fr', 'Amerulla LK1 Immobilier'));
$email->getHeaders()->addTextHeader('X-Transport', 'amerulla');
break;
case 'gwenola@lk1.fr':
$email->from(new Address('gwenola@lk1.fr', 'Gwenola LK1 Immobilier'));
$email->getHeaders()->addTextHeader('X-Transport', 'gwenola');
break;
case 'carolinepetit@lk1.fr':
$email->from(new Address('carolinepetit@lk1.fr', 'Caroline LK1 Immobilier'));
$email->getHeaders()->addTextHeader('X-Transport', 'caroline');
break;
case 'ndufort@lk1.fr':
$email->from(new Address('ndufort@lk1.fr', 'Nordahl LK1 Immobilier'));
$email->getHeaders()->addTextHeader('X-Transport', 'nordahl');
break;
case 'vruiz@lk1.fr':
$email->from(new Address('vruiz@lk1.fr', 'Vincent LK1 Immobilier'));
$email->getHeaders()->addTextHeader('X-Transport', 'vincent');
break;
case 'sweltz@lk1.fr':
$email->from(new Address('sweltz@lk1.fr', 'Stéphanie LK1 Immobilier'));
$email->getHeaders()->addTextHeader('X-Transport', 'stephanie');
break;
case 'wdouma@lk1.fr':
$email->from(new Address('wdouma@lk1.fr', 'Wafaa LK1 Immobilier'));
$email->getHeaders()->addTextHeader('X-Transport', 'wafaa');
break;
case 'c.aussandon@lk1.fr':
$email->from(new Address('c.aussandon@lk1.fr', 'Christelle LK1 Immobilier'));
$email->getHeaders()->addTextHeader('X-Transport', 'aussandon');
break;
case 'a.soulet@lk1.fr':
$email->from(new Address('a.soulet@lk1.fr', 'Aurélia LK1 Immobilier'));
$email->getHeaders()->addTextHeader('X-Transport', 'soulet');
break;
case 'b.imbard@lk1.fr':
$email->from(new Address('b.imbard@lk1.fr', 'Benjamin LK1 Immobilier'));
$email->getHeaders()->addTextHeader('X-Transport', 'imbard');
break;
default:
$email->from(new Address('mailer@zada.ai', 'Élise Bala LK1 Immobilier'));
$email->getHeaders()->addTextHeader('X-Transport', 'main');
break;
}
try {
$this->mailer->send($email);
return true;
} catch (TransportExceptionInterface $e) {
return false;
}
}
public function alertAuteurProspect(int $prospectId, int $auteurId, Utilisateur $userConnected)
{
$auteur = $this->utilisateurRepository->find($auteurId);
$prospect = $this->prospectRepository->find($prospectId);
if (!$auteur || !$prospect) {
return false;
}
$pdfPath = $this->creationPdf->createPDF($prospect, '/', 'file');
$email = (new TemplatedEmail())
->from(new Address('mailer@zada.ai', 'LK1'))
->to($auteur->getEmail())
->subject($prospect->getEntreprise() . ' : nouveau contact à traiter')
->htmlTemplate('emails/email_nouveau_contact.html.twig')
->context([
'prospect' => $prospect,
'auteur' => $auteur,
])
->attachFromPath($pdfPath);
try {
$this->mailer->send($email);
if ($pdfPath) {
if (is_file($pdfPath)) {
unlink($pdfPath);
}
}
$this->addNotificationForAdmins($prospect, $auteur, $userConnected);
return true;
} catch (TransportExceptionInterface $e) {
if ($pdfPath) {
if (is_file($pdfPath)) {
unlink($pdfPath);
}
}
return false;
}
}
/**
* Méthode pour notifier les SUPERADMIN d'une demande de suppression de programme
*/
public function alertDemandeSuppression(Programme $programme, Utilisateur $userConnected)
{
$entreprise = $programme->getEntreprise();
if (!$entreprise) {
return false;
}
$superAdmins = $this->utilisateurRepository->createQueryBuilder('u')
->where('u.entreprise = :entreprise')
->andWhere('u.roles LIKE :roleSuperAdmin')
->setParameter('entreprise', $entreprise)
->setParameter('roleSuperAdmin', '%ROLE_SUPERADMIN%')
->getQuery()
->getResult();
foreach ($superAdmins as $admin) {
$infoSuivi = new InfosSuivi();
$infoSuivi->setUtilisateur($admin);
$infoSuivi->setType('suppr');
$infoSuivi->setDescription('[user] a fait une [demande de suppression] pour le programme [programme].');
$infoSuivi->setDate(new \DateTime());
$infoSuivi->setLu(false);
$infoSuivi->setConnectedUser($userConnected);
$infoSuivi->setProgramme($programme);
$this->em->persist($infoSuivi);
}
$this->em->flush();
return true;
}
private function addNotificationForAdmins(Prospect $prospect, ?Utilisateur $auteur, Utilisateur $userConnected)
{
$entreprise = $auteur ? $auteur->getEntreprise() : null;
$queryBuilder = $this->utilisateurRepository->createQueryBuilder('u');
if ($entreprise) {
$queryBuilder->where('u.entreprise = :entreprise')
->setParameter('entreprise', $entreprise);
}
$queryBuilder->andWhere(
$queryBuilder->expr()->orX(
$queryBuilder->expr()->like('u.roles', ':rolesAdmin'),
$queryBuilder->expr()->like('u.roles', ':rolesSuperAdmin')
)
)
->setParameter('rolesAdmin', '%ROLE_ADMIN%')
->setParameter('rolesSuperAdmin', '%ROLE_SUPERADMIN%');
if (in_array('ROLE_COMMERCIAL', $auteur->getRoles())) {
$queryBuilder->orWhere('u.roles LIKE :rolesDirecteur')
->setParameter('rolesDirecteur', '%ROLE_DIRECTEUR%');
}
if (in_array('ROLE_PARTENAIRE', $auteur->getRoles())) {
$queryBuilder->orWhere('u.roles LIKE :rolesResponsable')
->setParameter('rolesResponsable', '%ROLE_RESPONSABLE%');
}
$admins = $queryBuilder->getQuery()->getResult();
foreach ($admins as $admin) {
$infoSuivi = new InfosSuivi();
$infoSuivi->setUtilisateur($admin);
$infoSuivi->addProspect($prospect);
$infoSuivi->setType('client');
$infoSuivi->setDescription('Le client [prospect] a été attribué à [user] par [connectedUser]');
$infoSuivi->setDate(new \DateTime());
$infoSuivi->setLu(false);
$infoSuivi->setAuteur($auteur);
$infoSuivi->setConnectedUser($userConnected);
$this->em->persist($infoSuivi);
}
$this->em->flush();
}
}