> ## Documentation Index
> Fetch the complete documentation index at: https://docs.yume.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# Профиль и управление сотрудниками

> Просмотр и редактирование собственного профиля, управление карточками сотрудников — роли, точки проката, зарплата — и вход по разовой ссылке.

Полный перечень полей — в [глоссарии](/ru/logic/user/profile-glossary).

## Обзор

Этот раздел отвечает за две задачи: показать и отредактировать собственный профиль, а также управлять карточками сотрудников компании (роли, точки аренды, зарплата). Сюда же входит служебный вход по одноразовому кросс-токену и общий набор вспомогательных функций поиска пользователя, привязки к компании и проверки уникальности.

Важно с самого начала различать два разных сценария:

* **«Мой профиль»** — пользователь читает и правит только собственные базовые данные (имя, фамилия, почта, аватар, пароль). Роли, точки и зарплату через этот путь изменить нельзя, даже если они показываются при чтении.
* **«Управление сотрудником»** — привилегированное создание и редактирование карточки другого пользователя вместе с ролями, точками аренды и зарплатой. Здесь роли записываются в членство пользователя в компании, а зарплата и точки — в свои отдельные записи.

<Info>
  Роли (Группа прав, Сотрудник, Субарендатор, Суперпользователь компании) физически хранятся не в самом пользователе, а в его членстве в компании. Один и тот же человек в разных компаниях может иметь разные роли. Пароль при этом один глобальный.
</Info>

## Профиль пользователя (чтение и обновление)

Адрес профиля доступен только авторизованному пользователю и работает всегда с его собственной записью: объект выбирается по идентификатору текущего пользователя из токена, а не по идентификатору из URL. Подставить чужой идентификатор невозможно.

### Что подмешивается к профилю при чтении

Перед отдачей профиль дополняется тремя вычисляемыми значениями:

| Поле                  | Тип             | Назначение                                                                                      |
| --------------------- | --------------- | ----------------------------------------------------------------------------------------------- |
| Сумма зарплаты        | число (2 знака) | берётся из связанной записи о зарплате менеджера                                                |
| Список точек аренды   | список чисел    | собираются точки аренды пользователя **в текущей компании** (точки других компаний не попадают) |
| Основная точка аренды | число           | первый элемент из списка точек                                                                  |

<Note>
  Список точек фильтруется по текущей компании: один и тот же пользователь, открывая профиль под разными компаниями, увидит разные наборы точек. Основная точка — это просто первый элемент массива точек (нумерация в базе начинается с единицы), а не какая-то специально помеченная «главная» точка.
</Note>

### Что видно и что можно менять

* **На чтение** отдаётся детальный профиль: базовые поля, роли (только для чтения), основная и полный список точек, сумма зарплаты.
* **На запись** доступен ограниченный набор: только имя, фамилия, аватар, почта и пароль.

<Warning>
  Ключевой момент: при чтении профиля видны роли, точки и зарплата, но изменить их через сохранение собственного профиля нельзя — при записи используется урезанный набор полей. Это защита от того, чтобы пользователь сам себе не выдал права или не переписал зарплату. Все «лишние» поля, присланные в запросе на сохранение, просто игнорируются.
</Warning>

При сохранении собственного профиля почта проверяется на уникальность (см. раздел о проверке уникальности), при этом текущий пользователь исключается из проверки, чтобы сохранение без смены почты не выдавало ложную ошибку «почта занята». Пароль, если он передан, сохраняется в захешированном виде.

## Управление карточкой сотрудника

Расширенная форма создания и редактирования обслуживает привилегированный сценарий — заведение и правку сотрудников компании. Он затрагивает сразу несколько сущностей.

### Поля

| Поле                                                             | Тип                 | Назначение                                            |
| ---------------------------------------------------------------- | ------------------- | ----------------------------------------------------- |
| Имя, Фамилия, Аватар                                             | текст / изображение | базовые данные                                        |
| Электронная почта                                                | текст               | обязательна                                           |
| Пароль                                                           | текст               | только запись, обязателен; сохраняется захешированным |
| Группа прав, Сотрудник, Субарендатор, Суперпользователь компании | число / флаги       | записываются в членство пользователя в компании       |
| Точки аренды                                                     | список              | синхронизируются с записями о точках пользователя     |
| Сумма зарплаты                                                   | число (2 знака)     | необязательна; пишется в запись о зарплате            |

### Что происходит при создании

1. Из входных данных отделяются роли, зарплата, точки и пароль.
2. Создаётся сам пользователь.
3. Создаётся (или обновляется) членство этого пользователя в текущей компании с указанными ролями.
4. Пересчитывается лимит на число сотрудников компании.
5. Если передан пароль — он сохраняется захешированным.
6. Если переданы точки — они привязываются к пользователю. Первая привязка становится активной только если у пользователя ещё нет ни одной активной точки; иначе новые точки добавляются как неактивные.
7. Если сумма зарплаты задана (и не нулевая) — создаётся или обновляется запись о зарплате.

### Что происходит при обновлении

Логика близка к созданию, но с двумя отличиями:

* **Точки синхронизируются полностью**: точки, которых нет в новом списке, удаляются, оставшиеся и новые — привязываются заново. То есть присланный список полностью замещает прежний набор.
* **Роли**: если роль не пришла в запросе, для флагов подставляется текущее значение пользователя, а Группа прав при отсутствии значения обнуляется.

