<?php
namespace App\EventListener;
use App\Entity\FurnitureOrderMailQueue;
use App\Entity\OperationOrderFurnitureLine;
use App\Entity\OperationOrderStepVersion;
use App\Entity\PolymorphicOperationOrder\OperationOrderFurniture;
use App\Service\Access;
use App\Service\AdvertisingManagement;
use App\Service\EmailService;
use App\Service\FurnitureProductService;
use App\Service\FurnitureStockService;
use App\Service\MailQueueService;
use App\Service\QuotaService;
use App\Service\User as UserService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Workflow\Event\Event;
use Symfony\Component\Workflow\Registry;
class OpeOrderFurnitureWorkflowListener implements EventSubscriberInterface
{
private Access $access;
private AdvertisingManagement $advertisingManagement;
private EmailService $emailService;
private EntityManagerInterface $entityManager;
private FurnitureProductService $furnitureProductService;
private FurnitureStockService $furnitureStockService;
private MailQueueService $mailQueueService;
private QuotaService $quotaService;
private Registry $workflow;
private UserService $userService;
public function __construct(Access $access, AdvertisingManagement $advertisingManagement, EmailService $emailService, EntityManagerInterface $entityManager, FurnitureProductService $furnitureProductService, FurnitureStockService $furnitureStockService, MailQueueService $mailQueueService, QuotaService $quotaService, Registry $wokflow, UserService $userService)
{
$this->access = $access;
$this->advertisingManagement = $advertisingManagement;
$this->emailService = $emailService;
$this->entityManager = $entityManager;
$this->furnitureProductService = $furnitureProductService;
$this->furnitureStockService = $furnitureStockService;
$this->mailQueueService = $mailQueueService;
$this->quotaService = $quotaService;
$this->userService = $userService;
$this->workflow = $wokflow;
}
public function onEnter(Event $event): void
{
}
public function onTransition(Event $event): void
{
}
public function onEntered(Event $event): void
{
}
public function onCompleted(Event $event): void
{
$transitionName = $event->getTransition()->getName();
$user = $this->userService->getUser();
/** @var OperationOrderFurniture $operationOrder */
$operationOrder = $event->getSubject();
$operationOrder->setUpdatedAt(new \DateTime());
if (method_exists($this, $transitionName)) {
$this->{$transitionName}($operationOrder, $transitionName);
}
if (null === $user) {
$user = $operationOrder->getUser();
}
$this->entityManager->persist($operationOrder);
$operationOrderStepVersion = new OperationOrderStepVersion();
$operationOrderStepVersion->setDate(new \DateTime());
$operationOrderStepVersion->setStep(strtolower(substr((string) $transitionName, 2)));
$operationOrderStepVersion->setUser($user);
$operationOrderStepVersion->setOperationOrder($operationOrder);
$this->entityManager->persist($operationOrderStepVersion);
$this->entityManager->flush();
}
public function toCanceled(OperationOrderFurniture $operationOrder, string $transitionName): void
{
try {
$oldPrice = $operationOrder->getPrice();
$operationOrder->setPrice(0.0);
$updatedQuota = $this->quotaService->updateQuota($operationOrder, $oldPrice);
$furnitureInstances = $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
if (!empty($furnitureInstances)) {
foreach ($furnitureInstances as $furnitureInstance) {
$workflow = $this->workflow->get($furnitureInstance, 'furniture_instance_step');
if ($workflow->can($furnitureInstance, 'toAbandonned')) {
$workflow->apply($furnitureInstance, 'toAbandonned');
}
}
}
} catch (\Exception) {
// echo 'Exception reçue : ', $e->getMessage(), "\n";
}
}
public function toQteKo(OperationOrderFurniture $operationOrder, string $transitionName): void
{
try {
$oldPrice = $operationOrder->getPrice();
$operationOrder->setPrice(0.0);
$updatedQuota = $this->quotaService->updateQuota($operationOrder, $oldPrice);
$furnitureInstances = $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
$this->sendMailQteKo($operationOrder, $furnitureInstances);
if (!empty($furnitureInstances)) {
foreach ($furnitureInstances as $furnitureInstance) {
$workflow = $this->workflow->get($furnitureInstance, 'furniture_instance_step');
if ($workflow->can($furnitureInstance, 'toAbandonnedToTransmit')) {
$workflow->apply($furnitureInstance, 'toAbandonnedToTransmit');
} elseif ($workflow->can($furnitureInstance, 'toAbandonnedNoTransmited')) {
$workflow->apply($furnitureInstance, 'toAbandonnedNoTransmited');
} elseif ($workflow->can($furnitureInstance, 'toAbandonned')) {
$workflow->apply($furnitureInstance, 'toAbandonned');
}
}
}
} catch (\Exception) {
// echo 'Exception reçue : ', $e->getMessage(), "\n";
}
}
public function toAbandonnedNoTransmited(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$workflow = $this->workflow->get($operationOrder, 'order_furniture_step');
if ($workflow->can($operationOrder, 'toAbandonned')) {
$workflow->apply($operationOrder, 'toAbandonned');
}
}
public function toAbandonnedToTransmit(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$this->mailQueueService->addMailQueueEntryType1($operationOrder, 'AGENCY_NOTIF');
// todo to remove when api enabled
$workflow = $this->workflow->get($operationOrder, 'order_furniture_step');
if ($workflow->can($operationOrder, 'toAbandonned')) {
$workflow->apply($operationOrder, 'toAbandonned');
}
}
public function toAbandonnedTransmited(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$workflow = $this->workflow->get($operationOrder, 'order_furniture_step');
if ($workflow->can($operationOrder, 'toAbandonned')) {
$workflow->apply($operationOrder, 'toAbandonned');
}
}
public function toAbandonned(OperationOrderFurniture $operationOrder, string $transitionName): void
{
try {
$oldPrice = $operationOrder->getPrice();
$operationOrder->setPrice(0.0);
$updatedQuota = $this->quotaService->updateQuota($operationOrder, $oldPrice);
$orderMails = $this->entityManager->getRepository(FurnitureOrderMailQueue::class)->findBy([
'operationOrderFurniture' => $operationOrder,
'type' => FurnitureOrderMailQueue::TYPE_AGENCY_NOTIF,
'step' => 'toTransmit',
]);
if (!empty($orderMails)) {
foreach ($orderMails as $orderMail) {
if ($orderMail instanceof FurnitureOrderMailQueue) {
$this->entityManager->remove($orderMail);
}
}
}
$furnitureInstances = $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
if (!empty($furnitureInstances)) {
foreach ($furnitureInstances as $furnitureInstance) {
$workflow = $this->workflow->get($furnitureInstance, 'furniture_instance_step');
if ($workflow->can($furnitureInstance, 'toAbandonned')) {
$workflow->apply($furnitureInstance, 'toAbandonned');
}
}
}
} catch (\Exception) {
// echo 'Exception reçue : ', $e->getMessage(), "\n";
}
}
public function toShipped(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$opeOrderLines = $operationOrder->getOpeOrderFurnitureLines()->toArray();
if (!empty($opeOrderLines)) {
foreach ($opeOrderLines as $opeOrderLine) {
if ($opeOrderLine instanceof OperationOrderFurnitureLine) {
$instances = $opeOrderLine->getFurnitureInstances()->toArray();
if (!empty($instances)) {
foreach ($instances as $instance) {
$workflow = $this->workflow->get($instance, 'furniture_instance_step');
if ($instance->getStep() !== 'shipped' && $workflow->can($instance, $transitionName)) {
$workflow->apply($instance, $transitionName);
}
}
}
}
}
}
}
public function toDelivered(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$opeOrderLines = $operationOrder->getOpeOrderFurnitureLines()->toArray();
if (!empty($opeOrderLines)) {
foreach ($opeOrderLines as $opeOrderLine) {
if ($opeOrderLine instanceof OperationOrderFurnitureLine) {
$instances = $opeOrderLine->getFurnitureInstances()->toArray();
if (!empty($instances)) {
foreach ($instances as $instance) {
$workflow = $this->workflow->get($instance, 'furniture_instance_step');
if ($instance->getStep() !== 'delivered' && $workflow->can($instance, $transitionName)) {
$workflow->apply($instance, $transitionName);
}
}
}
}
}
}
}
public function toFinishedClosed(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$opeOrderLines = $operationOrder->getOpeOrderFurnitureLines()->toArray();
if (!empty($opeOrderLines)) {
foreach ($opeOrderLines as $opeOrderLine) {
if ($opeOrderLine instanceof OperationOrderFurnitureLine) {
$instances = $opeOrderLine->getFurnitureInstances()->toArray();
if (!empty($instances)) {
foreach ($instances as $instance) {
$workflow = $this->workflow->get($instance, 'furniture_instance_step');
if ($instance->getStep() !== 'recovered' && $workflow->can($instance, $transitionName)) {
$workflow->apply($instance, 'toRecovered');
}
}
}
}
}
}
}
public function toToTransmit(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$this->mailQueueService->addMailQueueEntryType1($operationOrder, 'AGENCY_NOTIF');
$furnitureInstances = $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
if (!empty($furnitureInstances)) {
foreach ($furnitureInstances as $furnitureInstance) {
$workflow = $this->workflow->get($furnitureInstance, 'furniture_instance_step');
if ($workflow->can($furnitureInstance, 'toAwaitingDelivery')) {
$workflow->apply($furnitureInstance, 'toAwaitingDelivery');
}
}
}
}
public function toToModerate(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$this->mailQueueService->addMailQueueEntryType1($operationOrder, 'MODERATION_NOTIF');
$furnitureInstances = $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
if (!empty($furnitureInstances)) {
foreach ($furnitureInstances as $furnitureInstance) {
$workflow = $this->workflow->get($furnitureInstance, 'furniture_instance_step');
if ($workflow->can($furnitureInstance, 'toAwaitingDelivery')) {
$workflow->apply($furnitureInstance, 'toAwaitingDelivery');
}
}
}
}
public function toUpdateToModerate(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$this->mailQueueService->addMailQueueEntryType1($operationOrder, 'MODERATION_NOTIF');
$this->furnitureStockService->removeStocksOrderToCalendar($operationOrder);
$furnitureInstances = $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
if (!empty($furnitureInstances)) {
foreach ($furnitureInstances as $furnitureInstance) {
$workflow = $this->workflow->get($furnitureInstance, 'furniture_instance_step');
if ($workflow->can($furnitureInstance, 'toAwaitingDelivery')) {
$workflow->apply($furnitureInstance, 'toAwaitingDelivery');
}
}
}
}
public function toModeratevalided(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$furnitureInstances = $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
$this->sendUserMailModeration($operationOrder, $furnitureInstances, true);
$workflow = $this->workflow->get($operationOrder, 'order_furniture_step');
if ($workflow->can($operationOrder, 'toToTransmit')) {
$workflow->apply($operationOrder, 'toToTransmit');
}
}
public function toUpdateModerateValided(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$furnitureInstances = $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
$this->sendUserMailModeration($operationOrder, $furnitureInstances, true);
$workflow = $this->workflow->get($operationOrder, 'order_furniture_step');
$opeOrderStepVersion = $this->entityManager->getRepository(OperationOrderStepVersion::class)->findBy([
'operationOrder' => $operationOrder,
'step' => 'requestSend'
]);
if (!empty($opeOrderStepVersion) && $workflow->can($operationOrder, 'toUpdateToTransmit')) {
$workflow->apply($operationOrder, 'toUpdateToTransmit');
} elseif (empty($opeOrderStepVersion) && $workflow->can($operationOrder, 'toToTransmit')) {
$workflow->apply($operationOrder, 'toToTransmit');
}
}
public function toModerateRefused(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$furnitureInstances = $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
$this->sendUserMailModeration($operationOrder, $furnitureInstances, false);
$workflow = $this->workflow->get($operationOrder, 'order_furniture_step');
if ($workflow->can($operationOrder, 'toAbandonnedNoTransmited')) {
$workflow->apply($operationOrder, 'toAbandonnedNoTransmited');
}
}
public function toUpdateModerateRefused(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$furnitureInstances = $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
$this->sendUserMailModeration($operationOrder, $furnitureInstances, false);
$workflow = $this->workflow->get($operationOrder, 'order_furniture_step');
$opeOrderStepVersion = $this->entityManager->getRepository(OperationOrderStepVersion::class)->findBy([
'operationOrder' => $operationOrder,
'step' => 'requestSend'
]);
if (!empty($opeOrderStepVersion) && $workflow->can($operationOrder, 'toAbandonnedToTransmit')) {
$workflow->apply($operationOrder, 'toAbandonnedToTransmit');
} elseif (empty($opeOrderStepVersion) && $workflow->can($operationOrder, 'toAbandonnedNoTransmited')) {
$workflow->apply($operationOrder, 'toAbandonnedNoTransmited');
}
}
public function toUpdateToTransmit(OperationOrderFurniture $operationOrder, string $transitionName): void
{
$this->mailQueueService->addMailQueueEntryType1($operationOrder, 'AGENCY_NOTIF');
}
public function sendMailQteKo(OperationOrderFurniture $operationOrder, array $furnitureInstances): void
{
$user = $operationOrder->getUser();
if ($user->getEmail() !== null) {
$advertiser = $operationOrder->getOperation()->getAdvertiser();
$subdomain = $advertiser->getSubdomain();
$defaultSubdomain = $this->advertisingManagement->getDefaultSubdomain();
$defaultBaseUrl = $this->advertisingManagement->getAbsoluteUrl($defaultSubdomain);
$baseUrl = $this->advertisingManagement->getAbsoluteUrl($subdomain);
$opeOrderShowLink = $baseUrl . '/operation-order/' . $operationOrder->getId();
$mailBody = $this->access->render('emails/userOrderQteKo.html.twig', [
'defaultBaseUrl' => $defaultBaseUrl,
'operationOrder' => $operationOrder,
'user' => $user,
'furnitureInstances' => $furnitureInstances,
'opeOrderShowLink' => $opeOrderShowLink,
], 200, $advertiser);
$this->emailService->send('Staci - Commande annulée', 'no-reply@staci-animations.com', $user->getEmail(), $mailBody, []);
}
}
public function sendUserMailModeration(OperationOrderFurniture $operationOrder, array $furnitureInstances, bool $isOk): void
{
$user = $operationOrder->getUser();
if ($user->getEmail() !== null) {
$advertiser = $operationOrder->getOperation()->getAdvertiser();
$subdomain = $advertiser->getSubdomain();
$defaultSubdomain = $this->advertisingManagement->getDefaultSubdomain();
$defaultBaseUrl = $this->advertisingManagement->getAbsoluteUrl($defaultSubdomain);
$baseUrl = $this->advertisingManagement->getAbsoluteUrl($subdomain);
$opeOrderShowLink = $baseUrl . '/operation-order/' . $operationOrder->getId();
$mailBody = $this->access->render('emails/userOrderModeration.html.twig', [
'defaultBaseUrl' => $defaultBaseUrl,
'operationOrder' => $operationOrder,
'user' => $user,
'furnitureInstances' => $furnitureInstances,
'opeOrderShowLink' => $opeOrderShowLink,
'isOk' => $isOk,
], 200, $advertiser);
$this->emailService->send('Staci - Commande modéré', 'no-reply@staci-animations.com', $user->getEmail(), $mailBody, []);
}
}
public function onLeave(Event $event): void
{
}
public static function getSubscribedEvents(): array
{
return [
'workflow.order_furniture_step.leave' => 'onLeave',
'workflow.order_furniture_step.enter' => 'onEnter',
'workflow.order_furniture_step.completed' => 'onCompleted',
'workflow.order_furniture_step.entered' => 'onEntered',
];
}
}