<?php
declare(strict_types=1);
namespace App\EventSubscriber;
use App\Enum\ActivityLogCategoryEnum;
use App\Enum\OrganizationStatusEnum;
use App\Events\SubscriptionChangedEvent;
use App\Service\SubscriptionUtils;
use Doctrine\ORM\EntityManagerInterface;
use Evo\Infrastructure\MappingORM\ActivityLog;
use Evo\Infrastructure\MappingORM\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class SubscriberChangedSubscriber implements EventSubscriberInterface
{
public const EXCEPTED_STATUS = [
OrganizationStatusEnum::NEW,
OrganizationStatusEnum::DELETED,
OrganizationStatusEnum::CANCELLED,
OrganizationStatusEnum::LOST,
];
private EntityManagerInterface $em;
private SubscriptionUtils $subscriptionUtils;
public function __construct(
EntityManagerInterface $em,
SubscriptionUtils $subscriptionUtils
) {
$this->em = $em;
$this->subscriptionUtils = $subscriptionUtils;
}
public static function getSubscribedEvents(): array
{
return [
SubscriptionChangedEvent::NAME => 'onSubscriberChanged',
];
}
public function onSubscriberChanged(SubscriptionChangedEvent $changedEvent): void
{
if (!$changedEvent->getOrganization()->getStatus() ||
\in_array($changedEvent->getOrganization()->getStatus(), self::EXCEPTED_STATUS, true)) {
return;
}
$entity = $changedEvent->getSubscription();
$user = $changedEvent->getUser();
$organization = $changedEvent->getOrganization();
$agent = $changedEvent->getAgent();
$emailAgent = $agent instanceof User ? $agent->getEmail() : 'N/A';
$changeSet = $changedEvent->getChangeSet();
$object = $changedEvent->getObject();
$category = ('UPSELL' === $object) ? ActivityLogCategoryEnum::UPSELL : ActivityLogCategoryEnum::DOWNSELL;
$activityLog = new ActivityLog();
$activityLog->setOrganization($entity->getOrganization());
$user instanceof User ? $activityLog->setUser($user) : $activityLog->setUser(null);
$activityLog->setObject($object);
$activityLog->setNote('-');
$activityLog->setMethod('CREATION');
$activityLog->setCategory($category);
$activityLog->setChangeSet([
'Ancien pack' => [$entity->getPreviousPack() => $this->subscriptionUtils->getSubscriptionPackInfo($entity)['packName']],
'Raison de changement' => ['-' => $organization->getReasonChange() ?: 'N/A'],
'Prix' => [null !== $entity->getStoredTotalPriceWithoutTax() ? $entity->getStoredTotalPriceWithoutTax().' €' : '' => $entity->getTotalPriceWithoutTax() ? $entity->getTotalPriceWithoutTax().' €' : '-'],
'Agent' => ['-' => $emailAgent],
]);
$entity->setStoredTotalPriceWithoutTax($entity->getTotalPriceWithoutTax());
$this->em->persist($entity);
$this->em->persist($activityLog);
$this->em->flush();
}
}