{{ 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 }}
{{ t.purpose }}
{{ 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 }}
Пользователи
ЛогинEmailРольАктивен
{{ u.username }} {{ u.email || '—' }} {{ u.role }} {{ u.is_active?'да':'нет' }}