<?php
namespace CioBudget\Subscriber;
use CioBudget\Definition\Budget\BudgetEntity;
use CioBudget\Service\BudgetLoaderService;
use Shopware\Core\Checkout\Customer\CustomerEntity;
use Shopware\Core\Checkout\Customer\CustomerEvents;
use Shopware\Core\Framework\Api\Context\SalesChannelApiSource;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class FilterCustomerEntityBudgetsSubscriber implements EventSubscriberInterface
{
private BudgetLoaderService $budgetLoaderService;
private Container $container;
public function __construct(
Container $container,
BudgetLoaderService $budgetLoaderService
)
{
$this->budgetLoaderService = $budgetLoaderService;
$this->container = $container;
}
public static function getSubscribedEvents(): array
{
return [
CustomerEvents::CUSTOMER_LOADED_EVENT => 'onLoaded'
];
}
public function onLoaded(EntityLoadedEvent $event)
{
/** @var BudgetLoaderService $budgetLoaderService */
if ($event->getContext()->getScope() !== 'user' || !($event->getContext()->getSource() instanceof SalesChannelApiSource)) {
return;
}
/** @var CustomerEntity $customer */
$customers = $event->getEntities();
foreach ($customers as $customer) {
$customFields = $customer->getCustomFields();
$customerBudgets = $this->budgetLoaderService->getActiveBudgetsByCustomer($customer, $event->getContext());
if ($customerBudgets) {
$customFields['cio_active_budgets'] = array_map(function ($customerBudget) {
return $customerBudget->getId();
}, $customerBudgets->getElements());
}
$customer->setCustomFields($customFields);
}
}
}