src/EventSubscriber/SubContractorSubscriber.php line 161

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