<?php
namespace CioBudget\Subscriber;
use CioBudget\PaymentHandler\BudgetPayment;
use Shopware\Core\Checkout\Order\Event\OrderStateMachineStateChangeEvent;
use Shopware\Core\Checkout\Payment\Cart\PaymentHandler\PaymentHandlerRegistry;
use Shopware\Core\Checkout\Payment\Cart\SyncPaymentTransactionStruct;
use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
use Shopware\Core\System\SalesChannel\Context\AbstractSalesChannelContextFactory;
use Shopware\Core\System\SalesChannel\Context\SalesChannelContextService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class BudgetMovementSubscriber implements EventSubscriberInterface
{
private PaymentHandlerRegistry $paymentHandlerRegistry;
private AbstractSalesChannelContextFactory $salesChannelContextFactory;
public function __construct(PaymentHandlerRegistry $paymentHandlerRegistry, AbstractSalesChannelContextFactory $salesChannelContextFactory)
{
$this->paymentHandlerRegistry = $paymentHandlerRegistry;
$this->salesChannelContextFactory = $salesChannelContextFactory;
}
public static function getSubscribedEvents(): array
{
return [
'state_enter.order_transaction.state.refunded' => 'onOrderRefund',
];
}
public function onOrderRefund(OrderStateMachineStateChangeEvent $event): void
{
$order = $event->getOrder();
$transaction = $order->getTransactions()->last();
$paymentMethod = $transaction->getPaymentMethod();
$paymentHandler = $this->paymentHandlerRegistry->getHandlerForPaymentMethod($paymentMethod);
if ($paymentHandler instanceof BudgetPayment) {
/** @var $paymentHandler BudgetPayment */
$paymentTransaction = new SyncPaymentTransactionStruct($transaction, $order);
$dataBag = new RequestDataBag();
$salesChannelContext = $this->salesChannelContextFactory->create('', $order->getSalesChannelId(), [SalesChannelContextService::LANGUAGE_ID => $order->getLanguageId()]);
$paymentHandler->refund($paymentTransaction, $dataBag, $salesChannelContext);
}
}
}