Задача
Фрилансеры, веб-агентства и IT-консультанты работают в разрозненных инструментах: один для клиентов, другой для смет, таблица для продления доменов, блокнот для доступов к серверам. В Италии есть ещё одно препятствие. Каждый счёт нужно выставлять в формате FatturaPA XML и отправлять через национальную систему обмена (SDI), а большинство CRM этого не умеют. BalanceAI появилась как CRM для моей собственной консалтинговой практики. Потом я переработал её, чтобы ею могли пользоваться и другие компании.
Что я сделал
Я создал мультиарендную (multi-tenant) платформу управления, которая собирает в одном месте клиентов, сметы, счета и техническую сторону работы.
- Multi-tenant ядро — каждая компания работает с изолированными данными, потому что каждый запрос фильтруется по tenant. Панель суперадминистратора управляет арендаторами, так что одна и та же установка может обслуживать одну компанию или предлагаться как SaaS.
- Итальянские электронные счета — приложение формирует XML FatturaPA 1.2.1 и отправляет его через API электронных счетов Aruba, кешируя токен входа для каждого tenant. По каждому счёту отслеживаются платежи и сроки.
- От сметы к счёту — сметы с несколькими позициями и скидками превращаются в счёт за один шаг, так что ничего не приходится вводить дважды.
- Домены и серверы — даты продления, автоматические запросы WHOIS и подключение к API cPanel/WHM, чтобы истекающие домены и хостинг-аккаунты были видны до того, как станут проблемой для клиента.
- Зашифрованное хранилище — доступы к серверам, пароли клиентов и личные заметки хранятся с AES-256-CBC и новым случайным IV для каждого значения.
- Поиск клиента с помощью ИИ — введите название компании или номер плательщика НДС, и модель OpenAI (по умолчанию GPT-4o mini) вернёт адрес, сертифицированную почту и код SDI в строгом JSON, чтобы заполнить карточку клиента. Неизвестные поля возвращаются пустыми, а не угаданными.
- Массовый импорт — существующие данные загружаются из файлов Excel, CSV, Word и PDF.
Технологии
Node.js и Express, серверный рендеринг страниц на EJS и Bootstrap 5 на фронтенде. Данные хранятся в MySQL или MariaDB. Код разделён на 26 роутеров, по одному на модуль, и 16 моделей данных. Вход через сессии, пароли хешируются bcrypt. Интеграции: электронные счета Aruba, WHOIS, cPanel/WHM и API OpenAI, ключ которого хранится в зашифрованном виде для каждого tenant. Устанавливается на VPS за Nginx или на хостинг с cPanel.
Почему именно так
Сначала BalanceAI была CRM для одной компании. В версии 2.0.0 она стала мультиарендной благодаря скрипту миграции. Скрипт добавляет столбец tenant в каждую таблицу и переносит все существующие записи в tenant 1. Реальные данные за годы работы остались нетронутыми, а та же кодовая база превратилась в продукт, которым могут пользоваться другие агентства. Правило, которое появилось вместе с этим, простое: ни один запрос не выполняется без фильтра по tenant.


