<?php
/*
* This file has been created by developers from BitBag.
* Feel free to contact us once you face any issues or want to start
* You can find more information about us on https://bitbag.io and write us
* an email on hello@bitbag.io.
*/
declare(strict_types=1);
namespace BitBag\SyliusB2BPlugin\EventListener;
use BitBag\SyliusB2BPlugin\Provider\PaymentTokenProviderInterface;
use BitBag\SyliusB2BPlugin\Sender\OrderPaymentLinkSenderInterface;
use Doctrine\ORM\EntityManagerInterface;
use Payum\Core\Model\GatewayConfigInterface;
use Sylius\Component\Core\Model\OrderInterface;
use Sylius\Component\Core\Model\PaymentMethodInterface;
use Sylius\Component\Payment\Model\PaymentInterface as PaymentInterfaceAlias;
use Symfony\Component\EventDispatcher\GenericEvent;
use Webmozart\Assert\Assert;
final class PaymentLinkCreationListener
{
private PaymentTokenProviderInterface $paymentTokenProvider;
private EntityManagerInterface $orderManager;
private OrderPaymentLinkSenderInterface $orderPaymentLinkSender;
public function __construct(
PaymentTokenProviderInterface $paymentTokenProvider,
EntityManagerInterface $orderManager,
OrderPaymentLinkSenderInterface $orderPaymentLinkSender,
) {
$this->paymentTokenProvider = $paymentTokenProvider;
$this->orderManager = $orderManager;
$this->orderPaymentLinkSender = $orderPaymentLinkSender;
}
public function setPaymentLink(GenericEvent $event): void
{
/** @var ?OrderInterface $order */
$order = $event->getSubject();
Assert::isInstanceOf($order, OrderInterface::class);
$payment = $order->getLastPayment(PaymentInterfaceAlias::STATE_NEW);
if (null === $payment) {
return;
}
/** @var PaymentMethodInterface $paymentMethod */
$paymentMethod = $payment->getMethod();
/** @var GatewayConfigInterface $gatewayConfig */
$gatewayConfig = $paymentMethod->getGatewayConfig();
if ('offline' === $gatewayConfig->getGatewayName()) {
return;
}
$token = $this->paymentTokenProvider->getPaymentToken($payment);
$payment->setDetails(['payment-link' => $token->getAfterUrl()]);
$this->orderPaymentLinkSender->sendPaymentLink($order);
$this->orderManager->flush();
}
}