Marketing Expense Tracker: русский ввод → английский отчёт в HQ
Корпоративная система учёта маркетинговых бюджетов с LLM-генерацией полей отчёта, квартальной блокировкой и автоматическими Excel-выгрузками под требования головного офиса Samsung в Корее.
mediace-budget.ru ↗Коротко
- Задача — отчётность по маркетинговым бюджетам в HQ Samsung в Корее. Ручное заполнение на английском, ошибки, итерации согласований.
- Подход — русский ввод на стороне менеджера, английский отчёт на выходе. LLM-агент генерирует структурированные поля события одним кликом.
- Инфраструктура — Next.js 16 (App Router + Server Actions), PostgreSQL 17 с аудит-триггерами, квартальная блокировка, роли manager/admin.
- Стабильность — 127 автотестов, Docker-деплой, Let's Encrypt, CBR RF для курса, Auth.js v5 с JWT-сессиями.
Цифры, которые можно сверить
- Автотестов (Vitest)
- 127
- AI-генерируемых полей
- 5 за клик
- Аудит-триггеров PostgreSQL
- 6
- Листов в Excel-отчёте
- 3
- Роли доступа
- manager / admin
- Production URL
- mediace-budget.ru
Что за задача
У дистрибьютора Samsung Medison в РФ есть маркетинговый бюджет и обязательство отчитываться по нему перед головным офисом в Корее. HQ получает отчётность на английском языке, в строгом формате: по каждому мероприятию — обоснование, результаты, обратная связь, лиды на продажу, план дальнейших действий.
До системы это работало так: российский менеджер после мероприятия садился и писал отчёт на английском в произвольной форме. Ошибки в формулировках, разночтения, итерации согласований, ручная сборка Excel-выгрузок для квартальной отчётности.
Нам нужно было превратить этот процесс в учётную систему, в которой русскоязычный менеджер вводит кейс на русском, а HQ в Корее получает готовый Excel-отчёт на английском. Без перевода руками и без потерь в формулировках.
Менеджер вводит кейс на русском — система автоматически собирает отчёт на английском под требования HQ в Корее. Это сильно сокращает время подготовки и количество итераций правок.
Что это за продукт
Производственная система mediace-budget.ru. Работает на сервере дистрибьютора с отдельным Docker-стеком, Nginx, Let’s Encrypt, SSL.
Основная сущность — расход (Expense). У расхода есть категория (general / event / webinar), регион (субъект РФ или «National»), сумма в рублях, курс CBR РФ на дату расхода, автоматически посчитанная сумма в USD. К расходу можно прицепить вложенные под-расходы (аренда зала, кейтеринг, гонорары спикеров) — это отдельные Expense-записи с FK на родителя.
Для событий и вебинаров расход дополняется 5 текстовыми полями, которые и попадают в отчёт HQ:
- Background Information — обоснование, зачем проводили мероприятие.
- Results — что получили.
- Overall Feedbacks — обратная связь от участников.
- Sales Leads — прямые продажи, запросы на коммерческие предложения.
- Follow Up Points — список дальнейших шагов.
Каждое из этих 5 полей имеет кнопку «Generate with AI».
Как устроен AI-генератор
Модель: anthropic/claude-haiku-4.5 через OpenAI-совместимый proxy (ServerSpace GPT API).
Промпт содержит контекст компании. Не «вы маркетолог», а именно: ЗАО «Медиэйс» как дистрибьютор Samsung Medison УЗ-оборудования в РФ. Портфолио сканеров (V5–V8, HS50/HS60, Z20, HERA W10). Целевая аудитория — radiologists, OB/GYN, surgeons. Тон — от первого лица «we», сдержанный, без выдумывания фактов.
Вход: заполненные к этому моменту поля формы — название мероприятия, описание, категория, регион, дата, бюджет, число участников, sales manager, флаг «плановое / внеплановое».
Выход: строгий JSON с 5 полями (justification, results, feedbacks, salesLeads, followUp) — в одно нажатие «Generate all fields». Менеджер дальше редактирует сгенерированный текст и сохраняет.
Язык промпта и выхода — английский. Менеджер вводит русскоязычный контекст в название/описание/заметки, LLM возвращает готовые английские формулировки под требования HQ. Это тот самый мост, который убрал большую часть итераций согласований.
Архитектура под enterprise-требования
Для корпоративной системы недостаточно «красивого фронта». Нужна надёжность, следы всех действий и контроль доступа.
- Аутентификация и роли. Auth.js v5 с Credentials-провайдером и JWT-сессиями. Две роли: manager (учёт расходов, отчёты) и admin (всё то же + управление пользователями, категориями, кварталами, sales managers, аудит-лог).
- Server Actions с проверкой на каждом вызове. Все мутации идут через Next.js Server Actions. В начале каждого action —
getCurrentUser()илиrequireAdmin(). Нет неавторизованных путей. - Аудит на уровне БД. PostgreSQL-триггеры автоматически записывают все INSERT / UPDATE / DELETE по шести критичным таблицам: расходы, курсы, кварталы, категории, sales managers, типы расходов. User ID пробрасывается через
set_config(‘app.current_user_id’, …)в параметризованном запросе. - Квартальная блокировка. Расход можно создать только в явно открытом квартале. Админ открывает квартал → менеджеры работают → админ закрывает после отчётности. После закрытия — запись нельзя создать, изменить или удалить ни с клиента, ни с сервера.
- Курсы валют из CBR РФ. В форме расхода кнопка «взять курс с CBR на дату» — система обращается к
cbr-xml-daily.ru, округляет до двух знаков, подставляет в поле. USD считается формулой RUB ÷ rate.
Excel-отчёт для HQ
Всё значение системы для бизнеса — в этой выгрузке. Excel на трёх листах, без хардкода чисел, все значения — формулы Excel (чтобы HQ мог пересортировать, отфильтровать и сверить сам):
- Category Summary — суммы по категориям с формулами SUMIF, колонка доли, авто-фильтр, закреплённая шапка.
- All Expenses — все расходы с сортировкой по дате. Колонка «Internal Costs» показывает вложенные под-расходы многострочно, «Total (RUB)» = основной + дочерние, USD пересчитывается формулой по курсу строки.
- By Employee — статистика по менеджерам: средний расход (формула), список категорий.
Под-расходы в общей таблице не дублируются отдельными строками — они собираются внутри родительской. Это важно: HQ получает отчёт в той структуре, в какой он думает о расходах, а не в той, в какой БД хранит записи.
Что в системе, кроме основной формы
- Dashboard — суммы в рублях и долларах, средневзвешенный курс, статус кварталов, топ-категории, разбивка по регионам и месяцам, топ-5 расходов, список мероприятий без заполненных результатов, недавние записи.
- Полнотекстовый поиск по расходам — по названию, описанию, обоснованию, результатам, категории, региону, менеджеру, сумме. Поиск ограничен 200 символами, пагинация до 100 записей на страницу.
- Файловые приложения (receipts) к расходам — JPEG / PNG / WebP / HEIC / PDF, до 10 МБ на файл, до 10 файлов на расход. Раздача через защищённый эндпоинт с проверкой авторизации.
- Фильтры сохраняются в URL — при переходе в детали расхода и обратно фильтры таблицы не сбрасываются.
- Адаптивная вёрстка — sidebar прячется на мобильном, таблицы скроллятся, второстепенные колонки скрываются на узких экранах.
Безопасность, которую заложили с самого начала
- Аутентификация на каждом server action, как на read, так и на write.
- Супер-админ не может быть разжалован, заблокирован или деактивирован (даже самим собой).
- Удаление пользователей и категорий невозможно физически — только деактивация (на них есть FK с логов и расходов).
- Удаление расхода каскадно удаляет все дочерние под-расходы в одной транзакции.
- Лимиты на входы: поиск 200 символов, страница таблицы 100 записей, пароли от 8 символов.
- Zod-валидация на входе, человеческие сообщения об ошибках.
Что показательно для бизнеса
- AI здесь — инструмент экономии времени, а не витрина. LLM не в заголовке, а в одной кнопке на форме. Но эта кнопка снимает часы работы в неделю.
- Русский ввод → английский отчёт. Коллизия языков в международной корпорации решена на уровне интерфейса, а не через переводчиков.
- Excel, а не красивый дашборд. HQ в Корее хочет видеть отчёт в том формате, в каком он его согласовывал. Формулы в Excel — это, возможно, самое ценное решение в системе.
- 127 тестов, аудит на уровне БД, Docker-деплой. Для корпоративной системы это не галочка, а обязательное условие того, что через полгода её нельзя «сломать» случайным обновлением.
Что из этого кейса можно забрать себе
- Любая внутренняя отчётность в HQ за рубежом превращается в похожую задачу: локальный язык на входе, английский на выходе, LLM вытягивает формулировки в нужный тон.
- Аудит через PostgreSQL-триггеры — на порядок дешевле, чем прокладывать логирование через код. И его нельзя «забыть включить».
- Блокировки по периодам (кварталы, отчётные месяцы) — редко встречаются в штатных CRM, но закрывают реальный риск «поправили цифру прошлого квартала после сдачи отчёта».
- Полноценный Excel с формулами — язык, на котором говорит бухгалтерия и HQ. Не стоит заменять его дашбордом.
Если у вас есть задача с отчётностью в головной офис, учётом бюджетов по правилам, которые живут в Excel-шаблоне, или переводом «я расскажу на русском» в структурированные поля на английском — напишите мне в Telegram. Разберём, подходит ли ваш процесс под похожую систему.