# Матрица User Flow для Тестирования Платформы (CLIENT / LAWYER / ADMIN)

## Назначение
Этот файл описывает полный набор пользовательских сценариев для тестирования платформы через веб-интерфейс.
Используется как:
1. чеклист ручной приемки,
2. источник для e2e/интеграционных сценариев,
3. карта corner cases по ролям.

## Общие правила проверки
1. Все ключевые сценарии проверять через UI (не только по API).
2. Для каждого сценария проверять:
   - видимость данных по роли,
   - корректность уведомлений/непрочитанного,
   - записи в истории статусов/чата,
   - отсутствие утечки служебной/финансовой информации клиенту.
3. Для статусов:
   - `важная дата` видна клиенту, юристу и администратору,
   - для юриста/администратора это дедлайн текущего статуса,
   - смена статуса логируется вместе с `важной датой` и комментарием.
4. Для файлов:
   - проверять и успешный сценарий, и ошибки (размер, MIME, предпросмотр, поврежденный файл).

## Тестовые роли и данные (рекомендуемые)
1. `ADMIN`: `admin@example.com` / `admin123`
2. `LAWYER #1`: основной юрист (назначенные заявки)
3. `LAWYER #2`: другой юрист (для проверок запрета доступа к чужим данным)
4. `CLIENT #1`: новый клиент (новый номер телефона)
5. `CLIENT #2`: второй клиент (для проверки изоляции JWT/заявок)

## CLIENT (Пользователь / Заказчик)

### C01. Просмотр лендинга и создание заявки (happy path)
1. Открыть лендинг.
2. Открыть модальную форму создания заявки.
3. Заполнить:
   - ФИО,
   - телефон,
   - тему,
   - описание.
4. Пройти OTP-подтверждение телефона.
5. Создать заявку.
6. Проверить:
   - выдан уникальный номер заявки,
   - создается запись клиента (`client`) и связь с заявкой,
   - клиент не видит служебные поля (ставка, стоимость, внутренние ID, ответственные ID, финансовые поля).

### C02. Повторный вход в клиентский контур по номеру/OTP
1. На лендинге нажать кнопку перехода к работе с заявкой.
2. Если нет JWT (новое устройство/браузер), пройти OTP.
3. Открыть страницу работы с заявкой.
4. Проверить:
   - доступ только к своим заявкам,
   - после авторизации создается 7-дневный JWT/сессия устройства,
   - повторный вход на том же устройстве не требует OTP до истечения срока.

### C03. Переключение между заявками клиента
1. Создать 2+ заявки на один телефон.
2. Открыть клиентский кабинет.
3. Переключаться между заявками в UI.
4. Проверить:
   - отображаются только заявки этого клиента,
   - корректно обновляются статус, чат, файлы, важная дата, уведомления,
   - переход не ломает состояние JWT/авторизации.

### C04. Просмотр карточки заявки (видимость данных)
1. Открыть заявку в клиентском кабинете.
2. Проверить, что видны:
   - номер заявки,
   - тема,
   - статус,
   - важная дата (дедлайн),
   - история/маршрут статусов,
   - чат,
   - файлы,
   - запросы дополнительных данных.
3. Проверить, что НЕ видны:
   - ставка юриста,
   - внутренние финансовые поля,
   - служебные ID,
   - служебные комментарии/системная информация, не предназначенная клиенту.

### C05. Чат клиент <-> юрист (happy path)
1. Клиент отправляет сообщение юристу.
2. Юрист отвечает.
3. Клиент обновляет/переоткрывает заявку.
4. Проверить:
   - сообщения отображаются в стиле чата,
   - метки времени/даты корректны,
   - непрочитанные индикаторы появляются и сбрасываются после открытия заявки,
   - история сообщений сохраняется.

### C06. Загрузка файлов клиентом (happy path)
1. В карточке заявки/чате прикрепить файл.
2. Отправить сообщение с файлом.
3. Проверить:
   - файл загружается,
   - появляется в чате и во вкладке файлов,
   - доступен предпросмотр/скачивание,
   - размер учитывается в лимитах заявки.

### C07. Запрос дополнительных данных от юриста (частичное заполнение)
1. Юрист создает `Запрос` с несколькими полями.
2. Клиент открывает сообщение `Запрос`.
3. Заполняет часть полей, сохраняет.
4. Повторно открывает запрос и дозаполняет остальное.
5. Проверить:
   - заполненные поля отмечаются и зачеркиваются в чате,
   - незаполненные остаются активными,
   - после полного заполнения запрос сворачивается и меняет цвет/состояние.

