MAATRIX / Блог / Ежедневный отчёт о продажах: PostgreSQL, n8n и PDF к началу рабочего дня

Ежедневный отчёт о продажах: PostgreSQL, n8n и PDF к началу рабочего дня

MAATRIX · 17 октября 2026 · 8 мин чтения

Утренний отчёт обычно нужен раньше, чем человек, который умеет его собирать, допьёт кофе. Данные уже есть в базе, но их приходится выгружать, приводить к одному виду и отправлять руководителю. Автоматизация этой процедуры полезна до тех пор, пока аккуратный PDF не начинает уверенно показывать неправильную выручку.

Построим процесс вокруг проверяемого результата: n8n получает показатели из PostgreSQL, формирует документ, сохраняет его и отправляет адресатам. Расчёт остаётся в SQL, оформление — в шаблоне, а отправка не повторяет весь процесс при первой сетевой ошибке.

Отчёт к началу рабочего дня

Разместите n8n и конвертацию документов на VPS MAATRIX. Для пилота с локальным Gotenberg рассмотрите 4 vCPU и 8 GB RAM.

Выбрать VPS с n8n

Самый важный лист находится до отчёта

Запишите определения показателей. Что называется продажей: оформленный заказ, успешная оплата или отгрузка? Сумма включает доставку и налоги? Возврат уменьшает выручку дня возврата или пересчитывает день покупки? Ответы нужны до автоматизации, иначе два отдела будут получать разные, одинаково убедительные цифры.

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

Определите часовой пояс отчётного дня и время закрытия данных. Если платежи приходят с задержкой, отчёт в полночь будет предварительным. Можно выпускать его утром за предыдущий день и отмечать момент формирования. Поздние события потребуют исправленной версии, которую нельзя незаметно подменять под старым именем.

Запрос, который можно проверить на бумаге

Создайте отдельную роль PostgreSQL с чтением нужных представлений. n8n не требуется право менять заказы. Лучше предоставить подготовленное представление с понятными бизнес-полями, чем разрешать workflow читать каждую таблицу магазина.

Ниже учебный запрос для собственной таблицы reporting_payments: paid_at имеет тип timestamptz, amount — точный денежный тип numeric, а валюты не смешиваются. Имена здесь пример, их нужно сопоставить с вашей схемой. Возвраты в таком простом запросе ещё не учтены и должны рассчитываться отдельно по согласованному правилу.

SELECT currency,
       COUNT(DISTINCT order_id) AS paid_orders,
       COALESCE(SUM(amount), 0) AS paid_amount
FROM reporting_payments
WHERE status = 'succeeded'
  AND paid_at >= ($1::date::timestamp AT TIME ZONE $2)
  AND paid_at < (($1::date + 1)::timestamp AT TIME ZONE $2)
GROUP BY currency
ORDER BY currency;

Первый параметр — отчётная дата, второй — зона, например Europe/Moscow. Границы полуинтервала позволяют не включать полночь следующего дня дважды. Преобразование времени описано в документации PostgreSQL. Если ваша таблица хранит другие типы или значения без зоны, сначала разберитесь с их смыслом.

Проверьте запрос на небольшой копии: две оплаты одного заказа, оплата ровно в полночь, несколько валют, неуспешный платёж и день без продаж. Сумма платежей и число заказов считаются по-разному. Нельзя заменить одну метрику другой только потому, что на первой тестовой дате результаты совпали.

Сначала цифры, затем расписание

Создайте Manual Trigger, далее Edit Fields с отчётной датой и зоной, затем узел Postgres с операцией Execute Query. Передавайте значения через Query Parameters. В настройках credentials используйте отдельную роль и защищённое соединение с базой, если она находится на другом сервере.

Сохраните результат запроса как снимок с датой, временем формирования, версией расчёта и идентификатором запуска. Это позволит позже понять, какие именно данные попали в документ. Если завтра изменится правило учёта возвратов, вчерашний PDF не должен оставаться без объяснимой методики.

Перед созданием файла добавьте проверки. Неожиданно пустая выборка может означать отсутствие продаж, а может — поломку источника. Сравните время последнего обновления данных, наличие обязательных полей и допустимость значений. Ошибка запроса не равна нулевой выручке. При сомнении отправляйте уведомление о задержке отчёта, а не красивую страницу с нулями.

После ручной приёмки замените вход на Schedule Trigger и задайте время в часовом поясе workflow. Дату отчёта вычисляйте относительно этого пояса, а для ручного повторного выпуска оставьте возможность передать конкретный день. Затем опубликуйте workflow: сохранённого черновика для ежедневной работы недостаточно.

От таблицы к PDF без магии

