➜ ~/projects joywork.md
← cd ..# JoyWork — специализированная CRM-система для агентств недвижимости
# Описание
Многофункциональная B2B SaaS CRM-платформа, разработанная для оптимизации и автоматизации бизнес-процессов в агентствах недвижимости. Система связывает в единую экосистему базы данных объектов недвижимости, карточки клиентов и входящие заявки, а также предоставляет гибкие инструменты администрирования для руководителей компаний.
⚡ Задача
- Реализовать масштабируемую архитектуру для одновременного учета тысяч объектов, клиентов и заявок;
- Разработать модуль автоматического мэтчинга (связывания) требований клиентов из заявок с доступными объектами базы;
- Спроектировать сложную, кастомизируемую систему ролей и прав доступа для изоляции данных внутри агентств;
- Интегрировать движок мгновенного полнотекстового поиска по десяткам параметров недвижимости.
🔌 Интеграции
- Полнотекстовый поисковый движок Sphinx — для мгновенной фильтрации и поиска по сложным текстовым и числовым свойствам недвижимости;
- Комбинированная архитектура БД (MySQL + PostgreSQL) — для оптимизированного хранения реляционных данных и JSON-логов;
- Внутренний модуль пересечения данных — автоматическое создание лидов при совпадении критериев «Заявка - Объект»;
🎯 Результаты
- Разработан отказоустойчивый бэкенд, способный обслуживать сотни подключенных агентств недвижимости без просадки производительности;
- Создана гибкая матрица доступов (ACL): администраторы агентств могут настраивать видимость объектов и контактов клиентов для каждого сотрудника;
- Внедрен функционал связывания сущностей, сокративший время рутинного подбора недвижимости агентами;
- Обеспечен высокоскоростной поиск по базе объектов за счет переноса тяжелых поисковых запросов в Sphinx.
🛠 Технические вызовы
- Синхронизация и поддержка двух СУБД (MySQL и PostgreSQL): Использование разных баз данных для разных модулей требовало строгой согласованности данных при обработке транзакций.
Решение: Логически разделил домены данных. Тяжелые транзакционные B2B-модули и логирование перенес в PostgreSQL, а классическую реляционную структуру оставил в MySQL. Настроил синхронизацию через промежуточные события (Event-Driven подход) на уровне PHP-бэкенда.
- Оптимизация фасетного поиска по миллионам комбинаций свойств: Стандартные SQL-запросы с множественными JOIN при поиске квартир (этаж, район, цена, тип стен, площадь) перегружали сервер БД.
Решение: Интегрировал Sphinx Search в качестве поискового движка. Настроил регулярную индексацию базы недвижимости. Это позволило выполнять сложнейшие поисковые выборки менее чем за 50мс и полностью разгрузить основные базы данных.
- Производительность сложной системы проверки прав доступа (RBAC/ACL): Проверка прав пользователя при каждом просмотре списка объектов приводила к лавинообразному росту вложенных запросов в БД.
Решение: Реализовал иерархическую структуру ролей и закешировал маску прав пользователя в сессии/Redis. Ограничение выборки записей перенес непосредственно на уровень формирования SQL-запросов (динамическое добавление условий WHERE tenant_id = X AND...), исключив лишнюю фильтрацию на стороне PHP.