# Отчёт — Осмотр портала глазами клиента (Фаза 1, нефинансовый периметр)

**Дата:** 17.06.2026
**Среда:** локальный портал 127.0.0.1:8000 (= боевой код, ветка main), наполнен
`php artisan imitation:seed --leads=20 --clients=3`.
**Клиент:** `sestakova.dmitrij@example.org` / `password` (тенант «IMIT-seed-client-1»,
Капитолина Д.).
**Метод:** навык `verify` + Playwright (живой браузер), скриншоты в `.playwright-mcp/`.
**Периметр:** только нефинансовые экраны. Финансовая часть (биллинг/баланс/тарифы/
стоимость) **не проверялась** — отдельный проход по отдельному разрешению.

**Вердикт: PASS** — все нефинансовые экраны клиентского пути работают; поймано
несколько находок (1 UX-замечание + финансово-смежные наблюдения для следующего
прохода).

---

## Таблица «ожидали / получили / вывод»

| Экран | Ожидали | Получили | Вывод |
|---|---|---|---|
| **D1 Вход** | Форма email+пароль, без 2FA, вход в рабочую область | «Вход в Лидерру», ввёл логин → редирект `/dashboard`, Yandex 360 кнопка disabled | ✅ OK |
| **D2 Проекты** | Список проектов клиента | Видит **только свой** проект «IMIT-seed-client-1» (Сайт), 20/1000 лидов 2%, «Sync pending» | ✅ OK (изоляция тенантов работает) |
| **D3 Лента сделок** | Новые сделки, телефон, Город=настоящий регион | 20 сделок, телефон, источник, **Город=Москва** у всех, статус «Новая сделка», поставлены 17.06 09:26 | ✅ OK |
| **D3 Карточка сделки** | Телефон и Город | «Сделка #58», телефон (tel:-ссылка), статус-переключатель, Параметры (Проект/Стоимость/Тип/Источник), комментарий, напоминания, активность «Лид принят (supplier_webhook)» | ⚠️ карточка **не показывает Город** (есть в таблице, нет в Параметрах) — находка F1 |
| **D4 Смена статуса** | Статус меняется и сохраняется | Сменил «Новая сделка» → «В работе», после перезагрузки сохранилось, видно и в таблице, и в CSV | ✅ OK |
| **D5 Экспорт** | CSV и XLSX скачиваются, непусты | `deals_export_2026-06-17.csv` (20 строк, столбцы Телефон/Источник/Город/Статус/Комментарий/Поставлен, Город=Москва, смена статуса отражена) + `.xlsx` | ✅ OK |
| **D6 Колокольчик** | Уведомление о новой сделке | Выпадашка «Новый лид — IMIT-seed-client-1» с телефонами, «1 ч назад», «Прочитать все», счётчик 20 | ✅ OK |

---

## Находки

- ⚠️ **F1 (UX, нефинансовое) — карточка сделки не показывает «Город».** В таблице
  ленты столбец «Город» = Москва есть, но в карточке-дровере (раздел «Параметры»:
  Проект / Стоимость лида / Тип / Источник) поля региона/города **нет**. Клиент,
  открыв карточку, не видит город лида без возврата к таблице. Стоит добавить
  «Город» в Параметры карточки. (Скриншот `walk-D3-deal-card.png`.)

- 🔍 **Проба: смена статуса персистентна.** После смены статуса и перезагрузки
  страницы статус «В работе» сохранился и в таблице, и в выгрузке CSV — состояние
  пишется в БД, не только в UI. Держит.

- 🔍 **Проба: изоляция тенантов.** `imitation:seed` создал 3 клиентов, но под
  логином клиента №1 видны только его проект и его 20 сделок — чужих нет. RLS на
  выдаче работает.

- ℹ️ **Консоль: 401 на `/api/auth/me` при загрузке.** Возникает один раз при
  старте SPA до входа (приложение проверяет сессию, получает 401, уводит на
  `/login`). Ожидаемое поведение, не дефект; шумит в консоли — можно подавить
  логирование для пред-авторизационной проверки.

### Финансово-смежные наблюдения (НЕ проверял — для отдельного финансового прохода)

Видны мельком на нефинансовых экранах; **деньги намеренно не аудировал**, фиксирую
как пункты для следующего прохода по разрешению владельца:

- 💰 **Карточка сделки: «Стоимость лида 0 ₽».** При том, что лиды наполнялись через
  настоящий конвейер. Возможно корректно (имитационный поставщик без цены), но
  стоит проверить в финансовом проходе.
- 💰 **Дашборд: «Активные проекты 1 / 0»** — лимит тарифа показан 0 (проект активен,
  но знаменатель 0).
- 💰 **Дашборд: баланс 90 000 ₽, но «≈ 0 лидов · хватит на 0 дня».** Прогноз
  показывает 0 при ненулевом остатке — вероятно потому что «стоимость лида» = 0
  (деление/прогноз вырождается). Связано с пунктом про 0 ₽.
