src/Listener/StatusChangeSubscriber.php line 168

Open in your IDE?
  1. <?php
  2. namespace App\Listener;
  3. use App\DTO\Mdm\DelayComputingDTO;
  4. use App\Event\StatusChangedEvent;
  5. use App\Exception\DTOConstructException;
  6. use App\Manager\Mdm\MdmManager;
  7. use App\Manager\NotificationManager;
  8. use App\Manager\UserRequestManager;
  9. use App\Manager\UserRightsManagerInterface;
  10. use App\Model\UserRequest\RequestModel;
  11. use DateTime;
  12. use DateTimeZone;
  13. use Exception;
  14. use Psr\Cache\InvalidArgumentException;
  15. use Psr\Log\LoggerInterface;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use WebServiceCollectionBundle\Model\AtlasPce\UserRequestRequestModel;
  18. class StatusChangeSubscriber implements EventSubscriberInterface
  19. {
  20.     public const STATUS_CHANGED      'status.changed';
  21.     public const STATUS_CHANGED_DONE 'status.changed.done';
  22.     public const FIELD_PROCESSING_DURATION 'processingDuration';
  23.     public const FIELD_REALISATION_DATE    'realisationDate';
  24.     public const FIELD_SUBMISSION_DATE     'submissionDate';
  25.     public const STATUS_TRIGGERING_NOTIF = [
  26.         RequestModel::STATUS_TO_QUALIFY,
  27.         RequestModel::STATUS_TO_PLAN,
  28.         RequestModel::STATUS_TO_SPECIFY,
  29.         RequestModel::STATUS_PLANNED,
  30.         RequestModel::STATUS_ONGOING,
  31.         RequestModel::STATUS_DONE,
  32.     ];
  33.     public const STATUS_TRIGGERING_SUEZ_NOTIF = [
  34.         RequestModel::STATUS_TO_QUALIFY,
  35.         RequestModel::STATUS_CLOSED_REJECTED,
  36.     ];
  37.     /**
  38.      * @var MdmManager
  39.      */
  40.     protected $mdmManager;
  41.     /**
  42.      * @var UserRequestManager
  43.      */
  44.     protected $userRequestManager;
  45.     /**
  46.      * @var NotificationManager
  47.      */
  48.     protected $notificationManager;
  49.     /**
  50.      * @var LoggerInterface
  51.      */
  52.     protected $logger;
  53.     public function __construct(MdmManager $mdmManagerUserRequestManager $userRequestManagerNotificationManager $notificationManagerLoggerInterface $logger)
  54.     {
  55.         $this->mdmManager          $mdmManager;
  56.         $this->userRequestManager  $userRequestManager;
  57.         $this->notificationManager $notificationManager;
  58.         $this->logger              $logger;
  59.     }
  60.     /**
  61.      * @return array
  62.      */
  63.     public static function getSubscribedEvents(): array
  64.     {
  65.         return [
  66.             static::STATUS_CHANGED      => 'onStatusChanged',
  67.             static::STATUS_CHANGED_DONE => 'onStatusChangedDone',
  68.         ];
  69.     }
  70.     /**
  71.      * Bootstraps status change hooks.
  72.      *
  73.      * @param StatusChangedEvent $event
  74.      *
  75.      * @return void
  76.      *
  77.      * @throws InvalidArgumentException
  78.      * @throws Exception
  79.      */
  80.     public function onStatusChanged(StatusChangedEvent $event)
  81.     {
  82.         $request      $event->getSubject();
  83.         $targetStatus $event->getArgument('targetStatus');
  84.         $this->logger->info(
  85.             'Request passing to status {status}',
  86.             [
  87.                 'status' => $targetStatus,
  88.             ]
  89.         );
  90.         switch ($targetStatus) {
  91.             case RequestModel::STATUS_TO_QUALIFY:
  92.                 $this->toQualify($request);
  93.                 // When request turns to qualify, its submission time will be added into request data to keep creation date.
  94.                 $this->setRequestDataDate($request, static::FIELD_SUBMISSION_DATE);
  95.                 break;
  96.             case RequestModel::STATUS_DONE:
  97.                 // When request turns to done, its realised time will be added into request data to calculate process duration.
  98.                 $this->setRequestDataDate($request, static::FIELD_REALISATION_DATE);
  99.                 break;
  100.             default:
  101.                 $this->logger->info(
  102.                     'Uncaught status {status}',
  103.                     [
  104.                         'status' => $targetStatus,
  105.                     ]
  106.                 );
  107.         }
  108.         // If the user isn't from Suez organisation, a notification should be sent to Suez to let them know the action took place
  109.         $userRoles $event->getArgument('userRoles');
  110.         $isNotFromSuez             = !in_array(
  111.             UserRightsManagerInterface::ROLE_SUEZ,
  112.             $userRoles
  113.         ); // User isn't from Suez
  114.         $statusEligibleToSuezNotif in_array(
  115.             $targetStatus,
  116.             static::STATUS_TRIGGERING_SUEZ_NOTIF
  117.         ); // Status should trigger a notification to Suez
  118.         if ($isNotFromSuez && $statusEligibleToSuezNotif) {
  119.             $this->notifySuezNewStatus($event);
  120.         }
  121.     }
  122.     public function notifySuezNewStatus(StatusChangedEvent $event): void
  123.     {
  124.         $request      $event->getSubject();
  125.         $targetStatus $event->getArgument('targetStatus');
  126.         $this->logger->info(
  127.             'Status changed by Client user to `{targetStatus}`. Pushing notification to Asteo',
  128.             [
  129.                 'targetStatus' => $targetStatus,
  130.             ]
  131.         );
  132.         $notification $this->notificationManager->getStatusChangeNotification($request$targetStatus);
  133.         // Original email will be replaced by the consumer dedicated to pushing notifications to Suez.
  134.         // and we push
  135.         $this->notificationManager->notifyPce($notification);
  136.     }
  137.     /**
  138.      * Bootstraps status change done hooks.
  139.      *
  140.      * @param StatusChangedEvent $event
  141.      *
  142.      * @return void
  143.      */
  144.     public function onStatusChangedDone(StatusChangedEvent $event)
  145.     {
  146.         $request      $event->getSubject();
  147.         $targetStatus $event->getArgument('targetStatus');
  148.         if (in_array($targetStatus, static::STATUS_TRIGGERING_NOTIF)) {
  149.             $notification $this->notificationManager->getStatusChangeNotification($request$targetStatus);
  150.             $this->notificationManager->notify($notification);
  151.         }
  152.     }
  153.     /**
  154.      * When request turns to qualify, its processsing duration will be updated.
  155.      *
  156.      * @param UserRequestRequestModel $request
  157.      *
  158.      * @return void
  159.      *
  160.      * @throws DTOConstructException
  161.      * @throws Exception|InvalidArgumentException
  162.      */
  163.     public function toQualify(UserRequestRequestModel $request): void
  164.     {
  165.         $data     $request->getData();
  166.         $categoryId        $data['requestCategory']['id'];
  167.         $subCategoryId     $data['requestSubCategory']['id'];
  168.         $treatmentCategory $subCategoryId ?? $categoryId;
  169.         $desiredDate       $data['desiredDate'];
  170.         $definedTreatments $data['requestExpectedTreatment'] ?? [];
  171.         $treatments        array_column($definedTreatments'id');
  172.         $dto = new DelayComputingDTO(
  173.             [
  174.                 DelayComputingDTO::CATEGORY_ID   => $treatmentCategory,
  175.                 DelayComputingDTO::DESIRED_DATE  => $desiredDate,
  176.                 DelayComputingDTO::TREATMENTS    => $treatments,
  177.                 DelayComputingDTO::HUMANRISK     => $data['requestHumanRisk'],
  178.                 DelayComputingDTO::PROPERTYRISK  => $data['requestPropertyRisk'],
  179.                 DelayComputingDTO::SERVICERISK   => $data['requestServiceRisk'],
  180.             ]
  181.         );
  182.         $endOfProcessing $this->mdmManager->getDurationForTreatments($dto);
  183.         
  184.         $this->setRequestDataDate($request, static::FIELD_PROCESSING_DURATION$endOfProcessing);
  185.     }
  186.     /**
  187.      * @param UserRequestRequestModel $request
  188.      * @param string                  $field
  189.      * @param DateTime|null           $date
  190.      *
  191.      * @return void
  192.      *
  193.      * @throws Exception
  194.      */
  195.     protected function setRequestDataDate(UserRequestRequestModel $requeststring $fieldDateTime $date null): void
  196.     {
  197.         $date          $date ?? new DateTime('now', new DateTimeZone('Europe/Paris'));
  198.         $formattedDate $date->format('Y-m-d H:i:s');
  199.         $request->setData($field$formattedDate);
  200.         $this->logger->notice(
  201.             sprintf("[StatusChangeSubscriber] Setting request {id}'s %s to {%s}"$field$field),
  202.             [
  203.                 'id'   => $request->getId(),
  204.                 $field => $formattedDate,
  205.             ]
  206.         );
  207.         $this->userRequestManager->putRequest($request);
  208.     }
  209. }