<?php
namespace Nextag\Checkout\Subscriber;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\System\SalesChannel\Context\SalesChannelContextService;
use Shopware\Core\System\SalesChannel\Context\SalesChannelContextPersister;
class PaymentMethodSubscriber implements EventSubscriberInterface
{
private EntityRepository $productRepository;
private SalesChannelContextPersister $contextPersister;
public function __construct(EntityRepository $productRepository, SalesChannelContextPersister $contextPersister)
{
$this->productRepository = $productRepository;
$this->contextPersister = $contextPersister;
}
public static function getSubscribedEvents(): array
{
return [
CheckoutConfirmPageLoadedEvent::class => 'onConfirmPageLoaded',
];
}
public function onConfirmPageLoaded(CheckoutConfirmPageLoadedEvent $event): void
{
$page = $event->getPage();
$methods = $page->getPaymentMethods();
$cart = $event->getPage()->getCart(); // ✅ correct for confirm page
$salesChannelContext = $event->getSalesChannelContext();
$context = $event->getSalesChannelContext()->getContext();
$customerGroup = strtolower($event->getSalesChannelContext()->getCurrentCustomerGroup()?->getTranslated()['name'] ?? '');
$exclude = false;
foreach ($cart->getLineItems() as $item) {
$productId = $item->getReferencedId();
$criteria = new Criteria([$productId]);
$product = $this->productRepository->search($criteria, $context)->first();
if (!$product) {
continue;
}
$customFields = $product->getCustomFields() ?? [];
$isZuteilungswein = $customFields['custom_produkt_label_produkt_zuteilungswein'] ?? false;
if (
$isZuteilungswein
) {
$exclude = true;
break;
}
/* if (
($customerGroup === 'privat' && ($customFields['custom_produkt_label_produkt_aktionsartikel_pr_specialsellingvisible'] ?? null) === '1') ||
($customerGroup === 'wiederverkauf' && ($customFields['custom_produkt_label_produkt_aktionsartikel_ga_specialsellingvisible'] ?? null) === '1') ||
($customerGroup === 'mitarbeiter' && ($customFields['custom_produkt_label_produkt_aktionsartikel_mi_specialsellingvisible'] ?? null) === '1') ||
($customerGroup === 'privat' && ($customFields['custom_produkt_label_produkt_aktionsartikel_pr_specialsellingvisible'] ?? null) === '2') ||
($customerGroup === 'wiederverkauf' && ($customFields['custom_produkt_label_produkt_aktionsartikel_ga_specialsellingvisible'] ?? null) === '3') ||
($customerGroup === 'mitarbeiter' && ($customFields['custom_produkt_label_produkt_aktionsartikel_mi_specialsellingvisible'] ?? null) === '4')
) {
$exclude = true;
break;
} */
}
if ($exclude) {
// Filter only "invoice_payment"
$filtered = $methods->filter(function ($method) {
return $method->getShortName() === 'invoice_payment';
});
$page->setPaymentMethods($filtered);
// Check if selected method is no longer in the filtered list
$currentPayment = $salesChannelContext->getPaymentMethod();
$currentPaymentId = $currentPayment ? $currentPayment->getId() : null;
$isCurrentStillAvailable = $filtered->has($currentPaymentId);
if (!$isCurrentStillAvailable && $filtered->count() > 0) {
$newPaymentMethod = $filtered->first();
$salesChannelContext->assign(['paymentMethod' => $newPaymentMethod]);
$token = $salesChannelContext->getToken();
$persisterContext = $salesChannelContext->getContext();
$salesChannelId = $salesChannelContext->getSalesChannel()->getId();
$this->contextPersister->save(
$token,
[SalesChannelContextService::PAYMENT_METHOD_ID => $newPaymentMethod->getId()],
$salesChannelId
);
}
}
}
}