<?php
declare(strict_types=1);
namespace App\EventSubscriber;
use App\Event\ProcedureClaimEvent;
use App\Events;
use App\Manager\ProcedureManager;
use App\Repository\ProcedureRepository;
use App\Service\Sendinblue\SMTPApi;
use App\Service\UrlGeneratorService;
use JMS\Serializer\Serializer;
use JMS\Serializer\SerializerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class ProcedureClaimSubscriber implements EventSubscriberInterface
{
public const EMAIL_TEMPLATE_ID = '23'; // TODO: change this to the correct paid template - NOT READY YET
/**
* @var ProcedureManager
*/
protected $procedureManager;
/**
* @var ProcedureRepository
*/
protected $procedureRepository;
/**
* @var SMTPApi
*/
protected $smtp;
/**
* @var SerializerInterface|Serializer
*/
protected $serializer;
/**
* @var UrlGeneratorService
*/
protected $urlGenerator;
/**
* ProcedureClaimSubscriber constructor.
*
* @param ProcedureManager $procedureManager
* @param ProcedureRepository $procedureRepository
* @param SMTPApi $smtp
* @param SerializerInterface $serializer
* @param UrlGeneratorService $urlGenerator
*/
public function __construct(
ProcedureManager $procedureManager,
ProcedureRepository $procedureRepository,
SMTPApi $smtp,
SerializerInterface $serializer,
UrlGeneratorService $urlGenerator)
{
$this->procedureManager = $procedureManager;
$this->procedureRepository = $procedureRepository;
$this->smtp = $smtp;
$this->serializer = $serializer;
$this->urlGenerator = $urlGenerator;
}
/**
* @param ProcedureClaimEvent $event
*/
public function onAfterCreate(ProcedureClaimEvent $event): void
{
$claim = $event->getClaim();
$procedure = $claim->getProcedure();
// Refresh the claim token
$this->procedureRepository->save(
$procedure->refreshClaimToken()
);
// TODO: reschedule the pending step of the procedure (add 7 days to the scheduledAt prop)
// Send email to creditor
$invoice = $procedure->getInvoice();
$logo = null;
if (null !== $logoMedia = $invoice->getAccount()->getLogo()) {
$logo = $this->urlGenerator->getMediaFileUrl($logoMedia);
}
$parameters = [
'user' => $this->serializer->toArray($invoice->getUser()),
'invoice' => $this->serializer->toArray($invoice),
'claim' => $this->serializer->toArray($claim),
'close_link' => $this->urlGenerator->generate('app_page_procedure_close', [
'closeToken' => $procedure->getCloseToken()
]),
'resume_link' => $this->urlGenerator->generate('app_page_procedure_resume', [
'resumeToken' => $procedure->getResumeToken()
]),
'documents_link' => $this->urlGenerator->generate('app_page_procedure_documents', [
'procedure' => $procedure->getId()
]),
'logo' => $logo
];
$contacts = $invoice->getActiveAccountContacts();
if ($contacts->isEmpty()) {
$this->smtp->send(
$invoice->getCreditorName(),
$invoice->getCreditorEmail(),
self::EMAIL_TEMPLATE_ID,
$parameters,
[]
);
} else {
$this->smtp->sendToContacts(
$contacts,
self::EMAIL_TEMPLATE_ID,
$parameters,
[]
);
}
}
/**
* @inheritDoc
*/
public static function getSubscribedEvents()
{
return [
Events::PROCEDURE_CLAIM_AFTER_CREATE => 'onAfterCreate'
];
}
}