Пользователи backend

Пользователи БУС (Битрикс Управление Сайтом), они же пользователи "backend", тесно связаны с пользователями портала битрикс24 (коробочной версии).

Пользователь создается через портал битрикс24 (коробочная версия). Обычно через приглашение сотрудника по email.

При регистрации и изменении пользователя коробки происходит перехват события и запрос к api создания пользователя БУС.

POST https://bgs-group.eu/api/user/

token=#TOKEN#&crm_user_id=#CRM_ISER_ID#

API на самом деле запускает механизм импорта пользователя, который подтягивает его данные из CRM и создает пользователя в БУС (если не нашел уже существующего):

//local/app/Rest/UserEntity.php

try {
    //user will be imported in bitrix and created if necessary
    $result = UserTableImport::importUser($crmUserId);
    return ['data' => ['success' => $result]];
}

Импорт

Импорт получает данные пользователя из CRM и сверяет их с данными в локальной таблице bgs_crm_users.

Если данных в локальной таблице нет - то происходит также регистрация нового пользователя БУС:

//local/app/Crm/User/Tables/UserTableImport.php

CrmUserRegistration::register($crmUserId);

Если пользователь CRM не активен - то проиходит только деактивация пользователя в БУС:

//local/app/Crm/User/Tables/UserTableImport.php

// deactivate user if non-active at crm but still active at imported list
if (!!$importedUser && !!boolval($importedUser['ACTIVE'])) {
    self::deactivateUser($crmUserId);
}
continue;

Если пользователя коробки перенесли в отдел CRM в структуре компании, то пока ничего не делаем с ним в БУС:

//local/app/Crm/User/Tables/UserTableImport.php

// skip if user was moved to CRM department
if (self::isUserAtCrmDepartment($userData)) {
    continue;
}

Далее происходит удаление строки из локальной таблицы, с последующим добавлением новой строки:

//local/app/Crm/User/Tables/UserTableImport.php

// if user exists delete from import table
if (!!$importedUser) {
    self::deleteUser($crmUserId);
}

self::addUser($userData);

Раз в день (в зависимости от настроек cron), происходит импорт всех пользователей по тому же механизму.

Регистрация

Пользователь регистрируется автоматически при выполнении механизма импорта пользователя.

BGSGroup\User\CrmUserRegistration::register($crmUserId);

При этом, если пользователь уже существует в таблице b_user (проверка по crm_user_id), то сразу возвращается объект, содержащий его локальный ID

//local/app/User/CrmUserRegistration.php

if ($bxUserId = self::getBitrixUserByID($crm_user_id)) {
    return (object)['id' => $bxUserId];
}

В противном случае идет попытка найти пользователь по email. В случае успеха ему привязывается внешний ID, и возвращается объект с локальным ID

//local/app/User/CrmUserRegistration.php

// set crm user ID if bx user was found by EMAIL and return data with bx ID
if ($bxUserId = self::getBitrixUserByEmail($user['EMAIL'])) {
    self::setBitrixUserCrmID($bxUserId, $crm_user_id);
    return (object)['id' => $bxUserId];
}

Если же пользователь так и не был найден, создается новый, используя стандартный API битрикс (CUser::Add, включая стандартные события OnBeforeUserRegister и OnAfterUserRegister).

//local/app/User/CrmUserRegistration.php

$registerResult = UserRegistration::register($user);

После этого вызывается метод, который выполняет процессы, связанные с созданием пользователя (отправка уведомлений и прочее). Например, пользователь получает пароль для входа в backend в чате портала (как уведомление):

//local/app/User/CrmUserRegistration.php

self::afterRegister($registerResult, $crm_user_id);

Авторизация

При авторизации срабатывает событие, которое синхронизирует данные пользователя (имя, фамилию, фото) с данными в локальной таблице bgs_crm_users.

//bitrix/php_interface/include/EventHandlers/CrmUserRegistration.php

AddEventHandler("main", "OnAfterUserLogin", [
    '\BGSGroup\EventHandlers\CrmUserCheckRights',
    "checkUserData"
]);

Здесь же проверяются группы пользователя, если у него стоит галочка в форме редактирования пользователя БУС:

Группы устанавливаются в зависимости от отделов, к которым принадлежит пользователь на портале. Настройка привязки групп к отделам происходит в настройках в backend (вкладка `Bitrix24):