Общее решение задачи следующее (в реальной работе):
Подготовка:
1. Разбиваем менеджеров на группы 1,2,3 и т.д. Каждый менеджер может быть и в нескольких группах.
2. К каждой группе применяем фильтр. Например, в группу 1 могут попасть только заявки с бюджетом N, а в группу 2 — только двухкомнатные квартиры. Фишка в том, что фильтры могут пересекаться, ничего страшного в этом нет.
3. Группы выстраиваются в очередь. В начале — та, которая дольше всех не получала заявки.
Теперь алгоритм:
1. Приходит новая заявка.
2. Примеряется к условию попадания в группу, первую по очереди. Если ок — то заявка поступает в группу, а группа уходит в конец очереди. Если нет, то выбирается следующая за ней и так далее. Та группа в которую попала заявка улетает в конец очереди.
3. Если заявка попала в группу, то конкретный менеджер из группы назначается просто по-очереди. Опять же, когда он принял заявку, то попадает в конец (уже в этой группе). Если он не взял заявку в течение определенного времени, то она поступает в пул доступных для свободного взятия. Если менеджер присутствует в разных группах, то он продвигается по очереди в них независимо!
Зачем так сложно? Дело в том, что менеджеры разные по способностям. Нельзя слабых менеджеров сажать на жирных клиентов. В то же время, передвижение в жирные группы — серьезная мотивация работать лучше. Такая система дает хорошую равномерность распределения + оставляет простор для мотивации путем ротации персонала между группами. Ну и абсолютная прозрачность.
Важное замечание — предусмотрите место для тех заявок, которые не прошли ни в одну из групп (мало ли вы с фильтрами накосячили).