Уведомления ERPNext: e-mail и Telegram для согласований
АйТи Фреш
IT-аутсорсинг и бизнес

Как согласующий узнаёт о заявке: уведомления ERPNext по e-mail и в Telegram

Автор: , директор ООО «АйТи-Фреш» · · ~14 мин чтения
Бригадир на крыше отправляет заявку, директор в машине получает письмо с зелёной галочкой согласования
Согласование доходит до директора там, где он находится.

Согласующий узнаёт о заявке в ERPNext из письма: Workflow Action присылает подписанные ссылки Approve и Reject, а Notification шлёт обычные оповещения. Готового Telegram-бота в коробке нет, но есть Webhook и сторонние приложения. Ниже настройки, защита и разбор «письмо не пришло».

Что уведомляет ERPNext из коробки: Notification, Email Template и Workflow Action

В ERPNext за «сообщить человеку» отвечают три разных механизма, и их часто путают. Первый — документ Notification, второй — письма Workflow Action, третий — шаблоны писем (Email Template), которые подставляются в тексты. В решении на ERPNext я использую их вместе: Notification говорит «появилась заявка», а Workflow Action даёт согласующему кнопки, чтобы он ответил, не заходя в систему.

Notification — это правило. В исходниках Frappe версии 15 у него есть поле события «Send Alert On» со значениями New, Save, Submit, Cancel, Days After, Days Before, Value Change, Method и Custom, а канал выбирается из четырёх: Email, Slack, System Notification и SMS. Получателей задают таблицей: роль, поле документа или конкретный адрес. Условие пишется выражением, например по сумме заказа, а тема и текст — на Jinja, то есть в них можно подставить номер заявки, объект, сумму. К письму можно приложить печатную форму документа (опция Attach Print и выбор Print Format).

Обратите внимание на то, чего в списке каналов нет: Telegram. Он не входит ни в Notification, ни в какую-либо другую штатную настройку; я проверил это по описанию поля канала. Поэтому всё, что звучит как «настроить Telegram-уведомления в ERPNext из коробки», на самом деле означает установку отдельного приложения или Webhook, и об этом отдельный раздел ниже.

Workflow Action — это механизм самого маршрута согласования. Когда документ переходит в состояние, из которого возможны переходы, система создаёт задачу-действие для ролей с правом на переход и, если включено, отправляет письмо. По коду Workflow Action у Workflow есть флажок «Send Email Alert» (по умолчанию выключен), а у состояния — «Send Email On State» (по умолчанию включён): письмо уходит, только если включены оба. Это частая причина жалобы «согласующему ничего не приходит»: маршрут настроен, но флажки не отмечены.

Как настроить письмо согласующему с PDF и кнопками Approve / Reject

Порядок такой. Сначала создаётся Workflow для документа, например для Material Request: состояния (Draft, Pending Approval, Approved, Rejected), переходы с ролями и условиями. Затем у Workflow включается «Send Email Alert», а в состоянии Pending Approval проверяется, что «Send Email On State» не снят (у новых состояний он стоит по умолчанию). У состояния есть и поле «Next Action Email Template»: шаблон письма можно подготовить заранее, чтобы в тексте стояли объект, сумма и автор заявки. У перехода есть флажок «Send Email To Creator», он уведомляет инициатора о решении.

Что получает согласующий. Письмо содержит кнопки по числу возможных действий, например Approve и Reject. Каждая кнопка — подписанная ссылка на метод apply_action: в исходнике видно, что ссылка собирается из параметров документа, действия, пользователя и текущего состояния и подписывается функцией get_signed_params, а метод проверяет подпись командой verify_request. Подделать ссылку или изменить действие нельзя, не зная ключа сайта.

