<?php
declare(strict_types=1);
namespace CioCustomerPermissionGroups;
use CioCustomerPermissionGroups\Definition\CustomerAclgroupsEntity;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\Plugin;
use Doctrine\DBAL\Connection;
use Shopware\Core\Framework\Plugin\Context\ActivateContext;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
class CioCustomerPermissionGroups extends Plugin
{
public const GROUP_BACKOFFICE_ID = '42aa169976e34a8cba6181b03c6279e0';
public const GROUP_SPRINGER_ID = '4452ccbabb38462c9aaad8357440b3ed';
public const GROUP_BZHMA_ID = 'b11e1a0e26aa4782ba85c5c6573d306a';
public const GROUP_FILIALE_ID = 'abeade76041142c3912d47c567957d05';
public const GROUP_ASSETS_CENTER_ID = 'a8fa0a9676a242fa97cfdc3c51468030';
public const GROUP_SUPPORT_POINTS_ID = 'de35600091074dd783b5966b4fee8789';
public const GROUP_AREAS_ID = 'c6890e162107402d8d39f73cf68f112d';
public const GROUP_CLUSTER_ID = '5533c9c364f6444692a45c9d4bbb53d7';
public function activate(ActivateContext $activateContext): void
{
parent::activate($activateContext);
$this->createPermissionGroup(self::GROUP_BACKOFFICE_ID, 'Backoffice', 'backoffice');
$this->createPermissionGroup(self::GROUP_SPRINGER_ID, 'Springer', 'springer');
$this->createPermissionGroup(self::GROUP_BZHMA_ID, 'BzH-MA', 'bzhma');
$this->createPermissionGroup(self::GROUP_FILIALE_ID, 'Filiale', 'filiale');
$this->createPermissionGroup(self::GROUP_ASSETS_CENTER_ID, 'Vermögens-center (ehem. Investmentcenter)', 'assets_center');
$this->createPermissionGroup(self::GROUP_SUPPORT_POINTS_ID, 'Beratungspunkte', 'support_points');
$this->createPermissionGroup(self::GROUP_AREAS_ID, 'Bereiche', 'areas');
$this->createPermissionGroup(self::GROUP_CLUSTER_ID, 'Cluster', 'cluster');
}
public function uninstall(UninstallContext $context): void
{
parent::uninstall($context);
if ($context->keepUserData()) {
return;
}
$connection = $this->container->get(Connection::class);
//$connection->executeUpdate('DROP TABLE IF EXISTS `customer_aclgroups`');
//$connection->executeUpdate('ALTER TABLE `customer` DROP COLUMN `customer_aclgroup_ids`');
}
public static function arrayUnique(array $array, callable $comparator): array
{
$unique_array = [];
do {
$element = array_shift($array);
$unique_array[] = $element;
$array = array_udiff(
$array,
[$element],
$comparator
);
} while (count($array) > 0);
return $unique_array;
}
public static function getAclIds($array)
{
if (!is_array($array)) {
return [];
}
$array = self::uniqueACL($array);
$res = [];
foreach ($array as $item) {
$res[] = $item['id'];
}
return $res;
}
public static function uniqueACL(array $array): array
{
foreach ($array as $key => $customAclRole) {
if (!is_array($customAclRole)) {
unset($array[$key]);
}
}
if (count($array)) {
return self::arrayUnique($array, function ($a, $b) {
if ($a['id'] == $b['id']) {
$b['imported'] = $a['imported'] = true;
}
return $a['id'] <=> $b['id'];
});
}
return [];
}
protected function createPermissionGroup(string $id, string $name, string $technicalName)
{
/** @var EntityRepository $aclGroupRepository */
$aclGroupRepository = $this->container->get('customer_aclgroups.repository');
$aclGroup = $aclGroupRepository->search(new Criteria([$id]), Context::createDefaultContext())->first();
if (!$aclGroup instanceof CustomerAclgroupsEntity) {
$aclGroupRepository->create([
[
'id' => $id,
'name' => $name,
'technicalname' => $technicalName,
'roles' => []
]
], Context::createDefaultContext());
}
}
}