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.