src/EventSubscriber/DemandeValidationFlowSubscriber.php line 40

Open in your IDE?
  1. <?php
  2. // api/src/EventSubscriber/BookMailSubscriber.php
  3. namespace App\EventSubscriber;
  4. use ApiPlatform\Core\EventListener\EventPriorities;
  5. use App\Entity\Action;
  6. use App\Entity\Demande;
  7. use App\Entity\Profile;
  8. use App\Entity\Valideur;
  9. use App\Service\NotificationMailFlow;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\Security\Core\Security;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpKernel\Event\ViewEvent;
  14. use Symfony\Component\HttpKernel\KernelEvents;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. final class DemandeValidationFlowSubscriber implements EventSubscriberInterface
  17. {
  18.     private $security;
  19.     private $em;
  20.     private $notifier;
  21.     public function __construct(Security $securityEntityManagerInterface $emNotificationMailFlow $notifier)
  22.     {
  23.         $this->security $security;
  24.         $this->em $em;
  25.         $this->notifier $notifier;
  26.     }
  27.     public static function getSubscribedEvents()
  28.     {
  29.         return [
  30.             KernelEvents::VIEW => ['validationFlow'EventPriorities::POST_VALIDATE],
  31.         ];
  32.     }
  33.     public function validationFlow(ViewEvent $event)
  34.     {
  35.         $demande $event->getControllerResult();
  36.         $method $event->getRequest()->getMethod();
  37.         if (!$demande instanceof Demande || (Request::METHOD_POST !== $method && Request::METHOD_PUT !== $method && Request::METHOD_PATCH != $method)) {
  38.             return;
  39.         }
  40.         $this->checkDemande($demande);
  41.     }
  42.     protected function checkDemande(Demande $demande)
  43.     {
  44.         $currentUserHasValidated $demande->getValidated();
  45.         /**
  46.          * @var $user User
  47.          */
  48.         $user $this->security->getUser();
  49.         //on regarde si il y a un nouveau commentaire
  50.         $lastComment $demande->getNewComment();
  51.         if ($lastComment && !$lastComment->getId()) {
  52.             $lastComment->setProfile($user->getProfile());
  53.             $lastComment->setCreatedAt(new \DateTime());
  54.             if ($lastComment->getStatus() === Demande::WAITTING) {
  55.                 $demande->setStatus(Demande::WAITTING);
  56.                 $currentUserHasValidated false;
  57.                 $newValideur $this->em->getRepository(Valideur::class)->findOneById($lastComment->getValideurId());
  58.                 // $newValideur->setValidated(false);
  59.                 $demande->setCurrentValidator($newValideur->getProfile());
  60.             } elseif ($lastComment->getStatus() === Demande::REFUSED) {
  61.                 $demande->setStatus(Demande::REFUSED);
  62.                 $demande->setRefusedAt(new \DateTime());
  63.                 $currentUserHasValidated false;
  64.                 $this->refuseDemande($demande$user->getProfile());
  65.             }
  66.             // si l'utilisateur courant a validé
  67.             // qu'il est l'auteur
  68.             // et que la demande est en attente
  69.             elseif (
  70.                 $demande->getStatus() == Demande::WAITTING
  71.                 && $user->getProfile() == $demande->getCurrentValidator()
  72.             ) {
  73.                 if ($lastComment->getStatus() == Demande::TO_VALIDATE || $currentUserHasValidated) {
  74.                     $demande->setStatus(Demande::TO_VALIDATE);
  75.                 } elseif ($lastComment->getStatus() == Demande::REFUSED) {
  76.                     $demande->setStatus(Demande::REFUSED);
  77.                     $demande->setRefusedAt(new \DateTime());
  78.                     $currentUserHasValidated false;
  79.                     $this->refuseDemande($demande$user->getProfile());
  80.                 }
  81.                 $currentUserHasValidated false;
  82.                 // il faut peut-être révoir de dé-valider tous les valideurs
  83.             }
  84.             $demande->addComment($lastComment);
  85.         }
  86.         //si l'utilisateur courant a validé
  87.         if ($currentUserHasValidated && $demande->getStatus() == Demande::TO_VALIDATE) {
  88.             if ($user->getProfile() == $demande->getCurrentValidator()) {
  89.                 $this->validateDemande($demande$user->getProfile());
  90.             } elseif ($demande->getCurrentValidator() == null) {
  91.                 //On lance le flux de validation
  92.                 $this->setCurrentValidator($demande);
  93.             }
  94.         } elseif ($currentUserHasValidated && $demande->getStatus() == Demande::WAITTING) {
  95.             $demande->setStatus(Demande::TO_VALIDATE);
  96.         } elseif ($currentUserHasValidated && $demande->getStatus() == Demande::DRAFT && $demande->getAuthor() == $user->getProfile()) {
  97.             $demande->setStatus(Demande::TO_VALIDATE);
  98.             $demande->setCreatedAt(new \DateTime());
  99.         }
  100.         //on set le valideur
  101.         if ($demande->getStatus() == Demande::TO_VALIDATE) {
  102.             $this->setCurrentValidator($demande);
  103.         }
  104.         while (
  105.             $currentUserHasValidated
  106.             && $demande->getStatus() == Demande::TO_VALIDATE
  107.             && $demande->getCurrentValidator() == $user->getProfile()
  108.         ) {
  109.             $this->setCurrentValidator($demande);
  110.             $this->validateDemande($demande$user->getProfile());
  111.         }
  112.         //$this->em->merge($demande);
  113.         $this->notifier->notify($demande);
  114.     }
  115.     protected function validateDemande(Demande $demandeProfile $profile)
  116.     {
  117.         $index 0;
  118.         $valideurs $demande->getValideurs()->toArray();
  119.         usort($valideurs, function ($first$second) {
  120.             return $first->getWeight() <=> $second->getWeight();
  121.         });
  122.         while ($index count($valideurs)) {
  123.             $currentValideur $valideurs[$index];
  124.             if (!$currentValideur->getValidated()) {
  125.                 // On est au premier valideur qui a une action à faire
  126.                 // Si il s'agit de l'utilisateur courant, on change le status
  127.                 if ($currentValideur->getProfile() === $profile) {
  128.                     $currentValideur->setValidated(true);
  129.                     $currentValideur->setValidationDate(new \DateTime());
  130.                     if($demande->getCurrentValidator()->getId() <> $demande->getInitialValidator()->getId() ) {
  131.                     $action = new Action();
  132.                     $action->setProfile($profile);
  133.                     $action->setDescription("Validation en remplacement de {$demande->getInitialValidator()->getFirstName()} {$demande->getInitialValidator()->getLastName()}");
  134.                     $action->setDate(new \DateTime());
  135.                     if($demande->getNextDemande() !== null){
  136.                         // $action->setComeFromNextDemande(true);
  137.                         $action->setDemande($demande->getNextDemande());
  138.                     }
  139.                     else{
  140.                         $action->setDemande($demande);
  141.                     }
  142.                     $this->em->persist($action);}
  143.                 }
  144.                 // je retire le return parce que si le validateur intervient plusieurs fois dans le workflow
  145.                 // alors il ne doit valider la demande qu'une seule fois
  146.                 if($demande->getUnitaryValidation()){
  147.                     return;
  148.                 }
  149.                 //return;
  150.             }
  151.             $index++;
  152.         }
  153.         return;
  154.     }
  155.     protected function refuseDemande(Demande $demandeProfile $profile)
  156.     {
  157.         $index 0;
  158.         $valideurs $demande->getValideurs()->toArray();
  159.         usort($valideurs, function ($first$second) {
  160.             return $first->getWeight() <=> $second->getWeight();
  161.         });
  162.         while ($index count($valideurs)) {
  163.             $currentValideur $valideurs[$index];
  164.             if (!$currentValideur->getValidated()) {
  165.                 // On est au premier valideur qui a une action à faire
  166.                 // Si il s'agit de l'utilisateur courant, on change le status
  167.                 if ($currentValideur->getProfile() === $profile) {
  168.                     $currentValideur->setRefused(true);
  169.                     $currentValideur->setRefusedAt(new \DateTime());
  170.                 }
  171.                 // je retire le return parce que si le validateur intervient plusieurs fois dans le workflow
  172.                 // alors il ne doit valider la demande qu'une seule fois
  173.                 if($demande->getUnitaryValidation()){
  174.                     return;
  175.                 }
  176.                 //return;
  177.             }
  178.             $index++;
  179.         }
  180.         return;
  181.     }
  182.     protected function setCurrentValidator(Demande $demande)
  183.     {
  184.         $index 0;
  185.         $valideurs $demande->getValideurs()->toArray();
  186.         usort($valideurs, function ($first$second) {
  187.             return $first->getWeight() <=> $second->getWeight();
  188.         });
  189.         while ($index count($valideurs)) {
  190.             $currentValideur $valideurs[$index];
  191.             if (!$currentValideur->getValidated()) {
  192.                 $demande->setCurrentValidator($currentValideur->getProfile());
  193.                 // save initial validator in case of backup ...
  194.                 $demande->setInitialValidator($currentValideur->getProfile());
  195.                 return;
  196.             }
  197.             $index++;
  198.         }
  199.         //ou la demande est clôturée
  200.         $demande->setStatus(Demande::CLOSED);
  201.         $demande->setCurrentValidator(null);
  202.         $demande->setInitialValidator(null);
  203.     }
  204. }