Но нажатие на кнопку не сразу меняет документ. По коду метод apply_action открывает страницу подтверждения с кнопкой и ссылкой на PDF, и только после подтверждения вызывается confirm_action, который применяет переход. Если после отправки письма документ успел измениться, страница об этом предупреждает; если состояние уже другое (кто-то согласовал раньше), показывается страница «ссылка устарела». Это защита от повторного нажатия, которая у вас появится бесплатно.

Отдельно про уведомление без согласования. Допустим, снабженцу нужно знать о каждой новой заявке. Создаём Notification для Material Request, событие New или Submit, получатель — роль «Снабженец», тема на Jinja, например «Заявка {{ doc.name }} от {{ doc.owner }}», PDF прикладываем. Для директора добавляем условие по сумме. Письма проходят через очередь и фоновые задачи, поэтому проверяйте работу планировщика, о чём в последнем разделе.

Мой совет по текстам: тема письма должна отвечать на вопрос «что от меня нужно», а не «что произошло». «Нужно согласовать заявку на кровельную плёнку, объект Северная, 84 тыс. ₽» понятнее, чем «Новая заявка в системе». Это один абзац на Jinja, и он экономит открытие письма.

Telegram и ERPNext: чего в коробке нет и какие есть пути

Прямо: готового Telegram-бота в ERPNext нет, и согласование «одной кнопкой в чате» нужно собирать. Путей три, и ни один не настраивается галочкой. Они сведены в таблицу, которая дублирует схему сравнения ниже. | Путь | Что это | Кнопки Approve/Reject | Что проверить на стенде | |---|---|---|---| | Webhook из ERPNext в Bot API | Штатный документ Webhook отправляет JSON в Telegram | нет, только текст и ссылка | токен бота и права | | Сторонние приложения | Например, erpnext_telegram (yrestom) | в описании только уведомления | совместимость с вашей версией | | Свой обработчик (бот) | Сервис принимает нажатия и вызывает переход | да, но это разработка | chat_id, права, статус, повтор |

Первый путь — Webhook. В Frappe он описывается документом Webhook: событие (по описанию поля — after_insert, on_update, on_submit, on_cancel и другие), условие, адрес запроса, заголовки, тело в формате JSON, написанное на Jinja, и секрет для подписи. Для Telegram адрес запроса — метод sendMessage Bot API, а в теле — идентификатор чата и текст. Пример тела с условными значениями:

{
  "chat_id": "123456789",
  "text": "Заявка {{ doc.name }} ждёт согласования: {{ doc.owner }}"
}

Токен бота при этом обычно входит в адрес запроса, и хранить его в открытом виде в настройках не стоит; поэтому вместо прямого вызова Bot API я ставлю между ERPNext и Telegram небольшой собственный сервис или сценарий в n8n, который хранит токен и решает, кому и что отправить. О сценариях без программиста мы писали в статье про n8n и автоматизацию бизнес-процессов.

Второй путь — сторонние приложения. Проект erpnext_telegram (репозиторий yrestom) в описании обещает уведомления через Telegram-ботов пользователям, сотрудникам, клиентам и в групповые чаты, а также отправку сообщений из формы документа. Я проверил репозиторий: в нём есть ветки version-14, version-15 и version-16, последняя активность — август 2026 года. Но в описании нет согласования кнопками, и я не утверждаю, что оно там работает. Второй проект, frappe_telegram (leam-tech), обновлялся в январе 2024 года. Перед выбором приложения проверьте совместимость с вашей версией на стенде, лицензию и то, как приложение хранит токен.

Третий путь — собственный обработчик: Telegram отправляет боту нажатие кнопки (в Bot API это CallbackQuery с данными кнопки), а сервис вызывает переход Workflow. Он даёт то, что хочет директор, но это разработка со своими правилами безопасности, и о них следующий раздел. Для большинства подрядчиков на 10–20 человек я предлагаю промежуточное решение: Telegram присылает уведомление со ссылкой на документ, а само согласование — из письма с подписанной ссылкой, которая работает и на смартфоне. Общую услугу по ботам под ключ можно посмотреть на странице про Telegram-ботов для бизнеса.

Как защитить согласование из мессенджера: chat_id, права и повторные нажатия

Кнопка в чате — это дверь в закупки, и она должна проверять не меньше, чем веб-интерфейс. Первое: соответствие чата и пользователя. Обработчик хранит привязку «идентификатор чата — пользователь ERPNext» и не доверяет ничему, что пришло в самом нажатии. Привязку создаёт администратор, а не сам пользователь по команде в чате: иначе любой, кто узнает имя бота, попытается привязаться.

Второе: право на переход. Обработчик должен выполнять переход от имени этого пользователя, а не от имени служебной учётки с полными правами. Тогда ERPNext сам проверит роль и условия перехода, и повторять эту логику в боте не придётся. Третье: статус документа. Перед переходом проверяйте, что документ всё ещё в том состоянии, из которого отправили кнопку; письма Workflow Action делают это штатно (страница устаревшей ссылки), и бот обязан вести себя так же. Четвёртое: блокировка повторных нажатий, чтобы двойной тап не провёл два перехода.

Теперь о самосогласовании. Часто пишут, что Workflow сам его не запрещает и без скрипта не обойтись. Но в исходниках Frappe версии 15 у перехода есть флажок «Allow Self Approval» с описанием «разрешить согласование создателю документа», и по умолчанию он включён. Функция проверки доступа к переходу пропускает автора, только если флажок стоит, исключение одно: пользователь Administrator. Значит, правило настраивается без кода: снимите флажок у перехода, и автор заявки с ролью согласующего не сможет одобрить свою заявку. Поэтому под Administrator заявки не согласовывают, а поведение проверяют на тестовой заявке под обычной учётной записью.

И ещё одно правило, которое я проверяю у каждого заказчика: секреты. Токен бота, секрет подписи Webhook и ключи не хранятся в тексте документов и в репозитории. Если токен утёк, его перевыпускают, а привязки чатов проверяют заново. Рассылка о закупках — это внутренняя информация компании, и канал, в который она уходит, нужно контролировать так же, как почту.

Кровля Экспресс: заявки с крыши согласует директор, который не сидит в офисе

Условный пример: подрядчик по устройству кровли «Кровля Экспресс», 12 рабочих мест, три бригады на объектах. Заявки на материалы подают бригадиры с крыш, директор почти всё время в разъездах, а офис с одним снабженцем стоит на связи. Раньше заявка шла в мессенджер, директор отвечал «ок» голосом из машины, и никто не мог потом сказать, что именно согласовано. Цифры в примере иллюстративны.

Мы настроили маршрут на Material Request с тремя состояниями и включённой отправкой писем. Заявка от бригадира уходит снабженцу обычным оповещением (Notification для роли «Снабженец»). Если сумма заявки превышает порог, заявка получает состояние ожидания согласования, а директору уходит письмо с PDF и двумя кнопками. Директор нажимает Approve в почте на смартфоне, подтверждает на странице, и заявка меняет состояние, о чём бригадир получает письмо. Самосогласование отключили флажком у перехода.

Telegram подключили вторым этапом и только как уведомление: промежуточный сценарий через n8n отправляет в рабочий чат директора сообщение «Нужно согласовать заявку, ссылка» без кнопок. Согласование через чат мы не делали сознательно: на 12 человек разработка бота с проверками не окупает себя, и мы честно объяснили это заказчику. Это решение можно пересмотреть, когда число заявок вырастет.

Что осталось нерешённым. Часть бригад работает там, где нет мобильной связи, и заявка уходит только когда телефон ловит сеть. Письмо с кнопками в таком случае приходит директору с задержкой, и об этом договорились отдельно в регламенте: срочные заявки дублируются звонком. Посмотреть маршрут и письма на демо-данных можно на демостенде erp-demo.itfresh.ru по запросу.

