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.             }
  78.             else {
  79.                 $establishmentDiplomaEntity $entity->getEstablishmentDiploma();
  80.                 $establishment $establishmentDiplomaEntity->getEstablishment();
  81.                 $schoolYear $entity->getSchoolYear();
  82.                 $schoolYearId $schoolYear->getId();
  83.                 // Nombre d'heures de coordination autorisée par établissement
  84.                 $establishmentDataYear $this->establishmentDataYearRepository->findBy(['establishment' => $establishment'schoolYear' => $schoolYear]);
  85.                 $establishmentDataYear $establishmentDataYear[0];
  86.                 $nbHourAllowedByEstablishment $establishmentDataYear->getNbCoordinationHourAuthorized()->getHourAuthorized();
  87.                 $coordinationMailed $establishmentDataYear->getCoordinationMailed();
  88.                 // On récupère tout les diplomes de l'établissement
  89.                 $allDiplomaByEstablishmentAndSchoolYear $this->establishmentDiplomaRepository->findBy(['establishment' => $establishment'schoolYear' => $schoolYear]);
  90.                 $allDeclarationEstablishment 0;
  91.                 foreach($allDiplomaByEstablishmentAndSchoolYear as $establishmentDiploma){
  92.                     //somme de toute les declaration de type heure de coordination pour un diplome
  93.                     $totalHourCoordinationByDiploma = (float)$this->declarationStaffLineRepository->getTotalOfCoordinationHourWorkedByEstablishment($establishmentDiploma);
  94.                     $allDeclarationEstablishment $allDeclarationEstablishment $totalHourCoordinationByDiploma;
  95.                 }
  96.                 //On récupère 90% de la prévison
  97.                 $ninetyPercentForecastHourCoordination $nbHourAllowedByEstablishment 0.90;
  98.                 if ($coordinationMailed !== null){
  99.                     /* 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
  100.                      et que la valeur à deja atteint les 100% on ne fait rien*/
  101.                     if ($coordinationMailed->getForecastLimit() >= $nbHourAllowedByEstablishment && $coordinationMailed->isHundredPercent())
  102.                     {
  103.                         return;
  104.                     }
  105.                      /*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
  106.                        mais que les 100% n'ont pas été atteint alors check pour l'envoie de mail des heures totales atteintes*/
  107.                     elseif ($coordinationMailed->getForecastLimit() >= $nbHourAllowedByEstablishment && !$coordinationMailed->isHundredPercent())
  108.                     {
  109.                         if ($allDeclarationEstablishment $nbHourAllowedByEstablishment)
  110.                         {
  111.                             return;
  112.                         }
  113.                         else
  114.                         {
  115.                             $template Mail::COORDINATION_HOUR_EXCEEDED_TEMPLATE;
  116.                             $this->sendMailForCoordination($entity$template$establishment$schoolYear$request);
  117.                             $coordinationMailed->setIsHundredPercent(true);
  118.                         }
  119.                     }
  120.                     elseif ($coordinationMailed->getForecastLimit() <= $nbHourAllowedByEstablishment && !$coordinationMailed->isHundredPercent())
  121.                     {
  122.                         if ($allDeclarationEstablishment $nbHourAllowedByEstablishment && $allDeclarationEstablishment $ninetyPercentForecastHourCoordination)
  123.                         {
  124.                             $template Mail::COORDINATION_90_PERCENT_TEMPLATE;
  125.                             $this->sendMailForCoordination($entity$template$establishment$schoolYear$request);
  126.                             $coordinationMailed->setForecastLimit($nbHourAllowedByEstablishment);
  127.                         }
  128.                         if ($allDeclarationEstablishment $nbHourAllowedByEstablishment)
  129.                         {
  130.                             $template Mail::COORDINATION_HOUR_EXCEEDED_TEMPLATE;
  131.                             $this->sendMailForCoordination($entity$template$establishment$schoolYear$request);
  132.                             $coordinationMailed->setIsHundredPercent(true);
  133.                         }
  134.                         return;
  135.                     }
  136.                 }
  137.                 else
  138.                 {
  139.                     if($allDeclarationEstablishment >= $ninetyPercentForecastHourCoordination && $allDeclarationEstablishment <= $nbHourAllowedByEstablishment)
  140.                     {
  141.                         $template Mail::COORDINATION_90_PERCENT_TEMPLATE;
  142.                         $this->sendMailForCoordination($entity$template$establishment$schoolYear$request);
  143.                         $establishmentCoordinationMailedEntity = New EstablishmentCoordinationMailed();
  144.                         $establishmentCoordinationMailedEntity->setEstablishment($establishmentDataYear);
  145.                         $establishmentCoordinationMailedEntity->setForecastLimit($nbHourAllowedByEstablishment);
  146.                         $establishmentCoordinationMailedEntity->setIsHundredPercent(false);
  147.                         $this->entityManager->persist($establishmentCoordinationMailedEntity);
  148.                         $this->entityManager->flush();
  149.                         $establishmentDataYear->setCoordinationMailed($establishmentCoordinationMailedEntity);
  150.                         $this->entityManager->flush();
  151.                     }
  152.                     if ($allDeclarationEstablishment >= $ninetyPercentForecastHourCoordination && $allDeclarationEstablishment $nbHourAllowedByEstablishment)
  153.                     {
  154.                         $template Mail::COORDINATION_HOUR_EXCEEDED_TEMPLATE;
  155.                         $this->sendMailForCoordination($entity$template$establishment$schoolYear$request);
  156.                         $establishmentCoordinationMailedEntity = New EstablishmentCoordinationMailed();
  157.                         $establishmentCoordinationMailedEntity->setEstablishment($establishmentDataYear);
  158.                         $establishmentCoordinationMailedEntity->setForecastLimit($nbHourAllowedByEstablishment);
  159.                         $establishmentCoordinationMailedEntity->setIsHundredPercent(true);
  160.                         $this->entityManager->persist($establishmentCoordinationMailedEntity);
  161.                         $this->entityManager->flush();
  162.                         $establishmentDataYear->setCoordinationMailed($establishmentCoordinationMailedEntity);
  163.                         $this->entityManager->flush();
  164.                     }
  165.                     return;
  166.                 }
  167.             }
  168.         }
  169.     }
  170.     public function getAdminEmails(): array
  171.     {
  172.         return $this->repositoryStaff->getUserEmailWithRole([Role::ROLE_ADMINRole::ROLE_SUPER_ADMIN]);
  173.     }
  174.     public function getDdfptEmails($establishment): array
  175.     {
  176.         return $this->repositoryStaff->getUserEmailWithPosition([StaffPosition::DDFPT], $establishment);
  177.     }
  178.     private function sendMailForCoordination($entity$template$establishment$schoolYear$request)
  179.     {
  180.         $querryGetEstablishmentDirectorArray $this->establishmentStaffRepository->getDirectorEstablishment($establishment$schoolYear);
  181.         $querryGetEstablishmentDirectorCollection $querryGetEstablishmentDirectorArray[0];
  182.         // On récupére les emails des administrateurs et du directeur
  183.         if ($querryGetEstablishmentDirectorCollection instanceof EstablishmentStaff) {
  184.             $director $querryGetEstablishmentDirectorCollection->getStaff();
  185.             $directorEmail $director->getEmail();
  186.             $adminMailCollection $this->getAdminEmails();
  187.             $ddfptMailCollection $this->getDdfptEmails($establishment);
  188.             $samiraMail 'service-paie.cfa.academique@ac-besancon.fr';
  189.             $data $this->getBaseTemplateData();
  190.             $declarationStaffLineWeek $request->attributes->get('data');
  191.             $declaration $declarationStaffLineWeek->getDeclaration();
  192.             $establishmentDiploma $declaration->getEstablishmentDiploma();
  193.             $diplomaId $establishmentDiploma->getDiploma()->getid();
  194.             $diploma $this->diplomaRepository->findBy(['id' => $diplomaId]);
  195.             $type $diploma[0]->getLevel()->getLabel();
  196.             if ($declaration instanceof DeclarationMonth) {
  197.                 $declarationType "declaration-mensuelle";
  198.             }
  199.             else if ($declaration instanceof DeclarationTrimester) {
  200.                 $declarationType "declaration-trimestrielle";
  201.             }
  202.             else{
  203.                 return throw new HttpException(500'La déclaration doit être de type mensuel ou trimestriel');
  204.             }
  205.             //email du directeur
  206.             $email = [
  207.                 $directorEmail,
  208.             ];
  209.             foreach ($adminMailCollection as $adminMail) {
  210.                 array_push($email$adminMail);
  211.             }
  212.             foreach ($ddfptMailCollection as $ddfptMail) {
  213.                 array_push($email$ddfptMail);
  214.             }
  215.             array_push($email$samiraMail);
  216.             //informations pour la template du mail
  217.             $data['typeOfDiploma'] = $entity->getEstablishmentDiploma()->getDiploma()->getLevel()->getLabel();
  218.             $data["diploma"] = $entity->getEstablishmentDiploma()->getDiploma()->getDataOfYear($schoolYear)->getName();
  219.             $data["establishment"] = $establishment->getName();
  220.             $data['type'] = $type;
  221.             // Ajout du l'url pour le bouton
  222.             $button_url_root '/gestion-des-heures/diplomes/' $establishmentDiploma->getId() . '/' $declarationType '/' $declaration->getId();
  223.             $data['button_url'] = $button_url_root;
  224.             // envoie du mail pour les utilisateurs concerné
  225.             $mail = new Mail(
  226.                 $template,
  227.                 $email,
  228.                 $data,
  229.             );
  230.             $this->mailSender->sendEmail($mail);
  231.         }
  232.     }
  233.     
  234. }