src/EventSubscriber/SubContractorSubscriber.php line 230

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\CampaignPendingToSend;
  4. use App\Entity\SystemEmail;
  5. use App\Entity\User;
  6. use App\Entity\UserData;
  7. use App\Event\SubContractor\SubContractorCompletedProfileEvent;
  8. use App\Event\SubContractor\SubContractorMissionAddedEvent;
  9. use App\Event\SubContractor\SubContractorReferencedEvent;
  10. use App\Event\SubContractor\SubContractorServiceAddedEvent;
  11. use App\Event\SubContractor\SubContractorActivatedEvent;
  12. use App\Event\SubContractorVigilanceCertificateAbsentEvent;
  13. use App\Event\SubContractorVigilanceCertificateReminderEvent;
  14. use App\Event\SubContractorRelaunchedEvent;
  15. use App\Event\SubContractorUpdatedEvent;
  16. use App\Repository\SystemEmailRepository;
  17. use App\Repository\UserRepository;
  18. use App\Service\FrontAPIService;
  19. use App\Service\NotificationService;
  20. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  21. use App\Enum\AdminMail;
  22. use App\Enum\ProductType;
  23. use App\Event\Confidentiality\ConfidentialityRequestButInfoCompanyNotCompletEvent;
  24. use App\Event\Confidentiality\ConfidentialityRequestEvent;
  25. use App\Event\SubContractor\SubContractorEvaluateMissionEvent;
  26. use App\Event\SubContractor\SubContractorRequestEvaluateMissionEvent;
  27. use App\Event\SubContractor\SubContractorMarginProblemEvent;
  28. use App\Repository\CampaignPendingToSendRepository;
  29. use App\Service\ConfidentialityService;
  30. use Doctrine\ORM\EntityManagerInterface;
  31. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  32. use Symfony\Component\Mime\Address;
  33. use App\Event\SubContractor\RelaunchAdminCertificateVigilenceEvent;
  34. use App\Service\FirebaseCloudeMessagingService;
  35. use App\Service\DynamicHostService;
  36. use App\Service\UserService;
  37. use App\Event\SubContractor\SubContractorRequestNotEvaluatedMissionClosedEvent;
  38. class SubContractorSubscriber implements EventSubscriberInterface
  39. {
  40.     public function __construct(
  41.         private FrontAPIService $frontAPIService,
  42.         private SystemEmailRepository $systemEmailRepository,
  43.         private UserRepository $userRepository,
  44.         private ConfidentialityService $confidentialityService,
  45.         private NotificationService $notificationService,
  46.         private EventDispatcherInterface $dispatcher,
  47.         private EntityManagerInterface $em,
  48.         private UserService $userService
  49.         private CampaignPendingToSendRepository $CampaignPendingToSendRepository,
  50.         private FirebaseCloudeMessagingService $firebaseCloudeMessagingService
  51.         private DynamicHostService $dynamicHostService
  52.     ){}
  53.     public static function getSubscribedEvents()
  54.     {
  55.         return [
  56.             SubContractorUpdatedEvent::NAME => 'onSubcontractorUpdated',
  57.             SubContractorRequestNotEvaluatedMissionClosedEvent::NAME => 'onSubcontractorNotEvaluatedInMissionClosed',
  58.             SubContractorRelaunchedEvent::NAME => 'onSubcontractorRelaunched',
  59.             SubContractorReferencedEvent::NAME => 'onSubContractorReferenced',
  60.             SubContractorCompletedProfileEvent::NAME => 'onSubContractorCompletedProfile',
  61.             SubContractorMissionAddedEvent::NAME => 'onSubContractorMissionAdded',
  62.             SubContractorServiceAddedEvent::NAME => 'onSubContractorServiceAdded',
  63.             SubContractorActivatedEvent::NAME => 'onSubContractorActivatedEvent',
  64.             SubContractorEvaluateMissionEvent::NAME => 'onSubContractorAddMission',
  65.             SubContractorRequestEvaluateMissionEvent::NAME => 'onRequestEvaluateMission',
  66.             SubContractorMarginProblemEvent::NAME => 'onSubContractorMarginProblemEvent',
  67.             SubContractorVigilanceCertificateAbsentEvent::NAME => 'onSubContractorVigilanceCertificateAbsentEvent',
  68.             SubContractorVigilanceCertificateReminderEvent::NAME => 'onSubContractorVigilanceCertificateReminderEvent',RelaunchAdminCertificateVigilenceEvent::NAME => 'onRelaunchAdminCertificateVigilenceEvent',
  69.         ];
  70.     }
  71.     public function onSubcontractorNotEvaluatedInMissionClosed(SubContractorRequestNotEvaluatedMissionClosedEvent $event){
  72.         $user $event->getUser();
  73.         $mission $event->getMission();
  74.         $email $this->systemEmailRepository->findOneBy(['code' => SystemEmail::REQUETE_EVALUATION_MISSION_FOR_MISSION_CLOSED]);
  75.         if($email){
  76.             $this->notificationService->create($email$user$user,$mission->getCampaign()->getOrderedBy()->getCompany(),null,$mission->getCampaign());    
  77.             
  78.         } 
  79.     }
  80.     public function onRelaunchAdminCertificateVigilenceEvent(RelaunchAdminCertificateVigilenceEvent $event){
  81.         $subcontractor $event->getUser();
  82.          $admins $this->dynamicHostService->getMailAdmin();
  83.         $email $this->systemEmailRepository->findOneBy(['code' => SystemEmail::VIGILANCE_CERTIFICATE_REMINDER_ADMIN],[],$subcontractor);
  84.         foreach ($admins as $admin){
  85.             $this->notificationService->create($email$admin->value$subcontractornullnullnullnulltrue);
  86.         }
  87.         return false;
  88.     }
  89.     public function onSubContractorVigilanceCertificateReminderEvent(SubContractorVigilanceCertificateReminderEvent $event){
  90.         $sendNotification $event->getSendNotification();
  91.         $subContractor $event->getSubContractor();
  92.         $email $this->systemEmailRepository->findOneBy(['code'=>SystemEmail::VIGILANCE_CERTIFICATE_REMINDER],[],$subContractor);
  93.         if($sendNotification){
  94.             $this->notificationService->create($email$subContractor,$subContractor);
  95.         } 
  96.     }
  97.     public function onSubContractorVigilanceCertificateAbsentEvent (SubContractorVigilanceCertificateAbsentEvent $event){
  98.         $sendNotification $event->getSendNotification();
  99.         $subcontractor $event->getSubContractor();
  100.         $email $this->systemEmailRepository->findOneBy(['code'=>SystemEmail::VIGILANCE_CERTIFICATE_ABSENT]);
  101.         if($sendNotification){
  102.             $this->notificationService->create($email$subcontractor$subcontractor);    
  103.         } 
  104.     }
  105.     public function onSubContractorMarginProblemEvent(SubContractorMarginProblemEvent $event){
  106.         $user $event->getUser();
  107.         $content $event->getContent();
  108.          $admins $this->dynamicHostService->getMailAdmin();
  109.         $addressFrom = new Address("caroline.b@my-flow.fr""myflow");
  110.         foreach ($admins as $admin){
  111.             $addressTo = new Address($admin->value);
  112.             $this->notificationService->sendEmail($addressFrom,$addressTo"Désassociation sous traitant pour marge non respectée",$content);
  113.         }
  114.         return false;
  115.     }
  116.     public function onRequestEvaluateMission(SubContractorRequestEvaluateMissionEvent $event){
  117.         $mission $event->getMission();
  118.         $email $this->systemEmailRepository->findOneBy(['code' => SystemEmail::REQUETE_EVALUATION_MISSION]);
  119.         $idsUserAlreadySendEmail = []; 
  120.         if (null !== $email) {
  121.             //send mail to every participant
  122.             foreach ($mission->subcontractorIsReady() as $participant) {
  123.                 if(!in_array($participant['user']->getId(), $idsUserAlreadySendEmail)){
  124.                     $user $participant['user'];
  125.                     $campaign $mission->getCampaign();
  126.                     $this->notificationService->create($email$user$campaign->getOrderedBy(), $campaign->getOrderedBy()->getCompany(), null$campaign);
  127.                     $idsUserAlreadySendEmail = [...$idsUserAlreadySendEmail,$participant['user']->getId()]; 
  128.                 } 
  129.             }
  130.         }
  131.     }
  132.     public function onSubContractorAddMission(SubContractorEvaluateMissionEvent $event){
  133.         $user $event->getUser();
  134.         $campaign $event->getCampaign();
  135.         if (!$user instanceof User) {
  136.             return;
  137.         }
  138.         $email $this->systemEmailRepository->findOneBy(['code' => SystemEmail::MISSION_DEMANDE_EVALUATION]);
  139.         
  140.         if (null !== $email) {
  141.                 $this->notificationService->create($email$user$campaign->getOrderedBy(), $campaign->getOrderedBy()->getCompany(), null$campaign);
  142.             
  143.         }
  144.         
  145.     }
  146.     public function onSubcontractorUpdated(SubContractorUpdatedEvent $event)
  147.     {
  148.         $subcontractor $event->getSubcontractor();
  149.         if (!$subcontractor instanceof User) {
  150.             return;
  151.         }
  152.         $this->frontAPIService->pushSubcontractorToFront($subcontractor);
  153.         $admins $this->dynamicHostService->getMailAdmin($subcontractor);
  154.         // if ($event->getSendNotification() && is_null($subcontractor->getParent())) {
  155.         if ($event->getSendNotification()) {
  156.             $email $this->systemEmailRepository->findOneBy(['code' => SystemEmail::CREATION_NOUVEAU_SOUS_TRAITANT]);
  157.             
  158.             if (null !== $email) {
  159.                 $this->notificationService->create($email$subcontractor$subcontractor);
  160.             }
  161.             // foreach ($admins as $admin) {
  162.             //     $this->notificationService->create($email, $admin->value, $subcontractor, null, null, null, null, true);
  163.             // }
  164.             $this->userService->generateIdentifierForUser($subcontractor);
  165.         }
  166.         if ($event->getThankYouNotification()) {
  167.             $email $this->systemEmailRepository->findOneBy(['code' => SystemEmail::CONFIRMATION_INSCRIPTION]);
  168.             if (null !== $email) {
  169.                 $this->notificationService->create($email$subcontractor$subcontractornullnullnullnulltruetrue);
  170.             }
  171.         }
  172.         if ($event->getUpdateProfileNotification() && is_null($subcontractor->getParent()) ) {
  173.             $email $this->systemEmailRepository->findOneBy(['code' => SystemEmail::MISE_A_JOUR_PROFIL_ATTENDU]);
  174.             if (null !== $email) {
  175.                 $this->notificationService->create($email$subcontractor$subcontractor);
  176.             }
  177.         }
  178.     }
  179.     public function onSubcontractorRelaunched(SubContractorRelaunchedEvent $event)
  180.     {
  181.         $emailSystem null;
  182.         if ($event->getSubcontractor()) {
  183.             $emailSystem $this->systemEmailRepository->findOneBy(['code' => SystemEmail::RELANCE_SOUS_TRAITANT] ,[],$event->getSubcontractor());
  184.         }
  185.         if ($emailSystem !== null){
  186.             $this->notificationService->create($emailSystem$event->getSubcontractor(), $event->getSubcontractor());
  187.         }
  188.     }
  189.     public function onSubContractorReferenced(SubContractorReferencedEvent $event)
  190.     {
  191.         $subcontractor $event->getUser();
  192.         if (!$subcontractor instanceof User) {
  193.             return;
  194.         }
  195.         if (!$subcontractor->getReferencingConfirmationNotification()) {
  196.             $emailSystem $this->systemEmailRepository->findOneBy(['code' => SystemEmail::CONFIRMATION_REFERENCEMENT]);
  197.             if ($emailSystem !== null){
  198.                 $this->notificationService->create($emailSystem$subcontractor$subcontractor);
  199.             }
  200.         }
  201.     }
  202.     public function onSubContractorCompletedProfile(SubContractorCompletedProfileEvent $event)
  203.     {
  204.         $subcontractor $event->getUser();
  205.         if (!$subcontractor instanceof User) {
  206.             return;
  207.         }
  208.         $admins $this->dynamicHostService->getMailAdmin($subcontractor);
  209.         $emailSystem $this->systemEmailRepository->findOneBy(['code' => SystemEmail::SOUS_TRAITANT_PROFIL_COMPLETE]);
  210.         if ($emailSystem !== null){
  211.             foreach ($admins as $admin) {
  212.                 $this->notificationService->create($emailSystem$admin->value$subcontractor,$subcontractor->getCompany());
  213.             }
  214.         }
  215.     }
  216.     public function onSubContractorMissionAdded(SubContractorMissionAddedEvent $event)
  217.     {
  218.         $subcontractor $event->getUser();
  219.         $mission $event->getMission();
  220.         $campaign =$mission->getCampaign();
  221.         $alreadyNotifAdminCompanyInfoIncomplet false;
  222.         if (!$subcontractor instanceof User) {
  223.             return;
  224.         }
  225.         $email $mission->getProduct()->getType() == ProductType::A_EVALUER $this->systemEmailRepository->findOneBy(['code' => SystemEmail::MISSION_DEMANDE_EVALUATION]) :$this->systemEmailRepository->findOneBy(['code' => SystemEmail::CONFIRMER_MISSION]);
  226.      
  227.      
  228.         if($campaign->getConfidentiality() != true || ($campaign->getConfidentiality() == true 
  229.                 && $this->confidentialityService->isAcceptConfidentialityContract($subcontractor$campaign->getCompany()))){
  230.                 $this->notificationService->create($email$subcontractor,$subcontractor$campaign->getOrderedBy()->getCompany(), null$campaignnullfalsefalsefalsefalse$mission);
  231.                 
  232.                 //mise a jour date Vigilence certificate
  233.                 $userData $subcontractor?->getUserData();
  234.                 if (is_null($userData)) {
  235.                     $userDataNew = new UserData();
  236.                     $userDataNew->setDateUpdateCertificate(new \DateTime())
  237.                     ->setStateCompany('fr');
  238.                     $this->em->persist($userDataNew);
  239.                     $this->em->flush();
  240.                     $subcontractor->setUserData($userDataNew);
  241.                     $this->em->persist($subcontractor);
  242.                     $this->em->flush();
  243.                     //send mail certitication vigilence if pays company is fr
  244.                     $emailVigilence $this->systemEmailRepository->findOneBy(['code'=>SystemEmail::VIGILANCE_CERTIFICATE_ABSENT]);
  245.                     $this->notificationService->create($emailVigilence$subcontractor$subcontractor);  
  246.                 }else{
  247.                     //verify if coutry is fr
  248.                     if ( $userData->getStateCompany() == 'fr' && is_null($userData->getDateUpdateCertificate()) ) {
  249.                         $userData->setDateUpdateCertificate(new \DateTime());
  250.                         $this->em->persist($userData);
  251.                         $this->em->flush();
  252.                         $subcontractor->setUserData($userData);
  253.                         $this->em->persist($subcontractor);
  254.                         $this->em->flush();
  255.                         //send mail certitication vigilence if pays company is fr
  256.                         $emailVigilence $this->systemEmailRepository->findOneBy(['code'=>SystemEmail::VIGILANCE_CERTIFICATE_ABSENT]);
  257.                         $this->notificationService->create($emailVigilence$subcontractor$subcontractor);    
  258.                     }
  259.                     
  260.                 }
  261.                 //end mise a jour
  262.         }
  263.         else{
  264.             if($this->confidentialityService->companyInfoIsComplete($campaign->getCompany())){
  265.               
  266.                 $event = new ConfidentialityRequestEvent($campaign->getCompany(),$subcontractor,$campaign);
  267.                 $this->dispatcher->dispatch($eventConfidentialityRequestEvent::NAME);
  268.             }
  269.             elseif(!$alreadyNotifAdminCompanyInfoIncomplet){
  270.                 $event = new ConfidentialityRequestButInfoCompanyNotCompletEvent($campaign->getCompany());
  271.                 $this->dispatcher->dispatch($eventConfidentialityRequestButInfoCompanyNotCompletEvent::NAME);
  272.                 $alreadyNotifAdminCompanyInfoIncomplet true ;
  273.             }
  274.             if($this->CampaignPendingToSendRepository->findOneBy(['user'=>$subcontractor,'company'=>$campaign->getCompany(), 'campaign'=>$campaign,'isSend'=>false])==null){
  275.                 $campaingPendingToSend = new CampaignPendingToSend();
  276.                 $campaingPendingToSend->setUser($subcontractor);
  277.                 $campaingPendingToSend->setCampaign($campaign);
  278.                 $campaingPendingToSend->setCompany($campaign->getCompany());
  279.     
  280.                 $this->em->persist($campaingPendingToSend);
  281.                 $this->em->flush();
  282.             }
  283.         }
  284.       
  285.         if(in_array('ROLE_SUBCONTRACTOR'$subcontractor->getRoles())){
  286.             if($mission->getProduct()->getType() == ProductType::A_EVALUER){
  287.                 $message 'Action requise - Une nouvelle mission attend votre évaluation. Connecte toi pour plus de détails.';
  288.              }else{
  289.                 $message 'Action requise - Une nouvelle mission attend votre validation. Connectez-vous pour plus de détails.';
  290.              }
  291.              
  292.             $this->firebaseCloudeMessagingService->sendPushNotification($subcontractor'myFlow'$message);
  293.          }
  294.     }
  295.     public function onSubContractorServiceAdded(SubContractorServiceAddedEvent $event)
  296.     {
  297.         $subcontractor $event->getUser();
  298.         if (!$subcontractor instanceof User) {
  299.             return;
  300.         }
  301.         $email $this->systemEmailRepository->findOneBy(['code' => SystemEmail::SOUS_TRAITANT_ADD_SERVICE]);
  302.         if ($email !== null){
  303.             $this->notificationService->create($email$subcontractor$subcontractor);
  304.         }
  305.     }
  306.     public function onSubContractorActivatedEvent(SubContractorActivatedEvent $event){
  307.         $subcontractor $event->getUser();
  308.         if (!$subcontractor instanceof User) {
  309.             return;
  310.         }
  311.         $email $this->systemEmailRepository->findOneBy(['code' => SystemEmail::ACTIVATION_PRESTATAIRE]);
  312.         if ($email !== null){
  313.             $this->notificationService->create($email$subcontractor$subcontractor);
  314.         }
  315.     }
  316. }