Всем привет! Меня зовут Станислав Тюленев, я главный инженер по разработке в одной из продуктовых команд Домклик. В этой статье я расскажу, как мы в полтора раза увеличили возможное количество сделок в течение дня, с какими сложностями столкнулись и почему это повлияло на скорость расчёта слотов для записи.
Когда ипотечная сделка доходит до стадии записи клиента в офис, процесс может выглядеть так:
- Сотрудник связывается с клиентом, уточняет все пожелания по месту и дате встречи 
- После ввода предпочтительного места, система предлагает список из 15 ближайших офисов 
- Система наглядно показывает, в какой день и в каком офисе есть периоды для записи (слоты), с группировкой по временным интервалам — до обеда и после обеда 
- При выборе конкретного офиса становятся видны все возможные слоты 
- Сотрудник выбирает подходящий слот и нажимает «Запись» 

Рассмотрим, как была устроена система расчёта слотов раньше и какие изменения позволили достичь упомянутых в начале улучшений.
Исходный алгоритм
Раньше мы использовали простой механизм определения сложности сделки, который предполагал всего два варианта длительности встречи: 60 и 120 минут.
Разберём упрощённый расчёт слотов по сотруднику на простом примере. Предположим, выбрана длительность встречи 60 минут.
- 
Для начала определяем две реперные точки: - Начало рабочего дня, округлённое до часа в большую сторону, или текущее время округлённое до часа в большую сторону 
- Конец рабочего дня, округлённый до часа в меньшую сторону 
 
- Рассчитываем первый слот, началом которого является первая точка, затем прибавляем длительность встречи, получаем конец периода 
- Рассчитываем следующий слот, где началом будет конец предыдущего периода 
- Повторяем третий шаг, пока конец очередного слота не станет меньше или равен концу рабочего дня 
- Просматриваем полученный список слотов и удаляем те, которые пересекаются с уже существующими активностями 
Проделываем эти шаги для каждого сотрудника в офисе, ищем среди них повторяющиеся слоты. В результате получаем уникальный список свободных слотов в офисе на один день. Повторяем этот процесс для каждого дня и офиса.
Алгоритм простой и предсказуемый, так как исключена динамичность длины слота. Это позволяет с высокой вероятностью заполнять образовавшиеся окна между записанными встречами.
Результат: в среднем один сотрудник проводил по четыре сделки в день. Средняя продолжительность одной сделки превышала 90 минут.
Важно пояснить, что не все сотрудники работают восемь часов в день. Наша компания имеет большую разветвлённую сеть офисов, как крупных, так и небольших.

Реформа системы записи: СлотМенеджмент
Процесс оптимизации состоял из нескольких этапов и получил рабочее название «СлотМенеджмент», которое стало для нас нарицательным.
Этап 1: динамическая длительность сделки
Проблема: существующие длительности сделок (60 и 120 минут) часто превышали фактическое время их проведения.
Решение:
- Разработали гибкую систему оценки сложности сделки 
- Определили критерии и описали наборы параметров сделки с соответствующей длительностью 
- Перенесли их в базу данных, предоставили бизнесу возможность изменять через REST API 
- Получили варианты от 20 до 120 минут с шагом в 10 минут (при меньшем шаге пришлось бы переписывать весь календарь, уже содержащий сетки, кратные 10, 30 и 60 минутам) 
Этап 2: динамическое начало сделки
Проблема: существующий алгоритм нарезки слотов сработал корректно, но не сработали потребители его функциональности.
- Обнаружились прописанные в коде фронтенда и бэкенда длительности активностей 
- Пришлось переписать всё под динамический расчёт и во все события добавить информацию об окончании встречи 
- Начальный алгоритм изменился незначительно, только длительность стала более гибкой. 
Результат: после изменений в календаре стали появляться нежелательные пустые промежутки, в которые сложно запланировать встречи. Если раньше любое свободное окно от 60 минут гарантировало возможность новой записи, то в новом формате эта вероятность существенно снижалась, так как окна получались слишком маленькими.
Этап 3: забиваем календарь по полной
Идея: больше никаких слотов по предсказуемым сеткам. Нужно предлагать слоты, которые идут либо сразу после существующей активности, либо перед следующей. Мы назвали это up/down внутри сегментов: окна между активностями всегда остаются максимально большими.
- Сегментом считается окно между реперными точками 
- Реперными точками являются начало и конец рабочего дня, начало и конец существующих активностей. 

Изменяем алгоритм:
- Рассчитываем сегменты на основе реперных точек 
- Рассчитываем up/down-слоты внутри каждого сегмента 
- Если сегмент по длине равен длительности активности, то слот будет один 
Результат: минимизация возможных разрывов в течение дня, в которые невозможно записать ни одну сделку.
Этап 4: итоговый результат
После проведения пилота все гипотезы подтвердились. Средняя заполняемость календаря увеличилась на 30%: вместо четырёх-пяти сделок стали проводить шесть-семь встреч.
С технической частью возникли проблемы. Все алгоритмы писались в наивном стиле, и сразу после релиза время расчёта слотов увеличилось с 1 секунды до 6-7 секунд. Но чуть позже мы это исправили.
С этого момента логика расчёта слотов изменилась: появилось много факторов, которые нужно учитывать при выборе сегментов и расчёте слотов. Перечислю некоторые из них:
- «Новички»: система характеристики сотрудников. Из-за неё длительность сделки в одном офисе может отличаться от сотрудника к сотруднику. 
- 
Подготовка: на иллюстрации с календарём вы могли увидеть два типа 10-минутных активностей — резервы для подготовки и сама подготовка (есть предварительно созданные резервы для того, чтобы можно было заранее подготовиться к сделке, и есть режимы записи с подготовкой и без неё). При записи ищется любой свободный резерв в Т-3 (в течение трёх дней до записи). Если он отсутствует, то к расчёту слота добавляется 10 минут до самой сделки. Отсюда следует, что комбинаций (длительность слотов, наличие резервов, существующие активности динамической длины) становится настолько много, что их сложно предварительно рассчитать или закешировать. 
- Разные часовые пояса в выборке офисов: как правило, это пограничные офисы на стыке часовых поясов. Или же слишком большой радиус поиска офисов. 
- «Налог» на офис: аналогично системе характеристик сотрудников. Но в данном случае добавляется длительность для конкретного офиса. 
- Межрегиональная запись: запись одной стороны зависимо фильтруется существующей записью второй стороны. 
Помимо этого, существуют также переносы сделок, различные типы табелей и десятки условий для определения возможных офисов. Но в это сейчас вдаваться не будем.
Заключение
«СлотМенеджмент» позволил оптимизировать использование времени сотрудников, обеспечив более гибкую и эффективную систему записи, несмотря на увеличение сложности вычислений.
 
          