<?php
namespace App\EventListener;
use App\Entity\Gos\AdditionalAccess\AdditionalAccessBeneficiary;
use App\Entity\Gos\AdditionalAccess\UserAdditionalAccessOffer;
use App\Entity\Gos\OrderPart;
use App\Entity\Gos\OrderProductVariant;
use App\Entity\Gos\Orders;
use App\Entity\Gos\RenewalOffer\UserRenewalOffer;
use App\Event\ApiOrderPlacedEvent;
use App\Utils\RenewalOffer\RenewalOfferUtils;
use App\Utils\SyncNadzorService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ApiOrderPlacedListener implements EventSubscriberInterface
{
private $entityManager;
private $renewalOfferUtils;
public function __construct(
EntityManagerInterface $entityManager,
RenewalOfferUtils $renewalOfferUtils
)
{
$this->entityManager = $entityManager;
$this->renewalOfferUtils = $renewalOfferUtils;
}
public static function getSubscribedEvents(): array
{
return [
ApiOrderPlacedEvent::API_ORDER_PLACED => [
['assignNextOrderToUserRenewalOffer', 10],
['createAdditionalAccessBeneficiary', 0],
],
];
}
public function assignNextOrderToUserRenewalOffer(ApiOrderPlacedEvent $event): void
{
$orderId = $event->getOrderId();
$session = $event->getRequest()->getSession();
if (null === $userRenewalOfferHash = $session->get('renewalOfferHash'))
{
return;
}
$session->remove('renewalOfferHash');
$order = $this->entityManager->getRepository(Orders::class)->find($orderId);
$userRenewalOffer = $this->entityManager->getRepository(UserRenewalOffer::class)->findOneByHash($userRenewalOfferHash);
$possibleVariants = $this->renewalOfferUtils->getPossibleVariantsAccordingToOrderedItem(
$userRenewalOffer->getRenewalOffer()->getSuggestedVariants(),
$userRenewalOffer->getProductVariantNoComplete()
);
$possiblePvNo = array_map(function (array $productVariant) {
return $productVariant['pvNo'];
}, $possibleVariants);
/** @var OrderPart $orderPart */
foreach ($order->getOrderPart() as $orderPart)
{
/** @var OrderProductVariant $orderProductVariant */
foreach ($orderPart->getOrderProductVariant() as $orderProductVariant)
{
if (in_array($orderProductVariant->getProductVariantNoComplete(), $possiblePvNo, true))
{
$userRenewalOffer->setNextOrder($order);
$this->entityManager->persist($userRenewalOffer);
$this->entityManager->flush();
return;
}
}
}
}
public function createAdditionalAccessBeneficiary(ApiOrderPlacedEvent $event): void
{
$session = $event->getRequest()->getSession();
if (
empty($event->getRequest()->request->get('additionalAccessUsers'))
|| null === $userAdditionalAccessOfferHash = $session->get('additionalAccessOfferHash')
)
{
return;
}
$session->remove('additionalAccessOfferHash');
$order = $this->entityManager->getRepository(Orders::class)
->find($event->getOrderId());
$userAdditionalAccessOffer = $this->entityManager->getRepository(UserAdditionalAccessOffer::class)
->findOneByHash($userAdditionalAccessOfferHash);
$order->setUserAdditionalAccessOffer($userAdditionalAccessOffer);
foreach ($event->getRequest()->request->get('additionalAccessUsers') as $beneficiary)
{
$beneficiary = (new AdditionalAccessBeneficiary())
->setOrders($order)
->setFirstName($beneficiary['firstname'])
->setLastName($beneficiary['lastname'])
->setEmail($beneficiary['email'])
->setPhoneNumber($beneficiary['phone'])
->setPosition($beneficiary['position']);
$this->entityManager->persist($beneficiary);
}
$this->entityManager->flush();
}
}