Узел Convert to File умеет создавать несколько файловых форматов, но отдельной штатной операции «превратить всё в PDF» в нём нет. Для PDF понадобится дополнительный компонент. Подойдёт Gotenberg, который принимает подготовленный HTML и возвращает документ.

Если n8n работает в Docker Compose, добавьте Gotenberg как отдельный сервис в ту же внутреннюю сеть по официальной инструкции. Не публикуйте его порт в интернет. Имя сервиса, например gotenberg, будет доступно соседнему контейнеру, а localhost внутри n8n указывает на сам контейнер n8n, не на весь сервер.

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

В n8n сформируйте строку шаблона, затем Convert to File с операцией Convert to Text File. Поле с текстом укажите как вход, выходное бинарное поле назовите data, а файл — index.html. Название важно для маршрута Gotenberg. Кодировка должна сохранять русский текст.

Следующий HTTP Request отправляет POST на http://gotenberg:3000/forms/chromium/convert/html, если именно такое имя сервиса вы выбрали. Тип тела — Form-Data, параметр files — бинарный файл n8n из поля data. Ответ сохраняйте как файл. Это конкретная связка для внутренней сети; для другого расположения сервиса потребуется настроить адрес и защищённый доступ.

Откройте полученный PDF вручную. Проверьте переносы строк, кириллицу, длинные названия, несколько страниц и пустые разделы. Успешный HTTP-ответ говорит о выполненной конвертации, но не доказывает, что последняя колонка таблицы поместилась на листе.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

АРЕНДОВАТЬ СЕРВЕР

У отчёта должна быть версия

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

Для документа с несколькими разделами задайте контрольные равенства. Например, сумма по категориям должна совпадать с общей суммой при одинаковых правилах включения. Если заказ относится к нескольким категориям, заранее определите, как распределяется его стоимость. Соединение таблицы заказов с позициями может умножить сумму заказа на число строк — распространённая ошибка, которую красивое оформление скрывает особенно успешно.

Не округляйте каждую промежуточную строку без необходимости. Сначала выполните расчёт в согласованной точности, затем примените правило отображения. В документе укажите валюту рядом с суммой, а для процентного изменения — период сравнения. Если прошлый период нулевой, напишите это словами: бесконечный рост математически любопытен, но плохо помогает планировать закупки.

Проверьте читаемость на телефоне. Если основные показатели спрятаны на третьей странице, вынесите краткую сводку в начало, а детализацию оставьте приложением. Уберите колонки, которыми никто не пользуется. Автоматически сформированный отчёт тоже заслуживает редактуры: возможность ежедневно производить двадцать страниц ещё не означает, что их нужно ежедневно рассылать.

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

Присваивайте файлу имя с периодом и версией, например «продажи за дату, версия два». Внутри документа указывайте время формирования и признак предварительного или окончательного расчёта. Исправление должно содержать короткое пояснение: поступили поздние платежи, обновлены возвраты или исправлено правило расчёта.

Храните PDF в закрытом каталоге либо объектном хранилище с ограниченным доступом. Если отправляете ссылку, проверяйте её срок действия и права получателя. Для небольшого документа можно использовать вложение через Telegram или почту, но пересылка файла переносит данные за пределы вашего хранилища.

Отправку отделите от формирования. После успешного сохранения документа запишите его ID и список адресатов. Если одному человеку не доставили сообщение, повторяйте эту доставку, а не пересчитывайте весь день. Иначе разные получатели могут получить разные версии под одним названием.

Создайте журнал доставок с идентификатором отчёта и адресатом. Не считайте HTTP-успех доказательством прочтения. Если отчёт нужен для обязательного согласования, это отдельный процесс с явным подтверждением, а не скрытое предположение о внимательности получателя.

Маленькая редакция на одном сервере

Для n8n, локальной конвертации PDF и небольших отчётов можно рассмотреть VPS MAATRIX Heka Standard с 4 vCPU и 8 GB RAM. Это стартовый ориентир для пилота, а не гарантия обработки произвольных таблиц. Браузерный движок Gotenberg потребляет память, поэтому сначала ограничьте параллельную генерацию одним документом.

Подойдёт поддерживаемая Ubuntu или Debian. Большую рабочую базу лучше не нагружать тяжёлым запросом каждое утро без оценки плана выполнения. Используйте подходящие индексы, подготовленные представления или отдельный источник отчётности, если это оправдано объёмом. Резервируйте шаблон, снимки расчётов и настройки процесса; срок хранения PDF задайте заранее.

В MAATRIX доступен VPS с n8n; компонент конвертации и бизнес-запросы настраиваются под ваш отчёт. ИИ для суммирования платежей здесь не нужен. Самое полезное чудо состоит в другом: документ приходит вовремя, каждую цифру можно объяснить, а автор отчёта наконец успевает выпить свой кофе.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

АРЕНДОВАТЬ СЕРВЕР

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →