Отчёты и BI: 20+ готовых отчётов, дашборды и планировщик выгрузки
В AIERP реализовано 20 предопределённых отчётов, у каждого свой раздел и операция выгрузки: ABC-XYZ (пороги 80/95 для ABC и 10/25 для XYZ), когорты с матрицей удержания и накопленным LTV, RFM-анализ, маржа, воронка продаж, перекрёстные продажи, выполнение планов, сравнение магазинов, аналитика клиентов, контрагентов, компаний, сотрудников и задач, бонусы сотрудников с матрицей «наценка × бонус». Каждый отчёт защищён отдельным правом просмотра и поддерживает выгрузку в Excel и CSV. Поверх — 4 сводки: главная аналитическая сводка (выручка и маржа, конверсия, заказы, клиенты, лиды плюс графики динамики, топ-10 товаров и клиентов, сравнение периодов), базовая сводка, сводка для закупщика, сводка для директора магазина — с фильтрацией чувствительных данных по правам. Регулярная выгрузка построена на четырёх связанных сущностях (шаблон + точка получения + расписание + фактический запуск), четырёх типизированных перечнях (статус запуска, тип точки, тип периода — 8 вариантов, режим записи), 12 генераторах формата (контрагенты, финансы, заявки, заказы для 1С, позиции, заказы, платежи, продажи товаров, остатки, магазины, сотрудники, плюс реестр и общий интерфейс) и расписаниях по стандартным cron-выражениям с защитой от двойного запуска.
Что получает бизнес от модуля
20 предопределённых отчётов
Каждый отчёт реализован отдельно: топ товаров, ABC/XYZ, разбивка продаж, способы оплаты, маржа, контрагенты, продажи по времени, воронка, сравнение магазинов, аналитика сотрудников, перекрёстные продажи, выполнение планов, когорты, остатки, организации, заказы, клиенты, компании, задачи, бонусы сотрудников. Не «конструктор без SQL» — это реально написанные отчёты с правильно посчитанными метриками.
ABC-XYZ с зафиксированными порогами
Пороги для ABC — 80 и 95 (накопленный % от выручки/маржи/количества). Пороги для XYZ — 10 и 25 (коэффициент вариации помесячных продаж в %). Критерий — выручка, маржа или количество, фильтры по категории, типу товара и производителю. Маржа скрыта для пользователей без права.
Когорты + удержание + RFM + LTV
Когортный отчёт собирает 5 блоков за один запрос: когорты (по месяцам или неделям), матрица удержания (классическая когортная сетка), клиентские метрики, RFM-анализ (шкалы давности, частоты и суммы) и LTV по когортам. Когорты можно строить по месяцам, неделям или произвольному периоду; настраивается поле даты — подтверждения или закрытия заказа.
Планировщик выгрузки с cron
Расписание связывает шаблон и точку выгрузки с cron-выражением, папкой и переопределением имени файла, плюс флаг активности. Хранит моменты следующего и последнего запуска для отслеживания, признак «идёт сейчас» и время начала — защита от двойного запуска. Фоновый исполнитель проверяет флаг до старта и сбрасывает по завершении.
FTP / SFTP / локально
Поддерживаются три типа точек выгрузки: FTP, SFTP, локальный диск. Хранятся хост, порт, имя пользователя, пароль (шифруется), приватный ключ и парольная фраза для SFTP (тоже шифруются), корневая папка, пассивный режим для FTP, защищённое соединение, тайм-аут, лимит параллельных выгрузок. Универсальный слой работы с файлами выбирает нужный драйвер автоматически.
8 предустановленных периодов
Сегодня, вчера, текущая и прошлая неделя, текущий и прошлый месяц, последние N дней (число дней настраивается) и «всё время». Единая логика отбора дат для всех генераторов — не нужно по N раз вручную вычислять «прошлую неделю».
Отдельное право на каждый отчёт
У каждого из 20 отчётов своё право просмотра — топ товаров, ABC/XYZ, разбивка продаж, способы оплаты, маржа, контрагенты, продажи по времени, воронка, сравнение магазинов, аналитика сотрудников, перекрёстные продажи, выполнение планов, когорты, остатки, организации, заказы, клиенты, компании, бонусы сотрудников. Менеджер не увидит отчёт, на который у него нет права.
Аналитический дашборд
Один запрос собирает 5 KPI-блоков: выручка и маржа, конверсия, распределение заказов по статусам, клиенты, лиды. Плюс 2 графика: динамика продаж с настраиваемой агрегацией (день/неделя/месяц) и распределение по магазинам. Плюс 2 топа: топ-10 товаров и клиентов. Плюс опциональное сравнение с прошлым периодом. Фильтр чувствительных полей скрывает данные по правам пользователя.
12 генераторов формата экспорта
Реестр хранит готовые генераторы: контрагенты, финансовые операции, заявки, заказы для 1С, позиции заказов, заказы, платежи, продажи товаров, остатки, магазины, сотрудники. Каждый отдаёт свой набор колонок и строк, CSV-форматтер применяет настройки шаблона: кодировку, разделитель, обрамление полей, перевод строки, BOM, заголовочную строку.
Что входит в Аналитика
- 01
Отчёт «Топ товаров»
Данные, экспорт и детализация остатков по складам для конкретного товара. Топ по выручке, марже или количеству. Доступен по соответствующему праву просмотра.
- 02
Отчёт ABC/XYZ
Данные, сравнение двух периодов, экспорт и детализация остатков по товару. ABC по выручке, марже или количеству; XYZ по коэффициенту вариации помесячных продаж. Пороги ABC — 80% и 95%, пороги XYZ — 10% и 25%. Маржа скрывается для пользователей без права видеть прибыль.
- 03
Отчёт «Разбивка продаж»
Данные, детализация позиций внутри категории, экспорт. Разбивка продаж по категориям с возможностью провалиться в конкретные товары категории. Доступен по соответствующему праву.
- 04
Отчёт по марже
Данные, отдельный топ по марже, экспорт. Маржинальность товаров и категорий. Считается как разница между ценой продажи и закупочной с учётом разнесённых логистических расходов из модуля «Логистика».
- 05
Аналитика по контрагентам
7 действий: данные, магазины по контрагентам, тренды, товары по контрагентам, визуализации, карточка контрагента, экспорт. Анализ закупочной активности по поставщикам.
- 06
Аналитика по компаниям
6 действий: данные, тренды, сегменты, внутренний ABC по компаниям, карточка компании. Анализ B2B-клиентов как юрлиц: сегментация, ABC, тренды по периодам, детальная карточка с заказами и платежами.
- 07
Когортный отчёт + 3 расчётных инструмента
Данные, удержание, экспорт. Один запрос возвращает 5 блоков. Внутри: расчёт когорт, клиентских метрик и LTV; матрица удержания; RFM-анализ. Можно строить когорты по месяцам, неделям или произвольному периоду.
- 08
Аналитика по остаткам
Данные и экспорт. Покрывает 4 направления: ABC/XYZ остатков, возраст остатков, распределение по магазинам и категориям, оборачиваемость. Доступна по соответствующему праву.
- 09
Отчёт по бонусам сотрудников
9 действий: данные, бонусы по магазину, по производителю, заказы сотрудника, заказы сотрудника по конкретному производителю, помесячная динамика бонусов, матрица «наценка × бонус», доли продаж по категориям, экспорт. Связан с бонусом продавца у позиции склада из модуля «Склад и остатки».
- 10
Аналитика по сотрудникам с пересчётом наград
4 действия: данные, тренды, карточка сотрудника, пересчёт наградных расчётов за период. Продажи, средний чек, конверсия, выработка по каждому сотруднику.
- 11
Отчёт «Выполнение планов»
Данные, тренды и экспорт. Выполнение планов по сотрудникам и магазинам. Берёт планы магазинов и сотрудников и сопоставляет их с фактом. Тренды дают динамику выполнения по периодам.
- 12
Отчёт по перекрёстным продажам
Данные, рекомендации для конкретного товара, экспорт. Анализирует, какие товары покупают вместе. По заказам строится матрица совместной встречаемости, на её основе формируются рекомендации.
- 13
Отчёт «Воронка продаж»
Данные и экспорт. Воронка по статусам заказа и заявки: сколько перешло с этапа на этап, процент конверсии, потери. Доступен по соответствующему праву.
- 14
Отчёт «Сравнение магазинов»
Данные и экспорт. Сравнение магазинов между собой по выручке, марже, чеку, конверсии и бонусам. Помогает находить отстающие точки и точки-эталоны для масштабирования практик.
- 15
Шаблон выгрузки
Название, описание, ключ генератора в реестре, параметры генератора, формат файла, кодировка, разделитель, обрамление полей, перевод строки, печатать ли заголовок, добавлять ли BOM, шаблон имени файла, тип периода, число дней, режим записи (перезапись или дозапись), ограничения на число строк и размер файла, флаг активности.
- 16
Точка выгрузки с шифрованием секретов
Тип драйвера, хост, порт, имя пользователя, пароль (шифруется), приватный ключ и парольная фраза (шифруются), корневая папка, пассивный режим, защищённое соединение, тайм-аут, лимит параллельных выгрузок. Секретные поля скрываются в выдаче, прозрачно шифруются при записи.
- 17
Расписание выгрузки с защитой от двойного запуска
Cron-выражение, моменты следующего и последнего запуска, признак «идёт сейчас» и время начала. Перед стартом фоновый исполнитель проверяет, что выгрузка не идёт, ставит флаги, по завершении сбрасывает. Если запуск завис — видно, сколько времени флаг стоит, можно сбросить вручную.
- 18
Журнал запусков с 4 статусами
Статусы: ожидание (серый), выполняется (синий), успех (изумрудный), ошибка (красный). Поля: ссылка на расписание (необязательная — ручной запуск), ссылка на шаблон, ссылка на точку выгрузки, автор, источник запуска (расписание, вручную, через API), моменты начала и окончания, период с/по, число строк, размер файла, путь к файлу, текст ошибки, доп. контекст. История доступна и по шаблону, и по расписанию.
- 19
Аналитическая сводка одним запросом
5 KPI-блоков (выручка и маржа, конверсия, заказы, клиенты, лиды) + 2 графика (динамика продаж с настраиваемой агрегацией, распределение по магазинам) + 2 топа (топ-10 товаров и клиентов) + опциональное сравнение с прошлым периодом. Поле даты настраивается (дата подтверждения или дата закрытия) — важно при работе с долгими циклами заказов.
- 20
Фильтр чувствительных данных
Аналитический дашборд перед возвратом данных фильтрует блок выручки. Если у пользователя нет права видеть маржу и себестоимость — поля маржи, закупочной стоимости и процента прибыли скрываются. Менеджер видит только выручку, директор — всё.
Как это выглядит в системе
Частые вопросы
Это «конструктор отчётов без SQL»?
Нет, в коде нет drag-and-drop конструктора метрик. Реализовано 20 предопределённых отчётов с правильно посчитанными метриками: ABC-XYZ с фиксированными порогами, когорты с retention/RFM/LTV, маржа с учётом разнесённых логистических расходов, бонусы сотрудников с матрицей наценка-бонус и т.д. Каждый отчёт — отдельный контроллер и сервис, проверенные на реальных данных. Для произвольных кастомных срезов есть API с фильтрами; полноценный no-code BI-конструктор — потенциальный отдельный функционал.
Какие отчёты есть из коробки?
20 отчётов под /api/reports/*: top-items, abc-xyz, sales-breakdown, payment-methods, margin, contr-analytics, sales-by-time, sales-funnel, store-comparison, worker-analytics, cross-sell, plan-fulfillment, cohort, stock-analytics, organization-analytics, order-analytics, client-analytics, company-analytics, task-analytics, worker-bonuses. У каждого есть getData + export, у многих — детальные эндпоинты (trends, items, details, item-stock-details, recommendations).
По каким порогам считается ABC-XYZ?
ABC: пороги 80 и 95 (накопленный процент от метрики — выручки/маржи/количества). Товары до 80% — класс A, до 95% — B, остальные — C. XYZ: пороги 10 и 25 (коэффициент вариации помесячных продаж в %). До 10% — X (стабильно), до 25% — Y (умеренно), выше — Z (нестабильно).
По каким критериям можно считать ABC?
criterion ∈ {revenue, margin, quantity}. revenue — по выручке (default), margin — по марже (требует canViewProfit=true), quantity — по количеству проданных единиц. Дополнительно фильтры: categoryIds, itemTypeIds, manufacturerIds. dateField — confirmed_at или closed_at, важно для разных бизнес-циклов.
Что входит в когортный отчёт?
Когортный отчёт возвращает 5 блоков: когорты (по месяцам/неделям), удержание (классическая когортная сетка), клиентские метрики (стоимость привлечения, средний чек, повторные покупки), RFM-анализ (давность, частота, сумма), накопленный LTV по когортам. Один запрос — всё разом, не 5 отдельных.
Какие дашборды есть?
Четыре дашборда: главный аналитический (KPI, графики, топы, сравнение периодов), базовый, для закупщиков (нужные товары, поставщики, открытые заявки), для директора магазина (выручка, чеки, конверсия, KPI сотрудников). У каждого свой набор операций.
Что показывает аналитический дашборд?
Аналитический дашборд собирает 5 KPI-блоков: выручка и маржа, конверсия, статусы заказов, клиенты, лиды. Плюс графики динамики выручки (день/неделя/месяц) и распределения по магазинам. Плюс топ-10 товаров и клиентов. Плюс опциональное сравнение с прошлым периодом — показывает абсолютное изменение и процент.
Как скрываются чувствительные данные?
Скрытие чувствительных данных. Аналитический дашборд перед выдачей проверяет права пользователя. Если у него нет права видеть маржу или себестоимость — поля маржи, закупочной цены и процента прибыли скрываются автоматически. Менеджер видит только выручку, директор магазина — выручку и маржу своих точек, финансовый директор УК — всё. Никаких «случайно показал лишнее».
Кто может видеть какой отчёт?
Permission per report через middleware can:report_*.view: report_top_items, report_abc_xyz, report_sales_breakdown, report_payment_methods, report_margin, report_contr_analytics, report_sales_by_time, report_sales_funnel, report_store_comparison, report_worker_analytics, report_cross_sell, report_plan_fulfillment, report_cohort, report_stock_analytics, report_organization_analytics, report_order_analytics, report_client_analytics, report_company_analytics, report_worker_bonuses. Менеджер видит свои разрешённые отчёты, директор сети — все.
Как настраивается регулярная выгрузка?
Три модели: ReportExportTemplate (что выгружаем — generator_key + параметры формата), ReportExportDestination (куда — FTP/SFTP/Local с реквизитами), ReportExportSchedule (когда — cron_expression). При создании Schedule cron-выражение парсится, рассчитывается next_run_at, ReportExportRunner ежеминутно проверяет, что наступило время запуска.
Какие куда-куда (destinations) поддерживаются?
ExportDriverEnum: Ftp, Sftp, Local. У Destination — host, port, username, password (encrypted), private_key + private_key_passphrase (для SFTP-ключей, encrypted), root_path, passive (для FTP), ssl, timeout, max_concurrent_executions (ограничение на параллельные выгрузки в одну точку). DestinationFilesystemFactory возвращает Filesystem-инстанс под нужный драйвер.
Какие периоды можно задать в шаблоне?
Доступные периоды в шаблоне выгрузки: сегодня, вчера, текущая неделя, прошлая неделя, текущий месяц, прошлый месяц, последние N дней (настраивается), всё время. Это единая логика отбора дат для всех генераторов — не нужно каждый раз писать «начало прошлой недели» вручную.
Overwrite или append к файлу?
WriteModeEnum: Overwrite (полная перезапись файла при каждом запуске — обычное поведение), Append (добавление к существующему — для инкрементальной выгрузки). У ReportExportTemplate.write_mode хранится cast в enum. CsvFileWriter и другие writers выбирают режим открытия файла на основе этого поля.
Какие генераторы доступны?
12 классов под /Services/ReportExports/Generators: ContrsGenerator, FinanceExportGenerator, OrderBidsGenerator, OrderFor1CGenerator (специальный формат для 1С), OrderItemsGenerator, OrdersGenerator, PaymentExportGenerator, ProductSalesGenerator, StocksGenerator, StoresGenerator, WorkersGenerator + ReportGeneratorInterface + ReportGeneratorRegistry (реестр-резолвер по generator_key). Свой формат — отдельный класс, реализующий interface.
Какие статусы у запусков выгрузки?
ExecutionStatusEnum: Pending (gray, поставлен в очередь), Running (blue, идёт сейчас), Success (emerald, завершился успешно), Failed (rose, упал с ошибкой). У ExecutionStatusEnum есть метод color() — UI берёт цвет напрямую из enum, не зашивает руками. options() — массив {value, label} для select.
Как защищаемся от двойного запуска?
У ReportExportSchedule есть поля running (bool) и running_since (datetime). Перед стартом ReportExportRunner проверяет !running, ставит running=true и running_since=now(). По завершении (success или failed) сбрасывает обратно. Если запуск завис (например, по timeout) — running_since показывает, сколько висит флаг; администратор может вручную сбросить и перезапустить.
Как настроить формат CSV?
В ReportExportTemplate: file_format (csv/xlsx/json), file_encoding (utf-8/windows-1251), file_delimiter (по умолчанию ;), file_enclosure (" обрамление полей), line_ending (\\r\\n или \\n), include_header (булево — печатать ли заголовок), file_bom (булево — добавлять ли BOM), filename_pattern (шаблон с подстановками {date}, {period}). max_rows и max_file_size_mb — ограничители.
Можно ли смотреть историю выгрузок?
Да. По каждому запуску выгрузки сохраняется полная карточка: расписание (если запуск по графику), шаблон, точка доставки, кто запустил вручную, способ запуска (вручную/по расписанию/по API), время начала и окончания, период отбора данных, число строк, размер файла, путь к файлу, текст ошибки если запуск упал, техническая информация. Журнал доступен из карточки шаблона и из расписания.
Какие отчёты считают маржу с учётом логистики?
Отчёт по марже и ABC-XYZ с критерием «маржа» берут маржу как цена позиции минус закупочная цена с расходами. Закупочная цена с расходами пересчитывается при каждом изменении состава или стоимости рейса (см. «Логистика»). То есть маржа в отчётах — это маржа после разнесения стоимости рейсов, а не «голая» выручка минус закупка.
Что такое матрица «наценка — бонус» в отчёте по бонусам?
Отдельный раздел отчёта по бонусам сотрудников возвращает таблицу «наценка × бонус» — матрица соответствия размеров наценки и выплат бонуса сотруднику. Помогает менеджеру по KPI настраивать мотивационную сетку: какую наценку дают какие сделки → какой бонус получает продавец. Связь с бонусом продавца у позиции склада из «Склад и остатки».
Можно ли запускать отчёт вручную через API?
Да. У каждого отчёта есть операция «данные» (возвращает структурированный ответ для интерфейса) и операция «выгрузка» (возвращает файл). Вызов вручную через интерфейс или сторонний клиент. Для регулярных выгрузок — расписание с cron-выражением, система запускает их автоматически. Любой запуск пишет запись в журнал с источником запуска (вручную, расписание, через API).
Можно ли выгружать в Power BI / Tableau / DataLens?
Прямых коннекторов к Power BI, Tableau, DataLens в коде нет. Но: каждый отчёт отдаёт данные через API, плюс есть выгрузка в CSV/XLSX — можно настроить регулярную выгрузку на FTP/SFTP, откуда внешний BI забирает файлы. Полноценный live-коннектор по протоколу BI — отдельная разработка по запросу.
Как кэшируется отчётная нагрузка?
Тяжёлые отчётные запросы поднимают много данных. Часть отчётов кэшируется с тегами по тематике — финансовые, документные и т.д. Регулярные выгрузки идут в очередь и работают в отдельном процессе, не блокируя интерфейс. Точка доставки имеет лимит одновременных выгрузок — защита от перегрузки внешнего FTP-сервера.
Что показывает воронка продаж?
Отчёт «воронка продаж» строится по статусам заказа/заявки. Сколько перешло с этапа на этап (Новый → Думает → Подтверждён → Закрыт), процент конверсии между этапами, потери (где сильнее всего теряем). Помогает находить узкие места в продажном цикле. Отдельная выгрузка в Excel со всеми переходами.
Что в отчёте «сравнение магазинов»?
Сравнение магазинов между собой по ключевым метрикам: выручка, маржа, средний чек, конверсия, количество чеков, бонусы сотрудников. Сортировка по любой метрике. Помогает находить отстающие точки (внизу выручки) и точки-эталоны (вверху конверсии и среднего чека) для масштабирования практик.
Что меняется на реальной сети
- Было
- Чтобы понять, какие SKU «голова кошки» и тянут половину выручки, а какие — балласт, бухгалтер раз в квартал выгружал заказы в Excel и руками строил ABC. Уходила неделя, точность падала из-за человеческих ошибок при разнесении возвратов.
- Сделали
- Подключили ABC/XYZ-отчёт с фиксированными порогами 80% и 95% (ABC), 10% и 25% (XYZ). Критерий — маржа с учётом логистики. Сравнение двух периодов показывает, какие товары мигрировали из AX в BX (опасно) или из CZ в BY (хорошо).
- Стало
- ABC-XYZ строится за минуту прямо из ERP. canViewProfit=true для маркетинг-директора — он видит маржу, для менеджера — только revenue. Видимость классов AX/AY/AZ — сразу действия: для AX усиливать промо, CZ — кандидаты на вывод.
- Было
- Финдиректор раз в неделю выгружал заказы B2B-клиентов и собирал в Excel когортную матрицу — какая когорта 2025-Q1 ещё покупает в 2026-Q1. Уходил день, retention считали без LTV, RFM — отдельной таблицей.
- Сделали
- Когортный отчёт за один запрос возвращает 5 блоков: когорты по месяцам, классическая когортная сетка удержания, клиентские метрики (стоимость привлечения, средний чек, доля повторных покупок), RFM-анализ (давность, частота, сумма), накопленный LTV.
- Стало
- Когорта + retention + RFM + LTV — за минуту, не за день. Финдиректор видит сразу: какая когорта дала наибольший LTV, в какой R-сегмент уходят «спящие», какие F-сегменты приносят больше денег. Решения по реактивации — за дни, не за месяцы.
- Было
- Поставщик товара требовал ежедневную выгрузку остатков в их FTP в строгом формате CSV (encoding windows-1251, delimiter ;, BOM, поля в фиксированных кавычках). Программист вручную писал скрипт на каждый новый формат — 2–3 дня на адаптацию.
- Сделали
- Завели ReportExportTemplate с generator_key=stocks, period_type=Today, write_mode=Overwrite, file_encoding=windows-1251, file_delimiter=";", file_enclosure=\", file_bom=true, line_ending=\r\n, filename_pattern=stocks_{date}.csv. Destination — FTP с шифрованными credentials. Schedule с cron_expression \"0 6 * * *\" — каждый день в 6 утра.
- Стало
- Новый формат подключается за час — без программиста. ReportExportExecution пишет историю каждого запуска: rows_count, file_size, file_path, status. При сбое FTP — статус Failed с error_message, повтор настраивается отдельным правилом. Поставщик получает данные точно в срок.
- Было
- Менеджер по KPI считал бонусы продавцов вручную в Excel по сложной формуле «наценка × бонус». При расчёте за 60 сотрудников × 30 дней × 100+ чеков — час работы и регулярные ошибки. Продавцы оспаривали суммы, доверие падало.
- Сделали
- Подключили отчёт по бонусам сотрудников: считаются по тем же правилам, что и при фактической продаже. Видна матрица «наценка × бонус» — продавец понимает формулу. Детализация до каждого чека. Динамика по месяцам.
- Стало
- Расчёт бонусов — секунды. Каждая копейка детализирована до сделки. Менеджер по KPI настраивает мотивационную сетку через bonus-markup-matrix. Продавцы видят свои бонусы в моменте, не в конце месяца.
- Было
- Финдиректор открывал /dashboards каждые полчаса между совещаниями — нужно было «держать руку на пульсе». Цифры считались на каждый запрос: 12 SQL-запросов на 100+ строк каждый. UI открывался 8–10 секунд, нагрузка на БД росла.
- Сделали
- Аналитическая сводка собирает 5 KPI-блоков + 2 графика + 2 топа + опциональное сравнение — за один запрос. Сравнение с прошлым периодом добавляет расчёт изменений. Поле даты настраивается — для розницы дата закрытия, для опта дата подтверждения.
- Стало
- Дашборд открывается за <1 секунды. Финдиректор смотрит KPI и динамику без задержек. Тяжёлые отчёты (когорты, ABC-XYZ) — на /reports, не блокируют главный экран. Между совещаниями — спокойно глянул и пошёл дальше.
- Было
- Раз в неделю один из cron-выгрузок зависал на FTP (старый VPS поставщика отказывал в подключении). running-флаг не сбрасывался — повторные запуски пропускались. Уходило 1–2 дня, прежде чем замечали проблему, поставщик жаловался на отсутствие данных.
- Сделали
- Включили мониторинг по running + running_since. Если флаг стоит дольше Х часов — алерт. ReportExportExecution фиксирует каждый запуск со status (4 значения: Pending/Running/Success/Failed) и color() для UI. Дашборд /exports показывает таблицу с подсветкой Failed и долго-Running.
- Стало
- Зависшие запуски ловятся в день инцидента, не через 1–2 дня. error_message в Execution показывает текст ошибки FTP («connection timed out»). Администратор сбрасывает флаг и перезапускает руками — двойного запуска нет благодаря проверке running.
Как модуль помогает розничной сети
Отчёты и BI — 20 предопределённых отчётов поверх реальных данных
Аналитический контур — это не безкодовый конструктор без SQL, а 20 правильно посчитанных отчётов под каждый ключевой бизнес-сценарий торговой сети. Каждый отчёт — отдельная страница с собственным правом доступа: топ товаров, ABC/XYZ с фиксированными порогами, разбивка по категориям, способы оплаты, маржинальность с учётом логистики, аналитика по контрагентам и компаниям (B2B), продажи по времени, воронка продаж, сравнение магазинов, аналитика сотрудников (с пересчётом наград), перекрёстные продажи и рекомендации к товару, выполнение планов, когорты (5 блоков за запрос — когорты, удержание, метрики, RFM, LTV), аналитика остатков (4 направления — ABC/XYZ, возраст, распределение, оборачиваемость), аналитика организаций, заказов, клиентов, задач, бонусов сотрудников (с матрицей наценка-бонус).
Каждый отчёт даёт две базовые операции: «данные» (структурированный ответ для интерфейса) и «выгрузка» (Excel/CSV). У многих есть дополнительные: «динамика», «детализация по позициям», «карточка сущности», «рекомендации». Все принимают единый набор параметров: дата с, дата по, список магазинов, поле даты (дата подтверждения или дата закрытия — критично для длинных циклов), плюс свои специфичные. Право доступа к каждому отчёту своё: менеджер видит отчёты по своему магазину, директор сети — все.
ABC-XYZ с зафиксированными порогами
ABC/XYZ-отчёт использует четыре фиксированных порога: 80% и 95% для ABC (товары с накопленной долей до 80% — A, до 95% — B, остальные — C), 10% и 25% для XYZ (коэффициент вариации помесячных продаж до 10% — X стабильный, до 25% — Y умеренный, выше — Z нестабильный). Это стандартные пороги в литературе по логистике; они зашиты в коде и не меняются — для всех отчётов один и тот же критерий, чтобы данные были сопоставимы между периодами.
criterion ∈ {revenue, margin, quantity} — три варианта анализируемой метрики. revenue — по выручке (default, всегда доступно), margin — по марже (требует canViewProfit=true, т.е. права видеть себестоимость и маржу), quantity — по количеству проданных единиц. Дополнительные фильтры: categoryIds, itemTypeIds, manufacturerIds — можно строить ABC внутри конкретной категории или производителя. dateField (confirmed_at / closed_at) выбирает поле даты для отбора: первое — когда заказ подтверждён, второе — когда фактически закрыт. compare-эндпоинт сравнивает два периода — какие SKU мигрировали между классами.
Когорты, retention, RFM и LTV — за один запрос
Когортный отчёт собирает 5 аналитических блоков в одном запросе: когорты (массив когорт за период с разбивкой по месяцам, неделям или произвольному периоду), удержание (классическая когортная сетка — какая когорта какой % сохранила за каждый последующий период), клиентские метрики (стоимость привлечения, средний чек, доля повторных покупок, отток), RFM-анализ (давность, частота, сумма — шкалы для каждого клиента), накопленный LTV для каждой когорты.
Это означает, что финдиректор или маркетолог за один открытый экран /reports/cohort видит всю картину когортной динамики, не открывает 5 разных вкладок. dateField (confirmed_at — default для когорт, потому что важно момент подтверждения, а не закрытия). storeIds — фильтр по точкам, для региональных аналитиков. cohortType custom позволяет нестандартные периоды — например, недели с понедельника.
4 дашборда: основной, базовый, закупки, магазин
Главный аналитический дашборд для руководителя. По выбранному периоду, набору магазинов, опциональному периоду для сравнения, полю даты (создание/закрытие) и шагу графика (день/неделя/месяц) собирает 5 KPI-блоков: выручка и маржа (с учётом скрытия чувствительных данных по правам), конверсия, распределение заказов по статусам, статистика клиентов, статистика лидов. Плюс 2 графика: динамика выручки с настраиваемым шагом и выручка по магазинам. Плюс топ-10 товаров и клиентов. Плюс опциональное сравнение с прошлым периодом — показывает абсолютное и процентное изменение каждой метрики.
Поверх главного — три специализированных дашборда. Базовый — общие метрики без сложных KPI. Для отдела закупок: товары к заказу с низкими остатками, активные заявки на поставку, поставщики с просрочкой. Для директора магазина: выручка и план магазина, чеки, конверсия, KPI сотрудников этой точки. У каждого свой набор операций и свой фильтр прав — продавец не видит дашборд закупок, кладовщик не видит дашборд директора.
ReportExport — Template + Destination + Schedule + Execution
Регулярная выгрузка построена на четырёх взаимосвязанных моделях. ReportExportTemplate описывает «что выгружаем»: generator_key (ключ в ReportGeneratorRegistry для резолва конкретного класса-генератора), generator_config (json с параметрами для генератора), file_format (csv/xlsx/json), параметры CSV — file_encoding (utf-8/windows-1251 для интеграций со старыми системами), file_delimiter (по умолчанию ;), file_enclosure (\" для обрамления полей со спецсимволами), line_ending (\\r\\n или \\n), include_header (печатать ли заголовочную строку), file_bom (BOM-маркер для корректного отображения кириллицы), filename_pattern (с подстановками {date}, {period}). period_type (PeriodTypeEnum cast), period_days (для LastDays), write_mode (overwrite/append), max_rows, max_file_size_mb. is_active — отключить шаблон без удаления.
Точка выгрузки — «куда выгружаем»: тип драйвера (FTP, SFTP, локально), хост, порт, имя пользователя, пароль (с прозрачным шифрованием в БД), приватный ключ и парольная фраза (тоже шифруются, для аутентификации по ключу в SFTP), корневая папка, пассивный режим (для FTP), защищённое соединение, тайм-аут, лимит параллельных выгрузок в эту точку (защита от перегрузки старого FTP-сервера). Секреты скрываются в выдаче. Универсальный слой работы с файлами выбирает нужный драйвер автоматически.
Cron-расписания и защита от двойного запуска
ReportExportSchedule связывает Template и Destination с cron-выражением. Поля: template_id, destination_id, name, cron_expression (стандартный cron, например, «0 6 * * *» — каждый день в 6 утра), folder (поддиректория в root_path для этого расписания), filename_override (опциональный override filename_pattern из шаблона), is_active. Состояние: next_run_at (когда запустится в следующий раз, рассчитывается из cron), last_run_at (когда запустилось последний раз), running (bool — идёт ли сейчас), running_since (datetime — когда поднялся флаг). ReportExportRunner работает фоном, ежеминутно проверяет next_run_at <= now() && !running и запускает подходящие.
Защита от двойного запуска: перед стартом ReportExportRunner проверяет !running, ставит running=true и running_since=now(). По завершении (success или failed) сбрасывает обратно. Если запуск завис (например, по timeout FTP) — running_since показывает, сколько висит флаг. Администратор через UI /exports может вручную сбросить running=false и запустить заново. max_concurrent_executions у Destination дополнительно ограничивает количество параллельных Schedule, работающих на одну точку — даже если два Schedule наступили одновременно, второй ждёт.
12 генераторов формата и история запусков
ReportGeneratorRegistry — реестр-резолвер: по generator_key возвращает конкретный класс, реализующий ReportGeneratorInterface. 11 готовых генераторов: ContrsGenerator (контрагенты), FinanceExportGenerator (финансовые операции), OrderBidsGenerator (заявки), OrderFor1CGenerator (специальный формат для 1С), OrderItemsGenerator (позиции заказов), OrdersGenerator (заказы), PaymentExportGenerator (платежи), ProductSalesGenerator (продажи товаров), StocksGenerator (остатки), StoresGenerator (магазины), WorkersGenerator (сотрудники). Каждый отдаёт свой набор колонок и строк. Свой формат — отдельный класс на интерфейс, регистрация в Registry. CsvFileWriter, DestinationFilesystemFactory, ReportExportRunner — общая инфраструктура.
Каждый запуск выгрузки сохраняется в журнал со всеми полями: расписание (для ручных пусто), шаблон, точка доставки, кто запустил (если вручную), статус (ожидает / выполняется / успех / ошибка), способ запуска (вручную, по расписанию, по API), время начала и окончания, фактический период отбора, число строк, размер файла, путь к файлу, текст ошибки, техническая информация. Журнал доступен из карточки шаблона и из расписания. На странице истории выгрузок статусы подсвечены цветом — серый, синий, зелёный, красный.
Готовы автоматизировать?
Покажем модуль на ваших данных и подключим за 1–2 недели.
