Перейти к содержанию

Люди и конфиденциальность

Каждый, кого знает Helpdesk Pro, — человек: сотрудники, клиенты, входящие с учётной записью Grav, и люди, которые только писали по почте или через гостевую форму. Эта страница описывает управление людьми, объединение, юридические удержания и удаление, а также то, что Helpdesk Pro хранит о каждом.

Для чтения людей нужно helpdesk-pro.desk. Для всего, что меняет человека, нужно helpdesk-pro.people.manage.

Экран «Люди»

People (#/people, в разделе Library) перечисляет всех с полем поиска (имя или адрес электронной почты), фильтром вида (все, клиенты, сотрудники) и фильтром состояния (активные, заблокированные, удалённые). Все три входят в адрес, поэтому отфильтрованный список — ссылка. В меню ⋯ строки есть Send sign-in link и Block или Unblock. Add person создаёт клиента только с почтой, когда вы хотите открыть заявку для человека, который ещё не писал.

Страница человека (#/people/<id>) показывает:

  • его имя, сотрудник он или клиент, его состояние и юридическое удержание, а также его адрес и учётную запись Grav;
  • его обращения, начиная с новых;
  • детали: адрес (с «not verified», когда его учётная запись его не подтвердила), связанную учётную запись Grav, язык, часовой пояс и когда его впервые и последний раз видели;
  • для сотрудников, управляющих людьми, What Helpdesk Pro holds about them: количество строк по запросу субъекта данных (обращения, ответы, заметки, файлы, уведомления, ожидающие письма, ссылки для входа, поиски в справочном центре…), а также примечание о каждой другой записи с тем же адресом с Merge it into для этого человека.

Меню ⋯ содержит Edit, Block или Unblock, Link a Grav account или Unlink it, Merge into…, Place или Release legal hold и Erase. Erase не предлагается, пока действует юридическое удержание.

Что могут делать сотрудники

  • Edit имя или адрес. Адрес должен быть свободен: два человека никогда не могут владеть одним.
  • Block и unblock. Заблокированный человек не может отправлять обращения, отвечать в вебе или по почте, получать ссылки для входа, а почта от него записывается в журнал и отбрасывается. Его заявки остаются и продолжают работать для всех остальных.
  • Send a sign-in link. Отправляет клиенту ссылку для входа. Сотрудникам ссылка никогда не показывается. В ней отказывают сотрудникам, заблокированным и удалённым людям, людям без адреса, при выключенном portal.magic_links и после пяти ссылок одному человеку за час.
  • Link или unlink учётную запись Grav. Свяжите существующую учётную запись по её имени пользователя, когда знаете, что она его: тогда учётная запись видит обращения человека в портале. Учётная запись, уже принадлежащая другому, отклоняется (вместо этого объедините двух людей). Отвязка сохраняет человека и его заявки. Учётная запись, чей адрес подтверждён и совпадает, снова связывается сама при следующем входе, поэтому отвяжите и смените адрес, если это действительно разные люди. Связывание также выдаёт учётной записи группы Grav из portal.client_groups (клиенты) или desk.staff_groups (сотрудники), которых у неё ещё не было.

Один адрес — один заявитель

Один адрес может оказаться на двух записях: человек только с почтой, который написал, и учётная запись, чей владелец зарегистрировался с этим адресом, но не подтвердил его. Helpdesk Pro держит их раздельно, потому что при регистрации любой может ввести чужой адрес.

Рабочая область скрывает это от сотрудника, открывающего заявку:

  • Поиск заявителя в форме новой заявки показывает одну запись на адрес: человека, которому достанется заявка для этого адреса. Это учётная запись, как только её адрес подтверждён, и человек только с почтой до этого.
  • Когда у учётной записи есть адрес, но он не подтверждён, запись говорит account not verified. Выбор её отправляет адрес, а не учётную запись, поэтому заявка достаётся человеку только с почтой для этого адреса.

Когда клиент позже подтверждает адрес (ссылкой для входа или пунктом «Verify your email to see earlier requests» в портале), две записи соединяются сами. Список People показывает каждую запись, поэтому вы можете найти обе и объединить их, когда это один и тот же человек.

Объединение двух людей

Объединяйте, когда две записи — один и тот же человек: два адреса, с которых он пишет, или запись только с почтой и учётная запись, созданная без подтверждения адреса.

  1. Откройте человека, которого нужно присоединить.
  2. Выберите Merge into… и введите человека, которого нужно сохранить (его адрес или номер, например #42).
  3. Подтвердите.

Всё, что указывает на присоединённого человека, переходит к сохранённому: обращения, сообщения, строки копий и наблюдателей, назначения, уведомления, поставленная в очередь и отправленная почта, загруженные файлы, ссылки для входа, членство в проектах, активность, история справочного центра, сохранённые представления и ответы, полученная почта. После этого присоединённая запись удаляется.

  • Сохранённый человек сохраняет свои имя, адрес и учётную запись и берёт только то, чего у него нет.
  • Когда присоединённая запись владела адресом, который сохранённая учётная запись не подтвердила, адрес становится подтверждённым.
  • Сохранённый человек сохраняет свою организацию или берёт организацию присоединённого, когда у него её нет.
  • Если присоединённая запись была заблокирована, сохранённая тоже блокируется, а юридическое удержание переходит к сохранённому.
  • Каждая заявка, сменившая владельца, получает внутреннюю строку «person merged» в активности.

Две записи, у каждой из которых есть своя учётная запись Grav, никогда не объединяются. Объединение себя с другим, объединение с собой и объединение удалённого человека тоже отклоняются. Объединение нельзя отменить.

То же объединение выполняется само, когда учётная запись подтверждает адрес, уже принадлежащий человеку только с почтой: запись учётной записи складывается в человека только с почтой, который сохраняет свой id и историю и получает учётную запись.

Юридическое удержание не даёт удалить записи человека, например во время спора или по решению суда. Пока человек под удержанием, удаление отклоняется, а уже поставленное в очередь удаление останавливается при выполнении задания (его отчёт говорит held).

Удержание записывает причину, кто его наложил и когда. Снятие удаляет его, поэтому храните причину в своих записях, если она понадобится позже.

Удаление человека

Удаление предназначено для запроса «право быть забытым» (GDPR). Есть два режима:

Режим Что происходит
anonymize (по умолчанию) Имя и адрес становятся «Erased person #id». Связь с учётной записью Grav, язык, часовой пояс, предпочтения, хеш IP и ссылки для входа исчезают; колокольчик и история справочного центра удаляются; исходные письма, хранившиеся за его сообщениями, удаляются; его убирают со всех заявок, за которыми он только наблюдал, и снимают с назначений; почта, ждущая его, отменяется. Написанное им остаётся как ваша запись переписки.
delete_content Всё, что делает anonymize, плюс каждое написанное им сообщение становится «[removed]», тема каждого открытого им обращения становится «[removed]», а каждый загруженный им файл удаляется.
  1. Откройте страницу человека.
  2. Выберите Erase в меню ⋯ и режим.
  3. Подтвердите.

Удаление выполняется как задание people.erase, обычно в течение минуты, в одной транзакции базы данных, и его нельзя отменить. Страница человека показывает удаление, пока оно ждёт, и его отчёт после выполнения. Чтобы удалить сразу с сервера, выполните bin/plugin helpdesk-pro erase <id> (см. CLI).

Повторять безопасно: повторный запуск ничего не меняет, а delete_content после anonymize удаляет оставшееся. Его учётная запись Grav не удаляется, поскольку учётная запись принадлежит сайту; удалите её в Accounts в Admin Next, если он просил и об этом. Если он снова войдёт с ней, он начнёт как новый пустой человек.

Что удаляет удаление

Данные anonymize delete_content добавляет
Почта, ждущая его Отменяется; адрес, переменные и заголовки в её строках очищаются
Его колокольчик Удаляется. Уведомления других сотрудников о нём называют «Erased person #id».
Ссылки для входа и адреса ответа Удаляются
Файлы Неотправленные загрузки удаляются Каждый файл в его сообщениях и каждый загруженный им файл удаляется
Сообщения Исходное письмо, хранившееся за его сообщениями, удаляется Тело каждого написанного им сообщения становится «[removed]»
Заявки Его снимают со всех назначений. Его обращения остаются его и показывают «Erased person #id». Тема каждого открытого им обращения становится «[removed]»
Участие в заявках Он перестаёт наблюдать за каждой заявкой; его строки заявителя отключаются
Проекты Он покидает каждый проект и перестаёт быть исполнителем по умолчанию любого проекта
История справочного центра Его поиски и просмотры статей удаляются «Before writing in» в его обращениях удаляется
Присутствие и живые слушатели Удаляются
Сохранённые представления и ответы Его личные удаляются; общие остаются
Журнал входящей почты Адрес отправителя очищается, исходное сообщение удаляется Тема и детали тоже очищаются
Оценки Его ссылки на оценку удаляются; данные им оценки теряют комментарий и связь с ним Данные им оценки удаляются
Организация Он покидает её; открытые им обращения сохраняют её
Пользовательские поля Публичные значения полей в его обращениях очищаются; readonly и внутренние остаются
Человек Имя становится «Erased person #id»; адрес, подтверждение, связь с учётной записью, язык, часовой пояс, предпочтения, копия прав, последний визит и хеш IP очищаются; состояние становится erased
Активность Каждая заявка, где он был, получает внутреннюю строку «erased» с указанием режима

Файлы никогда не удаляются внутри транзакции. Файл, который больше никто не использует, помечается для сбора, и задание attachments.gc удаляет его с диска и из бакета сразу после. Те же байты, прикреплённые кем-то другим, сохраняют файл для него.

Имена в чужих словах

Сотрудники пишут имя клиента: сохранённый ответ подставляет «Hi Nia,», заметка говорит «Nia Long called again». Поэтому удаление также проходит по каждой заявке, где был человек, и заменяет его имя на «Erased person #id» в обоих режимах. Заявки, где его не было, никогда не затрагиваются.

Что заменяется, как целые слова в любом сочетании верхнего и нижнего регистра:

  • Его адрес электронной почты в том виде, в каком он был до удаления.
  • Его полное отображаемое имя («Nia Long»).
  • Его имя отдельно, когда оно не короче трёх букв и не является также обычным словом.
  • Короткое или обычное имя («Al», «Will», «May», «Grace» и ещё около сотни) только сразу после приветствия или благодарности: «Hi», «Hello», «Hey», «Dear», «Thanks», «Thank you», «Cheers», «Welcome» или «Good morning/afternoon/evening».

Его фамилия отдельно остаётся, как и псевдоним, которым он подписался. Коллега с тем же именем тоже теряет его в этих заявках. Форматирование сохраняется, а повторное удаление ничего не меняет.

Письма строятся при отправке, поэтому почта об обращениях человека, ушедшая после удаления, уже читает «[removed]» и «Erased person #id». Поисковый индекс перестраивает каждую заявку, где был человек, а открытые рабочие области обновляют их. Чёрный список сохраняет любую запись, сделанную сотрудниками с его адресом.

Что хранит Helpdesk Pro

Человек — это имя, адрес, подтверждён ли адрес, связанная учётная запись Grav, язык и часовой пояс, предпочтения уведомлений, когда он был последний раз активен (и хеш его IP-адреса, см. ниже), а для сотрудников — копия их прав и групп. What Helpdesk Pro holds about them на странице человека — отправная точка для запроса субъекта данных.

Гостевое обращение хранит то, что ввёл гость: его имя (необязательно), адрес электронной почты и обращение. Адрес становится человеком только с почтой без учётной записи Grav, пока он не воспользуется ссылкой для входа. С обращением не хранится ничего о браузере или IP-адресе гостя.

Ссылки для входа хранятся только как хеш SHA-256, с тем, для кого они, что открывают, когда истекают и когда были использованы, плюс хеш IP-адреса, запросившего их. Строки удаляются через день после истечения или использования ссылки.

Ограничения частоты гостевой формы и ссылок для входа считаются по хешированным ключам: IP-адрес или адрес электронной почты никогда не записываются как есть. Счётчики удаляются через пару часов.

Чёрный список хранит ровно то, что положили в него сотрудники.

Проверки спама читают форму и ничего больше. Приманка — пустое поле, которого люди не видят, а временная ловушка — подписанная отметка времени в форме, а не cookie.

Cookie. Гостевой форме и странице входа нужен сессионный cookie Grav для nonce формы. Справочный центр ставит один функциональный cookie hd_kb, чтобы связать обращение с поисками перед ним (см. Базу знаний). Вход по ссылке не добавляет ничего сверх обычной сессии плагина Login.

Капча. По умолчанию Cap работает целиком на вашем сайте. Cloudflare Turnstile и Google reCAPTCHA, если выбрать их в portal.captcha, загружают скрипт этих компаний и отправляют им ответ посетителя и IP-адрес. Упомяните это в уведомлении о конфиденциальности, если используете их.

Каналы уведомлений копируют факты заявок в Slack, Discord, webhook или почтовый ящик. Заметки, внутренние поля, ответы сотрудников и переписка никогда не уходят, а слова самого клиента — только когда вы включаете Include the first lines of a client's message. После публикации сообщение живёт по правилам хранения этого сервиса, а не вашим: удаление человека не достаёт до истории канала Slack. См. Каналы уведомлений.

Сроки хранения

Что Хранится Настройка
Последний IP-адрес человека Хранится как хеш SHA-256 или как есть, когда выключено privacy.ip_hashing (true)
Поиски, просмотры и ответы справочного центра 90 дней privacy.kb_events_days
Исходная копия каждого полученного письма 90 дней (0 хранит) privacy.inbound_raw_days
Прочитанные уведомления 90 дней notifications.keep_read_days
Отправленные, неудачные и отменённые строки почты, завершённые задания 30 дней jobs.retention_days
Журналы доставок каналов 14 дней channels.log_days
Ссылки для входа и истёкшие ссылки на оценку Через день после истечения или использования

Удаляет ежедневное задание maintenance.prune.

API и MCP

Основные маршруты людей находятся в REST API. Им нужно helpdesk-pro.people.manage:

Маршрут Тело Ответ Инструмент MCP
GET /helpdesk-pro/people/{id}/privacy {person, account, legal_hold, erasure, holdings, same_email, sign_in_link} get_person_privacy
POST /helpdesk-pro/people/{id}/magic-link {sent: true}; 409 с причиной, когда ссылку нельзя отправить send_sign_in_link
POST /helpdesk-pro/people/{id}/merge {into_id} Сохранённый человек; 409 для двух учётных записей; 422 без into_id merge_person
POST /helpdesk-pro/people/{id}/erase {mode: anonymize or delete_content} 202 {job_id, mode}; 409 под юридическим удержанием или для себя erase_person
POST /helpdesk-pro/people/{id}/account {username} Человек; 409, когда учётная запись принадлежит другому link_person_account
DELETE /helpdesk-pro/people/{id}/account Человек unlink_person_account
PUT /helpdesk-pro/people/{id}/legal-hold {reason} Удержание place_legal_hold
DELETE /helpdesk-pro/people/{id}/legal-hold 204; 404, когда его нет release_legal_hold

В сводке конфиденциальности holdings — количество строк по областям, erasure — новейшее удаление (job_id, mode, state, requested_at, report), same_email перечисляет другие записи с тем же адресом, а sign_in_link говорит, можно ли отправить ему ссылку и, если нет, почему.