- 💰 **Дашборд: «средняя стоимость 2 248 ₽»** vs нулевая стоимость в карточке —
  расхождение источников цифр, проверить в финансовом проходе.

---

## Скриншоты (в `.playwright-mcp/`)

- `walk-D1-login.png` — экран входа
- `walk-dashboard.png` — дашборд после входа
- `walk-D2-projects.png` — проекты (свой проект клиента)
- `walk-D3-deals-feed.png` — лента сделок (20, Город=Москва)
- `walk-D3-deal-card.png` — карточка сделки (без поля Город — F1)
- `walk-D4-status-changed.png` — смена статуса на «В работе»
- `walk-D6-notifications.png` — колокольчик с уведомлениями
- выгрузки: `deals-export-2026-06-17.csv`, `deals-export-2026-06-17.xlsx`

---

## Финансовая часть (проход по отдельному разрешению владельца)

Биллинг (`/billing`): вкладки «Обзор» и «Списания».

| Что | Ожидали | Получили | Вывод |
|---|---|---|---|
| Кошелёк | Остаток после 20 списаний | 90 000 ₽ (было 100 000) | ✅ |
| История транзакций (Обзор) | 20 списаний | #TX-1…#TX-58, каждое − 500 ₽ | ✅ суммы верны |
| Списания (вкладка) | По-сделочно, tier, цена | 20 строк: Сделка #N (ссылка на /deals/N), **Tier 1**, **500.00 ₽** | ✅ |
| Выгрузка списаний CSV | Непуст, с провенансом | `charges_2026-06-17.csv`: `charged_at, deal_id, tier_no, charge_source=rub, price_rub=500, balance_rub_after` | ✅ |

**Денежная корректность — чиста.** В CSV колонка `balance_rub_after` убывает ровно
на 500 ₽ на каждом списании: 99 500 → 99 000 → … → 90 000. 20 × 500 = 10 000 ₽,
остаток 90 000 ₽. Tier 1 у всех (стартовая ступень), `charge_source=rub`. Потери
копеек нет, последовательность монотонна. Это подтверждает на живом UI то, что
автотесты Фазы 1 показывали на данных.

### Финансовые находки (расхождения ОТОБРАЖЕНИЯ, не денег)

- ⚠️ **F2 — карточка сделки: «Стоимость лида 0 ₽», а списано 500 ₽.** В карточке
  сделки #58 поле «Стоимость лида» = 0 ₽, при этом в биллинге та же сделка #58
  списана на 500 ₽ (Tier 1). Либо поле показывает не то (надо цену списания 500 ₽),
  либо это стоимость со стороны поставщика (у имитационного = 0) — но клиенту
  показывать 0 ₽ за лид, который стоил ему 500 ₽, **вводит в заблуждение**.
- ⚠️ **F3 — прогноз «хватит на …» расходится между экранами.** Дашборд:
  «≈ 0 лидов · хватит на 0 дня из 7». Биллинг: «хватит на 286 дн.» / «≈ 191 лидов».
  Один и тот же остаток 90 000 ₽ даёт два разных прогноза — баг в одном из расчётов
  (похоже, дашбордный виджет вырождается в 0).
- ⚠️ **F4 — в «Истории транзакций» (Обзор) пустой столбец «Операция».** Дата/ID/
  Сумма есть, тип операции не подписан (на вкладке «Списания» — нормально).
- ℹ️ **F5 — дашборд «средняя стоимость 2 248 ₽»** не сходится с фактическими
  500 ₽/лид — похоже на placeholder/мок-число на дашборде.
- ℹ️ **«Тариф не выбран»** → отсюда на дашборде «Активные проекты 1 / 0» (лимит 0)
  и «Сменить тариф» disabled. Для свежего тенанта без тарифа, возможно, ожидаемо,
  но стоит решить, что показывать клиенту до выбора тарифа.

---

## Итог

Весь клиентский путь — **и нефинансовый, и финансовый** — проверен на живом
боевом коде. **Денежная механика корректна** (списания 500 ₽ × 20 = 10 000 ₽,
баланс 100 000 → 90 000, Tier 1, провенанс rub, монотонный `balance_rub_after`).

Находки — это **расхождения отображения**, не дефекты денег:
- **F1** карточка сделки без поля «Город»;
- **F2** карточка: «Стоимость лида 0 ₽» вместо фактических 500 ₽ (самая важная —
  вводит клиента в заблуждение);
- **F3** прогноз «хватит на дни» расходится дашборд (0) ↔ биллинг (286);
- **F4** пустой столбец «Операция» в истории транзакций (Обзор);
- **F5** дашбордная «средняя стоимость 2 248 ₽» — похоже на мок.

Ни одной из находок деньги не теряются и доступ не нарушается; это UX/консистентность
отображения. Приоритет на починку: **F2 → F3 → F1 → F4 → F5**.
