Направление работ: WebLk Код раздела: 6.4 Отчеты > Клиенты Раздел: Клиенты Статус: черновик Ответственный: Панкова Л.А. Версия: 0.1 Обновлено: 20.07.26
1. Назначение
Данный раздел обеспечивает партнеру интерфейс для просмотра отчета по клиентам в партнерской зоне.
Партнер просматривает список клиентов, ищет и фильтрует клиентов, добавляет клиента, запускает действия со списком и переходит в карточку клиента.
Раздел зависит от Back: 1.3 Аккаунты и пользователи > Клиенты.
2. Ключевые понятия
Клиент — пользователь, данные которого отображаются партнеру в отчете и карточке клиента.
Отчет по клиентам — раздел WebLk со списком клиентов и действиями над этим списком.
Карточка клиента — детальный экран клиента, в который пользователь переходит из отчета. Описывается отдельно в https://wiki.yandex.ru/homepage/d750da42741c/texnicheskaja-dokumentacija/brd/f0421948614f/b8f68698b64f/ebbe7d6c3aef/6.4.1-kartochka-klienta/ и https://wiki.yandex.ru/homepage/d750da42741c/texnicheskaja-dokumentacija/brd/dokumentacija-po-funkcionalurazdelam/1-akkaunty-i-polzovateli/1.3-klienty/ .
Группа клиента — признак, по которому партнер может сегментировать клиентов и использовать фильтрацию.
Статус клиента — признак клиента, доступный для фильтрации и отображения в отчете.
Скидка / сбор / промокод — признаки клиента, которые используются в фильтрах отчета.
3. Scope
Входит
S1: Открытие отчета по клиентам S2: Просмотр списка клиентов S3: Поиск и фильтрация списка S4: Добавление клиента S5: Действия со списком клиентов S6: Переход в карточку клиента S7: Состояния интерфейса
Не входит
- WebLk 6.4.1 Карточка клиента
- WebLk 6.2 Заказы и заявки
- WebLk 5.3 Работа с заказами
- Back 1.3.2 / 1.3.3 Управление характеристиками, группами и справочниками клиентов
- Back 3 Бэковская логика заказов, заявок и оплат
- AdmLk 3.2 / 3.2.1 Административная работа с клиентами и карточкой клиента
- Backend/API-контракты, структура БД и техническая реализация
4. BR
Указаны в пункте 4 раздела Back: 1.3 Аккаунты и пользователи > Клиенты.
5. Функциональные требования (UC + FR) {#5-funkcionalnye-trebovaniya-uc-fr}
FR — functional requirement: что интерфейс должен уметь делать в рамках конкретного пользовательского сценария.
| ID | Сценарий | Функциональное требование | BR | Вес | Статус |
|---|---|---|---|---|---|
| S1: FR6.4-1 | Партнер открывает раздел «Клиенты» | Интерфейс открывает отчет по клиентам как основной экран раздела. | 1 | Реализовано | |
| S1: FR6.4-2 | Партнер работает с отчетом по клиентам | Интерфейс показывает основные действия раздела: поиск, фильтрацию, добавление клиента, выгрузку и меню дополнительных действий. | 1 | Реализовано | |
| S2: FR6.4-3 | Партнер просматривает список клиентов и их признаки | Интерфейс показывает список клиентов с данными и признаками, необходимыми для идентификации клиента и работы с отчетом: группу (на будущее), статус и признаки, связанные со скидкой, сбором или промокодом, если эти данные есть у клиента, а также кол-во заказов и действующий способ оплаты. Почта и телефон кликабельные – написать на почту или позвонить При наведении на Промокод со значением”Есть” появляется всплывающее окно с информацией о промокоде | 1 | Частично \ #OQ6.4-6 | |
| S2: FR6.4-4 | Партнер ищет клиента | Интерфейс позволяет искать клиента из отчета через поле поиска или / и применить фильтрацию по датам регистрации. | 1 | Частично \ #OQ6.4-3 | |
| S3: FR6.4-5 | Партнер фильтрует список клиентов | Интерфейс позволяет фильтровать список клиентов по группе клиента (на будущее), наличию скидки, наличию сбора, промокоду и статусу клиента. | 1 | Реализовано | |
| S3: FR6.4-6 | Партнер просматривает примененные фильтры | Интерфейс показывает примененные фильтры и позволяет удалить отдельный фильтр без сброса остальных. | 1 | Частично \ #OQ6.4-1 | |
| S3: FR6.4-7 | Партнер изменяет условия фильтрации | Интерфейс обновляет список клиентов после применения или удаления фильтра. | 2 | Реализовано | |
| S3: FR6.4-8 | Партнер добавляет клиента | Интерфейс открывает форму «Добавить клиента». | 1 | Реализовано | |
| S4: FR6.4-9 | Партнер заполняет данные клиента | Форма добавления клиента содержит поля: имя, фамилия, телефон и email. | 1 | Реализовано | |
| S4: FR6.4-10 | Партнер сохраняет клиента | Интерфейс не позволяет сохранить клиента, пока обязательные поля имя и телефон не заполнены корректно. | 2 | Частично \ #OQ6.4-2 \ #OQ6.4-8 | |
| S4: FR6.4-11 | Партнер закрывает форму добавления клиента | Интерфейс позволяет закрыть форму добавления клиента без сохранения данных. | 2 | Реализовано | |
| S4: FR6.4-12 | Партнер добавляет клиента в группу (на будущую реализацию) | Интерфейс позволяет выбрать группу клиента при добавлении клиента, если партнеру доступны группы клиентов. | 3 | Не реализовано (по плану) | |
| S5: FR6.4-13 | Интерфейс позволяет скачать отчет по клиентам в формате XLS или CSV. | Интерфейс позволяет запустить выгрузку списка клиентов из отчета. | 2 | Частично \ #OQ6.4-4 | |
| S5: FR6.4-14 | Партнер открывает дополнительные действия | Интерфейс открывает меню «Настройки отображения», где партнер может выбрать отображение по умолчанию, скрывать и показывать колонки отчета, менять порядок колонок. | 2 | Реализовано | |
| S6: FR6.4-15 | Партнер выбирает клиента из отчета | Интерфейс позволяет перейти из выбранного клиента в карточку клиента WebLk 6.4.1. | 1 | Реализовано | |
| S6: FR6.4-16 | Партнер переходит в карточку клиента | Интерфейс открывает карточку выбранного клиента и переходит в раздел https://wiki.yandex.ru/homepage/d750da42741c/texnicheskaja-dokumentacija/brd/f0421948614f/b8f68698b64f/ebbe7d6c3aef/6.4.1-kartochka-klienta/ . | 1 | Реализовано | |
| S6: FR6.4-17 | Партнер открывает отчет или меняет условия отображения | Интерфейс показывает состояние загрузки при получении списка клиентов, применении фильтров и запуске действий со списком. | 2 | Реализовано | |
| S7: FR6.4-18 | Партнер ищет или фильтрует клиентов, но результатов нет | Интерфейс показывает пустое состояние, если по текущим условиям поиска или фильтрации клиенты не найдены. | 2 | Не реализовано \ #OQ6.4-7 | |
| S7: FR6.4-19 | Партнер выполняет действие, которое недоступно или завершилось ошибкой | Интерфейс показывает ошибку, если список клиентов, фильтры, сохранение клиента или выгрузка недоступны. | 2 | Реализовано | |
| S7: FR6.4-20 | Партнер использует страницу на разных ширинах экрана | Интерфейс адаптирует страницу площадки, карточки, связанные блоки, формы редактирования и таблицы для desktop, laptop и tablet и mobile. | 2 | Частично \ #OQ6.4-5 |
6. Открытые вопросы {#6-otkrytye-voprosy}
| ID | Источник | Вопрос | Кому | Статус | Рекомендации | Итоговое решение |
|---|---|---|---|---|---|---|
| OQ6.4-1 | Код FR6.4-6 | Требование говорит: интерфейс показывает применённые фильтры и даёт снять отдельный без сброса остальных. В коде отдельного отображения (чипов) нет — все фильтры живут внутри выпадающего меню «Фильтр», снаружи не видны; снять один можно, только заново открыв меню и вернув значение в «Все». \ ClientsReportFilters.vue:16-89; ClientReport.vue:26-57 | Бизнес/Разработка | Open | (А, рекоменд.) добавить ряд чипов активных фильтров (дата/скидка/сбор/промокод/статус) с «×», снимающим только свой фильтр через существующий setFilters({…:'all'/[]}); (Б) признать чипы избыточными для v0.1 и перенести «на будущее» в BRD. Продуктовое решение о наличии чипов. | Вариант Б |
| OQ6.4-2 | Код FR6.4-10 | Требование говорит: сохранение блокируется, пока не заполнены обязательные имя и телефон (фамилия — необязательная, FR6.4-9). В коде обязательны имя, телефон И фамилия: схема требует lastName (min 2), поле подписано «Фамилия*». \ create-client-form.schema.ts:11-16; CreateClient.vue:97 | Разработка | Закрывает PM | BRD прямо относит к обязательным только имя+телефон — код это нарушает. Закрываю сам: сделать lastName необязательным и снять «*» с подписи → тикет в Bitrix. Если продукт хочет фамилию обязательной — это правка BRD (перечень обязательных), тогда вернуть. | Я бы оставил фамилию обязательной. Насколько я помню, Это изабвляет он лишних проверок в коде на наличие фамилии, также во всех интерфейсах в фигме расчитано, что у клиента есть фамилия |
| OQ6.4-3 | Код FR6.4-4 | Проблема: фильтр по датам регистрации есть, но по умолчанию задан диапазон «последний месяц» и применён сразу при открытии — клиенты, зарегистрированные раньше, в отчёте по умолчанию не видны, пока партнёр не расширит диапазон. \ clients-report.ui.ts:12-13,69,120-121 | Бизнес (Герман) | Open | Влияет на то, каких клиентов партнёр видит сразу. Нужно подтверждение: предустановленный «последний месяц» задуман? (А) подтвердить как осознанный дефолт и отразить в BRD; (Б, реком. проверить) по умолчанию не ограничивать по дате (или расширить окно), чтобы отчёт не выглядел неполным. | Тут требуется решение со стороны бизнеса. Для сокращения времени разработки стоит до релиза оставить выбор по последнему месяцу в фильтре. В дальнейшем, если будет запрос от пользователей поменять дефотлную фильтрацию |
| OQ6.4-4 | Код FR6.4-13 | Требование говорит: запустить выгрузку списка клиентов из отчёта (XLS/CSV). В коде выгрузка в CSV/XLSX есть, но выгружается только текущая страница (в кнопку передаётся текущая пачка, размер страницы = 10), а не весь отфильтрованный отчёт. \ ClientReport.vue:23,36; clients-report.ui.ts:68; useTableExport.ts:28-36 | Бизнес/Разработка | Open | «Выгрузить отчёт» ≠ «10 строк текущей страницы». (А, рекоменд.) выгружать весь отфильтрованный список (запросить все страницы / увеличенный размер перед экспортом); (Б) осознанно оставить постраничную выгрузку и описать это в BRD. | Решение: (Б) Есть техническое ограничение. Бек присылает только актуальную страницу, которую пользователь видит на экране. Чтобы реализовать всю выгрузку, потруется отдельный запрос на получаение всех клиентов. Решение: оставить постраничную выгрузку на стадии mvp |
| OQ6.4-5 | Код FR6.4-20 | Требование говорит: адаптив под desktop, laptop, tablet, mobile. В коде найдены только частичные приёмы: перенос панели действий (flex-wrap) и горизонтальный скролл таблицы; отдельной раскладки таблицы под tablet/mobile не найдено. \ ClientReport.vue:29; DataTable.vue:270-274; pages/reports-page/index.vue:105-108 | Бизнес/Разработка | Open | Таблица широкая → на узких экранах уходит в горизонтальный скролл. Нужно подтверждение полноты адаптива. (А, рекоменд.) уточнить требования к tablet/mobile и при необходимости добавить компактную/карточную раскладку; (Б) зафиксировать горизонтальный скролл как принятое поведение. | Решение: (Б) оставить горизонтальный скрол до релиза. Далее смотреть по реакции пользователей. |
| OQ6.4-6 | Код FR6.4-3 | Проблема: телефон корректно tel:, а колонка «Электронная почта» тоже отдаёт href="tel:${email}" вместо mailto: — клик по почте пытается позвонить, «написать на почту» не работает. \ defaultColumns.ts:46 (ср. телефон :30) | Разработка | Закрывает PM | Явная ошибка, продуктового выбора нет. Закрываю сам: заменить в колонке email href на mailto:${item.email} → тикет в Bitrix. Заодно косметическая опечатка заголовка «Статуc» (латинская c) — defaultColumns.ts:104. | Это баг, его надо исправить. Нужно завести баг-репорт, исправить |
| OQ6.4-7 | Код FR6.4-18 | Требование говорит: показывать пустое состояние, если по условиям клиенты не найдены. В коде пустого состояния нет: при нулевом результате DataTable рисует только заголовки колонок, без строк и без сообщения; ошибка загрузки даёт тост, но тело таблицы выглядит так же — «пусто» и «ошибка» визуально не различить. \ DataTable.vue:144-215 | Разработка | Закрывает PM | FR веса 2 не реализован, продуктового выбора нет. Закрываю сам: добавить в DataTable пустой блок (при !isLoading && items.length===0) с текстом и по возможности различать «нет данных» и «ошибка загрузки» → тикет в Bitrix. | Решение: сделать интерфейс с пустой таблицей и добавить это отображение, если пользователи не найдены |
| OQ6.4-8 | Код FR6.4-10 | Требование говорит: не сохранять, пока обязательные поля не заполнены корректно. В коде маска имени/фамилии допускает только буквы одного алфавита (латиница ИЛИ кириллица) и требует минимум 2 символа: «Анна-Мария», имена с апострофом/пробелом, из разных алфавитов или из 1 буквы не проходят и клиента не сохранить. \ create-client-form.schema.ts:5-16 | Разработка | Закрывает PM | Маска рискует отклонять легитимные имена. Закрываю сам: ослабить regex (разрешить пробел, дефис, апостроф; при необходимости оба алфавита) → тикет в Bitrix. Оговорка: минимальную длину имени согласовать с продуктом (сейчас 2). | Решение: Составить четки требования к валидации полей ВСЕГО приложения |
Вопросы по сверке с кодом
BRD 6.4 v0.1 · musbooking_personal_account · commit b9a7a706/test · 2026-07-09 · якорь
pages/reports-page/clients.vue→widgets.fsd/client-report/(+features.fsd/clients-report/,features.fsd/create-client-form/) Сводка: вопросов 8 (бизнесовых 5 / программных 3) · подтверждено без вопросов 12 (FR6.4-1, FR6.4-2, FR6.4-5, FR6.4-7, FR6.4-8, FR6.4-9, FR6.4-11, FR6.4-14, FR6.4-15, FR6.4-16, FR6.4-17, FR6.4-19) · отрезано находок обратного прохода 5 На будущее (в коде нет — ожидаемо по BRD): FR6.4-12 (выбор группы при добавлении клиента). Под особым вниманием: FR6.4-3 (кликабельная почта), FR6.4-6 (чипы применённых фильтров), FR6.4-10 (обязательные поля и проверка), FR6.4-18 (пустое состояние).
Бизнесовые
| № | Связано с | Что в BRD | Что в коде | Где в коде |
|---|---|---|---|---|
| Б1 | FR6.4-6 | Интерфейс показывает применённые фильтры и позволяет удалить отдельный фильтр без сброса остальных | Отдельного отображения применённых фильтров (чипов) нет: все фильтры живут внутри выпадающего меню «Фильтр», снаружи не видны. Снять один фильтр можно только заново открыв меню и вернув значение в «Все» — нужно решение: нужен ли ряд чипов применённых фильтров с удалением по одному | ClientsReportFilters.vue:16-89; ClientReport.vue:26-57 |
| Б2 | FR6.4-10 | Сохранение блокируется, пока не заполнены обязательные имя и телефон | Обязательными в коде являются имя, телефон И фамилия: схема требует lastName (min 2 символа), поле подписано «Фамилия*». BRD относит фамилию к необязательным — нужно решение: делать ли фамилию обязательной | create-client-form.schema.ts:11-16; CreateClient.vue:97 |
| Б3 | FR6.4-4 | Поиск и/или фильтрация по датам регистрации | Фильтр по датам есть, но по умолчанию задан диапазон «последний месяц» (from = месяц назад, to = сегодня) и применён сразу при открытии. Клиенты, зарегистрированные раньше, в отчёте по умолчанию не видны, пока партнёр не расширит диапазон — нужно подтверждение: такой предустановленный диапазон задуман | clients-report.ui.ts:12-13, 69, 120-121 |
| Б4 | FR6.4-13 | Запустить выгрузку списка клиентов из отчёта (XLS или CSV) | Выгрузка в CSV и XLSX есть, но выгружается только текущая страница (в кнопку передаётся текущая пачка клиентов, размер страницы = 10), а не весь отфильтрованный отчёт — нужно решение: выгружать весь отчёт или достаточно текущей страницы | ClientReport.vue:23, 36; clients-report.ui.ts:68; useTableExport.ts:28-36 |
| Б5 | FR6.4-20 | Адаптив страницы, таблиц и форм под desktop, laptop, tablet и mobile | За обход найдены только частичные приёмы: перенос панели действий (flex-wrap) и горизонтальный скролл таблицы; отдельной раскладки под tablet/mobile у таблицы отчёта не найдено — нужно подтверждение полноты адаптива | ClientReport.vue:29; DataTable.vue:270-274; pages/reports-page/index.vue:105-108 |
Рекомендация / варианты решения
- Чипы применённых фильтров (Б1) — сейчас партнёр не видит активные фильтры, не открыв меню. Вариант А (рекоменд.): добавить ряд чипов активных фильтров (дата, скидка, сбор, промокод, статус) с «×», снимающим только свой фильтр через существующий
setFilters({ … : 'all'/[] }). Вариант Б: признать требование избыточным для v0.1, перенести чипы «на будущее» и отразить это в BRD. - Обязательность фамилии (Б2) — расхождение спецификации и кода. Вариант А (рекоменд.): привести код к BRD — сделать
lastNameнеобязательным и снять «*» с подписи. Вариант Б: если продукт хочет фамилию обязательной — обновить BRD (перечень обязательных полей) под код. - Предустановленный диапазон дат (Б3) — влияет на то, каких клиентов партнёр видит сразу. Вариант А: подтвердить «последний месяц» как осознанный дефолт и отразить в BRD. Вариант Б (рекоменд. проверить с продуктом): по умолчанию не ограничивать по дате или расширить окно, чтобы отчёт не выглядел неполным.
- Объём выгрузки (Б4) — экспорт текущей страницы (10 строк) вероятно расходится с ожиданием «выгрузить отчёт». Вариант А (рекоменд.): выгружать весь отфильтрованный список (запросить все страницы или увеличенный размер перед экспортом). Вариант Б: осознанно оставить постраничную выгрузку и описать это в BRD.
- Адаптив (Б5) — таблица широкая, на узких экранах уходит в горизонтальный скролл. Вариант А (рекоменд.): подтвердить требования к tablet/mobile и при необходимости добавить компактную/карточную раскладку. Вариант Б: зафиксировать горизонтальный скролл как принятое поведение для узких экранов.
Программные
| № | Связано с | Что в BRD | Что в коде | Где в коде |
|---|---|---|---|---|
| П1 | FR6.4-3 | Почта и телефон кликабельные — написать на почту или позвонить | Телефон корректно tel:, а колонка «Электронная почта» тоже отдаёт href="tel:${email}" вместо mailto: — клик по почте пытается позвонить, «написать на почту» не работает | defaultColumns.ts:46 (ср. телефон :30) |
| П2 | FR6.4-18 | Показывать пустое состояние, если по условиям клиенты не найдены | Пустого состояния нет: при нулевом результате DataTable рисует только заголовки колонок, без строк и без сообщения «ничего не найдено». Ошибка загрузки списка при этом даёт тост, но тело таблицы выглядит так же (пусто) — состояния «пусто» и «ошибка» визуально не различить | DataTable.vue:144-215 |
| П3 | FR6.4-10 | Не сохранять, пока обязательные поля не заполнены корректно | Маска имени/фамилии допускает только буквы одного алфавита (латиница ИЛИ кириллица) и требует минимум 2 символа: имена с пробелом, дефисом, апострофом, из разных алфавитов или из 1 буквы (напр. «Анна-Мария», двойные имена) проверку не проходят и клиента не сохранить | create-client-form.schema.ts:5-16 |
Рекомендация / варианты решения
- Ссылка на почту (П1) — явная ошибка. Вариант А (рекоменд.): заменить в колонке email
hrefнаmailto:${item.email}(по аналогии с телефономtel:). Заодно стоит поправить косметическую опечатку заголовка «Статуc» (латинская c) в defaultColumns.ts:104. - Пустое состояние (П2) — Вариант А (рекоменд.): добавить в
DataTableпустой блок (когда неisLoadingиitems.length === 0) с текстом и по возможности различать «нет данных» и «ошибка загрузки». Вариант Б: обрабатывать пустоту над таблицей — вClientReport/ClientReportTable. - Строгость проверки имени (П3) — маска рискует отклонять легитимные имена. Вариант А (рекоменд.): ослабить regex (разрешить пробел, дефис, апостроф, при необходимости — оба алфавита) и согласовать минимальную длину с продуктом. Вариант Б: подтвердить текущие ограничения как намеренные и описать их в BRD.
- Отрезанные находки обратного прохода (5, в вопросы не вынесены): (1) колонка «Сбор» показывает сумму
${forfeit}₽, в т.ч. «0₽», а не признак есть/нет — defaultColumns.ts:97; (2) колонка «Группа клиентов» видима по умолчанию, но в типеClientIполя группы нет → всегда «—» (согласуется с «на будущее») — defaultColumns.ts:53, entities.fsd/client/types.ts:17-33; (3) легаси-сторstores/client.ts(useClientStore) и старыйClientsServiceв отчёте не используются — отчёт работает черезuseClientReportStore— stores/client.ts:17; (4) формаCreateClientподключена безonSuccess, поэтому после сохранения drawer не закрывается (форма очищается, список обновляется инвалидацией) — ClientReport.vue:55; (5) косметическая опечатка заголовка «Статуc» — defaultColumns.ts:104.