Система приглашений

Кратко

Система приглашений позволяет администраторам подключать сотрудников клиентских компаний к платформе поддержки. Поддерживаются два типа приглашений: общая ссылка для компании (invite link) и персональное приглашение конкретному человеку (personal invite). Приглашения обрабатываются через публичную страницу join.html и бэкенд join.php. Данные хранятся в таблицах client_orgs (код ссылки) и client_invites (персональные приглашения).

Кто имеет доступ

РольСоздание ссылкиПерсональное приглашениеОтмена приглашения
АдминистраторДаДаДа
РуководительДаДаДа
ОператорНетДаДа
Сотрудник клиентаНетНетНет

Где найти

Управление приглашениями доступно из карточки компании:

  • Перейти в Клиенты → вкладка Компании (#client-orgs).
  • Нажать Управление на нужной компании.
  • В карточке — секции «Ссылка-приглашение» и «Персональные приглашения».

Публичная страница принятия приглашения: https://support.tehprof.kz/join.html.

Как работает

Два типа приглашений

ТипПараметр URLТаблицаОписание
Ссылка компании?code=XXXXclient_orgs.invite_codeОбщая ссылка, по которой может присоединиться любой
Персональное?t=XXXXclient_invites.invite_tokenОтправляется конкретному контакту (email или телефон)

Каждая компания получает уникальный код при создании. Формат ссылки: 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 задаёт лимит. После его достижения ссылка перестаёт работать.

Связанные статьи

Нужна поддержка, которая так и работает?

TehProf Support собирает обращения из WhatsApp, Telegram, почты и виджета в одну очередь, считает сроки по SLA и показывает, где служба проседает.