{{ error }}
{{ success }}
Обзор
Сейчас работает
{{ current.fop_name }}
Смешанное состояние
Не определено
определено {{ fmtDate(current.updated_at) }}
Ресурсы находятся на разных ФОП — вероятно, переключение прошло частично.
Выполните его целиком или посмотрите детали в истории.
Состояние определяется при опросе ресурсов. Нажмите «Проверить все сайты».
{{ stats.sites_total || 0 }}
сайтов активно
{{ stats.sites_ok || 0 }}
на связи
{{ stats.sites_error || 0 }}
с ошибкой
{{ stats.drift_open || 0 }}
расхождений
Сайты разъехались по ФОП.
Сейчас в работе несколько разных суффиксов:
{{ s }} — {{ n }}
Отправитель Новой Почты
| Приложение | Активный ключ | Связь | Проверено |
|---|---|---|---|
|
{{ a.name }}
{{ a.db_path }}
|
{{ a.last_state.np_key_name }} — |
{{ healthLabel(a.health) }}
{{ a.last_error }}
|
{{ fmtDate(a.last_state_at) }} |
Текущее состояние
обновлено при последней проверке
Сайтов пока нет.
Добавить первый
| Сайт | CMS | Суффикс | Внутренний заголовок | Связь | Проверен |
|---|---|---|---|---|---|
|
{{ s.name }}
{{ s.url }}
|
{{ s.cms==='woo'?'Woo':'OpenCart' }} | {{ s.last_state.code_suffix }} — | {{ (s.last_state && s.last_state.internal_title) || '—' }} |
{{ healthLabel(s.health) }}
{{ s.last_error }}
|
{{ fmtDate(s.last_state_at) }} |
Переключение ФОП
Сейчас работает
{{ current.fop_name }}
смешанное состояние
не определено
{{ i.text }}
Что изменится
состав задаёт политика ФОП
|
{{ p.resource_name }}
{{ p.fields.map(fieldLabel).join(', ') }}
|
необязателен |
Снять галочку можно, добавить — нет: ресурсы, выключенные политикой,
в списке не появляются. Изменить состав — в разделе «Маппинг ФОП».
Сначала показываем список изменений, записи не происходит
{{ jobTypeLabel(job.type) }}
{{ jobStatusLabel(job.status) }}
{{ job.done_count }} / {{ job.total }}
| Сайт | Статус | Изменения |
|---|---|---|
|
{{ t.site_name }}
{{ t.site_url }}
|
{{ targetLabel(t.status) }}
{{ t.duration_ms }} мс
|
{{ t.error }}
{{ fieldLabel(field) }}
{{ fmtVal(pair[0]) }}
→
{{ fmtVal(pair[1]) }}
|
Менять нечего — на всех выбранных сайтах уже стоит этот профиль.
Будет изменено сайтов: {{ changesCount }}.
Клиенты, уже стоящие в чекауте, какое-то время ещё будут оформляться
со старым ФОП — такие заказы попадут в «Расхождения».
Часть ресурсов не ответила — назначен повтор на {{ fmtDate(nextDueAt) }}.
Закрывать страницу можно: продолжит фоновая задача.
{{ jobStatusLabel(job.status) }}.
Успешно {{ job.ok_count }},
с ошибкой {{ job.fail_count }},
заблокировано {{ job.blocked_count || 0 }},
пропущено политикой {{ job.skipped_count || 0 }}.
Часть систем осталась на прежнем ФОП — состояние смешанное.
Расхождения
Сюда попадают заказы, оформленные после переключения, но с прежним ФОП —
покупатель уже стоял в чекауте, и модуль взял суффикс из его сессии.
Также сюда попадают заказы с кодом без суффикса: признак, что на сайте не отработал confirm().
Расхождений нет
| Сайт | Заказ | Пришло | Ожидалось | Тип | Дата | |
|---|---|---|---|---|---|---|
| {{ d.site_name }} | #{{ d.order_ref }} | {{ d.payment_code }} | {{ d.expected_code }} | {{ d.kind==='no_suffix' ? 'без суффикса' : 'старый ФОП' }} | {{ d.order_date }} |
История переключений
Переключений ещё не было
| # | Тип | Профиль | Результат | Кто | Когда | |
|---|---|---|---|---|---|---|
| {{ j.id }} | {{ jobTypeLabel(j.type) }} | {{ j.profile_name }} — {{ j.profile_suffix }} | {{ jobStatusLabel(j.status) }} {{ j.ok_count }}/{{ j.total }} | {{ j.actor_name || 'крон' }} | {{ fmtDate(j.created_at) }} |
Расписание переключений
{{ calMonthLabel }}
Календарь на паузе. {{ calPauseReason }}
События не выполняются, пока пауза не снята. Сначала разберитесь
с причиной: следующее переключение поверх смешанного состояния
только усугубит расхождение.
Сейчас работает
{{ current.fop_name }}
смешанное состояние
не определено
Следующее переключение
{{ calNext.display_date }} {{ calNext.display_time }} → {{ calNext.fop_name }}
Месяц
{{ d }}
{{ cell.day }}
{{ e.display_time }}
{{ e.fop_name }}
| Дата | Время | ФОП | Состояние | |
|---|---|---|---|---|
| {{ e.display_date }} | {{ e.display_time }} | {{ e.fop_name }} |
{{ calStateLabel(e.state) }}
{{ e.note }}
|
В этом месяце событий нет
Сайты
Сайтов пока нет
| Название | CMS | Связь | Суффикс | |
|---|---|---|---|---|
|
{{ s.name }}
{{ s.url }}
|
{{ s.cms==='woo'?'Woo':'OpenCart' }} |
{{ healthLabel(s.health) }}
{{ s.last_error }}
|
{{ s.last_state.code_suffix }} — |
Маппинг ФОП
Появились ресурсы, не настроенные в политиках. Пока они не включены
ни у одного ФОП — откройте карточку и решите, нужны ли они.
ФОП пока нет
| ФОП | Состояние | Готовность | Ресурсов | Заполнено | |
|---|---|---|---|---|---|
|
{{ f.name }}
сейчас
|
{{ fopStateLabel(f.state) }} | {{ readyLabel(f.readiness) }} | {{ f.resources_enabled }}/{{ f.resources_total }} | {{ f.filled }}/{{ f.required }} |
{{ fopCard.fop.name }}
{{ readyLabel(fopCard.readiness.color) }}
Какое значение соответствует этому ФОП в каждом ресурсе. Для приложений
ключ выбирается из списка, который отдаёт само приложение.
{{ fld.label }}
не найдено
проверено
Что менять при переходе на этот ФОП. Выключенный ресурс пропускается
осознанно и ошибкой не считается. Включённый без значения блокирует переключение.
| Ресурс | Поля | Обязателен | |
|---|---|---|---|
|
{{ p.resource_name }}
{{ resourceKindLabel(p.kind) }}
|
Проблем нет — ФОП готов к переключению.
{{ i.text }}
Что будет переключено
Политика не включает ни одного ресурса
| Ресурс | Поля | Обязателен |
|---|---|---|
| {{ p.resource_name }} | {{ p.fields.map(fieldLabel).join(', ') || '—' }} | {{ p.mandatory ? 'да' : 'нет' }} |
Приложения Новой Почты
Приложения на этом же сервере, которые создают накладные — RMA, Picker.
При переключении ФОП панель меняет в них активный ключ Новой Почты,
чтобы отправитель в ТТН совпадал с ФОП на сайтах.
Приложений пока нет
| Название | Активный ключ | Связь | |
|---|---|---|---|
|
{{ a.name }}
{{ a.db_path }}
|
{{ a.last_state.np_key_name }} — |
{{ healthLabel(a.health) }}
{{ a.last_error }}
|
Коррекция сделок KeepinCRM
После переключения ФОП сделки, которые ещё не отгружены, продолжают
числиться за прежним ФОП. Здесь они находятся и правятся. Сделки
с действующей накладной не трогаются — документ уже выписан.
Подключение
{{ healthLabel(crm.health) }}
Пусто — прежний ключ сохраняется
{id} подставится номером сделки
Через запятую. Сделки других этапов не рассматриваются.
Накладные с этими статусами не мешают правке. Неизвестный
статус всегда считается действующим.
Этапы в вашей CRM
отмечены те, что попадут в проверку
| ID | Этап | Воронка | |
|---|---|---|---|
| {{ st.id }} | {{ st.name }} | {{ st.funnel || '—' }} |
Отмечайте только этапы, где заказ ещё не отгружен. Архив и отменённые
трогать не нужно: там сделки закрыты.
{{ crm.last_error }}
Разрешение на запись
{{ crm.write_enabled ? 'разрешена' : 'запрещена' }}
Прежде чем править сотни сделок, надо убедиться, что изменение
одного поля не стирает остальные. Проверка записывает в сделку
её же текущее значение и сверяет, все ли поля на месте.
Выберите любую сделку с заполненным типом оплаты.
{{ crm.safety_note }}
Коррекция
Целевое значение: {{ crmPreviewData.target }}.
К изменению {{ crmPreviewData.counts.pending || 0 }},
уже верных {{ crmPreviewData.counts.no_change || 0 }},
пропущено {{ crmPreviewData.counts.skipped || 0 }}.
| Сделка | Этап | Текущее | Станет | Причина | |
|---|---|---|---|---|---|
| {{ d.agreement_no }} | {{ d.stage_id }} | {{ d.old_value || '—' }} | {{ d.new_value }} — |
{{ crmStatusLabel(d.status) }}
{{ d.message }}
|
Запись запрещена — сначала пройдите проверку выше.
Последние изменения
| Сделка | Было | Стало | Итог | Когда |
|---|---|---|---|---|
| {{ j.agreement_no || j.agreement_id }} | {{ j.old_value || '—' }} | {{ j.new_value || '—' }} | {{ crmStatusLabel(j.status) }} без заметки | {{ fmtDate(j.processed_at) }} |
Уведомления в Telegram
Сообщения ставятся в очередь и отправляются фоновой задачей. Сбой отправки
никогда не считается сбоем переключения — уведомление важно, но не важнее
самой операции.
Бот
{{ tg.is_enabled ? 'включён' : 'выключен' }}
ID через запятую. Пусто — команды запрещены всем.
Вебхук нужен, чтобы бот принимал команды и регистрировал получателей.
После настройки напишите боту /start — чат появится ниже.
В очереди {{ tg.queue.pending }}, не доставлено {{ tg.queue.failed }}.
Получатели
Пока никого. Напишите боту /start в личном чате.
| Чат | Включён | Технические | Финансовые | |
|---|---|---|---|---|
|
{{ r.username ? '@' + r.username : (r.first_name || 'без имени') }}
{{ r.chat_id }}
бот заблокирован пользователем
|
Какие события отправлять
Шаблон сообщения
Неизвестные шорткоды: {{ tgUnknown.map(c => '{' + c + '}').join(', ') }}.
Сохранить не получится, пока они есть.
Доступные шорткоды: {{ tgCodes.map(c => '{' + c + '}').join(' ') }}
Как это будет выглядеть
NovaPay
На сервере нет расширения SOAP. Установите его:
apt-get install php8.1-soap && systemctl restart php8.1-fpm
Подключение
Учётные данные хранятся зашифрованными и наружу не отдаются.
Для фоновой работы предпочтителен режим JWT: он обходится без
одноразового кода при каждом входе.
{{ npConn.name }}
{{ npStateLabel(npConn.state) }}
{{ npConn.last_error }}
Режим наблюдения. Операции загружаются и классифицируются,
но записи в CRM не создаются. Выключать его стоит только после проверки
хотя бы одного полного цикла.
Подтверждение входа
На телефон, привязанный к кабинету NovaPay, отправлен одноразовый код.
Счета
Счета не загружены
| Предприятие | IBAN | Валюта | ФОП |
|---|---|---|---|
| {{ a.client_name || a.client_id }} | {{ a.iban_masked }} | {{ a.currency }} |
Выписка
Операции загружаются, распознаются правилами и сохраняются.
Повторная загрузка того же периода дублей не создаёт.
Всего
{{ npTxTotal }}
Распознано
{{ npTxCounts.matched || 0 }}
Пропущено
{{ npTxCounts.ignored || 0 }}
Ручная проверка
{{ npTxCounts.manual_review || 0 }}
| Дата | Сумма | Тип | Назначение | Правило |
|---|---|---|---|---|
| {{ t.org_date }} | {{ t.amount }} {{ t.currency_tag }} | {{ t.payment_type }} | {{ npActionLabel(t.rule_action) }} {{ npTxStateLabel(t.state) }} |
Операции не загружены
Образец ответа
Структура выписки в документации не зафиксирована, поэтому разбор
строится по реальному ответу. Кнопка загружает его и показывает здесь.
Проверьте образец на персональные данные, прежде чем передавать.
Пустая выписка часто означает, что счёт не указан
Размер {{ npSample.size }} байт, хэш {{ npSample.hash.slice(0,16) }}…
, операций в выписке: {{ npSample.payments_count }}
Выписка пустая. Проверьте период и выбранный счёт: за эти дни
операций может не быть, либо они попадают под другой тип даты.
Правила распознавания
| Правило | Действие | Условие | |
|---|---|---|---|
| {{ r.name }} | {{ npActionLabel(r.action) }} | {{ r.match_mode }}: {{ r.pattern }} | {{ Number(r.is_enabled) ? 'вкл' : 'выкл' }} |
Проверить правило на тексте
Сработало правило {{ npTestResult.rule.name }}
→ {{ npActionLabel(npTestResult.rule.action) }}
Ни одно правило не подошло
После нормализации: {{ npTestResult.normalized }}
Ожидаемая комиссия 0,25%: {{ npTestResult.expected_commission }}
Не подлежит обработке: {{ npTestResult.processable.reason }}
Финансовые операции
{{ npOpStateLabel(sr.state) }}
{{ sr.c }}
{{ Number(sr.total).toLocaleString('uk-UA') }} ₴
Операций нет
| Дата | ФОП | Снятие | Комиссия | Расчёт | Разница | Состояние | |
|---|---|---|---|---|---|---|---|
| {{ o.org_date || '—' }} | {{ o.fop_name || '—' }} | {{ o.amount || '—' }} | {{ o.commission_actual || '—' }} | {{ o.commission_expected || '—' }} | {{ o.difference || '—' }} |
{{ npOpStateLabel(o.state) }}
{{ o.reason }}
|
Финансовый маппинг
Снятие наличных создаёт в CRM перемещение из кошелька ФОП в «Наличные»,
комиссия — отдельный расход. Перемещение идёт через внутренний интерфейс
KeepinCRM: публичный API второй кошелёк не принимает. Внутренние номера
кошельков подставляются при обновлении справочников.
Общие настройки
Кошелёк и категория по каждому ФОП
ФОП нет
| ФОП | Кошелёк | Категория комиссии | Сегмент | Активен | Готовность |
|---|---|---|---|---|---|
| {{ m.fop_name }} |
готов
{{ m.issues.length }}
{{ i }}
|
Записи в CRM
| Дата | ФОП | Что | Сумма | Состояние |
|---|---|---|---|---|
| {{ r.at_date || fmtDate(r.created_at) }} | {{ r.fop_name || '—' }} | {{ r.action === 'cash_fee' ? 'комиссия' : 'перемещение' }} | {{ r.amount || '—' }} |
{{ finStateLabel(r.state) }}
{{ r.error }}
|
Журнал действий
Выгрузить CSV
Записей нет
| Время | Кто | Что | Действие | Причина | IP |
|---|---|---|---|---|---|
| {{ fmtDate(a.created_at) }} | {{ a.username || 'система' }} | {{ a.entity_type }} #{{ a.entity_id }} | {{ a.action }} | {{ a.reason || '—' }} | {{ a.ip || '—' }} |
Пользователи
| Логин | Роль | Активен | |
|---|---|---|---|
| {{ u.username }} | {{ u.email || '—' }} | {{ u.role }} | {{ u.is_active?'да':'нет' }} |