<?php
declare(strict_types=1);
namespace VioB2BLogin\Storefront\Subscriber;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Storefront\Event\RouteRequest\OrderRouteRequestEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use VioB2BLogin\Core\Services\AvailabilityService;
use VioB2BLogin\Core\Services\PrivilegeService;
use VioB2BLogin\Core\System\SalesChannel\Context\SalesChannelContextFactory;
use VioB2BLogin\Entity\Employee\EmployeeEntity;
use VioB2BLogin\Entity\Privilege\PrivilegeNames;
use VioB2BLogin\Entity\Privilege\PrivilegeNamespaces;
use VioB2BLogin\VioB2BLogin;
class OrderPageSubscriber implements EventSubscriberInterface
{
private PrivilegeService $privilegeService;
private AvailabilityService $availabilityService;
public function __construct(
PrivilegeService $privilegeService,
AvailabilityService $availabilityService
)
{
$this->privilegeService = $privilegeService;
$this->availabilityService = $availabilityService;
}
public static function getSubscribedEvents(): array
{
return [
OrderRouteRequestEvent::class => 'onOrderRouteRequest'
];
}
public function onOrderRouteRequest(OrderRouteRequestEvent $event): void
{
$context = $event->getSalesChannelContext();
if (!$this->availabilityService->isEnabled($context)) {
return;
}
if (!$this->privilegeService->checkPrivilege($context, PrivilegeNamespaces::ORDER, PrivilegeNames::LIST)) {
$employee = $context->getExtensionOfType(SalesChannelContextFactory::EMPLOYEE_KEY, EmployeeEntity::class);
if ($employee instanceof EmployeeEntity
&& $this->privilegeService->checkPrivilege($context, PrivilegeNamespaces::EMPLOYEE_ORDER, PrivilegeNames::LIST)) {
// include only own orders
$event->getCriteria()->addFilter(new EqualsFilter('order.customFields.' . VioB2BLogin::EMPLOYEE_FIELD, $employee->getId()));
} else {
// exclude all orders from result
$event->getCriteria()->addFilter(new EqualsFilter('order.id', null));
}
}
}
}