8.7 KiB
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 строк), обновлённый RPCsupabase/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).