Новый ответ!
Опрос: {{ notif.project_title }}
Вход в панель
Проекты
Загрузка проектов...
Пожалуйста, подождите
{{ p.title }}
{{ p.description }}
{{ projects.length ? 'Ничего не найдено' : 'У вас пока нет проектов' }}
{{ projects.length ? 'Сбросьте поиск или фильтр по типу.' : 'Создайте первый проект, чтобы начать собирать ответы.' }}
Заблокированные пользователи (Спам)
Список IP-адресов
Всего: {{ blockedUsers.length }}| IP-адрес | Дата блокировки | Регион / Страна | Устройство | Браузер / ОС | Действия |
|---|---|---|---|---|---|
| {{ user.ip_address }} | {{ fmtServerDt(user.created_at) }} | {{ user.location || 'Неизвестно' }} | Мобильное Десктоп | {{ parseUserAgent(user.user_agent) }} | |
| Список заблокированных пуст | |||||
Управление пользователями
Список администраторов
Всего: {{ users.length }}| Логин | ФИО | Роль | Email / Телефон | Действия |
|---|---|---|---|---|
| {{ user.username }} | {{ user.full_name || '—' }} | Администратор Редактор Только просмотр |
{{ user.email }}
{{ user.phone }}
—
|
|
| Список пользователей пуст | ||||
{{ currentProject.project.title }}
{{ kindTitleOf(projectKind) }}
{{ currentProject.project.description }}
Конструктор информирования
Скачайте шаблон Excel, заполните список абонентов и загрузите файл обратно. Затем укажите колонку с телефоном и соберите текст из полей таблицы. Суммы вроде 110,55 озвучиваются как «сто десять рублей пятьдесят пять копеек».
Яндекс — амплуа; Fish/Silero/Edge — темп и характер речи.
Загрузите Excel — здесь появятся названия колонок файла.
Параметры — названия колонок загруженного Excel. Подставляются при звонке. Приветствие звучит перед основным текстом.
Вставляйте параметры кнопками. Пример: Уважаемый [ФИО], Ваш долг [Долг].
| {{ col }} |
|---|
| {{ row[col] }} |
Конструктор e-mail письма
Загрузите Excel со списком получателей. Колонка «здание» обязательна. Параметры из таблицы можно вставить в тему и HTML-тело письма. Скрытая метка открытия подставляется автоматически при создании проекта и отправке — в шаблон её добавлять не нужно.
ИИ подберёт цвета под тему, фото, шрифты, кнопку перехода и ссылки. Макет можно править и сохранить. Если в тексте есть http-ссылка — она станет кнопкой.
Загрузите готовый файл .html — вёрстка, стили и плейсхолдеры вида [здание], [ФИО] сохранятся. Затем нажмите «Сохранить шаблон».
Загружен файл: {{ emailHtmlFileName }}
| {{ col }} |
|---|
| {{ row[col] }} |
Конструктор писем Почты России
Короткий путь: организация → Excel → PDF → подпись КриптоПро → сохранить. Сервер только отправляет в ИС ЭПС.
Справочник пуст. .
По памятке ИС ЭПС: PDF/A-1, ≤5 МБ, A4 книжная, шрифты встроены, страниц {{ pochtaForm.min_pages || 1 }}–{{ pochtaForm.max_pages || 40 }} (договор). Оригинальный размер листов — не склеиваем мелко. Если сканов >10 — уберите лишние. Выписку уплотняем только при нехватке страниц.
Собрано из: {{ pochtaForm.pdf_sources.join(', ') }}
Останутся крупными: {{ pochtaForm.pdf_size_plan.keep_full.map(x => x.name).join(', ') }}
Ужмём: {{ pochtaForm.pdf_size_plan.will_compress.map(x => x.name + (x.reason ? ' — ' + x.reason : '')).join('; ') }}
Могут измениться при лимите: {{ pochtaForm.pdf_size_plan.may_compact.map(x => x.name).join(', ') }}
На сервере сейчас: {{ pochtaForm.pdf_pages || '?' }} стр., {{ pochtaForm.pdf_images == null ? '?' : pochtaForm.pdf_images }} картинок, {{ pochtaForm.pdf_fonts == null ? '?' : pochtaForm.pdf_fonts }} стр. со шрифтами , {{ Math.round(pochtaForm.pdf_bytes / 1024) }} КБ, код {{ pochtaForm.pdf_sha }} — Почта отклонит (лимит 10 вложений)
Что сделала сборка ({{ pochtaForm.pdf_pack_notes.length }})
- {{ n }}
Для ИС ЭПС подпись — отдельный файл .sig (отсоединённая PKCS#7). PDF со штампом можно скачать и просмотреть.
Тот же PFX организации (канал ГОСТ-TLS) — на сервере, либо плагин КриптоПро на этом ПК.
Переподписать заново
Адрес получателя перед отправкой чистит DaData. Ключи — в разделе {{ epsSettings.has_dadata ? ' (ключи есть)' : ' (ключей пока нет)' }}.
Дополнительно (адрес, тип, разряд, МЧД, штраф, XML)
Можно подставить из комментария организации. Без адреса поле не отправляется.
Реквизиты штрафа (charge)
| {{ col }} |
|---|
| {{ row[col] }} |
Добавить новый вопрос
Например: от 10 до 1, вместо от 1 до 10.
Пока абонент говорит, ответ не обрываем — ждём паузу ~2.5 сек. «Ожидание» — сколько ждать начала речи.
После сохранения вопросы, приветствие, прощание и фраза «не расслышал, повторите» озвучиваются заранее. В звонке ИИ синтезирует только новую реплику.
{{ currentProject.project.tts_status==='generating' ? ('Идёт озвучка ' + (currentProject.project.tts_done||0) + ' / ' + (currentProject.project.tts_total||0)) : (currentProject.project.tts_status==='ready' ? 'Озвучка сохранена' : 'Нажмите «Озвучить сценарий» после вопросов') }}
{{ currentProject.project.tts_error }}
Структура анкеты
Всего вопросов: {{ currentProject.questions.length }}Анкета пуста
Добавьте свой первый вопрос, используя форму выше.
{{ q.text }} {{ q.audio_path ? 'дорожка готова' : 'нет дорожки' }}
✍️ Текст 🔘 Выбор ⭐ Рейтинг- {{ opt }}
Индивидуальные ссылки по зданиям
Добавить здание вручную
«+» сохраняет здание в общий справочник. «Добавить в проект» привязывает его к этому голосованию и тоже пишет в справочник.
Массовая загрузка (CSV)
Скачать шаблон| ЖК (Комплекс) | Здание | Действие |
|---|---|---|
|
{{ b.responses_count }} отв.
0 отв.
|
||
| Ничего не найдено по запросу "{{ searchBuildingQuery }}" | ||
Настройки дизайна опроса
Глобальное отображение оценок (Рейтинг)
Настройте интервалы и текст, который будет отображаться под шкалой оценок.
Превью (Пример)
Насколько вы довольны чистотой в холле?
Пожалуйста, уточните ваш ответ:
{{ currentProject.project.title }}
{{ currentProject.project.description }}
{{ projectKind === 'inform' ? 'Где ролик не доходит' : 'Проблема по каждому дому' }}
Дома, где больше всего людей не дослушали сообщение или ещё стоят в очереди. Оценок в этом обзвоне нет — смотрим доставку, не индекс.
По каждому дому — одна тема высокого приоритета, которая сильнее тянет NPS вниз за всю кампанию. Цитата — самый свежий такой ответ.
«{{ a.quote }}»
Цифры по выбранным домам: люди, не попытки набора.
Попытки — это звонки. Один человек может быть в нескольких попытках.
Средний разговор
{{ talkTimeLabel }}Шкала оценок 0–10
Сколько человек поставило каждую цифру.
Красный — 0–6, серый — 7–8, зелёный — 9–10. Сумма столбцов: {{ npsScaleTotal }}. Нажмите столбец — ответы и дома.
Тишина на уточнении: {{ campaignReport.followup_silent_pct }}% — человек дошёл до свободного вопроса и ничего не сказал.
Воронка сценария
Фильтр домов не режет попытки набора, поэтому воронка звонков здесь скрыта. Иначе «набрали» по всей кампании стояло бы рядом с оценками одного дома.
Первая цифра — попытки набора, не уникальные люди. Дальше: ответил человек → начал слушать → дослушал ролик. Разница последних двух — бросили на середине. Нажмите карточку — отчёт по этой цифре.
Первая цифра — попытки набора, не уникальные люди. Дальше: ответил человек → поставил оценку → договорил уточнение. Падение на шаге — где ломается сценарий. Нажмите карточку — отчёт по этой цифре.
Дозвон — взяли трубку. Ответ — есть оценка или слова жителя. Охват — ответы от всех жителей дома. Нажмите строку — аналитика этого дома.
| Здание | Всего | Отправлено | Прочитано | Дозвон | Ответ | Охват |
|---|---|---|---|---|---|---|
| {{ row.building }} | {{ row.total }} | {{ row.sent }} | {{ row.opened }} | {{ row.reached || 0 }} | {{ row.responses || 0 }} | {{ row.coverage_pct }}% |
Линия, попытки звонков. Дослушали ролик и NPS — на брифинге, здесь их нет второй раз.
Динамика голосования
{{ activityGrain === 'hour' ? 'Час суток, сумма по всем дням. ' : (activityGrain === 'weekday' ? 'День недели, сумма по всей выборке. ' : '') }}{{ projectKind === 'inform' ? 'Три столбца: прозвонили, ответили, дослушали.' : 'Три столбца: прозвонили, ответили, проголосовали.' }}
Каждый столбец — один час суток, с 00 до 23. Сумма по всем дням выборки.
Каждый столбец — день недели, с понедельника по воскресенье. Сумма по всем дням выборки.
Устройства аудитории
Детальная аналитика по вопросам
{{ idx + 1 }}. {{ q.text }}
{{ q.type === 'rating' ? 'Рейтинг' : (q.type === 'choice' ? 'Выбор' : 'Свободный ответ') }}Категории ответов
Всего: {{ themeAnswersCount(q) }}Нажмите категорию — откроются ответы жителей и записи.
Последние ответы:
Последние: {{ q.recent_texts ? q.recent_texts.length : 0 }}Нет вопросов с рейтингом или ответов для расчета NPS
Общий NPS по всем вопросам
Что съело NPS
Три темы, которые сильнее всего опускают общий индекс: на столько пунктов вырос бы NPS кампании, если бы эти жильцы оценивали как в среднем.
Динамика NPS по дням
Индекс и число оценок по дням — видно, сдвинулся ли результат после выезда или накопления.
Драйверы NPS
Насколько тема тянет индекс относительно среднего кампании, а не доля упоминаний. Полоска — те же доли, что у общего NPS. Клик открывает карточки жильцов.
Дома по NPS
Цвет — индекс дома. Рядом честность выборки: недозвон по этому адресу не подменяет NPS.
NPS по ЖК (общий)
Сравнение итогового NPS по каждому ЖК
NPS по каждому вопросу
{{ q.text }}
Инсайты по свободным ответам
{{ insightLead }}
Парето по объектам
Накопительная доля жалоб — и сколько пунктов NPS съела система
Топ 10 типов дефектов
Не «про что», а «что именно не так»
Очередь эскалации
Высокий приоритет — то, что стоит разобрать диспетчерской в первую очередь
| Приоритет | Объект | Кол-во | Примеры |
|---|---|---|---|
| {{ priorityLabel(q.urgency) }} | {{ q.object }} | {{ q.count }} | {{ (q.examples || []).join(' · ') || '—' }} |
| Горящих тем нет — хорошо | |||
Топ 10 ЖК по числу тем
Нажмите строку — темы этого ЖК, доля и число ответов.
Топ 10 зданий
Нажмите строку — темы этого здания, доля и число ответов.
Анкеты с содержанием: {{ loyaltyView.respondents }}. Тон ИИ есть у {{ loyaltyView.analyzed }}, ещё без тона {{ loyaltyView.pending }}.
· · · · прочее {{ loyaltyView.by.other }}. Вместе с «без тона» это все {{ loyaltyView.respondents }} ответивших.
9–10, а голос злой
Социальная желательность: оценка высокая, тон негативный. {{ (analyticsDesk.loyalty_gaps && analyticsDesk.loyalty_gaps.fake_promoters_n) || 0 }} чел.
«{{ g.quote }}»
0–6, а тон спокойный
Конструктивный критик: низкая оценка без злости. {{ (analyticsDesk.loyalty_gaps && analyticsDesk.loyalty_gaps.calm_critics_n) || 0 }} чел.
«{{ g.quote }}»
{{ col.title }}
{{ col.hint }} {{ col.cards.length }} чел.
«{{ g.quote }}»
Дома по лояльности
Сумма по домам — те же разобранные, что на карточках: негатив {{ loyaltyView.by.negative }} · лояльные {{ loyaltyView.by.loyal }} · нейтрально {{ loyaltyView.by.neutral }} · смешанно {{ loyaltyView.by.mixed }}.
Темы в разговорах
| Абонент | Оценка | Балл | Комментарий |
|---|---|---|---|
| {{ ex.full_name || ex.phone || '—' }} | {{ {loyal:'Лоялен', negative:'Негатив', mixed:'Смешанно', neutral:'Нейтрально'}[ex.sentiment] || ex.sentiment }} | {{ ex.score }} | {{ ex.summary }} |
| Пока нет разобранных звонков — ИИ анализирует записи в фоне | |||
Детализация ответов
| ЖК | Здание | Канал | Дата и время | IP и Регион | Браузер / ОС | Вопросы | NPS | Ответы |
|---|---|---|---|---|---|---|---|---|
| {{ row.complex_name || '—' }} | {{ row.building_name || '—' }} {{ row.full_name }} кв. {{ row.apartment }} |
{{ row.channel==='phone' ? 'телефон' : 'веб' }} | {{ fmtServerDt(row.created_at) }} |
{{ row.ip_address || 'Неизвестно' }}
{{ row.location || '' }}
|
{{ deviceLabel(row.user_agent) }} | {{ callAnswerProgress(row).n }} из {{ callAnswerProgress(row).total }} | не NPS NPS {{ rowNpsScore(row) }} — |
|
| {{ stats && (stats.lite || stats.full_pending) ? 'Считаем реестр ответов…' : 'Пока нет ни одного голоса' }} | ||||||||
Должники из 1С
Отметьте базы и дома. Дома и должники загружаются из каждой выбранной базы и остаются привязаны к ней. Перед звонком долг сверяется в той же базе: оплатил — не звоним.
Баз 1С ещё нет.
Выключены и не участвуют: {{ debtSkippedBases.map(b => b.title || 'База 1С').join(', ') }}. Включите их в интеграции или сохраните проект без них.
«До» = 0 — без верхней границы. Если к моменту звонка долг упал ниже «от», человеку не звоним.
Открытый — счёт действует. Закрытый — уже не действует. Список обновится после «Загрузить должников».
Человек называет дом и квартиру или лицевой счёт. Дом ищется по всем домам подключённых баз 1С, не только по отмеченным для обзвона. Робот называет долг и пени и спрашивает, нужна ли квитанция.
Список абонентов (Excel)
Скачайте шаблон, заполните его в Excel и загрузите обратно. Номер телефона обязателен. Для информирования шаблон содержит все поля, которые можно вставить в текст озвучки.
{{ projectKind === 'inform' ? 'Запуск информирования' : 'Сценарий звонка' }}
Ролик дослушан до конца. Если трубку положили раньше — можно засчитать разговор длиннее указанного числа секунд. 0 — только полный ролик.
Сценарий по сумме долга
Робот выбирает текст по долгу на момент звонка. В текст можно вставить поля: сумма проговаривается словами.
Сценарий
Загрузите Excel — здесь появятся названия колонок файла.
Приветствие → оценка 0–10 голосом (5 сек) → уточнение (10 сек, тишина 5 сек → дальше) → прощание A (9–10) или B (0–8).
Робот говорит это, когда ответ записан, перед следующим вопросом. Для NPS можно оставить пустым — в шаблоне подтверждения отключены.
По умолчанию 9: оценка 9–10 → вариант A, 0–8 → вариант B.
Если в сценарии есть оценка 0–10, без цифры звонок успешным не считаем — даже при длинном разговоре.
Голос и попытки
{{ projectKind === 'debt_call' ? 'Трубку положили раньше, но разговор не короче этого — повторно не звоним. 0 — только дослушанное сообщение.' : 'Разговор не короче этого — дозвон, без повтора. 0 — только полный опрос или NPS.' }}
Сколько вопросов успели ответить — номер больше не перезваниваем. 1 — достаточно любой оценки или свободного ответа.
Профиль телефонии
Эти учётки проект использует и для исходящих, и для входящих. Ничего не отмечено — любая свободная линия. Профили создаются в меню «SIP-учётные записи».
Запуск
После звонка: Звонки → Расшифровка → «Скачать диагностику» — JSON можно прислать для разбора. Или нажмите «Автотест линии».
Запуск
Старт / пауза / стоп и живые линии
Запуск загружает свежий список должников из 1С. Перед каждым набором долг сверяется ещё раз.
Параллельность: рекомендуемо по ядрам CPU, автоснижение при перегрузе, потолок — слоты выбранных профилей. Если входящие включены, одна линия под них не занята набором.
NPS по лицевым счетам
Как в обзвоне с опросом: промоутеры (9–10) минус критики (0–6). Один лицевой счёт — одна оценка, самый успешный номер. Согласие — 10, обсуждение — 8, вопрос — 7, сброс — 0. Прослушал и недозвон в индекс не входят.
Воронка обзвона
От списка должников до согласия на оплату — считаем людей, не попытки.
Реакция абонентов
По лицевому счёту берём самый успешный итог среди номеров.
Сегменты долга
Секунды — среднее время разговора. Процент — доля дослушавших среди тех, кто ответил. Попытки — сколько раз набирали номер.
| Сегмент | Долг | Людей | Сумма | Набрали | Попытки | Дозвон | Дослушали | Секунды | % | Согласие | Обсуждение | Вопросы | Оплатили | NPS |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ s.range }} | всего {{ s.listen_sec }} с |
{{ s.nps.n }} сч. |
Когда берут трубку
По часам суток: серое — наборы, золотое — ответил человек.
Дома
| Дом | Людей | Долг | Дозвон | Согласие | Обсуждение | Оплатили | NPS |
|---|---|---|---|---|---|---|---|
{{ b.complex }} |
Кому перезвонить
Оставили вопрос, запросили обсуждение или согласились оплатить — с этими людьми должен связаться сотрудник.
| Когда | Абонент | Телефон | Долг | Реакция | Что сказал | |
|---|---|---|---|---|---|---|
| {{ shortEtaAt(f.at) }} входящий |
{{ f.name || '—' }} {{ f.building }} · {{ f.apartment }} · ЛС {{ f.account }} |
{{ f.phone }} | {{ rub(f.debt) }} сегмент {{ f.segment }} |
{{ f.outcome_label }} | {{ f.message || '—' }} | |
| Пока некому перезванивать | ||||||
Входящие не из списка контактов
Номера не было среди загруженных контактов. Эти звонки не входят в воронку, сегменты, среднее время и «кому перезвонить».
| Когда | Телефон | Кого нашли | Долг | Пени | Итог | Что сказал | |
|---|---|---|---|---|---|---|---|
| {{ shortEtaAt(s.at) }} {{ s.duration_sec }} с |
{{ s.phone || '—' }} | {{ s.name || 'Не нашли' }} {{ s.building }} · кв. {{ s.apartment }} · ЛС {{ s.account }} по адресу по телефону в 1С |
{{ s.found_by ? rub(s.debt) : '—' }} | {{ s.found_by ? rub(s.penalties) : '—' }} | {{ s.outcome_label }}{{ s.outcome_label }} | {{ s.message || '—' }} | |
| Таких звонков пока нет | |||||||
По контактам
Те же цифры, что в сегментах, по каждому лицевому счёту. Секунды — среднее время разговора, процент — дослушал ли сообщение.
| Контакт | Сегмент | Долг | Сумма | Набрали | Попытки | Дозвон | Дослушали | Секунды | % | Согласие | Обсуждение | Вопросы | Оплатили | NPS |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
{{ c.phone || '—' }} {{ c.building }} · {{ c.apartment }} · ЛС {{ c.account }} |
{{ c.range || '—' }} | |||||||||||||
| Контактов нет | ||||||||||||||
Разговоры, где человек ответил: {{ debtLoyalty.respondents }}. Тон ИИ есть у {{ debtLoyalty.analyzed }}, ещё без тона {{ debtLoyalty.pending }}. Это тон речи, не согласие на оплату.
· · · · прочее {{ debtLoyalty.by.other }}.
Согласие, а тон негативный
Сказал «оплата», но в речи претензия. {{ (debtLoyalty.gaps && debtLoyalty.gaps.fake_promoters_n) || 0 }} чел.
«{{ g.quote }}»
{{ g.summary }}
Положил трубку, а тон спокойный
Разговор оборвался без злости. {{ (debtLoyalty.gaps && debtLoyalty.gaps.calm_critics_n) || 0 }} чел.
«{{ g.quote }}»
{{ g.summary }}
{{ col.title }}
{{ col.hint }} {{ col.cards.length }} чел.
«{{ g.quote }}»
Дома по лояльности
Тот же разбор: негатив {{ debtLoyalty.by.negative }} · лояльные {{ debtLoyalty.by.loyal }} · нейтрально {{ debtLoyalty.by.neutral }} · смешанно {{ debtLoyalty.by.mixed }}.
Темы в разговорах
| Абонент | Реакция | Тон | Комментарий |
|---|---|---|---|
| {{ ex.full_name || ex.phone || '—' }} {{ ex.building }} |
{{ ex.outcome_label || '—' }} | {{ sentimentLabel(ex.sentiment) }} | {{ ex.summary || ex.quote || '—' }} |
| Пока нет разобранных звонков — ИИ анализирует записи в фоне | |||
{{ projectKind === 'pochta' ? 'Запуск рассылки Почты России' : 'Запуск рассылки' }}
Каждому получателю уходит тот же PDF, подписанный КриптоПро. После отправки ИС ЭПС может принять, отклонить или сменить статус (вручение / возврат) — фон пишет это в контакт и журнал; таблица обновляется сама. «Запросить статусы» / кнопка «Статус» у контакта — ручной опрос с полным ответом Почты. «Обновить ШПИ» / «Получить ЭУВ» — принудительно. Ниже — п. 61 и ф. 103.
Письма уходят через SMTP из раздела «Почтовый клиент». Скрытая метка открытия вставляется в каждое письмо автоматически.
Zip за день отправки (не старше 30 дней). Если Почта ещё не сформировала реестр — будет «не найден», обычно появляется на следующий рабочий день.
По всем ШПИ проекта, не больше 1000 за запрос.
{{ projectKind === 'email' ? 'Список получателей' : (projectKind === 'pochta' ? 'Получатели писем' : 'Список для обзвона') }}
Поле «здание» обязательно. {{ projectKind === 'email' ? 'Укажите e-mail получателя.' : (projectKind === 'pochta' ? 'Для юрлица укажите организацию и ИНН, для физлица — ФИО и адрес.' : 'Номер очищается до цифр, 8XXXXXXXXXX → 7XXXXXXXXXX') }}
| Здание | Кв. | ФИО | {{ projectKind==='email' ? 'E-mail' : (projectKind==='pochta' ? 'Адрес / ШПИ' : 'Телефон') }} | Лицевой счёт | Основной долг | Пени | Общий долг | Оплатили | Остаток долга | Действует | ИНН | {{ (projectKind==='pochta' || projectKind==='email') ? 'Статус отправки' : 'Статус звонка' }} | Озвучка | Прочитано | ЭУВ | Код / п. 61 | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ c.building }} | {{ c.apartment }} | {{ c.full_name }} сегмент {{ c.extra_data._segment }} дозвонились на {{ c.extra_data._numbers_reached || 0 }} из {{ c.extra_data._phones.length }} {{ p }} — {{ debtNumberLabel(c, p) }} {{ contactOrgName(c) }} |
{{ c.email || '—' }}
{{ contactAddress(c) || '—' }}
DaData
ШПИ {{ contactMailId(c) }}
Отследить
req {{ contactRequestCode(c) }}
{{ c.phone_digits }}
|
{{ (c.extra_data && c.extra_data['ЛС']) || '—' }} | {{ debtAmount(c, 'principal') }} | {{ debtAmount(c, 'penalties') }} | {{ debtAmount(c, 'total') }} | {{ debtCheckedAmount(c, 'paid') }} | {{ debtCheckedAmount(c, 'remain') }} | {{ (c.extra_data && c.extra_data['Действует']) || '—' }} | {{ contactInn(c) || '—' }} |
{{ projectKind === 'pochta' ? contactSendStatusLabel(c) : kpiContactLabel(c.status) }}
Отследить на Почте
{{ contactLetterDesc(c) }}
|
{{ c.audio_path ? 'файл готов' : 'нет файла' }} | {{ c.email_opened_at ? 'да' : 'нет' }} |
{{ contactHasEdn(c) ? 'Готово' : (contactCanFetchEdn(c) ? 'Ещё нет' : '—') }}
|
Код {{ contactAccessCode(c) }}
Кода пока нет
Нужен ШПИ
|
||
| Список пуст — загрузите Excel | ||||||||||||||||||
Журнал звонков
| Время | Абонент | Телефон | ЖК | Здание | Квартира | Лицевой счёт | Долг | Направление | Исход | Лояльность | Сек. | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| — | {{ c.started_at || c.created_at }} | {{ c.full_name || '—' }} {{ debtOutcomeLabel(c.meta.outcome) }} {{ c.building }} кв. {{ c.apartment }} |
{{ c.phone || '—' }} | {{ c.complex || '—' }} | {{ c.building || '—' }} | {{ c.apartment || '—' }} | {{ c.account || '—' }} | {{ c.debt != null && c.debt !== '' ? rub(c.debt) : '—' }} | Входящий Исходящий |
{{ c.outcome_label || kpiCallLabel(c.status) }}
{{ c.hangup_label }}
|
{{ c.reached ? ({loyal:'Лоялен', negative:'Негатив', mixed:'Смешанно', neutral:'Нейтрально'}[c.sentiment] || c.sentiment || 'анализ…') : '—' }} | {{ c.duration_sec || 0 }} | |
| Звонков пока нет |
Журнал проекта
Отправка писем через ИС ЭПС: старт, каждое письмо (requestCode / ШПИ), ошибки и закрытие рассылки.
Отправка e-mail: старт, каждому получателю, ошибки и закрытие рассылки.
Исход попытки: дозвонились, не ответили, занято или набор не начался. В строке — что случилось, сколько ждали и что дальше с номером.
| Время | Исход | Уровень | Источник | Что случилось |
|---|---|---|---|---|
| {{ row.created_at }} | {{ logOutcome(row) }} — | {{ {error:'Ошибка', warning:'Внимание', info:'Инфо'}[row.level] || row.level }} | {{ row.source }} | {{ logDetail(row) }} |
| Записей нет | ||||
Интеграция 1С
Баз может быть несколько. Проект «Обзвон должников» выбирает, из каких забирать дома и должников. В каждой 1С должно быть подключено расширение «АвтоОбзвон».
Путь сервиса /hs/obzvon дописывается сам. Запросы идут на: {{ onecServiceUrl(b) }}
Авторизация Basic: в каждом запросе уходит заголовок Authorization: Basic base64(логин:пароль). Пользователю 1С нужна роль «Автообзвон: использование HTTP-сервиса должников».
Менять настройки может только администратор.
Журнал проверок связи
За сегодня. Под каждой строкой — технический лог: с какого адреса ушёл запрос, куда, код ответа и текст ошибки. Пароль в лог не пишется. Записи за прошлые дни удаляются.
| Когда | База | Итог | Что ответила 1С |
|---|---|---|---|
| {{ shortEtaAt(row.at) }} | {{ row.title || 'База 1С' }} | {{ row.ok ? 'Связь есть' : 'Нет связи' }} | {{ row.message }}{{ row.configuration }} {{ row.configuration_version }}{{ row.log }} |
| Проверок за сегодня ещё не было | |||
SIP-учётные записи
Каждая запись — профиль телефонии: его выбирают в настройках проекта. Можно добавить SIP-учётку (одна линия) или транк со слотами (несколько параллельных звонков). Выключите запись — она не пойдёт в обзвон, связь с АТС сохранится. Статус обновляется каждые 8 секунд.
У номера из 11 цифр при звонке первая цифра заменяется на выбранную. Короткие внутренние не меняются. У Дом.ру обычно 8. Входящий ищется и по 7, и по 8.
Ожидание набора
Сколько секунд ждать, пока исходящий станет живым звонком. Если канал Asterisk так и не появился — слот сбрасывается, номер снова в очереди. Это не недозвон: трубку ещё не звонили.
Сейчас: {{ sipDialer.orphan_wait_sec || 20 }} с. Журнал проекта пишет, дозвонились или нет и сколько ждали.
| Логин | Тип | Хост | Порт | АОН | Регистрация | Активна | Занятость | |
|---|---|---|---|---|---|---|---|---|
| {{ s.login }} {{ s.title }} |
{{ s.kind === 'trunk' ? 'Транк' : 'Учётка' }}
{{ s.auth_mode === 'ip' ? 'по IP' : 'REGISTER' }}, слотов: {{ s.slots || 1 }}
набор через {{ s.dial_prefix === '8' ? '8' : '7' }}
|
{{ s.host }} | {{ s.port }} | {{ s.caller_id }} |
{{ s.kind === 'trunk' && s.auth_mode === 'ip' ? 'Доступен' : 'Зарегистрирована' }}
Нет
Проверка…
{{ s.reg_status || 'ожидание проверки' }}
{{ s.reg_reason || s.last_error }}
|
{{ s.enabled ? 'Да' : 'Нет' }} | Не активна {{ s.used_slots || 0 }} / {{ s.slots || 1 }} |
{{ sipRegDiag.exchange.text || sipRegDiag.exchange.note }}
Почтовый клиент
Эти настройки используются для всех e-mail рассылок. Публичный адрес нужен, чтобы считать открытия писем.
Fish Audio
API-ключ для живых голосов Алина и Максим. После сохранения обзвон подхватывает ключ сам, без правки Environment в Dokploy (обычно до 30 секунд).
Кабинет Fish Audio → API. Ключ в git и в переписку не кладите.
Яндекс SpeechKit
API-ключ для голосов Яндекса. После сохранения обзвон подхватывает ключ сам, без правки Environment в Dokploy (обычно до 30 секунд).
Нужна роль billing.accounts.viewer у сервисного аккаунта на платёжном аккаунте. Ключ только со scope SpeechKit баланс не покажет.
Yandex Cloud → сервисный аккаунт → API-ключ. Для баланса лучше ключ без узкого scope или с доступом к Billing.
Переопределяет API-имя для карточек «Алёна» / «Филипп». Остальные голоса (Джейн, Омаж, Марина, Ермил, Захар) вызываются своим кодом SpeechKit.
Для Алёны: good/neutral. Джейн: +evil. Марина: +whisper/friendly. Неподдерживаемое амплуа подставится автоматически.
Голос Эвереста
Нейронный русский мужской голос для карточки «Эверест» в конструкторе. Тон не занижается. Обычный системный голос включается только если нейронного нет.
Если Павла нет на сервере синтеза, звонок идёт голосом Дмитрия — тоже нейронным, без занижения тона.
Почта России — шлюз ИС ЭПС
Шлюз eps и X-API-Key. Сертификат ГОСТ-TLS — свой у каждой организации
(PFX привязанной подписи из
).
Проверка канала всегда идёт от конкретной организации.
ID/токен и PFX — в карточке организации. Этот блок только про контейнер eps.
Боевой сервер ИС ЭПС: api.zakaznoe.pochta.ru:3080 (ГОСТ-TLS).
Шлюз ходит в gost-stunnel:13000+org_id, API /api/v2.6.
org {{ g.org_id }} → :{{ g.port || '—' }} · в КриптоПро (thumb {{ (g.thumbprint || '').slice(0, 16) }}…) · файл есть, импорт CSP: {{ g.import_error }} · файл есть, ждёт Restart gost-stunnel · нет PFX
Загрузите PFX в карточку организации и нажмите «Использовать PFX этой организации для канала ГОСТ-TLS».
OpenSSL не открывает PFX КриптоПро. Скачайте linux-amd64_deb.tgz (КриптоПро CSP для Linux, регистрация на cryptopro.ru), загрузите архив сюда и сделайте Restart gost-stunnel. Перед первой загрузкой нужен Rebuild nginx, backend и gost-stunnel.
Архив уже на диске. Осталось Restart gost-stunnel.
{{ epsSettings.gost_tls.csp_error }}
Туннель на КриптоПро CSP: PFX открывается через certmgr, без OpenSSL.
В Docker не меняйте: http://eps:8010.
Ключ контейнера eps, не путать с токеном организации в справочнике.
Перед отправкой в ИС ЭПС адрес чистится через clean/address (индекс, регион, пункт, дом, квартира). ФИАС/КЛАДР пишем в JSON диагностики; в тело письма Почты поле ФИАС не входит — иначе ИС ЭПС может отклонить заявку. 20 коп. за адрес, ключ общий на все рассылки.
{{ epsSettings.has_dadata ? 'Ключи сохранены' : 'Ключей нет — пока разбор своей регуляркой' }}
Запрос к ИС ЭПС идёт с ID/токеном выбранной организации из справочника.
Справочник зданий
Общий список для обзвона, голосования, информирования, e-mail и Почты России. Новое название и прежние имена сразу переносятся в статистику: контакты, звонки и ответы считаются по карточке справочника. Если дом уже пропал из справочника, откройте нужную карточку и впишите старое имя в «Прежние названия».
| Здание | ЖК | ||
|---|---|---|---|
| {{ b.name }} также: {{ b.former_names.join(', ') }} |
{{ b.complex || '—' }} | ||
| {{ directoryBuildings.length ? 'Ничего не найдено' : 'Справочник пуст — добавьте здание здесь или кнопкой + в проекте' }} |
Справочник организаций
Для модуля Почты России: ИНН, договор, БЗ, ID и токен ИС ЭПС, сертификат. Проверка канала ГОСТ-TLS — по каждой организации (кнопка «Канал»).
Экспортируйте контейнер из КриптоПро CSP в PFX/P12 с паролем. Отпечаток и туннель ГОСТ-TLS для этой организации подставим сами. Подпись PDF в проекте — отдельно плагином КриптоПро на компьютере оператора.
Отпечаток: {{ orgForm.cert_thumbprint || '—' }}{{ orgForm.cert_name ? ' · ' + orgForm.cert_name : '' }}
| Наименование | ИНН | Договор | БЗ | ID | Токен | Сертификат | |
|---|---|---|---|---|---|---|---|
| {{ o.name }} | {{ o.inn || '—' }} | {{ o.contract_number || '—' }} | {{ o.bz_number || '—' }} | {{ o.login || '—' }} | {{ o.has_token ? 'задан' : 'нет' }} | {{ o.cert_name || o.cert_thumbprint || (o.has_cert ? 'сохранён' : '—') }} CSP :{{ o.gost_tls_port }} PFX ждёт Restart {{ o.gost_tls_error }} | |
| {{ directoryOrgs.length ? 'Ничего не найдено' : 'Справочник пуст — загрузите Excel или добавьте организацию вручную' }} | |||||||
Расписание работы
У каждого дня своё окно по часам сервера. Выключенный день — выходной. Праздники подгружаются из производственного календаря РФ (isdayoff.ru).
Окно и все даты в журнале считаются по серверу, не по часам браузера.
Например, понедельник 08:00–20:00, суббота 10:00–16:00. Выключенный день не набираем, кроме рабочей субботы из календаря.
Праздники и переносы (рабочие субботы) с isdayoff.ru
Это окно на все даты из производственного календаря. Выключено — в праздники не звоним. «До конца» считает праздник этим окном, если оно включено.
Сейчас {{ hoursSettings.now || '—' }} · {{ hoursSettings.day_kind_label }} · сегодня {{ hoursSettings.today_from }}–{{ hoursSettings.today_to }} — {{ hoursSettings.within ? 'окно открыто, можно звонить и писать' : 'окно закрыто, задания ждут начала' }}
Бэкап и записи
Ночью сохраняется архив базы. Записи звонков старше указанного срока удаляются, транскрипты остаются.
Последний бэкап: {{ opsSettings.last_backup_at }} · {{ opsSettings.last_backup_file }}
Очистка записей: {{ opsSettings.last_purge_at }} ({{ opsSettings.last_purge_count || 0 }} файлов)
Состояние ИИ
Локальный Qwen (Ollama) или удалённый API на другом сервере. Рядом — распознавание речи (Яндекс, запасной Whisper) и нагрузка сервера.
{{ aiStatusError }}
Источник Qwen
Локальный контейнер ollama останавливается в режиме API и не поднимается при перезапуске служб, пока снова не включите локальный режим.
Локально обычно qwen2.5:1.5b (не путать с моделью remote API).
Для URL вида …/v1 выбирайте OpenAI. Ollama — если база без /v1 (порт 11434).
{{ llmSaveError }}
| Служба | Состояние | Статус |
|---|---|---|
| {{ c.service }} | {{ c.state }} | {{ c.status }} |
KPI обзвона
Редактировать проект
Справочник пуст — сначала добавьте организацию в меню «Справочник организаций».
Редактировать SIP
Смена логина, пароля, хоста или типа обновит конфиг Asterisk. Слоты транка действуют сразу в обзвоне.
Первая цифра 11-значного номера при наборе заменяется на выбранную. Контакт во входящем находится и если абонент позвонил с 8.
Новый проект
Загрузите файл со списком зданий, чтобы сгенерировать для каждого индивидуальную ссылку.
Отправка пойдёт от этой организации (ID и токен ИС ЭПС из справочника).
{{ mustChangePassword ? 'Смените пароль admin' : 'Смена пароля' }}
Пароль по умолчанию нельзя оставлять в боевой системе. Укажите новый пароль не короче 8 символов.
{{ userData.id ? 'Редактировать пользователя' : 'Новый пользователь' }}
Резервная копия
Восстановить из бэкапа
Редактировать вопрос
Пока абонент говорит, ответ не обрываем — ждём паузу ~2.5 сек.
Редактировать здание
{{ priorityModal.name }}
{{ priorityModal.count }} ответов · {{ priorityModal.share }}% · {{ priorityModal.items.length }} тем
«{{ item.examples.join('» · «') }}»
{{ debtSliceModal.title }}
{{ debtSliceModal.hint }}
По домам
По сегментам
Лицевые счета
{{ funnelModal.title }}
{{ funnelModal.hint }}
Из чего состоит
По домам
Темы
Ответы · {{ funnelModal.building }} · {{ funnelModal.theme }}
«{{ c.quote }}»
{{ insightSliceModal.name }}
{{ insightSliceModal.note }}
{{ insightSliceHint() }}
По домам
Темы
Ответы · {{ insightSliceModal.building }} · {{ insightSliceModal.theme }}
«{{ c.quote }}»
{{ evidenceDrawer.title }}
{{ evidenceDrawer.hint || 'Дом → оценка → цитата → тон → запись' }}
«{{ c.quote }}»
{{ c.summary }}
Дома
{{ buildingCoverage.label }}. Число — ответы в текущей выборке. Нажмите дом, чтобы открыть их.
{{ scoreBuildingsModal.title }}
{{ scoreBuildingsModal.hint }}
По домам
Ответы · {{ scoreBuildingsModal.building }}
«{{ c.quote }}»
{{ themeModal.name }}
{{ themeModal.question }}
{{ themeModal.items.length }} ответов · в категории {{ themeModal.count }}, в списке урезанный реестр
«{{ item.quote }}»
Ответ пользователя
Если число попало в оценку по ошибке, звонок уйдёт из NPS и аналитики, но останется успешным. Похожая фраза больше не будет считаться оценкой.
{{ fmtServerDt(viewAnswersModal.created_at) }}
{{ viewAnswersModal.ip_address || 'Неизвестно' }}
{{ viewAnswersModal.location || 'Локация не определена' }}
{{ deviceLabel(viewAnswersModal.user_agent) }}
{{ confirmModal.title }}
{{ confirmModal.text }}
{{ promptModal.title }}
{{ promptModal.text }}
Расшифровка звонка
После пробного звонка скачайте диагностику и пришлите JSON в чат. В файле уже есть аудио, лог робота и распознавание.
{{ callDetail.sentiment_summary }}
Почему «{{ contactDiag.status_label || kpiContactLabel(contactDiag.status) }}»
{{ contactDiag.full_name || (contactDiag.kind === 'pochta' ? 'Получатель' : 'Абонент') }} · {{ contactDiag.phone }} · {{ contactDiag.email }}
{{ contactDiag.why }}
{{ formatPochtaStatusJson(contactDiag.letter_status) }}
Загрузка Excel
{{ excelUpload.filename || 'файл' }}
{{ excelUpload.stageLabel || 'Обработка' }}
{{ excelUpload.error || excelUpload.message || '…' }}
- {{ w }}
| Стр. | ФИО | Телефон | Причина |
|---|---|---|---|
| {{ s.row || '—' }} | {{ s.name || '—' }} | {{ s.phone || '—' }} | {{ s.reason }} |
{{ alertModal.title }}
{{ alertModal.text }}
Изменить контакт
У лицевого счёта может быть несколько номеров. Каждый попадает в обзвон отдельно.
При сохранении строка проходит через DaData (индекс, дом, квартира). Ключи — в разделе «Почта России».
| ЛС | Кв. | Действует | Основной долг | Пени | Общий долг |
|---|---|---|---|---|---|
|
{{ a.account }}
{{ a.fio }}
{{ a.building }}
|
{{ a.premise || '—' }} | {{ a.active || '—' }} | {{ rub(a.principal) }} | {{ rub(a.penalties) }} | {{ rub(a.total) }} |
| Всего по контакту | {{ rub(contactAccountSum(editContactModal, 'principal')) }} | {{ rub(contactAccountSum(editContactModal, 'penalties')) }} | {{ rub(contactAccountSum(editContactModal, 'total')) }} | ||
Новый ответ
{{ fmtServerDt(globalResponseModal.created_at) }}
{{ globalResponseModal.ip_address || 'Неизвестно' }}
{{ globalResponseModal.location || 'Локация не определена' }}
{{ deviceLabel(globalResponseModal.user_agent) }}