<?php
namespace App\EventListener;
use App\Entity\Gos\OrderPart;
use App\Entity\Gos\OrderProductVariant;
use App\Entity\Gos\Orders;
use App\Entity\Gos\UserFlag;
use App\Event\OrderPlacedEvent;
use App\Utils\OmittedUpsellUtils;
use App\Utils\SalesManago\v2\Action\Contact\ExternalEvent\Purchase\PurchaseEventAction;
use App\Utils\SalesManago\v2\Action\Contact\ExternalEvent\Purchase\PurchaseEventContext;
use App\Utils\SalesManago\v2\Flow\PurchaseFlow;
use App\Utils\UserFlagService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class OrderPlacedListener implements EventSubscriberInterface
{
private $entityManager;
private $userFlagService;
private $omittedUpsellUtils;
private $salesManagoPurchaseFlow;
public function __construct(
EntityManagerInterface $entityManager,
UserFlagService $userFlagService,
OmittedUpsellUtils $omittedUpsellUtils,
PurchaseFlow $salesManagoPurchaseFlow
)
{
$this->entityManager = $entityManager;
$this->userFlagService = $userFlagService;
$this->omittedUpsellUtils = $omittedUpsellUtils;
$this->salesManagoPurchaseFlow = $salesManagoPurchaseFlow;
}
public static function getSubscribedEvents(): array
{
return [
OrderPlacedEvent::ORDER_PLACED => [
['assignFlagToUser', 10],
['createOmittedUpsellRecords', 9],
['removeOmittedUpsellIfPurchased', 8],
['sendSalesManago2PurchaseEvent', 7],
],
];
}
public function assignFlagToUser(OrderPlacedEvent $event): void
{
$orderId = $event->getOrderId();
$order = $this->entityManager->getRepository(Orders::class)->find($orderId);
/** @var OrderPart $orderPart */
foreach ($order->getOrderPart() as $orderPart)
{
/** @var OrderProductVariant $opv */
foreach ($orderPart->getOrderProductVariant() as $opv)
{
$orderedProductVariants[] = $opv->getProductVariant()->getProductVariantNoComplete();
}
}
$matchedUserFlags = $this->entityManager
->getRepository(UserFlag::class)
->findActiveByProductVariant($orderedProductVariants ?? []);
if (empty($matchedUserFlags))
{
return;
}
foreach ($matchedUserFlags as $userFlag)
{
$this->userFlagService->assignToUser($userFlag, $order->getUser());
}
}
public function createOmittedUpsellRecords(OrderPlacedEvent $event)
{
$orderId = $event->getOrderId();
$order = $this->entityManager->getRepository(Orders::class)->find($orderId);
$this->omittedUpsellUtils->create($order);
}
public function removeOmittedUpsellIfPurchased(OrderPlacedEvent $event)
{
$orderId = $event->getOrderId();
$order = $this->entityManager->getRepository(Orders::class)->find($orderId);
$this->omittedUpsellUtils->removePurchased($order);
}
public function sendSalesManago2PurchaseEvent(OrderPlacedEvent $event): void
{
$orderId = $event->getOrderId();
$order = $this->entityManager->getRepository(Orders::class)->find($orderId);
if (!$order) {
return;
}
$this->salesManagoPurchaseFlow->handle($order);
}
}