Введение:
Застройщик живёт в CRM: заявки, объекты, сделки, платежи. Операционку она ведёт хорошо, а на вопросы руководителя отвечает плохо. Сколько продали за квартал, кто должен, какие квартиры стоят непроданными третий месяц — за этим идут в Excel, оттуда в Power BI. Пока отчёт соберут и сверят, он успевает устареть.
Vizion встаёт сбоку от CRM, читает её базу и отдаёт менеджменту готовую отчётность. Не выгрузку, а рабочий инструмент: фильтры, группировки, детализация до конкретной сделки.
На снимках экрана — интерфейс системы. Названия компаний, имена и суммы в таблицах заменены на вымышленные: данные клиентов не показываются.

Ход работы:
Отчёт — это конфиг, а не код. Решение, из которого выросло всё остальное. Отчёт описывается структурой: колонки и их типы, фильтры, выражения, группировки с агрегатами, производные метрики, бейджи просрочки, итоги. Завести новый отчёт — значит описать его. Отсюда и правки на лету, и перенос отчёта от одного клиента к другому.
Отчёты собирает модель. Раз конфиг — структура, писать его может не только человек. В системе работает чат поверх данных компании: на вопрос «сколько сделок в январе» он отвечает текстом, на «сделай отчёт по квартальным продажам» — создаёт отчёт. Перед генерацией модель обязана посмотреть на реальные данные компании, после — конфиг прогоняется вхолостую. Ошиблась в имени сущности или связи — получила структурированную ошибку с подсказками и переписала сама. Дальше отчёт правится диалогом: «добавь колонку», «сгруппируй по ЖК». Модель поднята на своём сервере: в отчётах лежат продажи, долги и платежи чужого бизнеса, и наружу такие данные не уходят.
Каждый клиент на своей базе. У всех своя копия CRM и свои справочники. Подключения хранятся не в конфиге приложения, а в базе, пароли зашифрованы, нужное подставляется на лету под активную компанию. Чтобы один системный отчёт работал у всех, я развёл конфиг и конкретную базу: в отчёте пишется ссылка на понятие, а чем оно окажется у этого клиента — решается в момент запроса.
Импорт из Power BI. Отдельный сервис распаковывает файл Power BI и отдаёт модель структурой. Дальше она сопоставляется с данными CRM, и такой же отчёт собирается уже внутри системы. Путь для тех, кто сидел на Power BI годами и не хочет начинать с нуля.
Документы. Коммерческие предложения по объекту — с логотипом, палитрой и реквизитами компании, с расчётом скидок, на выходе PDF. Плюс работа с чужими шаблонами: клиент грузит свой Word с плейсхолдерами, система предлагает, какое поле данных куда встаёт, человек подтверждает, документ заполняется.
Дашборды собираются из виджетов перетаскиванием, у каждого пользователя свой.


Что было сложным:
Главное ограничение проекта — чужая схема данных, которую нельзя менять. Шесть с лишним десятков таблиц CRM, только чтение, запись запрещена архитектурно. Всё, что нужно продукту, достаётся из того, что уже есть, и делать это надо быстро на объёмах реального застройщика.
Отдельно намучился с памятью. Группировка больших отчётов сначала укладывала процесс в потолок; выборку пришлось переписать на порционное чтение с восстановлением сортировки. Пик потребления упал больше чем вдвое.
Результат:
Системой пользуются застройщики Казахстана, Узбекистана и ОАЭ. У каждого своя валюта, таймзона и язык интерфейса. Внутри — готовые отчёты по договорам, дебиторке, поступлениям, непроданным объектам и балансам клиентов, сводные таблицы с детализацией и экспорт, который совпадает с тем, что человек видит на экране.
Проект живой, последние изменения — на этой неделе.


Моя роль:
Серверная часть, движок отчётов, слой работы с базой CRM, интеграция модели, миграции и тесты. Фронтенд-каркас на старте делал второй разработчик, дальше проект веду я.
Стек:
Laravel · PHP · PostgreSQL · Vue · TypeScript · ECharts · Docker · GitHub Actions
Для тех, кому интересен Vizion.