<?php
use App\BitrixCore;
use Bitrix\Main\GroupTable;
use Illuminate\Database\Migrations\Migration;
return new class extends Migration {
private const SORT_STEP = 100;
public function __construct()
{
BitrixCore::load();
}
public function up(): void
{
$userGroups = $this->getPreparedUserGroups();
foreach ($userGroups as $userGroup) {
$this->addUserGroup($userGroup);
}
}
public function down(): void
{
$userGroups = $this->getUserGroups();
foreach ($userGroups as $userGroup) {
$this->deleteUserGroup($userGroup['STRING_ID']);
}
}
private function getUserGroups(): array
{
return [
[
'ACTIVE' => 'Y',
//'C_SORT' => 0, //рассчитывается
'NAME' => 'Тест',
'DESCRIPTION' => 'Пользователи, пришедшие из Тест',
'USER_ID' => [],
'STRING_ID' => 'LICARD',
'IS_SYSTEM' => 'N',
//тут удалил установку прав на модули, как было в миграции одиночной группы, потому что считаю лучше делать это в отдельной миграции
],
[
'ACTIVE' => 'Y',
//'C_SORT' => 0, //рассчитывается
'NAME' => 'Тест: сегмент 1',
'DESCRIPTION' => '',
'USER_ID' => [],
'STRING_ID' => 'SEGMENT_1',
'IS_SYSTEM' => 'N',
//тут удалил установку прав на модули, как было в миграции одиночной группы, потому что считаю лучше делать это в отдельной миграции
],
[
'ACTIVE' => 'Y',
//'C_SORT' => 0, //рассчитывается
'NAME' => 'Тест: сегмент 2',
'DESCRIPTION' => '',
'USER_ID' => [],
'STRING_ID' => 'SEGMENT_2',
'IS_SYSTEM' => 'N',
//тут удалил установку прав на модули, как было в миграции одиночной группы, потому что считаю лучше делать это в отдельной миграции
],
[
'ACTIVE' => 'Y',
//'C_SORT' => 0, //рассчитывается
'NAME' => 'Тест: сегмент 3',
'DESCRIPTION' => '',
'USER_ID' => [],
'STRING_ID' => 'SEGMENT_3',
'IS_SYSTEM' => 'N',
//тут удалил установку прав на модули, как было в миграции одиночной группы, потому что считаю лучше делать это в отдельной миграции
],
];
}
private function deleteUserGroup(string $stringId): void
{
global $APPLICATION;
$userGroupObject = GroupTable::query()
->addSelect('ID')
->where('STRING_ID', $stringId)
->setLimit(1)
->fetchObject();
if ($userGroupObject === null) {
throw new RuntimeException('Не найдена группа пользователей с STRING_ID = ' . $stringId);
}
/** @noinspection NotOptimalIfConditionsInspection */
if (CGroup::Delete($userGroupObject->getId()) === false && ($bitrixException = $APPLICATION->GetException())) {
throw new RuntimeException($bitrixException->GetString());
}
}
private function addUserGroup(array $params): void
{
$group = new CGroup;
$groupId = $group->Add($params);
if ($groupId === false) {
throw new RuntimeException($group->LAST_ERROR);
}
}
private function getPreparedUserGroups(): array
{
$userGroups = $this->getUserGroups();
$sort = $this->getMaxSort() + self::SORT_STEP;
foreach ($userGroups as $key => $userGroup) {
$userGroups[$key]['C_SORT'] = $sort;
$sort += self::SORT_STEP;
}
return $userGroups;
}
private function getMaxSort(): int
{
$groupWithMaxSortObject = GroupTable::query()
->addSelect('C_SORT')
->addOrder('C_SORT', 'desc')
->setLimit(1)
->fetchObject();
return $groupWithMaxSortObject?->getCSort() ?? 0;
}
};