<?php
namespace App\EventSubscriber;
use App\Entity\User;
use App\Factory\Platform\MailerFactory;
use App\Services\Common\Email\MailTypes;
use App\Services\Common\MailerService;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use ReflectionException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Workflow\Event\Event;
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
/**
* Subscriber pour écouter les events sur le workflow des users
*/
class UserStatusWorkflowSubscriber implements EventSubscriberInterface
{
private MailerService $mailerService;
private EntityManagerInterface $em;
public function __construct(
MailerService $mailerService,
EntityManagerInterface $em
) {
$this->mailerService = $mailerService;
$this->em = $em;
}
/**
* Quand une demande d'inscription est acceptée par un admin
*
* @param Event $event
*
* @return void
*
* @throws ReflectionException
* @throws ClientExceptionInterface
* @throws RedirectionExceptionInterface
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
* @throws Exception
*/
public function onWorkflowUserStatusAcceptRegister(Event $event): void
{
/** @var User $user */
$user = $event->getSubject();
$this->mailerService->createApiMailRequest(MailTypes::REGISTRATION_VALIDATED)
->addRecipientToRequest($user)
->send()
;
}
/**
* Quand un user accepte les CGU
*
* @param Event $event
*
* @return void
*/
public function onWorkflowUserStatusAcceptCgu(Event $event): void
{
/** @var User $user */
$user = $event->getSubject();
$user->setCguAt(new DateTime());
}
/**
* Quand un user refuse les CGU
*
* @param Event $event
*
* @return void
* @throws Exception|TransportExceptionInterface
*/
public function onWorkflowUserStatusRejectCgu(Event $event): void
{
/** @var User $user */
$user = $event->getSubject();
$user->setCguAt(NULL);
// Pour les installateurs DAIKIN, le mail n'est présent que dans la config de Daikin
$this->mailerService->createApiMailRequest(MailTypes::USER_REJECT_CGU);
$commercial = $user->getCommercial();
if ($commercial !== NULL) {
$this->mailerService->addRecipientToRequest($commercial, MailerFactory::buildRejectCGU($user));
$agencyManager = $commercial->getParents();
if (count($agencyManager) > 0) {
$this->mailerService->addRecipientToRequest($agencyManager[ 0 ], MailerFactory::buildRejectCGU($user));
}
}
$admins = $this->em->getRepository(User::class)->findUsersByJob('ADMIN_1');
foreach ($admins as $admin) {
$this->mailerService->addRecipientToRequest($admin, MailerFactory::buildRejectCGU($user));
}
$this->mailerService->send();
// FIN
}
/**
* Quand les CGU sont renvoyées
*
* @param Event $event
*
* @return void
*
* @throws Exception|TransportExceptionInterface
*/
public function onWorkflowUserStatusResendCgu(Event $event): void
{
/** @var User $user */
$user = $event->getSubject();
$token = md5(uniqid('', TRUE));
$user->setCguAt(NULL)
->setPassword($token)
->setWelcomeEmail(new DateTime())
;
if (isset($event->getContext()[ 'async_mail' ]) && $event->getContext()[ 'async_mail' ] === TRUE) {
$this->mailerService->addRecipientToRequest($user, MailerFactory::buildAcceptCguFirst($user->getPassword()));
} else {
$this->mailerService->createApiMailRequest(MailTypes::ACCEPT_CGU_FIRST)
->addRecipientToRequest($user, MailerFactory::buildAcceptCguFirst($user->getPassword()))
->send()
;
}
}
/**
* Quand un user se désinscrit
*
* @param Event $event
*
* @return void
* @throws Exception|TransportExceptionInterface
*/
public function onWorkflowUserStatusUnsubscribe(Event $event): void
{
/** @var User $user */
$user = $event->getSubject();
$user->setUnsubscribedAt(new DateTime());
// Pour les installateurs DAIKIN, le mail n'est présent que dans la config de Daikin
$this->mailerService->createApiMailRequest(MailTypes::USER_UNSUBSCRIBE);
$commercial = $user->getCommercial();
if ($commercial !== NULL) {
$this->mailerService->addRecipientToRequest($commercial, MailerFactory::buildUnsubscribe($user));
$agencyManager = $commercial->getParents();
if (count($agencyManager) > 0) {
$this->mailerService->addRecipientToRequest($agencyManager[ 0 ], MailerFactory::buildUnsubscribe($user));
}
}
$admins = $this->em->getRepository(User::class)->findUsersByJob('ADMIN_1');
foreach ($admins as $admin) {
$this->mailerService->addRecipientToRequest($admin, MailerFactory::buildUnsubscribe($user));
}
$this->mailerService->send();
// FIN
}
/**
* Quand un user est désactivé
*
* @param Event $event
*
* @return void
*/
public function onWorkflowUserStatusDisable(Event $event): void
{
/** @var User $user */
$user = $event->getSubject();
$user->setDisabledAt(new DateTime());
}
/**
* Quand un user est réactivé
*
* @param Event $event
*
* @return void
*/
public function onWorkflowUserStatusEnable(Event $event): void
{
/** @var User $user */
$user = $event->getSubject();
$user->setDisabledAt(NULL);
}
/**
* Quand un réinscrit par un admin
*
* @param Event $event
*
* @return void
*/
public function onWorkflowUserStatusReRegistration(Event $event): void
{
/** @var User $user */
$user = $event->getSubject();
$user->setUnsubscribedAt(NULL)
->setUnsubscribeReason(NULL)
;
}
/**
* Quand un user est archivé manuellement
*
* @param Event $event
*
* @return void
*/
public function onWorkflowUserStatusArchiveManual(Event $event): void
{
/** @var User $user */
$user = $event->getSubject();
$user->setArchivedAt(new DateTime())
->setCguAt(NULL)
;
if ($user->getArchiveReason() === NULL) {
$user->setArchiveReason('Archivage manuel');
}
}
/**
* Quand un user est archivé automatiquement
*
* @param Event $event
*
* @return void
*/
public function onWorkflowUserStatusArchiveAuto(Event $event): void
{
/** @var User $user */
$user = $event->getSubject();
$user->setArchivedAt(new DateTime())
->setArchiveReason('Archivage automatique')
->setCguAt(NULL)
;
}
/**
* Quand on désarchive un user
*
* @param Event $event
*
* @return void
* @throws Exception|TransportExceptionInterface
*/
public function onWorkflowUserStatusUnarchive(Event $event): void
{
/** @var User $user */
$user = $event->getSubject();
$user->setArchivedAt(NULL)
->setArchiveReason(NULL)
->setDeletedAt(NULL)
->setCguAt(NULL)
->setUnsubscribedAt(NULL)
->setUnsubscribeReason(NULL)
->setWelcomeEmail(new DateTime())
->setPassword(md5(uniqid('', TRUE)))
;
$this->mailerService->createApiMailRequest(MailTypes::ACCEPT_CGU_FIRST)
->addRecipientToRequest($user, MailerFactory::buildAcceptCguFirst($user->getPassword()))
->send()
;
}
/**
* Quand on soft delete un user
*
* @param Event $event
*
* @return void
* @throws Exception
*/
public function onWorkflowUserStatusSoftDelete(Event $event): void
{
/** @var User $user */
$user = $event->getSubject();
$anonymousData = substr(md5($user->getEmail()), 0, 30);
$user->setEmail($anonymousData.'@__deleted__')
->setCivility(NULL)
->setFirstName($anonymousData)
->setLastName($anonymousData)
->setPhone(NULL)
->setMobile(NULL)
->setAddress1(NULL)
->setAddress2(NULL)
->setAddress3(NULL)
->setCity(NULL)
->setPostcode(NULL)
->setCompany(NULL)
->setDistributor(NULL)
->setDistributor2(NULL)
->setSapAccount(NULL)
->setUsername(NULL)
->setUsernameCanonical(NULL)
->setEmailCanonical(NULL)
->setSalt(NULL)
->setLastLogin(NULL)
->setTransactionalEmail(NULL)
->setSocialSecurityNumber(NULL)
->setBirthDate(NULL)
->setBirthCity(NULL)
->setPassword($anonymousData)
->setDeletedAt(new DateTime())
;
}
public static function getSubscribedEvents(): array
{
return [
'workflow.user_status.transition.accept_register' => 'onWorkflowUserStatusAcceptRegister',
'workflow.user_status.transition.accept_cgu' => 'onWorkflowUserStatusAcceptCgu',
'workflow.user_status.transition.reject_cgu' => 'onWorkflowUserStatusRejectCgu',
'workflow.user_status.transition.resend_cgu' => 'onWorkflowUserStatusResendCgu',
'workflow.user_status.transition.disable' => 'onWorkflowUserStatusDisable',
'workflow.user_status.transition.enable' => 'onWorkflowUserStatusEnable',
'workflow.user_status.transition.unsubscribe' => 'onWorkflowUserStatusUnsubscribe',
'workflow.user_status.transition.re_registration' => 'onWorkflowUserStatusReRegistration',
'workflow.user_status.transition.archive_manual' => 'onWorkflowUserStatusArchiveManual',
'workflow.user_status.transition.archive_auto' => 'onWorkflowUserStatusArchiveAuto',
'workflow.user_status.transition.unarchive' => 'onWorkflowUserStatusUnarchive',
'workflow.user_status.transition.soft_delete' => 'onWorkflowUserStatusSoftDelete',
];
}
}