### C08. `file`-поле в запросе дополнительных данных
1. Юрист создает запрос с полем типа `file`.
2. Клиент загружает файл в это поле.
3. Проверить:
   - файл реально загружается как attachment,
   - поле считается заполненным,
   - файл доступен в файлах заявки и в контексте запроса,
   - юрист видит, что запрос выполнен.

### C09. Оповещения клиента
1. Юрист меняет статус.
2. Юрист отправляет сообщение.
3. Юрист загружает файл.
4. Клиент открывает кабинет.
5. Проверить:
   - есть визуальные индикаторы новых событий,
   - открытие заявки сбрасывает непрочитанное состояние,
   - важная дата обновляется при смене статуса.

### C10. Терминальный статус (завершение заявки)
1. Юрист/админ переводит заявку в терминальный статус.
2. Клиент открывает заявку.
3. Проверить:
   - терминальный статус отображается корректно,
   - маршрут/история статусов содержит финальную запись,
   - важная дата по финальному статусу отображается.

### C11. Ошибка загрузки файла (корнер-кейсы)
Проверить UI-реакцию и корректный текст ошибки:
1. Слишком большой файл (>25MB).
2. Превышение суммарного лимита по заявке (>250MB).
3. Обрыв сети/ошибка presigned upload.
4. Неподдерживаемый или некорректный MIME.
5. Проверить:
   - пользователь видит понятную ошибку,
   - UI не зависает,
   - частично неуспешная отправка не ломает чат,
   - дубликаты/битые attachments не создаются.

### C12. Слишком длинное сообщение / некорректное сообщение
1. Отправить очень длинный текст (выше backend-лимита, если установлен).
2. Отправить пустое сообщение.
3. Отправить сообщение из пробелов.
4. Проверить:
   - понятная ошибка в UI,
   - ничего лишнего в чат не попадает,
   - состояние формы остается консистентным.

### C13. Предпросмотр файлов (валидный / невалидный)
1. Валидный `pdf`, `jpg`, `mp4`, `txt`.
2. Невалидный PDF (файл с MIME `application/pdf`, но без `%PDF-`).
3. `.txt` с кривым MIME (`application/pdf`).
4. Проверить:
   - валидные файлы открываются,
   - невалидный PDF дает fallback (понятное сообщение / текстовый предпросмотр),
   - `.txt` открывается текстом даже при кривом MIME.

### C14. Безопасность доступа клиента (изоляция)
1. Открыть чужой номер заявки.
2. Использовать JWT клиента #1 для заявки клиента #2.
3. Попробовать открыть прямые URL файлов чужой заявки.
4. Проверить:
   - доступ запрещен,
   - нет утечки метаданных.

## LAWYER (Юрист)

### L01. Вход и видимость заявок
1. Войти как юрист.
2. Открыть список заявок.
3. Проверить видимость:
   - свои заявки,
   - неназначенные заявки,
   - отсутствие чужих назначенных заявок.

### L02. Claim неназначенной заявки
1. В списке или в канбане выбрать неназначенную заявку.
2. Нажать `Взять в работу`.
3. Проверить:
   - заявка назначается текущему юристу,
   - в канбане/таблице обновляется исполнитель,
   - claim логируется (audit),
   - другой юрист больше не может ее claim'ить.

### L03. Канбан: просмотр и работа с карточками
1. Открыть `Канбан`.
2. Проверить:
   - группировка по группам статусов,
   - карточки содержат ключевые поля (номер, клиент, тема, дедлайн/важная дата, индикаторы новых сообщений/файлов),
   - горизонтальная прокрутка внутри блока, без растягивания страницы.

### L04. Канбан: drag&drop смена статуса (однозначная группа)
1. Перетащить карточку в колонку, где целевая группа сопоставляется с одним статусом.
2. Проверить:
   - статус меняется,
   - важная дата проставляется по умолчанию (`+3 дня`), если не задана явно,
   - изменение отображается в карточке и в истории статусов.

### L05. Канбан: drag&drop в группу с несколькими статусами
1. Перетащить карточку в колонку, где в группе >1 статуса.
2. Проверить:
   - открывается карточка заявки / модалка смены статуса,
   - доступны только статусы соответствующей группы,
   - можно выбрать конкретный статус и важную дату.

### L06. Смена статуса из карточки заявки (happy path)
1. Открыть карточку заявки.
2. Нажать кнопку смены статуса.
3. Выбрать новый статус, указать важную дату, добавить комментарий и файл.
4. Отправить.
5. Проверить:
   - статус заявки обновился,
   - важная дата изменилась,
   - запись появилась в истории статусов,
   - комментарий/файл попали в чат.

