src/EventSubscriber/CoordinationHour/CoordinationHour90PercentSubscriber.php line 72

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\CoordinationHour;
  3. use ApiPlatform\Core\EventListener\EventPriorities;
  4. use App\Entity\Declaration\Staff\DeclarationMonth;
  5. use App\Entity\Declaration\Staff\DeclarationTrimester;
  6. use App\Entity\Declaration\Staff\Line\DeclarationStaffLine;
  7. use App\Entity\Declaration\Staff\Line\DeclarationStaffLineMonth;
  8. use App\Entity\Declaration\Staff\Line\DeclarationStaffLineWeek;
  9. use App\Entity\Diploma\DiplomaLevel;
  10. use App\Entity\Establishment\Establishment;
  11. use App\Entity\Establishment\EstablishmentCoordinationMailed;
  12. use App\Entity\Establishment\EstablishmentDataYear;
  13. use App\Entity\Establishment\EstablishmentStaff;
  14. use App\Entity\Forecast\HourType;
  15. use App\Entity\Staff\Role;
  16. use App\Entity\Staff\StaffPosition;
  17. use App\MailBundle\Entity\Mail;
  18. use App\MailBundle\EventListener\MailListener;
  19. use App\MailBundle\EventListener\ValidationRequest\ValidationRequestEventListener;
  20. use App\MailBundle\MailBundle;
  21. use App\MailBundle\Service\MailSender;
  22. use App\Repository\DeclarationStaffLineRepository;
  23. use App\Repository\DiplomaLevelRepository;
  24. use App\Repository\DiplomaRepository;
  25. use App\Repository\EstablishmentDataYearRepository;
  26. use App\Repository\EstablishmentDiplomaRepository;
  27. use App\Repository\EstablishmentStaffRepository;
  28. use App\Repository\ForecastOnEstablishmentRepository;
  29. use App\Repository\ForecastStaffLineRepository;
  30. use App\Repository\HourTypeRepository;
  31. use App\Repository\StaffRepository;
  32. use App\Security\Voter\Staff\PseudoRoleVoter;
  33. use App\Service\Tools;
  34. use Doctrine\ORM\EntityManager;
  35. use Doctrine\ORM\EntityManagerInterface;
  36. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  37. use Symfony\Component\HttpFoundation\Request;
  38. use Symfony\Component\HttpKernel\Event\ViewEvent;
  39. use Symfony\Component\HttpKernel\Exception\HttpException;
  40. use Symfony\Component\HttpKernel\KernelEvents;
  41. use Symfony\Component\Security\Core\Security;
  42. class CoordinationHour90PercentSubscriber extends MailListener implements EventSubscriberInterface
  43. {
  44.     public function __construct(
  45.     MailSender $mailSender
  46.     Tools $tools,Private EstablishmentStaffRepository $establishmentStaffRepository,
  47.     private DeclarationStaffLineRepository $declarationStaffLineRepository,
  48.     private EstablishmentDataYearRepository $establishmentDataYearRepository,
  49.     private EstablishmentDiplomaRepository $establishmentDiplomaRepository,
  50.     private StaffRepository $repositoryStaff,
  51.     private EntityManagerInterface $entityManager,
  52.     private DiplomaRepository $diplomaRepository,
  53.     private DiplomaLevelRepository $diplomaLevelRepository,
  54.   )
  55.     {
  56.         $this->mailSender $mailSender;
  57.         $this->tools $tools;
  58.     }
  59.     
  60.     public static function getSubscribedEvents()
  61.     {
  62.         return [
  63.             KernelEvents::VIEW => ['updateCoordination'EventPriorities::POST_WRITE]
  64.         ];
  65.     }
  66.     
  67.     public function updateCoordination(ViewEvent $event)
  68.     {
  69.         $entity $event->getControllerResult();
  70.         
  71.         if ($entity instanceof DeclarationStaffLine) {
  72.             $request $event->getRequest();
  73.             $method $request->getMethod();
  74.             $hourTypeId $entity->getForecastStaffLine()->getHourType()->getId();
  75.             if ($method != Request::METHOD_PATCH || $hourTypeId != HourType::HEURE_COORDINATION) {
  76.                 return;
  77.             } else {
  78.                 $establishmentDiplomaEntity $entity->getEstablishmentDiploma();
  79.                 $establishment $establishmentDiplomaEntity->getEstablishment();
  80.                 $schoolYear $entity->getSchoolYear();
  81.                 // Nombre d'heures de coordination autorisée par établissement
  82.                 $establishmentDataYear $this->establishmentDataYearRepository->findBy(['establishment' => $establishment'schoolYear' => $schoolYear]);
  83.                 $establishmentDataYear $establishmentDataYear[0];
  84.                 $nbHourAllowedByEstablishment $establishmentDataYear->getNbCoordinationHourAuthorized()->getHourAuthorized();
  85.                 $coordinationMailed $establishmentDataYear->getCoordinationMailed();
  86.                 // On récupère tout les diplomes de l'établissement
  87.                 $allDiplomaByEstablishmentAndSchoolYear $this->establishmentDiplomaRepository->findBy(['establishment' => $establishment'schoolYear' => $schoolYear]);
  88.                 $allDeclarationEstablishment 0;
  89.                 foreach($allDiplomaByEstablishmentAndSchoolYear as $establishmentDiploma){
  90.                     //somme de toute les declaration de type heure de coordination pour un diplome
  91.                     $totalHourCoordinationByDiploma = (float)$this->declarationStaffLineRepository->getTotalOfCoordinationHourWorkedByEstablishment($establishmentDiploma);
  92.                     $allDeclarationEstablishment $allDeclarationEstablishment $totalHourCoordinationByDiploma;
  93.                 }
  94.                 //On récupère 90% de la prévison
  95.                 $ninetyPercentForecastHourCoordination $nbHourAllowedByEstablishment 0.90;
  96.                 if ($coordinationMailed !== null){
  97.                     /* Si une l'établissement à déja été notifié par mail et que sa valeur de l'époque est égale ou supérieur à celle d'aujourd'hui
  98.                      et que la valeur à deja atteint les 100% on ne fait rien*/
  99.                     if ($coordinationMailed->getForecastLimit() >= $nbHourAllowedByEstablishment && $coordinationMailed->isHundredPercent())
  100.                     {
  101.                         $coordinationMailed->setIsHundredPercent(false);
  102.                     }
  103.                      /*Si une l'établissement à déja été notifié par mail et que sa valeur de l'époque est égale ou supérieur à celle d'aujourd'hui
  104.                        mais que les 100% n'ont pas été atteint alors check pour l'envoie de mail des heures totales atteintes*/
  105.                     elseif ($coordinationMailed->getForecastLimit() >= $nbHourAllowedByEstablishment && !$coordinationMailed->isHundredPercent())
  106.                     {
  107.                         if ($allDeclarationEstablishment $nbHourAllowedByEstablishment)
  108.                         {
  109.                             return;
  110.                         }
  111.                         else
  112.                         {
  113.                             $template Mail::COORDINATION_HOUR_EXCEEDED_TEMPLATE;
  114.                             $this->sendMailForCoordination($entity$template$establishment$schoolYear$request);
  115.                             $coordinationMailed->setIsHundredPercent(true);
  116.                         }
  117.                     }
  118.                     elseif ($coordinationMailed->getForecastLimit() <= $nbHourAllowedByEstablishment && !$coordinationMailed->isHundredPercent())
  119.                     {
  120.                         if ($allDeclarationEstablishment $nbHourAllowedByEstablishment && $allDeclarationEstablishment $ninetyPercentForecastHourCoordination)
  121.                         {
  122.                             $template Mail::COORDINATION_90_PERCENT_TEMPLATE;
  123.                             $this->sendMailForCoordination($entity$template$establishment$schoolYear$request);
  124.                             $coordinationMailed->setForecastLimit($nbHourAllowedByEstablishment);
  125.                             $coordinationMailed->setIsHundredPercent(false);
  126.                         }
  127.                         if ($allDeclarationEstablishment $nbHourAllowedByEstablishment)
  128.                         {
  129.                             $template Mail::COORDINATION_HOUR_EXCEEDED_TEMPLATE;
  130.                             $this->sendMailForCoordination($entity$template$establishment$schoolYear$request);
  131.                             $coordinationMailed->setIsHundredPercent(true);
  132.                         }
  133.                     }
  134.                     $this->entityManager->persist($coordinationMailed);
  135.                     $this->entityManager->flush();
  136.                     return;
  137.                 }
  138.                 else
  139.                 {
  140.                     if($allDeclarationEstablishment >= $ninetyPercentForecastHourCoordination && $allDeclarationEstablishment <= $nbHourAllowedByEstablishment)
  141.                     {
  142.                         $template Mail::COORDINATION_90_PERCENT_TEMPLATE;
  143.                         $this->sendMailForCoordination($entity$template$establishment$schoolYear$request);
  144.                         $establishmentCoordinationMailedEntity = New EstablishmentCoordinationMailed();
  145.                         $establishmentCoordinationMailedEntity->setEstablishment($establishmentDataYear);
  146.                         $establishmentCoordinationMailedEntity->setForecastLimit($nbHourAllowedByEstablishment);
  147.                         $establishmentCoordinationMailedEntity->setIsHundredPercent(false);
  148.                         $this->entityManager->persist($establishmentCoordinationMailedEntity);
  149.                         $this->entityManager->flush();
  150.                         $establishmentDataYear->setCoordinationMailed($establishmentCoordinationMailedEntity);
  151.                         $this->entityManager->flush();
  152.                     }
  153.                     if ($allDeclarationEstablishment >= $ninetyPercentForecastHourCoordination && $allDeclarationEstablishment $nbHourAllowedByEstablishment)
  154.                     {
  155.                         $template Mail::COORDINATION_HOUR_EXCEEDED_TEMPLATE;
  156.                         $this->sendMailForCoordination($entity$template$establishment$schoolYear$request);
  157.                         $establishmentCoordinationMailedEntity = New EstablishmentCoordinationMailed();
  158.                         $establishmentCoordinationMailedEntity->setEstablishment($establishmentDataYear);
  159.                         $establishmentCoordinationMailedEntity->setForecastLimit($nbHourAllowedByEstablishment);
  160.                         $establishmentCoordinationMailedEntity->setIsHundredPercent(true);
  161.                         $this->entityManager->persist($establishmentCoordinationMailedEntity);
  162.                         $this->entityManager->flush();
  163.                         $establishmentDataYear->setCoordinationMailed($establishmentCoordinationMailedEntity);
  164.                         $this->entityManager->flush();
  165.                     }
  166.                     return;
  167.                 }
  168.             }
  169.         }
  170.     }
  171.     public function getAdminEmails(): array
  172.     {
  173.         return $this->repositoryStaff->getUserEmailWithRole([Role::ROLE_ADMINRole::ROLE_SUPER_ADMIN]);
  174.     }
  175.     public function getDdfptEmails($establishment$schoolYear): array
  176.     {
  177.         return $this->repositoryStaff->getUserEmailWithPosition([StaffPosition::DDFPT], $establishment$schoolYear);
  178.     }
  179.     private function sendMailForCoordination($entity$template$establishment$schoolYear$request)
  180.     {
  181.         $querryGetEstablishmentDirectorArray $this->establishmentStaffRepository->getDirectorEstablishment($establishment$schoolYear);
  182.         $querryGetEstablishmentDirectorCollection $querryGetEstablishmentDirectorArray[0];
  183.         $schoolYearId $schoolYear->getId();
  184.         // On récupére les emails des administrateurs et du directeur
  185.         if ($querryGetEstablishmentDirectorCollection instanceof EstablishmentStaff) {
  186.             $director $querryGetEstablishmentDirectorCollection->getStaff();
  187.             $directorEmail $director->getEmail();
  188.             $adminMailCollection $this->getAdminEmails();
  189.             $ddfptMailCollection $this->getDdfptEmails($establishment$schoolYearId);
  190.             $samiraMail 'service-paie.cfa.academique@ac-besancon.fr';
  191.             $data $this->getBaseTemplateData();
  192.             $declarationStaffLineWeek $request->attributes->get('data');
  193.             $declaration $declarationStaffLineWeek->getDeclaration();
  194.             $establishmentDiploma $declaration->getEstablishmentDiploma();
  195.             $diplomaId $establishmentDiploma->getDiploma()->getid();
  196.             $diploma $this->diplomaRepository->findBy(['id' => $diplomaId]);
  197.             $type $diploma[0]->getLevel()->getLabel();
  198.             if ($declaration instanceof DeclarationMonth) {
  199.                 $declarationType "declaration-mensuelle";
  200.             }
  201.             else if ($declaration instanceof DeclarationTrimester) {
  202.                 $declarationType "declaration-trimestrielle";
  203.             }
  204.             else{
  205.                 return throw new HttpException(500'La déclaration doit être de type mensuel ou trimestriel');
  206.             }
  207.             //email du directeur - 11/06/2025 Suppression des emails de directeur sur demande de Samira (ticket #8699cz3dv)
  208.             $email = [
  209. //                $directorEmail,
  210.             ];
  211.             foreach ($adminMailCollection as $adminMail) {
  212.                 array_push($email$adminMail);
  213.             }
  214.             foreach ($ddfptMailCollection as $ddfptMail) {
  215.                 array_push($email$ddfptMail);
  216.             }
  217.             array_push($email$samiraMail);
  218.             //informations pour la template du mail
  219.             $data['typeOfDiploma'] = $entity->getEstablishmentDiploma()->getDiploma()->getLevel()->getLabel();
  220.             $data["diploma"] = $entity->getEstablishmentDiploma()->getDiploma()->getDataOfYear($schoolYear)->getName();
  221.             $data["establishment"] = $establishment->getName();
  222.             $data['type'] = $type;
  223.             
  224.             // Ajout du l'url pour le bouton
  225.             $button_url_root '/gestion-des-heures/diplomes/' $establishmentDiploma->getId() . '/' $declarationType '/' $declaration->getId();
  226.             $data['button_url'] = $button_url_root;
  227.             // envoie du mail pour les utilisateurs concerné
  228.             $mail = new Mail(
  229.                 $template,
  230.                 $email,
  231.                 $data,
  232.             );
  233.             $this->mailSender->sendEmail($mail);
  234.         }
  235.     }
  236.     
  237. }