supersam/docs/analytics-check-2026-10-02.md

67 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SuperSam — аналитика коммуникаций: проверка и исправления
Проверка и правки: 02.10.2026, МСК. Данные — последние 30 дней, живая БД (.8) и живой RPC, сверка с кодом, триггерами и боевой сборкой фронта.
## Итог
Все четыре предложения сделаны. Цифры согласований больше не врут: «Согласовано» считается по факту подтверждения, а заказ, закрытый без согласования, получил честный статус «Без согласования» — и в аналитике, и в реестре, и в карточке.
## Что было не так (и что стало)
### 1. «Согласовано» на 137 заказах из 186 — это не подтверждения клиента → исправлено
Триггер `clear_manual_required_on_action` ставил `notification_status='confirmed'` на любой уход заказа с ручной работы, даже когда даты нет и клиент ничего не подтверждал (в истории: `manual_confirmation_required → delivered` + `manual_required → confirmed`, источник «system» — приходит обменом).
Стало:
- триггер пишет «Согласовано» только когда у заказа есть дата (её поставил логист или выбрал клиент), иначе — новый статус `closed_without_confirmation` («Без согласования»);
- 128 уже испорченных строк переведены в новый статус (бэкап: `/root/order_groups_confirmed_backfill_20261002.csv` на .8);
- новый статус подписан в реестре, карточке, истории действий и в списке «не поднимают трубку»;
- автодозвон такие заказы не трогает (планировщик исключает новый статус из выборки).
Проверка поведения (транзакция с откатом на боевой БД): закрытие без даты → `closed_without_confirmation`, закрытие с датой → `confirmed`.
### 2. Два блока аналитики показывали разные цифры → исправлено
Канал согласования теперь считается одним классификатором в RPC (`confirm_channels`) для обоих блоков: «Чем подтвердили» и «Как согласовали дату» дают одинаковый расклад — **логист 112 · робот 26 · ссылка 18**. Раньше было «менеджер 25» в одном блоке и «логист 116» в другом, потому что цифра зависела от текущего `notification_status` и «сгорала», когда заказ уходил в `completed`. Теперь считается по событию — задним числом не меняется.
### 3. «Открыли ссылку» = 1 из 438 → стало 73 (16.4%)
Метрика считалась по `opened_at`, который пишет только edge-функция, а страница клиента ходит RPC. Считаем по фактическому входу: `access_count > 0`, `last_accessed_at`, подтверждение приглашения.
### 4. Тестовые звонки попадали в статистику → исправлено
37 тестовых строк за 30 дней (6 с привязкой к группе) убраны из воронки, таблицы попыток и «не поднимают трубку». Во вкладке «Коммуникации → Аналитика» они тоже исключены, а их число показано отдельным показателем.
### 5. Вкладка «Коммуникации → Аналитика» → приведена в порядок
- «Всё время» теперь действительно всё время (раньше молча бралось 90 дней);
- «Дозвонились» и «Согласовали» считаются по тем же исходам, что в воронке;
- вместо «времени на линии» и «среднего звонка» (АТС пишет длительность нулём — цифры были фиктивные) честный блок «Тестовые звонки — не в статистике»;
- дни на графике — по МСК.
### 6. Каналы больше не выводятся ключами БД → исправлено
Каналы из ссылки (`sms`, `client`, `push`, `messenger`) и робот (`call`) подписаны человеческими словами; там, где дата есть, а источник не записан, стоит «Источник не записан» вместо «В обход (без даты)».
## Цифры до и после (30 дней, когорта 444 группы)
- Открыли ссылку: 1 (0.2%) → **73 (16.4%)**
- Робот позвонил: 80 → 79 · Взяли трубку: 54 → 55 (тестовые исключены)
- Согласовано: 186 (42.5%) → **156 (35.1%)**: логист 112 · робот 26 · ссылка 18
- «Чем подтвердили» = «Как согласовали дату»: 112 / 26 / 18 (раньше 25/137/24 против 116/24/18)
- Закрыто без согласования: **128** — вынесено отдельной цифрой в «Путь заказа»
- Не достали: было одной цифрой 236 → **25 ещё в работе + 293 заказа уже закрыты** (раньше закрытые прятались, потому что считались «согласованными»)
## Критическое, что нашлось попутно и выложено раньше
Согласование по ссылке не работало с 29.09: `confirmDeliveryChoice` читал переменную `src`, которой нет среди параметров (`p_src: src || null`) → `ReferenceError: src is not defined`. Клиент на странице выбора слота получал ошибку, выбор не сохранялся, канал согласования в заказ не записывался.
Доказательства: живая сборка содержала `p_src:src`; тест `deliveryInvitationApi.test.js` падал с тем же `ReferenceError`; последнее подтверждение по ссылке в БД — 28.09 (миграция каналов — 29.09). Исправлено коммитом `f2a9249`, канал (`sms`/`push`/`messenger`/`client`) снова записывается.
## Выложено
- Фронт: прод dost.supersamsev.ru и dev dev.mkn8n.ru, SW v135 (коммиты `f2a9249`, `6dba84f`, `bf2b355`, `c8e9e69`).
- БД: миграция `supabase/migrations/20261002_confirmation_honesty.sql` (статус + триггер + backfill 128 строк), обновлённый RPC `supabase/admin_comms_funnel.sql`.
- Планировщик автодозвона на .8: новый статус исключён из выборки (md5 сверен с локальным).
- Тесты: 19/19 в блоках аналитики, 51/51 по затронутым файлам; полный прогон — 11 падений, и все в файлах, которых правки не касались (проверено возвратом `orderGroupViews.js` — список падений не изменился).
## Чего не проверял
Клик-прогон админки под логином (вход по OTP, доступа у меня нет). Вместо этого оба блока отрисованы на **живом ответе RPC**: цифры согласованы (сумма каналов = стадия) и сырые ключи/«Неизвестно» на экране отсутствуют. Визуальный вид реестра с новым статусом стоит глянуть глазами при следующем входе.
Проверки, по которым получены цифры: `/tmp/ss_analytics_check*.sql`, `/tmp/ss_fix_recon.sql` (выполнены на .8 в контейнере `supabase-db`).