### L07. Терминальный статус (закрытие заявки юристом)
1. Юрист переводит заявку в терминальный статус.
2. Проверить:
   - статус обновлен,
   - заявка считается завершенной в dashboard/метриках,
   - история статусов содержит терминальный этап.

### L08. История статусов в модалке смены статуса
1. Открыть модалку смены статуса для заявки с несколькими сменами статусов.
2. Проверить:
   - список прокручивается внутри фиксированного блока,
   - новые записи сверху, старые снизу,
   - видны дата назначения, важная дата, длительность нахождения, комментарий (если есть).

### L09. Важные даты (дедлайн) у юриста
1. Сменить статус без указания даты.
2. Проверить автоподстановку `+3 дня`.
3. Сменить статус с ручной датой.
4. Проверить:
   - дедлайн отображается в карточке заявки,
   - дедлайн отображается в канбане,
   - цвет дедлайна в канбане соответствует сроку.

### L10. Чат и файлы юриста
1. Отправка сообщений клиенту.
2. Отправка файлов.
3. Отправка файла+сообщения.
4. Drag&drop файлов в чат.
5. Проверить:
   - сообщения/файлы видит клиент,
   - непрочитанные индикаторы работают,
   - предпросмотр/скачивание работают.

### L11. Запрос дополнительных данных (шаблоны)
1. Открыть модалку `Запросить`.
2. Выбрать существующий шаблон.
3. Проверить автозагрузку полей шаблона в таблицу (без дубликатов).
4. Добавить поле из справочника.
5. Создать новое поле через тот же инпут.
6. Сохранить шаблон:
   - новый,
   - перезапись своего.
7. Проверить:
   - чужой шаблон нельзя перезаписать (UI + backend),
   - badge/tooltip соответствуют статусу шаблона.

### L12. Ограничения редактирования заполненных клиентом доп.данных
1. После заполнения клиентом открыть запрос в чате.
2. Проверить, что юрист НЕ может:
   - менять название поля,
   - тип,
   - порядок,
   - удалять заполненное поле.
3. Проверить backend-защиту (через UI негативный сценарий / при попытке сохранить).

### L13. Ограничения по правам (чужая заявка)
1. Попробовать открыть/изменить чужую назначенную заявку.
2. Попробовать сменить статус чужой заявки.
3. Попробовать загрузить файл/написать сообщение в чужую заявку.
4. Ожидание: запрет доступа/операции.

### L14. Финансовые ограничения
1. Юрист не должен иметь возможность менять запрещенные финансовые поля через CRUD заявки.
2. Юрист не может подтверждать оплату счета (`PAID`).
3. Проверить UI/API сообщения об ошибке.

## ADMIN (Администратор)

### A01. Вход и доступ ко всем разделам
1. Войти как администратор.
2. Проверить доступ:
   - Обзор,
   - Канбан,
   - Заявки,
   - Счета,
   - Справочники,
   - `availableTables` по прямой ссылке.

### A02. Справочник пользователей (CRUD)
1. Создать юриста:
   - имя, email, пароль,
   - роль,
   - основная тема,
   - дополнительные темы,
   - ставка по умолчанию,
   - процент,
   - телефон,
   - аватар.
2. Отредактировать пользователя.
3. Деактивировать/активировать.
4. Проверить:
   - данные сохраняются,
   - аватар/инициалы отображаются корректно,
   - роль и RBAC применяются.

### A03. Справочники статусов и групп статусов
1. Создать/редактировать группы статусов.
2. Создать/редактировать статусы:
   - группа,
   - терминальность,
   - kind (обычный / счет / оплачено).
3. Проверить:
   - канбан строится по группам,
   - статусы появляются в свободном выборе смены статуса.

### A04. Таблицы в справочниках и `availableTables`
1. Открыть `/admin.html?section=availableTables`.
2. Включать/выключать таблицы.
3. Проверить:
   - неактивные таблицы исчезают из списка справочников,
   - активные появляются без фронтовой доработки (универсальное отображение),
   - `clients` видны в справочниках, если таблица активна.

### A05. Заявки: полный CRUD и ручное управление
1. Создать заявку вручную.
2. Привязать существующего клиента.
3. Создать нового клиента через форму заявки (если нет в списке).
4. Изменить тему/описание/исполнителя/стоимость.
5. Проверить:
   - `client_id` корректно проставляется,
   - стоимость заявки видна админу/юристу, скрыта клиенту.

### A06. Смена статуса заявки (с важной датой)
1. Открыть карточку заявки.
2. Через модалку смены статуса:
   - выбрать любой статус,
   - указать важную дату,
   - добавить комментарий/файл.
