<?php
namespace App\EventSubscriber;
use App\Entity\ConfidentialityContract;
use App\Enum\AdminMail;
use App\Event\CompanyBirthdayArrivedEvent;
use App\Event\CompanyUpdatedEvent;
use App\Event\Confidentiality\ConfidentialityRequestAcceptedEvent;
use App\Event\Confidentiality\ConfidentialityRequestButInfoCompanyNotCompletEvent;
use App\Event\Confidentiality\ConfidentialityRequestEvent;
use App\Repository\ConfidentialityContractRepository;
use App\Repository\SystemEmailRepository;
use App\Service\CampaignService;
use App\Service\NotificationService;
use App\Service\PdfService;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use App\Service\DynamicHostService;
class ConfidentialitySubscriber implements EventSubscriberInterface
{
public function __construct(
private CampaignService $campaignService,
private NotificationService $notificationService,
private ConfidentialityContractRepository $confidentialityContractRepository,
private SystemEmailRepository $systemEmailRepository,
private PdfService $pdfService,
private EntityManagerInterface $entityManagerInterface,
private DynamicHostService $dynamicHostService,
){}
public static function getSubscribedEvents()
{
return [
ConfidentialityRequestEvent::NAME=>'onConfidentialityRequest',
ConfidentialityRequestButInfoCompanyNotCompletEvent::NAME=>'onConfidentialityRequestButInfoCompanyNotComplet',
ConfidentialityRequestAcceptedEvent::NAME=>'onConfidentialityRequestAccepted',
];
}
public function onConfidentialityRequestButInfoCompanyNotComplet(ConfidentialityRequestButInfoCompanyNotCompletEvent $event){
$email = $this->systemEmailRepository->findOneBy(['code'=>'CONFIDENTIALITY_REQUEST_INFO_COMPANY_INCOMPLETE']);
$company = $event->getCompany();
$admins = $this->dynamicHostService->getMailAdmin();
foreach ($admins as $adminEmail) {
$this->notificationService->create($email,$adminEmail->value,$adminEmail->value, $company);
}
}
public function onConfidentialityRequest(ConfidentialityRequestEvent $event){
$user = $event->getUser();
$company = $event->getCompany();
$campaign = $event->getCampaign();
$email = $this->systemEmailRepository->findOneBy(['code'=>'CONFIDENTIALITY_REQUEST']);
$this->notificationService->create($email,$user,$user, $company,null, $campaign);
}
public function onConfidentialityRequestAccepted(ConfidentialityRequestAcceptedEvent $event){
$user = $event->getFrom();
$clientValidators = $event->getTos();
$company = $event->getCompany();
$linkMyFlowConfidentiality = $this->pdfService->generatePdfConfidentialMyFlow($company, $clientValidators, $user);
$linkSubcontractorConfidentiality= $this->pdfService->generatePdfConfidentialSubcontractor($company, $user, $clientValidators);
$emailForClient= $this->systemEmailRepository->findOneBy(['code'=>'CONFIDENTIALITY_REQUEST_ACCETED']);
$emailForSucontractor = $this->systemEmailRepository->findOneBy(['code'=>'CONFIDENTIALITY_REQUEST_ACCETED_BY_SUBCONTRACTOR']);
// send mail for user accepted confidentiality
$this->notificationService->create($emailForSucontractor,$user,$user, $company,null, null, null, false, false, null, null, null, null, null, null,null, [$linkSubcontractorConfidentiality]);
if($company->getlinkMyFlowConfidentialityCommitment() == null){
$company->setlinkMyFlowConfidentialityCommitment($linkMyFlowConfidentiality);
}
$confidentialContractPersisted = $this->confidentialityContractRepository->findOneBy(['user'=>$user, 'company'=>$company]);
if($confidentialContractPersisted instanceof ConfidentialityContract){
$confidentialContractPersisted->setLinkSubcontractor($linkSubcontractorConfidentiality)
->setLinkMyFlow($linkMyFlowConfidentiality)
->setCreatedAt(new \DateTimeImmutable());
$this->entityManagerInterface->flush();
}
else{
// send email for client if a user accept confidetiliaty, of the first demande
$linkAtttachements=[$linkSubcontractorConfidentiality,$linkMyFlowConfidentiality];
foreach ($clientValidators as $clientValiator) {
$this->notificationService->create($emailForClient,$clientValiator,$clientValiator, $company,null, null, null, false, false, null, null, null, null, null, null,null, $linkAtttachements, $user->getFullName());
}
//add links in db
$confidentialContract = new ConfidentialityContract();
$confidentialContract->setUser($user)
->setCompany($company)
->setLinkSubcontractor($linkSubcontractorConfidentiality)
->setLinkMyFlow($linkMyFlowConfidentiality);
$this->entityManagerInterface->persist($confidentialContract);
$this->entityManagerInterface->flush();
}
}
}