<?php
namespace CioBudget\Subscriber;
use CioBudget\Definition\Budget\BudgetEntity;
use CioBudget\Service\BudgetInfoService;
use CioBudget\Service\SessionService;
use PhpParser\Node\Expr\Array_;
use Shopware\Core\Checkout\Customer\CustomerEntity;
use CioBudget\Service\BudgetLoaderService;
use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
use Shopware\Core\Framework\Validation\DataBag\DataBag;
use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
use Shopware\Core\System\SalesChannel\Context\SalesChannelContextService;
use Shopware\Core\System\SalesChannel\SalesChannel\ContextSwitchRoute;
use Shopware\Storefront\Event\StorefrontRenderEvent;
use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPage;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPage;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Shopware\Storefront\Page\Cart\CartPageLoadedEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class HeaderSelectionSubscriber implements EventSubscriberInterface
{
private Container $container;
private BudgetLoaderService $budgetLoaderService;
private SessionService $sessionService;
private BudgetInfoService $budgetInfoService;
private UrlGeneratorInterface $router;
private TranslatorInterface $translator;
public function __construct(Container $container, UrlGeneratorInterface $router, TranslatorInterface $translator)
{
$this->container = $container;
$this->router = $router;
$this->translator = $translator;
}
public function setSessionService(SessionService $sessionService)
{
$this->sessionService = $sessionService;
}
public function setBudgetLoaderService(BudgetLoaderService $budgetLoaderService)
{
$this->budgetLoaderService = $budgetLoaderService;
}
public function setBudgetInfoService(BudgetInfoService $budgetInfoService)
{
$this->budgetInfoService = $budgetInfoService;
}
public static function getSubscribedEvents(): array
{
return [
StorefrontRenderEvent::class => 'onStorefrontRender'
];
}
public function onStorefrontRender(StorefrontRenderEvent $event)
{
$customer = $event->getSalesChannelContext()->getCustomer();
if (!$customer instanceof CustomerEntity) {
$event->setParameter('cio_budgets_show', false);
return;
}
if (!$customer || !is_array($customer->getCustomFields())) {
return;
}
/** @var EntitySearchResult $budgets */
$budgets = $this->budgetLoaderService->getActiveBudgetsByCustomer($customer, $event->getSalesChannelContext()->getContext());
if (!$budgets) {
return;
}
$currentSelectedBudgetId = $this->sessionService->getBudgetIdFromSession();
if (!$currentSelectedBudgetId) {
return;
}
$currentBudget = $this->budgetLoaderService->getBudgetById($currentSelectedBudgetId);
$currentBudget = [
'budget' => $currentBudget,
'currentState' => $currentBudget ? $this->budgetInfoService->getAvailableBudget($currentBudget->getId(), $event->getSalesChannelContext()) : 0,
'externalId' => $currentBudget ? str_pad($currentBudget->get('store')->getExtId(), 4, 0, STR_PAD_LEFT) : ''
];
$event->setParameter('cio_budgets_show', true);
$event->setParameter('cio_currently_selected_budget', $currentBudget);
if ($budgets) {
$budgets = $budgets->map(function ($budget) use ($event) {
return [
'budget' => $budget,
'currentState' => $budget instanceof BudgetEntity ? $this->budgetInfoService->getAvailableBudget($budget->getId(), $event->getSalesChannelContext()) : 0,
'externalId' => $budget instanceof BudgetEntity ? str_pad($budget->get('store')->getExtId(), 4, 0, STR_PAD_LEFT) : ''
];
});
uasort($budgets, function ($a, $b) {
if ($a['budget']->getName() == $b['budget']->getName()) return 0;
return ($a['budget']->getName() < $b['budget']->getName()) ? -1 : 1;
});
$event->setParameter('cio_avaivable_budgets', $budgets);
}
$event->setParameter('cio_avaivable_budgets_redirect', $event->getRequest()->attributes->get('_route'));
$event->setParameter('cio_avaivable_budgets_redirect_querystring', $event->getRequest()->getQueryString());
$event->setParameter('cio_avaivable_budgets_redirect_params', $event->getRequest()->attributes->get('_route_params'));
if (key_exists('page', $event->getParameters()) && $event->getParameters()['page'] instanceof CheckoutConfirmPage ) {
$currentPaymentId = $event->getParameters()['page']->getCart()->getTransactions()->getElements()[0]->getPaymentMethodId();
if( !in_array($currentPaymentId, array('f261b55b5214496bb30fec99e5f6561c','8cbfa5840845471ea510d574a947b365'))){
return;
}
$valueCart = $event->getParameters()['page']->getCart()->getPrice()->getTotalPrice();
$valueBudget = $currentBudget['currentState'];
$valueBudgetDisplay = $currentBudget['currentState'] . ' ' . $event->getSalesChannelContext()->getCurrency()->getSymbol();
if( $valueCart > $valueBudget )
{
/** @var Session $sessionService */
$sessionService = $this->container->get('session');
$sessionService->getFlashBag()->set('danger', $this->translator->trans('confirm.cartValueExceedsBudget', array('%value%'=>$valueBudgetDisplay)));
$response = new RedirectResponse($this->router->generate('frontend.checkout.cart.page'), 301);
$response->headers->set('Location', $this->router->generate('frontend.checkout.cart.page'));
$response->setStatusCode(302);
$response->send();
$event->setResponse($response);
}
}
if (key_exists('page', $event->getParameters()) && $event->getParameters()['page'] instanceof CheckoutCartPage )
{
$currentPaymentId = $event->getParameters()['page']->getCart()->getTransactions()->getElements()[0]->getPaymentMethodId();
if( !in_array($currentPaymentId, array('f261b55b5214496bb30fec99e5f6561c','8cbfa5840845471ea510d574a947b365'))){
return;
}
$valueCart = $event->getParameters()['page']->getCart()->getPrice()->getTotalPrice();
$valueBudget = $currentBudget['currentState'];
$valueBudgetDisplay = $currentBudget['currentState'] . ' ' . $event->getSalesChannelContext()->getCurrency()->getSymbol();
if( $valueCart > $valueBudget )
{
/** @var Session $sessionService */
$sessionService = $this->container->get('session');
$sessionService->getFlashBag()->set('danger', $this->translator->trans('confirm.cartValueExceedsBudget', array('%value%'=>$valueBudgetDisplay)));
}
}
}
}