<?php
namespace CioBudget\Subscriber;
use CioBudget\Definition\Budget\BudgetEntity;
use CioBudget\Service\BudgetInfoService;
use CioBudget\Service\SessionService;
use CioMasterdata\Definition\Masterdata\MasterdataEntity;
use CioMasterdata\Service\MasterdataService;
use PhpParser\Node\Expr\Array_;
use Shopware\Core\Checkout\Customer\CustomerEntity;
use CioBudget\Service\BudgetLoaderService;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
use Shopware\Storefront\Event\StorefrontRenderEvent;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Session\Session;
class HeaderSelectionSubscriber implements EventSubscriberInterface
{
private Container $container;
private BudgetLoaderService $budgetLoaderService;
private SessionService $sessionService;
private BudgetInfoService $budgetInfoService;
private MasterdataService $masterdataService;
public function __construct(Container $container)
{
$this->container = $container;
}
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 function setMasterdataService(MasterdataService $masterdataService)
{
$this->masterdataService = $masterdataService;
}
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);
$storeArray = [];
if (is_array($customer->getCustomFields()) && array_key_exists('masterdata', $customer->getCustomFields())) {
$budgetMasterdatas = $customer->getCustomFields()['masterdata'];
foreach ($budgetMasterdatas as $budgetMasterdata) {
$masterData = $this->masterdataService->getMasterdataById($budgetMasterdata['id'], true);
if ($masterData instanceof MasterdataEntity) {
$masterDataName = $masterData->getName();
foreach ($masterData->getStores() as $store) {
if (!isset($storeArray[$store->getStoreId()])) {
$storeArray[$store->getStoreId()] = $masterDataName;
}
}
}
}
}
$currentBudget = [
'budget' => $currentBudget,
'currentState' => $currentBudget ? $this->budgetInfoService->getAvailableBudget($currentBudget->getId(), $event->getSalesChannelContext()->getContext(), $event->getSalesChannelContext()->getCustomer()) : 0,
'externalId' => $currentBudget ? str_pad($currentBudget->get('store')->getExtId(), 4, 0, STR_PAD_LEFT) : '',
'storeName' => isset($storeArray[$currentBudget->getStoreId()]) ? $storeArray[$currentBudget->getStoreId()] : ''
];
$event->setParameter('cio_budgets_show', true);
$event->setParameter('cio_currently_selected_budget', $currentBudget);
if ($budgets) {
$budgets = $budgets->map(function ($budget) use ($event, $storeArray) {
return [
'budget' => $budget,
'currentState' => $budget instanceof BudgetEntity ? $this->budgetInfoService->getAvailableBudget($budget->getId(), $event->getSalesChannelContext()->getContext(), $event->getSalesChannelContext()->getCustomer()) : 0,
'externalId' => $budget instanceof BudgetEntity ? str_pad($budget->get('store')->getExtId(), 4, 0, STR_PAD_LEFT) : '',
'storeName' => isset($storeArray[$budget->getStoreId()]) ? $storeArray[$budget->getStoreId()] : ''
];
});
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_params', $event->getRequest()->attributes->get('_route_params'));
}
}