<?php
namespace App\Features\InvoiceDeposit;
use App\Entity\InvoiceDeposit;
use App\Features\Core\ILogger;
use App\Features\InvoiceDeposit\Event\InvoiceDepositPaperReceiveEvent;
use App\Features\InvoiceDeposit\Event\InvoiceDepositRejectedEvent;
use App\Features\InvoiceDeposit\Event\InvoiceDepositSettleEvent;
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 InvoiceDepositWorkflowSubscriber implements EventSubscriberInterface
{
public function __construct(private EventDispatcherInterface $dispatcher,
private EntityManagerInterface $manager,
private ILogger $logger,
private Security $security){}
public static function getSubscribedEvents(): array
{
return [
'workflow.invoice_deposit.completed.reject_invoice' => 'onInvoiceRejected',
'workflow.invoice_deposit.completed.received_invoice' => 'onInvoiceReceive',
'workflow.invoice_deposit.completed.settled_invoice' => 'onInvoiceSettled',
];
}
public function onInvoiceRejected(Event $event): void
{
$invoice = $event->getSubject();
if($invoice instanceof InvoiceDeposit) {
$statusData= $invoice->getStateDate();
$statusData->setRejectedOn(new \DateTimeImmutable());
$invoice->setStateDate($statusData);
$invoice->setMarkAsRejectedBy($this->security->getUser());
$this->manager->flush();
$this->dispatcher->dispatch(new InvoiceDepositRejectedEvent($invoice), InvoiceDepositRejectedEvent::NAME);
$this->logger->log($invoice, "Rejet de facture", "Vous avez rejetée la facture {$invoice->getNumber()}");
}
}
public function onInvoiceReceive(Event $event): void
{
$invoice = $event->getSubject();
if($invoice instanceof InvoiceDeposit) {
$statusData= $invoice->getStateDate();
$statusData->setPaperVersionReceivedOn(new \DateTimeImmutable());
$invoice->setStateDate($statusData);
$invoice->setMarkAsPaperVersionReceivedBy($this->security->getUser());
$this->manager->flush();
$this->dispatcher->dispatch(new InvoiceDepositPaperReceiveEvent($invoice), InvoiceDepositPaperReceiveEvent::NAME);
$this->logger->log($invoice, "Facture reçue", "Vous avez marqué la facture {$invoice->getNumber()} comme reçue");
}
}
public function onInvoiceSettled(Event $event): void
{
$invoice = $event->getSubject();
if($invoice instanceof InvoiceDeposit) {
$statusData= $invoice->getStateDate();
$statusData->setSettledOn(new \DateTimeImmutable());
$invoice->setMarkAsSettledBy($this->security->getUser());
$invoice->setStateDate($statusData);
$this->manager->flush();
$this->dispatcher->dispatch(new InvoiceDepositSettleEvent($invoice), InvoiceDepositSettleEvent::NAME);
$this->logger->log($invoice, "Facture réglée", "Vous avez réglé la facture {$invoice->getNumber()}");
}
}
}