Почему письмо не пришло: планировщик, воркеры и Email Account

Если письмо не пришло, сначала смотрите на фоновые процессы. В коде Workflow Action письмо с кнопками ставится в очередь коротких фоновых задач, то есть без работающих воркеров оно не отправится, даже если всё остальное настроено верно. Диагностика начинается с команды bench doctor: она показывает, включён ли планировщик, сколько воркеров онлайн и сколько задач в каких очередях.

# Состояние планировщика и воркеров
bench doctor

# Статус и включение планировщика для сайта
bench --site erp.example.com scheduler status
bench --site erp.example.com enable-scheduler

Имена команд сверены с исходниками Frappe версии 15 (doctor, scheduler, enable-scheduler); у установок на Docker запускать их нужно внутри контейнера.

Таблица ниже — разбор по принципу «симптом, причина, действие», она дублирует дерево решений на схеме. | Симптом | Вероятная причина | Что делать | |---|---|---| | Не приходят вообще никакие письма | остановлен планировщик | bench doctor, включить планировщик | | Обычные письма идут, а с кнопками нет | не работают воркеры или не включены флажки Send Email | проверить воркеры и «Send Email Alert» | | Ошибка при отправке | неверно настроен Email Account | проверить пароль или способ входа ящика | | Письмо ушло, кнопка не работает | нет права на переход или статус уже изменился | проверить роль в переходе и текущее состояние |

Про ящик отправки. В коде видно, что при ошибке настройки исходящей почты система пишет в журнал ошибок запись «Failed to send workflow action email» и не пытается слать остальным получателям. Поэтому после смены пароля или политики почтового сервера проверяйте не только вход, но и журнал ошибок. Если письма доходят, но попадают в спам, дело в домене отправителя и записях SPF и DKIM, а не в ERPNext.

Два последних замечания. Во-первых, после настройки отправьте себе тестовую заявку и пройдите весь маршрут целиком: от создания до нажатия кнопки и письма автору. Во-вторых, если уведомлений много, они превращаются в шум; отключайте те, на которые никто не реагирует. Для сквозного маршрута согласования ещё и с договорами у нас есть статья про автоматизацию маршрутов согласования договоров.

Частые вопросы

Можно ли согласовать заявку в ERPNext прямо из письма?

Да. Workflow Action присылает письмо с подписанными ссылками, например Approve и Reject; нажатие открывает страницу подтверждения, а после подтверждения применяется переход Workflow. Письмо уходит, если включены «Send Email Alert» у Workflow и «Send Email On State» у состояния, а фоновые воркеры работают.

Есть ли в ERPNext готовый Telegram-бот из коробки?

Нет. В поле канала у документа Notification только Email, Slack, System Notification и SMS. Есть Webhook, который отправляет JSON в Bot API, и сторонние приложения вроде erpnext_telegram. Согласование кнопками в чате придётся разрабатывать и проверять на стенде своей версии.

Как настроить уведомление о новой заявке на материалы в ERPNext?

Создайте документ Notification для Material Request, событие New или Submit, канал Email, получатели по роли или полю документа. Тему и текст пишут на Jinja, например с номером заявки и автором, а печатную форму можно приложить через Attach Print и выбор Print Format.

Почему не приходят письма Workflow Action в ERPNext?

Чаще всего остановлен планировщик или не работают воркеры, реже не включены флажки отправки писем у Workflow и состояния либо неверно настроен Email Account. Диагностику начинают командой bench doctor: она показывает планировщик, воркеры онлайн и задачи по очередям.

Безопасно ли согласовывать закупки через Telegram?

Безопасно, если обработчик проверяет привязку чата к пользователю, выполняет переход от имени этого пользователя, сверяет текущий статус документа и блокирует повторные нажатия. Без этих проверок кнопка в чате становится дырой в согласовании. Токен бота храните не в тексте документов.

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

© ООО «АйТи-Фреш» · Москва · Все статьи