<Warning>
  Зарплата и точки записываются только если значение «истинно». Пустая или нулевая сумма зарплаты не обнулит уже сохранённую зарплату — она просто будет пропущена. Чтобы фактически изменить зарплату, нужно прислать ненулевое число.
</Warning>

<Info>
  Лимит на количество сотрудников пересчитывается при создании нового сотрудника. Это часть контроля тарифных ограничений компании.
</Info>

## Вход по разовой ссылке

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

Как это работает:

1. Система проверяет, что ссылка ещё действительна и ни разу не использована.
2. Ссылка сразу помечается использованной — повторно она уже не сработает.
3. По ней определяется, кому она принадлежит, и человек входит в систему.
4. Обновляется отметка о последнем входе.

<Info>
  Ссылка **одноразовая в полном смысле**: она гасится в момент использования, поэтому два одновременных перехода по одной ссылке приведут к входу только один раз. Если человеку нужно перейти снова, ему выдаётся новая ссылка — кнопка перехода в компанию всегда выдаёт непогашенную.
</Info>

<Warning>
  Недействительная, истёкшая или уже использованная ссылка вход не выполняет: обращение отклоняется с понятной ошибкой «токен недействителен или уже использован», а не отвечает успехом без данных для входа.
</Warning>

## Вспомогательные функции пользователей

Общий служебный слой, переиспользуемый входом, регистрацией и профилем.

### Поиск пользователя

Ищет пользователя последовательно по телефону, затем по почте, затем по имени пользователя — берётся первое непустое из переданных значений. В пределах одного поля возвращается пользователь с наименьшим идентификатором. Если ничего не передано или ничего не найдено — возвращается пустой результат.

### Привязка к компании

Создаёт участие человека в компании с заданными ролями. Если компания не определена (например, без выбранной компании) — привязка не выполняется. Используется механизм «получить или создать»: если членство уже есть, повторный вызов **не перезапишет** его роли.

<Note>
  Привязка к компании не обновляет существующее членство — она только создаёт недостающее. Для изменения ролей уже привязанного сотрудника используется сценарий управления карточкой сотрудника, а не эта функция.
</Note>

### Проверка уникальности

Настоящая защита уникальности по телефону, почте и имени пользователя. Для каждого заполненного значения проверяется, нет ли уже другого пользователя с таким же значением; текущий пользователь при правке исключается из проверки по его идентификатору. При нахождении дубликатов возвращается понятное сообщение об ошибке по каждому конфликтующему полю (например, «Пользователь с такой почтой уже существует»).

<Tip>
  Именно эта функция — реальная точка контроля уникальности при входе, регистрации и правке профиля. Проверять уникальность на уровне интерфейса недостаточно; окончательное решение принимает она.
</Tip>

## Как это используется

* Мобильные и веб-клиенты открывают «Мой профиль» на чтение, чтобы показать данные и роли пользователя, и на запись — чтобы обновить базовые поля или сменить пароль.
* Раздел управления сотрудниками использует расширенную форму для заведения и правки карточек с ролями, точками и зарплатой.
* Кросс-токен применяется для бесшовного перехода в систему без повторного ввода логина и пароля.

## Связанные страницы

<CardGroup cols={2}>
  <Card title="Глоссарий: Профиль и управление пользователями" icon="book" href="/ru/logic/user/profile-glossary">
    Полный перечень полей профиля, карточки сотрудника и вспомогательных функций.
  </Card>

  <Card title="Пользователи и доступ" icon="user-lock" href="/ru/logic/user">
    Обзорная страница раздела: аккаунт, участие в компании, роли и права.
  </Card>

  <Card title="Проблемы и логические ошибки" icon="bug" href="/ru/logic/user/issues">
    Сводка известных багов и логических изъянов всего модуля в одном месте.
  </Card>

  <Card title="Аккаунт и участие в компании" icon="user" href="/ru/logic/user/model">
    Как аккаунт связан с телефоном, как устроено участие в компаниях и откуда берутся роли.
  </Card>

  <Card title="Вход в систему" icon="right-to-bracket" href="/ru/logic/user/login">
    По каким данным можно войти — телефон, логин или адрес почты — и откуда берутся права.
  </Card>

  <Card title="Сессии и срок действия входа" icon="key" href="/ru/logic/user/sessions">
    Сколько живёт вход, как он продлевается и когда потребуется войти заново.
  </Card>

  <Card title="Как система определяет вашу компанию" icon="route" href="/ru/logic/user/active-company">
    Определение компании по адресу сайта или по аккаунту и что делать, если компании ещё нет.
  </Card>

  <Card title="Сброс пароля по коду" icon="unlock-keyhole" href="/ru/logic/user/password-reset">
    Восстановление доступа по коду из письма, с ограничением частоты запросов.
  </Card>

  <Card title="Вход через Google" icon="google" href="/ru/logic/user/google-login">
    Вход по аккаунту Google и связывание его с существующим профилем.
  </Card>

  <Card title="Уровни лояльности и карты" icon="star" href="/ru/logic/user/loyalty">
    Уровни лояльности клиентов и оформление их карт для Apple и Google Wallet.
  </Card>
</CardGroup>
