<?phpnamespace CioSubaccounts\Subscriber;use CioCustomerPermissionGroups\Definition\CustomerAclgroupsEntity;use CioCustomerPermissionGroups\Event\CustomerPermissionGroupIdsLoadedEvent;use CioCustomerPermissionGroups\Event\CustomerPermissionGroupsLoadedEvent;use CioCustomerPermissionGroups\Service\CustomerPermissionService;use Shopware\Core\Checkout\Customer\CustomerEntity;use Shopware\Core\Framework\Context;use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;use Symfony\Component\DependencyInjection\ContainerInterface;use Symfony\Component\EventDispatcher\EventSubscriberInterface;class SubaccountsPermissionInheritance implements EventSubscriberInterface{ protected const ROLE_WHITELIST = []; private ContainerInterface $container; public function __construct(ContainerInterface $container) { $this->container = $container; } public static function getSubscribedEvents(): array { return [ CustomerPermissionGroupIdsLoadedEvent::class => 'onCustomerPermissionGroupIdsLoadedEvent', CustomerPermissionGroupsLoadedEvent::class => 'onCustomerPermissionGroupsLoadedEvent' ]; } public function onCustomerPermissionGroupIdsLoadedEvent(CustomerPermissionGroupIdsLoadedEvent $event) { $customer = $event->getCustomer(); $parentCustomer = $customer->getExtension('customerParent'); // ignore customers without parent if (is_null($parentCustomer)) { return; } /** @var EntityRepositoryInterface $customerRepository */ $customerRepository = $this->container->get('customer.repository'); $criteria = new Criteria(); $criteria->addFilter(new EqualsFilter('id', $parentCustomer->getParent())); $parentCustomer = $customerRepository->search($criteria, Context::createDefaultContext())->first(); // customer has a parent for inheritance if ($parentCustomer instanceof CustomerEntity) { $customerPermissionService = $this->container->get('customer.cio_customer_permission_service'); if ($customerPermissionService instanceof CustomerPermissionService) { $permissionGroupIds = $event->getPermissionGroupIds(); $event->setPermissionGroupIds( array_unique( array_merge( $permissionGroupIds, // groups from user $customerPermissionService->getCustomerPermissionGroupIds($parentCustomer) // groups from parent ) ) ); } } } public function onCustomerPermissionGroupsLoadedEvent(CustomerPermissionGroupsLoadedEvent $event) { $customer = $event->getCustomer(); $parentCustomer = $customer->getExtension('customerParent'); // ignore customers without parent if (is_null($parentCustomer)) { return; } /** @var EntityRepositoryInterface $customerRepository */ $customerRepository = $this->container->get('customer.repository'); $criteria = new Criteria(); $criteria->addFilter(new EqualsFilter('id', $parentCustomer->getParent())); $parentCustomer = $customerRepository->search($criteria, Context::createDefaultContext())->first(); // customer has a parent for inheritance if ($parentCustomer instanceof CustomerEntity) { $customerPermissionService = $this->container->get('customer.cio_customer_permission_service'); $parentPermissionGroups = $customerPermissionService->getCustomerPermissionGroups($parentCustomer, Context::createDefaultContext()); // filter out unwanted permissions from parent foreach ($parentPermissionGroups as $parentPermissionGroup) { $parentPermissionRoles = $parentPermissionGroup->getRoles(); foreach ($parentPermissionRoles as $index => $parentPermissionRole) { if (!in_array($parentPermissionRole['key'], self::ROLE_WHITELIST)) { $parentPermissionRoles[$index]['value'] = false; } } $parentPermissionGroup->setRoles($parentPermissionRoles); } // merge and save permissions if ($customerPermissionService instanceof CustomerPermissionService) { $permissionGroups = $event->getPermissionGroups(); $event->setPermissionGroups( array_merge( $permissionGroups, // groups from user $parentPermissionGroups // groups from parent ) ); } } }}