<?php
namespace App\Features\ProviderRequest;
use App\Entity\ProviderRequest;
use App\Features\Core\ILogger;
use App\Features\ProviderRequest\Event\ProviderRequestApprovedEvent;
use App\Features\ProviderRequest\Event\ProviderRequestIncompleteEvent;
use App\Features\ProviderRequest\Event\ProviderRequestRejectedEvent;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Workflow\Event\Event;
class ProviderRequestWorkflowSubscriber implements EventSubscriberInterface
{
public function __construct(
private EventDispatcherInterface $dispatcher,
private ILogger $logger,
private EntityManagerInterface $manager,private Security $security){}
public static function getSubscribedEvents(): array
{
return [
'workflow.provider_request.completed.approve_request' => 'onRequestApproved',
'workflow.provider_request.completed.reject_request' => 'onRequestRejected',
'workflow.provider_request.completed.incomplete_request' => 'onRequestMarkAsIncomplete',
];
}
public function onRequestApproved(Event $event): void
{
$request = $event->getSubject();
if($request instanceof ProviderRequest) {
$statusData= $request->getStateDetail();
$statusData?->setApprovedAt(new \DateTime("now"));
$statusData?->setDetail($event->getContext()[ProviderRequestStateManager::ACTION_COMMENT_KEY]??null);
$request->setStateDetail($statusData);
$request->setApprovedBy($this->security->getUser());
$this->manager->flush();
$this->dispatcher->dispatch(new ProviderRequestApprovedEvent($request), ProviderRequestApprovedEvent::NAME);
$this->logger->log($request, "Demande d'agrément approuvée", "Vous avez approuvé la demande d'agrément {$request->getSocialReason()}");
}
}
public function onRequestMarkAsIncomplete(Event $event): void
{
$request = $event->getSubject();
if($request instanceof ProviderRequest) {
$statusData= $request->getStateDetail();
$statusData?->setMarkAsIncompleteAt(new \DateTime("now"));
$statusData?->setDetail($event->getContext()[ProviderRequestStateManager::ACTION_COMMENT_KEY]??null);
$request->setStateDetail($statusData);
$request->setMarkAsIncompleteBy($this->security->getUser());
$this->manager->flush();
$this->dispatcher->dispatch(new ProviderRequestIncompleteEvent($request), ProviderRequestIncompleteEvent::NAME);
$this->logger->log($request, "Demande d'agrément incomplete", "Vous avez marqué la demande d'agrément de {$request->getSocialReason()} comme incomplete");
}
}
public function onRequestRejected(Event $event): void
{
$request = $event->getSubject();
if($request instanceof ProviderRequest) {
$statusData= $request->getStateDetail();
$statusData?->setRejectedAt(new \DateTime("now"));
$statusData?->setDetail($event->getContext()[ProviderRequestStateManager::ACTION_COMMENT_KEY]??null);
$request->setStateDetail($statusData);
$request->setRejectedBy($this->security->getUser());
$this->manager->flush();
$this->dispatcher->dispatch(new ProviderRequestRejectedEvent($request), ProviderRequestRejectedEvent::NAME);
$this->logger->log($request, "Demande d'agrément rejetée", "Vous avez rejeté la demande d'agrément de {$request->getSocialReason()}");
}
}
}