Система приглашений
Кратко
Система приглашений позволяет администраторам подключать сотрудников клиентских компаний к платформе поддержки. Поддерживаются два типа приглашений: общая ссылка для компании (invite link) и персональное приглашение конкретному человеку (personal invite). Приглашения обрабатываются через публичную страницу join.html и бэкенд join.php. Данные хранятся в таблицах client_orgs (код ссылки) и client_invites (персональные приглашения).
Кто имеет доступ
| Роль | Создание ссылки | Персональное приглашение | Отмена приглашения |
|---|---|---|---|
| Администратор | Да | Да | Да |
| Руководитель | Да | Да | Да |
| Оператор | Нет | Да | Да |
| Сотрудник клиента | Нет | Нет | Нет |
Где найти
Управление приглашениями доступно из карточки компании:
- Перейти в Клиенты → вкладка Компании (
#client-orgs).
- Нажать Управление на нужной компании.
- В карточке — секции «Ссылка-приглашение» и «Персональные приглашения».
Публичная страница принятия приглашения: https://support.tehprof.kz/join.html.
Как работает
Два типа приглашений
| Тип | Параметр URL | Таблица | Описание |
|---|---|---|---|
| Ссылка компании | ?code=XXXX | client_orgs.invite_code | Общая ссылка, по которой может присоединиться любой |
| Персональное | ?t=XXXX | client_invites.invite_token | Отправляется конкретному контакту (email или телефон) |
Ссылка компании (invite link)
Каждая компания получает уникальный код при создании. Формат ссылки: https://support.tehprof.kz/join.html?code=ABC123.
Поведение зависит от режима:
- Открытый — пользователь регистрируется и сразу получает доступ.
- По заявке — создаётся запись со статусом
pending, администратор подтверждает вручную. - Закрытый — ссылка не принимается, возвращается ошибка 403.
Администратор может перегенерировать код (старый перестаёт работать) или установить лимит использований (invite_max_uses).
Персональное приглашение (personal invite)
Оператор или администратор создаёт приглашение, указывая контакт (email или телефон) и имя получателя. Система генерирует уникальный токен и формирует ссылку join.html?t=TOKEN.
Статусы приглашения:
| Статус | Описание |
|---|---|
pending | Ожидает принятия |
accepted | Принято — пользователь получил доступ |
declined | Отклонено получателем |
expired | Истёк срок действия |
cancelled | Отменено оператором |
Персональные приглашения всегда дают статус active (не требуют подтверждения), в отличие от ссылки в режиме «По заявке».
Процесс принятия приглашения
- Пользователь открывает ссылку
join.html.
- Фронтенд вызывает
join.php?action=info— получает название компании и тенанта.
- Пользователь вводит имя, email/телефон и пароль (необязательно).
- Фронтенд вызывает
accept_link(для ссылки) илиaccept_invite(для персонального).
- Бэкенд находит или создаёт запись в
users(черезfind_or_create_user), создаётuser_orgs.
- Пользователь видит подтверждение подключения.
Безопасность
- Rate limiting: не более 10 попыток за 15 минут с одного IP.
- Пароли: хешируются через Argon2ID.
- Токены: генерируются криптографически стойким способом.
- Срок действия: персональные приглашения имеют
expires_at— после истечения автоматически помечаются какexpired. - Проверка тенанта: принимаются только приглашения от тенантов со статусом
activeилиtrial.
API
| Действие | Endpoint | Доступ |
|---|---|---|
| Информация о приглашении | join.php?action=info | Публичный |
| Принять ссылку компании | join.php?action=accept_link | Публичный |
| Принять персональное | join.php?action=accept_invite | Публичный |
| Создать приглашение | admin.php?action=create_client_invite | Оператор+ |
| Отменить приглашение | admin.php?action=cancel_client_invite | Оператор+ |
| Список приглашений | admin.php?action=list_client_invites | Оператор+ |
Частые вопросы
Может ли пользователь присоединиться без пароля?
Да. Пароль при принятии приглашения необязателен. Пользователь сможет войти через OAuth (Google, Yandex) или установить пароль позже.
Что произойдёт, если отправить приглашение на уже зарегистрированный email?
Система найдёт существующего пользователя и просто создаст связь с компанией (user_orgs). Дублирования аккаунтов не произойдёт.
Как отправить ссылку клиенту?
Скопируйте ссылку из карточки компании (кнопка копирования) и отправьте через любой канал: email, WhatsApp, Telegram, мессенджер. Система не отправляет ссылку автоматически.
Можно ли ограничить количество переходов по ссылке?
Да. Поле invite_max_uses задаёт лимит. После его достижения ссылка перестаёт работать.
Связанные статьи
- Управление компаниями-клиентами — создание компаний и режимы приглашений.
- Единый аккаунт и способы входа — регистрация и авторизация пользователей.
- Подключение клиентской компании — пошаговое руководство.