<?php
namespace App\EventSubscriber;
use App\Entity\CampaignPendingToSend;
use App\Entity\SystemEmail;
use App\Entity\User;
use App\Entity\UserData;
use App\Event\SubContractor\SubContractorCompletedProfileEvent;
use App\Event\SubContractor\SubContractorMissionAddedEvent;
use App\Event\SubContractor\SubContractorReferencedEvent;
use App\Event\SubContractor\SubContractorServiceAddedEvent;
use App\Event\SubContractor\SubContractorActivatedEvent;
use App\Event\SubContractorVigilanceCertificateAbsentEvent;
use App\Event\SubContractorVigilanceCertificateReminderEvent;
use App\Event\SubContractorRelaunchedEvent;
use App\Event\SubContractorUpdatedEvent;
use App\Repository\SystemEmailRepository;
use App\Repository\UserRepository;
use App\Service\FrontAPIService;
use App\Service\NotificationService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use App\Enum\AdminMail;
use App\Enum\ProductType;
use App\Event\Confidentiality\ConfidentialityRequestButInfoCompanyNotCompletEvent;
use App\Event\Confidentiality\ConfidentialityRequestEvent;
use App\Event\SubContractor\SubContractorEvaluateMissionEvent;
use App\Event\SubContractor\SubContractorRequestEvaluateMissionEvent;
use App\Event\SubContractor\SubContractorMarginProblemEvent;
use App\Repository\CampaignPendingToSendRepository;
use App\Service\ConfidentialityService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Mime\Address;
use App\Event\SubContractor\RelaunchAdminCertificateVigilenceEvent;
use App\Service\FirebaseCloudeMessagingService;
use App\Service\DynamicHostService;
use App\Service\UserService;
use App\Event\SubContractor\SubContractorRequestNotEvaluatedMissionClosedEvent;
class SubContractorSubscriber implements EventSubscriberInterface
{
public function __construct(
private FrontAPIService $frontAPIService,
private SystemEmailRepository $systemEmailRepository,
private UserRepository $userRepository,
private ConfidentialityService $confidentialityService,
private NotificationService $notificationService,
private EventDispatcherInterface $dispatcher,
private EntityManagerInterface $em,
private UserService $userService,
private CampaignPendingToSendRepository $CampaignPendingToSendRepository,
private FirebaseCloudeMessagingService $firebaseCloudeMessagingService,
private DynamicHostService $dynamicHostService,
){}
public static function getSubscribedEvents()
{
return [
SubContractorUpdatedEvent::NAME => 'onSubcontractorUpdated',
SubContractorRequestNotEvaluatedMissionClosedEvent::NAME => 'onSubcontractorNotEvaluatedInMissionClosed',
SubContractorRelaunchedEvent::NAME => 'onSubcontractorRelaunched',
SubContractorReferencedEvent::NAME => 'onSubContractorReferenced',
SubContractorCompletedProfileEvent::NAME => 'onSubContractorCompletedProfile',
SubContractorMissionAddedEvent::NAME => 'onSubContractorMissionAdded',
SubContractorServiceAddedEvent::NAME => 'onSubContractorServiceAdded',
SubContractorActivatedEvent::NAME => 'onSubContractorActivatedEvent',
SubContractorEvaluateMissionEvent::NAME => 'onSubContractorAddMission',
SubContractorRequestEvaluateMissionEvent::NAME => 'onRequestEvaluateMission',
SubContractorMarginProblemEvent::NAME => 'onSubContractorMarginProblemEvent',
SubContractorVigilanceCertificateAbsentEvent::NAME => 'onSubContractorVigilanceCertificateAbsentEvent',
SubContractorVigilanceCertificateReminderEvent::NAME => 'onSubContractorVigilanceCertificateReminderEvent',RelaunchAdminCertificateVigilenceEvent::NAME => 'onRelaunchAdminCertificateVigilenceEvent',
];
}
public function onSubcontractorNotEvaluatedInMissionClosed(SubContractorRequestNotEvaluatedMissionClosedEvent $event){
$user = $event->getUser();
$mission = $event->getMission();
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::REQUETE_EVALUATION_MISSION_FOR_MISSION_CLOSED]);
if($email){
$this->notificationService->create($email, $user, $user,$mission->getCampaign()->getOrderedBy()->getCompany(),null,$mission->getCampaign());
}
}
public function onRelaunchAdminCertificateVigilenceEvent(RelaunchAdminCertificateVigilenceEvent $event){
$subcontractor = $event->getUser();
$admins = $this->dynamicHostService->getMailAdmin();
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::VIGILANCE_CERTIFICATE_REMINDER_ADMIN],[],$subcontractor);
foreach ($admins as $admin){
$this->notificationService->create($email, $admin->value, $subcontractor, null, null, null, null, true);
}
return false;
}
public function onSubContractorVigilanceCertificateReminderEvent(SubContractorVigilanceCertificateReminderEvent $event){
$sendNotification = $event->getSendNotification();
$subContractor = $event->getSubContractor();
$email = $this->systemEmailRepository->findOneBy(['code'=>SystemEmail::VIGILANCE_CERTIFICATE_REMINDER],[],$subContractor);
if($sendNotification){
$this->notificationService->create($email, $subContractor,$subContractor);
}
}
public function onSubContractorVigilanceCertificateAbsentEvent (SubContractorVigilanceCertificateAbsentEvent $event){
$sendNotification = $event->getSendNotification();
$subcontractor = $event->getSubContractor();
$email = $this->systemEmailRepository->findOneBy(['code'=>SystemEmail::VIGILANCE_CERTIFICATE_ABSENT]);
if($sendNotification){
$this->notificationService->create($email, $subcontractor, $subcontractor);
}
}
public function onSubContractorMarginProblemEvent(SubContractorMarginProblemEvent $event){
$user = $event->getUser();
$content = $event->getContent();
$admins = $this->dynamicHostService->getMailAdmin();
$addressFrom = new Address("caroline.b@my-flow.fr", "myflow");
foreach ($admins as $admin){
$addressTo = new Address($admin->value);
$this->notificationService->sendEmail($addressFrom,$addressTo, "Désassociation sous traitant pour marge non respectée",$content);
}
return false;
}
public function onRequestEvaluateMission(SubContractorRequestEvaluateMissionEvent $event){
$mission = $event->getMission();
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::REQUETE_EVALUATION_MISSION]);
$idsUserAlreadySendEmail = [];
if (null !== $email) {
//send mail to every participant
foreach ($mission->subcontractorIsReady() as $participant) {
if(!in_array($participant['user']->getId(), $idsUserAlreadySendEmail)){
$user = $participant['user'];
$campaign = $mission->getCampaign();
$this->notificationService->create($email, $user, $campaign->getOrderedBy(), $campaign->getOrderedBy()->getCompany(), null, $campaign);
$idsUserAlreadySendEmail = [...$idsUserAlreadySendEmail,$participant['user']->getId()];
}
}
}
}
public function onSubContractorAddMission(SubContractorEvaluateMissionEvent $event){
$user = $event->getUser();
$campaign = $event->getCampaign();
if (!$user instanceof User) {
return;
}
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::MISSION_DEMANDE_EVALUATION]);
if (null !== $email) {
$this->notificationService->create($email, $user, $campaign->getOrderedBy(), $campaign->getOrderedBy()->getCompany(), null, $campaign);
}
}
public function onSubcontractorUpdated(SubContractorUpdatedEvent $event)
{
$subcontractor = $event->getSubcontractor();
if (!$subcontractor instanceof User) {
return;
}
$this->frontAPIService->pushSubcontractorToFront($subcontractor);
$admins = $this->dynamicHostService->getMailAdmin($subcontractor);
// if ($event->getSendNotification() && is_null($subcontractor->getParent())) {
if ($event->getSendNotification()) {
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::CREATION_NOUVEAU_SOUS_TRAITANT]);
if (null !== $email) {
$this->notificationService->create($email, $subcontractor, $subcontractor);
}
// foreach ($admins as $admin) {
// $this->notificationService->create($email, $admin->value, $subcontractor, null, null, null, null, true);
// }
$this->userService->generateIdentifierForUser($subcontractor);
}
if ($event->getThankYouNotification()) {
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::CONFIRMATION_INSCRIPTION]);
if (null !== $email) {
$this->notificationService->create($email, $subcontractor, $subcontractor, null, null, null, null, true, true);
}
}
if ($event->getUpdateProfileNotification() && is_null($subcontractor->getParent()) ) {
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::MISE_A_JOUR_PROFIL_ATTENDU]);
if (null !== $email) {
$this->notificationService->create($email, $subcontractor, $subcontractor);
}
}
}
public function onSubcontractorRelaunched(SubContractorRelaunchedEvent $event)
{
$emailSystem = null;
if ($event->getSubcontractor()) {
$emailSystem = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::RELANCE_SOUS_TRAITANT] ,[],$event->getSubcontractor());
}
if ($emailSystem !== null){
$this->notificationService->create($emailSystem, $event->getSubcontractor(), $event->getSubcontractor());
}
}
public function onSubContractorReferenced(SubContractorReferencedEvent $event)
{
$subcontractor = $event->getUser();
if (!$subcontractor instanceof User) {
return;
}
if (!$subcontractor->getReferencingConfirmationNotification()) {
$emailSystem = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::CONFIRMATION_REFERENCEMENT]);
if ($emailSystem !== null){
$this->notificationService->create($emailSystem, $subcontractor, $subcontractor);
}
}
}
public function onSubContractorCompletedProfile(SubContractorCompletedProfileEvent $event)
{
$subcontractor = $event->getUser();
if (!$subcontractor instanceof User) {
return;
}
$admins = $this->dynamicHostService->getMailAdmin($subcontractor);
$emailSystem = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::SOUS_TRAITANT_PROFIL_COMPLETE]);
if ($emailSystem !== null){
foreach ($admins as $admin) {
$this->notificationService->create($emailSystem, $admin->value, $subcontractor,$subcontractor->getCompany());
}
}
}
public function onSubContractorMissionAdded(SubContractorMissionAddedEvent $event)
{
$subcontractor = $event->getUser();
$mission = $event->getMission();
$campaign =$mission->getCampaign();
$alreadyNotifAdminCompanyInfoIncomplet = false;
if (!$subcontractor instanceof User) {
return;
}
$email = $mission->getProduct()->getType() == ProductType::A_EVALUER ? $this->systemEmailRepository->findOneBy(['code' => SystemEmail::MISSION_DEMANDE_EVALUATION]) :$this->systemEmailRepository->findOneBy(['code' => SystemEmail::CONFIRMER_MISSION]);
if($campaign->getConfidentiality() != true || ($campaign->getConfidentiality() == true
&& $this->confidentialityService->isAcceptConfidentialityContract($subcontractor, $campaign->getCompany()))){
$this->notificationService->create($email, $subcontractor,$subcontractor, $campaign->getOrderedBy()->getCompany(), null, $campaign, null, false, false, false, false, $mission);
//mise a jour date Vigilence certificate
$userData = $subcontractor?->getUserData();
if (is_null($userData)) {
$userDataNew = new UserData();
$userDataNew->setDateUpdateCertificate(new \DateTime())
->setStateCompany('fr');
$this->em->persist($userDataNew);
$this->em->flush();
$subcontractor->setUserData($userDataNew);
$this->em->persist($subcontractor);
$this->em->flush();
//send mail certitication vigilence if pays company is fr
$emailVigilence = $this->systemEmailRepository->findOneBy(['code'=>SystemEmail::VIGILANCE_CERTIFICATE_ABSENT]);
$this->notificationService->create($emailVigilence, $subcontractor, $subcontractor);
}else{
//verify if coutry is fr
if ( $userData->getStateCompany() == 'fr' && is_null($userData->getDateUpdateCertificate()) ) {
$userData->setDateUpdateCertificate(new \DateTime());
$this->em->persist($userData);
$this->em->flush();
$subcontractor->setUserData($userData);
$this->em->persist($subcontractor);
$this->em->flush();
//send mail certitication vigilence if pays company is fr
$emailVigilence = $this->systemEmailRepository->findOneBy(['code'=>SystemEmail::VIGILANCE_CERTIFICATE_ABSENT]);
$this->notificationService->create($emailVigilence, $subcontractor, $subcontractor);
}
}
//end mise a jour
}
else{
if($this->confidentialityService->companyInfoIsComplete($campaign->getCompany())){
$event = new ConfidentialityRequestEvent($campaign->getCompany(),$subcontractor,$campaign);
$this->dispatcher->dispatch($event, ConfidentialityRequestEvent::NAME);
}
elseif(!$alreadyNotifAdminCompanyInfoIncomplet){
$event = new ConfidentialityRequestButInfoCompanyNotCompletEvent($campaign->getCompany());
$this->dispatcher->dispatch($event, ConfidentialityRequestButInfoCompanyNotCompletEvent::NAME);
$alreadyNotifAdminCompanyInfoIncomplet = true ;
}
if($this->CampaignPendingToSendRepository->findOneBy(['user'=>$subcontractor,'company'=>$campaign->getCompany(), 'campaign'=>$campaign,'isSend'=>false])==null){
$campaingPendingToSend = new CampaignPendingToSend();
$campaingPendingToSend->setUser($subcontractor);
$campaingPendingToSend->setCampaign($campaign);
$campaingPendingToSend->setCompany($campaign->getCompany());
$this->em->persist($campaingPendingToSend);
$this->em->flush();
}
}
if(in_array('ROLE_SUBCONTRACTOR', $subcontractor->getRoles())){
if($mission->getProduct()->getType() == ProductType::A_EVALUER){
$message = 'Action requise - Une nouvelle mission attend votre évaluation. Connecte toi pour plus de détails.';
}else{
$message = 'Action requise - Une nouvelle mission attend votre validation. Connectez-vous pour plus de détails.';
}
$this->firebaseCloudeMessagingService->sendPushNotification($subcontractor, 'myFlow', $message);
}
}
public function onSubContractorServiceAdded(SubContractorServiceAddedEvent $event)
{
$subcontractor = $event->getUser();
if (!$subcontractor instanceof User) {
return;
}
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::SOUS_TRAITANT_ADD_SERVICE]);
if ($email !== null){
$this->notificationService->create($email, $subcontractor, $subcontractor);
}
}
public function onSubContractorActivatedEvent(SubContractorActivatedEvent $event){
$subcontractor = $event->getUser();
if (!$subcontractor instanceof User) {
return;
}
$email = $this->systemEmailRepository->findOneBy(['code' => SystemEmail::ACTIVATION_PRESTATAIRE]);
if ($email !== null){
$this->notificationService->create($email, $subcontractor, $subcontractor);
}
}
}