Лидеры года — новая категория на Workspace Digital Awards! Номинируйте вашу команду, продукты и проекты.
Krelix
Система финансового учёта Visify
Krelix
#Разработка программного обеспечения#Администрирование серверов

Система финансового учёта Visify

18 
Krelix Россия, Уфа
Поделиться: 0 0 0
Клиент

Visify

Сфера

Финансы, страхование, инвестиции

Страна

Беларусь

Сдано

Август 2026

Задача

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

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

Мы отвечали за проект целиком: серверную часть, веб-интерфейс и развёртывание на сервере клиента.

Решение

Импорт выписок в том виде, в каком их выгружает банк

Белорусские банки выгружают Excel по-разному: колонки называются по-русски или по-английски и с разным написанием, даты приходят то числом в формате Excel, то строкой. Мы сделали нормализатор заголовков с таблицей соответствий и несколько стратегий разбора дат. Из строки выписки система извлекает УНП, находит агента и создаёт оплату. Повторная загрузка того же файла не создаёт дублей: запись проверяется по связке агента, даты и суммы. Реестры услуг загружаются тем же способом.

Частичный импорт вместо отказа на весь файл

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

Цена на дату услуги

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

Валюты

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

Роли и контроль удалений

Права доступа описаны через CASL для трёх ролей и кешируются в Redis вместе с данными пользователя, поэтому проверка прав не обращается к базе на каждом запросе. Вход построен на паре access и refresh токенов с управлением сессиями: конкретную сессию можно отозвать. Редактор и менеджер не могут удалить чужую запись сами, они отправляют запрос с причиной. Администратор видит очередь запросов и подтверждает или отклоняет каждый, а в истории остаётся, кто запросил, кто решил и когда.

Аналитика и выгрузка

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

Развёртывание

Система работает на VPS клиента: PostgreSQL и Redis в Docker Compose, nginx в роли обратного прокси, SSL от Let's Encrypt. В ходе развёртывания мы провели аудит безопасности сервера, очистили его, настроили firewall, защиту SSH и мониторинг. Когда ограничения Docker Hub начали срывать обновления, перевели развёртывание на локальный кеш образов.

Результат

Система запущена в эксплуатацию. Бухгалтерия перешла с ручной сверки в Excel на импорт: загрузка банковской выписки и реестра услуг занимает несколько минут вместо нескольких часов. Строки с проблемами разбираются точечно, весь файл переделывать не нужно. Цены по старым актам не меняются при обновлении прайса, а удаления проходят через подтверждение и остаются в истории.

Руководство получило отчёт с актуальной задолженностью по каждому менеджеру, агенту и направлению. Менеджеры работают только со своими агентами, и это ограничение задано правами в системе, а не договорённостью между сотрудниками.

Технологии: NestJS, TypeORM, PostgreSQL, Redis, CASL, Next.js, Material UI, Docker, nginx.


Стек технологий

  • TypeScript TypeScript Язык программирования
  • Next.js Next.js Фреймворк/библиотека
  • Nest Nest Фреймворк/библиотека
  • React.js React.js Фреймворк/библиотека
  • PostgreSQL PostgreSQL База данных
  • Redis Redis База данных
  • Docker Docker Среда разработки
  • Node.js Node.js Среда разработки
  • NGINX NGINX Веб-сервер

Над проектом работали:


Оцените кейс
Спасибо за оценку
Выскажите мнение
Авторизуйтесь, чтобы добавить свой комментарий.
оставить заявку

Хотите заказать похожий проект?

Krelix с удовольствием обсудит вашу задачу

Оставить заявку