<?php
namespace App\EventSubscriber;
use App\Entity\Mission;
use App\Entity\SystemEmail;
use App\Enum\Role;
use App\Event\Admin\MissionInitialTimeAfterValidationUpdatedEvent;
use App\Event\Admin\MissionNotificationActivatedEvent;
use App\Event\Admin\MissionNotificationSubContractorNotActivatedEvent;
use App\Event\AdminNotifiedMissionParticipantEvent;
use App\Repository\SystemEmailRepository;
use App\Repository\UserRepository;
use App\Service\NotificationService;
use App\Event\AdminNotifiedEvent;
use App\Event\AdminNotifiedSubContractorCompletedEvent;
use App\Event\AdminNotifiedSubContractorNoResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use App\Enum\AdminMail;
use App\Event\AdminCommandErrorEvent;
use App\Event\SubcontractorActivateOrThereIsABotEvent;
use Symfony\Component\Mime\Address;
use App\Service\DynamicHostService;
class AdminSubscriber implements EventSubscriberInterface
{
public function __construct(
private UserRepository $userRepository,
private SystemEmailRepository $systemEmailRepository,
private NotificationService $notificationService,
private DynamicHostService $dynamicHostService,
){}
public static function getSubscribedEvents()
{
return [
MissionNotificationActivatedEvent::NAME => 'onMissionNotificationActivated',
MissionNotificationSubContractorNotActivatedEvent::NAME => 'onMissionNotificationSubContractorNotActivated',
AdminNotifiedEvent::NAME => 'onAdminNotified',
AdminNotifiedSubContractorCompletedEvent::NAME => 'onSubContractorProfilComplete',
AdminNotifiedSubContractorNoResponseEvent::NAME => 'onSubContractorNoResponse48H',
MissionInitialTimeAfterValidationUpdatedEvent::NAME => 'onMissionInitialTimeAfterValidationUpdated',
AdminCommandErrorEvent::NAME => 'onCommandPassedError',
SubcontractorActivateOrThereIsABotEvent::NAME => 'onSubcontractorActivateOrThereIsABot',
AdminNotifiedMissionParticipantEvent::NAME => 'onAdminNotifiedMissionParticipant'
];
}
public function onAdminNotifiedMissionParticipant(AdminNotifiedMissionParticipantEvent $event){
$campaign = $event->getCampaign();
$admins = $this->dynamicHostService->getMailAdmin();
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::MISSION_MANQUE_PARTICIPANT_POUR_VALIDATION],[],$campaign->getOrderedBy());
if (null !== $email) {
foreach ($admins as $admin) {
$this->notificationService->create(email: $email,user: $admin->value,emailUser : $campaign->getOrderedBy(),emailCompany: $campaign->getOrderedBy()->getCompany(),emailStep:null, emailCampaign:$campaign);
}
}
}
public function onMissionNotificationActivated(MissionNotificationActivatedEvent $event)
{
$mission = $event->getMission();
if (!$mission instanceof Mission) {
return;
}
$admins = $this->dynamicHostService->getMailAdmin();
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::MISSION_SOUS_TRAITANT_TOUS_ACTIVER],[],$mission->getCampaign()->getOrderedBy());
if (null !== $email) {
foreach ($admins as $admin) {
$this->notificationService->create(email: $email,user: $admin->value,emailUser : $mission->getCampaign()->getOrderedBy(),emailCompany: $mission->getCampaign()->getOrderedBy()->getCompany(),emailStep:null, emailCampaign:$mission->getCampaign());
}
}
}
public function onMissionNotificationSubContractorNotActivated(MissionNotificationSubContractorNotActivatedEvent $event)
{
$mission = $event->getMission();
if (!$mission instanceof Mission) {
return;
}
$admins = $this->dynamicHostService->getMailAdmin();
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::MISSION_SOUS_TRAITANT_PAS_ACTIVER_24H],[],$mission->getCampaign()->getOrderedBy());
if (null !== $email && $event->canSendToAdmin()) {
foreach ($admins as $admin) {
$this->notificationService->create($email, $admin->value, $mission->getCampaign()->getOrderedBy(), $mission->getCampaign()->getOrderedBy()->getCompany(),null,null,null,false,false,null,null,$mission);
}
}
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::MISSION_RELANCE_ACTIVATION_SOUS_TRAITANT]);
if (null !== $email) {
$this->notificationService->create($email, $event->getUser(), $mission->getCampaign()->getOrderedBy(), $mission->getCampaign()->getOrderedBy()->getCompany(),null,null,null,false,false,null,null,$mission);
}
}
public function onSubContractorProfilComplete(AdminNotifiedSubContractorCompletedEvent $event)
{
$emailSystem = null;
if ($event->getSubcontractor()) {
$emailSystem = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::SOUS_TRAITANT_PROFIL_COMPLETE]);
}
$role = Role::ROLE_ADMIN->value;
$admins = $this->dynamicHostService->getMailAdmin();
$company = $this->dynamicHostService->getCompany();
if ($emailSystem !== null) {
foreach ($admins as $admin) {
$this->notificationService->create($emailSystem, $admin->value, null, $company, null, null, null, true);
}
}
}
public function onSubContractorNoResponse48H(AdminNotifiedSubContractorNoResponseEvent $event)
{
$emailSystem = null;
if ($event->getSubcontractor()) {
$emailSystem = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::SOUS_TRAITANT_NO_REPONSE_48H], [],$event->getSubcontractor());
}
$role = Role::ROLE_ADMIN->value;
$admins = $this->dynamicHostService->getMailAdmin();
if ($emailSystem !== null) {
foreach ($admins as $admin) {
$this->notificationService->create($emailSystem, $admin->value, $event->getSubcontractor(), null, null, null, null, true, true);
}
}
}
public function onAdminNotified(AdminNotifiedEvent $event)
{
$emailSystem = null;
if ($event->getSubcontractor()) {
$emailSystem = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::NOTIFICATION_ADMIN]);
}
$role = Role::ROLE_ADMIN->value;
$admins = $this->dynamicHostService->getMailAdmin();
if ($emailSystem !== null) {
foreach ($admins as $admin) {
$this->notificationService->create($emailSystem, $admin->value);
}
}
}
public function onMissionInitialTimeAfterValidationUpdated(MissionInitialTimeAfterValidationUpdatedEvent $event)
{
$emailSystem = null;
if ($event->getMission() != null) {
$emailSystem = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::SOUS_TRAITANT_FORFAIT_INITIAL_TIME_UPDATED_AFTER_VALIDATION]);
}
$admins = $this->dynamicHostService->getMailAdmin();
if ($emailSystem !== null) {
foreach ($admins as $admin) {
$this->notificationService->create($emailSystem, $admin->value);
}
}
}
public function onCommandPassedError (AdminCommandErrorEvent $adminCommandErrorEvent ){
$emailSystem = null;
if ($adminCommandErrorEvent->getCampaign () != null) {
$emailSystem = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::ERREUR_LORS_DE_LA_COMMANDE]);
}
$admins = $this->dynamicHostService->getMailAdmin();
if ($emailSystem !== null) {
foreach ($admins as $admin) {
$this->notificationService->create(email:$emailSystem,user: $admin->value, emailCompany: null, emailStep:null, emailCampaign:$adminCommandErrorEvent->getCampaign());
}
}
}
public function onSubcontractorActivateOrThereIsABot(SubcontractorActivateOrThereIsABotEvent $subcontractorActivateOrThereIsABotEvent){
$mission = $subcontractorActivateOrThereIsABotEvent->getMission ();
$admins = $this->dynamicHostService->getMailAdmin();
foreach ($admins as $admin) {
$form = new Address('caroline.b@my-flow.fr','myFlow');
$to =new Address($admin->value);
$subject ="Presence de sous-traitant bot/manque de sous-traitant";
$content="<p>Bonjour<p>
<p>Un sous-traitant vient d'activé sa mission or on a besoin de votre intervention pour poursuivre le processus :
<p>Supprimez (modifiez) le(s) sous-traitant(s) bot(s) et/ou ajoutez un workflow et/ou ajoutez le(s) sous-traitant(s) manquant(s)</p>
</p>
ref mission: {$mission->getReference()}
";
$this->notificationService->sendEmail($form,$to,$subject,$content);
}
}
}