3. Проверить:
   - изменения видны клиенту/юристу/админу,
   - история статусов содержит важную дату и комментарий.

### A07. Администратор может корректировать заполненные доп.данные
1. После заполнения клиентом доп.данных открыть запрос.
2. Удалить/изменить заполненную строку (если требуется).
3. Проверить:
   - операция разрешена админу,
   - изменения консистентны.

### A08. Счета и оплаты (happy path)
1. Создать счет вручную.
2. Проверить формирование PDF.
3. Перевести в `Оплачен`.
4. Проверить:
   - дата оплаты проставляется,
   - данные видны в списке счетов,
   - юрист видит свои счета, админ — все.

### A09. Billing через статусы
1. Перевести заявку в billing-статус (если используется `INVOICE` / `PAID`).
2. Проверить:
   - срабатывает логика счетов/оплаты,
   - сумма/зарплата отражается в дашборде.

### A10. Dashboard администратора
Проверить плитки и метрики:
1. Новые / в работе / и др. статусы.
2. Выручка за месяц.
3. Расходы (зарплата юристов) за месяц.
4. Карточки загрузки юристов:
   - активные,
   - новые,
   - закрыто,
   - сумма,
   - зарплата.
5. Модалка статистики юриста:
   - фиксированные хедеры,
   - таблица активных заявок,
   - сумматоры внизу,
   - корректные переходы в карточки заявок.

### A11. Безопасность / аудит / доступы
1. Проверка доступа к файлам S3 по ролям.
2. Предпросмотр PDF/файлов через iframe/same-origin.
3. Проверка аудита действий (security audit / audit log).
4. Проверка, что ПДн и финансовые данные не уходят в публичный контур.

### A12. Corner cases администратора
1. Ошибки сохранения (невалидные поля, несуществующие ссылки).
2. Одновременное редактирование (refresh после сохранения).
3. Попытка удалить сущность, на которую есть ссылки.
4. Некорректные даты/числа в универсальных формах.
5. Проверить понятные ошибки и отсутствие “битого” состояния UI.

## Межролевые интеграционные сценарии (сквозные)

### X01. Полный цикл заявки (client -> lawyer -> terminal)
1. Клиент создает заявку.
2. Юрист берет в работу.
3. Юрист ведет чат, запрашивает данные/файлы.
4. Клиент заполняет запрос.
5. Юрист меняет статусы, выставляет важные даты.
6. Юрист завершает заявку терминальным статусом.
7. Проверить весь таймлайн и видимость по ролям.

### X02. Цикл со счетом и оплатой
1. Клиент создает заявку.
2. Юрист/админ переводит в статус выставления счета.
3. Админ формирует/подтверждает оплату счета.
4. Проверить:
   - счет виден в заявке и в списке счетов,
   - статус оплаты влияет на финансовые метрики,
   - зарплата юриста считается после `Оплачено`.

### X03. Непрочитанные события и уведомления
1. Создать набор событий: статус, сообщение, файл.
2. Проверить отображение индикаторов:
   - в списках,
   - в канбане,
   - в карточке заявки.
3. Проверить сброс после открытия заявки соответствующей ролью.

### X04. Ограничения прав и изоляция
1. CLIENT не видит служебные/финансовые поля.
2. LAWYER не видит/не меняет чужие заявки.
3. LAWYER не подтверждает оплату.
4. LAWYER не редактирует заполненные клиентом доп.данные.
5. ADMIN имеет доступ ко всем данным и операциям.

## Corner Cases (общий список для обязательного покрытия)
1. Пустые поля / пробельные значения.
2. Слишком длинные тексты сообщений / комментариев.
3. Файлы:
   - >25MB,
   - превышение 250MB на заявку,
   - невалидный PDF,
   - `.txt` с кривым MIME.
4. Повторные клики / double-submit.
5. Потеря сети во время upload/send/status-change.
6. Истекший JWT / отсутствие OTP.
7. Конфликт назначения заявки (claim race).
8. Удаление/изменение связанной сущности (клиент/статус/пользователь).
9. Переключение между заявками/разделами при открытых модалках.

## Рекомендация по автоматизации (e2e backlog)
Приоритетно выделить в отдельные Playwright-сценарии:
1. `public_client_notifications_flow`
2. `lawyer_status_change_modal_flow` (важная дата + комментарий + файл)
3. `kanban_multi_status_group_flow` (drag&drop -> выбор статуса)
4. `admin_finance_billing_dashboard_flow`
5. `client_file_upload_errors_flow`
6. `rbac_negative_flows` (client/lawyer/admin)

