Параметры и режим работы сотрудников

Обслуживание локаций в Календарном планировании выполняется мобильными сотрудниками, которые могут передвигаться на автомобилях, пешком или на общественном транспорте.

При планировании с помощью Excel характеристики и ограничения сотрудника и транспортного средства указываются на листе employees, а параметры режима работы — на листе working_days. При планировании в API все параметры указываются в объекте employees.

Основные параметры

Идентификатор
Обязательным атрибутом сотрудника является уникальный числовой или строковый идентификатор, который задается в поле id. Идентификатор должен быть уникальным в пределах одного запроса к сервису.
Дополнительный идентификатор
Дополнительный числовой или строковый идентификатор сотрудника вы можете указать в поле ref.
Номер телефона
Номер мобильного телефона для связи с сотрудником передается в поле phone.
Номер GPS-трекера
Если у сотрудника есть GPS-трекер, его номер указывается в поле imei.
Количество маршрутов
Сотруднику может быть запланировано несколько маршрутов в день. Максимальное количество маршрутов в день ограничивается параметром max_runs. По умолчанию параметр равен 1.
Способ передвижения
Способ передвижения сотрудника задается параметром routing_mode:
  • driving — способ по умолчанию, на автомобиле с грузоподъемностью меньше 2,5 тонн.

  • walking — пешком. В маршруте используются только те дороги, по которым может ходить пешеход.

  • transit — на общественном транспорте и пешком от остановки до локации. Подробнее см. Передвижение пешком и на общественном транспорте.

Коэффициент
В зависимости от квалификации сотрудника он может обслуживать локации быстрее или медленнее. Чтобы учитывать этот фактор, используйте коэффициент service_duration_multiplier. По умолчанию он равен 1. Для более квалифицированных сотрудников назначайте его меньше 1, для менее квалифицированных — больше 1. На этот коэффициент будет умножаться сервисное время локации при планировании посещений.

Отпуск

Чтобы указать отпуск сотрудника, используйте поле vacations. В поле указываются порядковые номера дней отпуска в периоде планирования (дни нумеруются с 0).

Разовые отсутствия (например, отгул) задаются с помощью индивидуального графика работы для конкретного сотрудника (поле working_days на листе working_days).

Если для сотрудника указан отпуск, то посещения, которые должны быть выполнены в этот период согласно настройкам локаций, распределяются между другими сотрудниками. Если же для сотрудника указано отсутствие (нерабочий день), то посещения, которые должны быть выполнены в этот день, распределяются на другие дни этого сотрудника.

Пример

В планировании участвуют три сотрудника, которые работают 5 дней в неделю. Планирование начинается с понедельника. Отпуск первого сотрудника приходится на вторую неделю планирования, то есть выпадает на 7-11 дни. Второй сотрудник взял отгул на понедельник второй недели, в поле working_days перечислены его рабочие дни (0, 1, 2, 3, 4, 8, 9, 10, 11).

Пример ExcelЗапрос API (JSON)Ответ API

Теги сотрудника

Для сотрудника можно можно назначить ограничения по посещению определенных локаций с помощью правил совместимости. Для этого используются теги, которые назначаются сотрудникам и локациям.

Ограничения могут потребоваться, если для обслуживания локации сотруднику необходимы специальные навыки, а если сотрудник передвигается на автомобиле — наличие у автомобиля специального оборудования или ограничения по габаритам автомобиля.

Теги сотрудника задаются в следующих полях:

  • tags — свойства сотрудника, которые частично могут совпадать со свойствами, указанными для локации.

  • excluded_tags — свойства сотрудника, которые не должны совпадать со свойствами, указанными для локации.

Определение тегов возможно как в виде строк, так и в виде регулярных выражений. В строках теги могут перечисляться через запятую. В этом случае сотрудник сможет посещать локацию, если хотя бы один из перечисленных тегов сотрудника совпадает с тегом локации или если у локации нет тегов.

Регулярные выражения — это способ описать более сложную логику и правила совместимости между сотрудниками и локациями. Используется синтаксис регулярных выражений POSIX Extended. Для тестирования регулярных выражений можно воспользоваться сервисом Regex101.

Теги обозначают постоянные ограничения, действующие для сотрудников и локаций. Например, теги могут использоваться для указания специальных навыков у сотрудников, подробнее см. в разделе Планирование с учетом навыков сотрудников.

Если нужно ограничить возможность посещения локаций в пределах одного маршрута, используйте несовместимость локаций.

Если локацию нужно закрепить за сотрудником, то можно задать тег сотрудника (поле tags) и указать его в обязательном теге локации. Подробнее см. в разделе Закрепление локации с помощью тегов.

Несовместимость локаций в маршруте

Отдельные локации могут иметь особые условия для посещения. Условия для разных локаций могут оказаться взаимоисключающими, такие локации нельзя посещать в одном маршруте. Например, для посещения медицинской лаборатории и строительного склада сотруднику может потребоваться разная спецодежда. Характеристики локаций, по которым определяется их несовместимость, указываются на листе locations в поле load_types, см. Несовместимость локаций.

Несовместимые характеристики локаций перечисляются через запятую в поле incompatible_load_types.N, где N — порядковый номер набора несовместимых характеристик, начиная с 0. Например, incompatible_load_types.0 = food,clean, incompatible_load_types.1 = cold,clean. Каждый набор несовместимых характеристик указывается в отдельном столбце.

Несовместимость локаций может указываться:

  • для всех маршрутов — на листе options;

  • для отдельных сотрудников — на листе employees.

Примечание

Несовместимость локаций для конкретного сотрудника, указанная в параметре incompatible_load_types на листе employees, имеет более высокий приоритет и для данного сотрудника полностью переопределяет значения параметра incompatible_load_types на листе options.

Несовместимость локаций incompatible_load_types действует только в пределах одного маршрута. Если необходимо задать постоянные ограничения, например, связанные с наличием у сотрудника определенных навыков обслуживания локаций, используйте теги.

Пример 1

Планируются посещения 8 локаций. У каждой локации в поле load_types указаны характеристики:

Локация

load_types

Пояснения

Location-1-with-food-and-freezer

food,cold

Замороженные продукты, необходима теплая одежда

Location-2-with-food

food

Продукты

Location-3-clean-lab

clean

Лаборатория, необходим белый халат

Location-4-with-food-and-freezer

food,cold

Замороженные продукты, необходима теплая одежда

Location-5-with-food

food

Продукты

Location-6-with-flowers

flowers

Цветы, удобрения

Location-7-with-flowers

flowers

Цветы, удобрения

Location-8-clean-lab

clean

Лаборатория, необходим белый халат

Несовместимость локаций не указана. Для каждого из двух сотрудников запланировано по 11 маршрутов, в маршруте посещаются локации с разными характеристиками.

Пример ExcelЗапрос API (JSON)Ответ API

Пример 2

То же, что в примере 1, но для на листе options указаны два набора несовместимых локаций: cold,clean и food,clean. Для локаций flowers несовместимость не задана.

Для первого сотрудника запланировано 16 маршрутов, для второго 14. Несовместимые локации распределены по разным маршрутам.

Пример ExcelЗапрос API (JSON)Ответ API

Геозоны

Для сотрудников могут быть заданы ограничения по зонам обслуживания.

Зоны, в которых сотруднику разрешено посещать локации, перечисляются в параметре employees.allowed_zones:

  • Сотрудник может посещать локации в любой зоне, указанной в параметре allowed_zones. Таким способом можно закреплять локации за определенным сотрудником, подробнее см. в разделе Закрепление локации с помощью геозон.

  • Если разрешенные зоны не заданы, то сотрудник может посещать локации без ограничений.

  • На локацию не будут запланированы посещения, если для всех сотрудников указаны разрешенные зоны, а локация не попадает ни в одну из них.

Зоны, запрещенные для посещения сотрудником, перечисляются в параметре employees.forbidden_zones.

Примечание

Если локация расположена в области пересечения разрешенной и запрещенной зон, то сотрудник не сможет ее посетить — параметр forbidden_zones имеет более высокий приоритет, чем allowed_zones.

Опциональные геозоны — это нежесткое ограничение. С их помощью можно задать предпочтительные для посещения зоны (приоритетные и неприоритетные). Если локация расположена в опциональной геозоне, за ее посещение сотруднику начисляется бонус или штраф. Для каждого сотрудника можно назначить одну или несколько таких геозон.

Опциональные геозоны задаются с помощью массива optional_zones:

  • optional_zones.N.zone — название геозоны;
  • optional_zones.N.value — если значение параметра больше 0, то сотрудник получает бонус за посещение указанной геозоны (значение этого параметра вычитается из стоимости маршрута), а если меньше 0 — штраф (значение прибавляется к стоимости маршрута).

Чтобы в один маршрут сотрудника не попадали локации, которые относятся к разным зонам обслуживания, можно определить несовместимость геозон.

Список таких зон можно задать не только для всего решения в объекте options.incompatible_zones, но и для конкретного сотрудника  в параметре incompatible_zones. Несовместимые зоны, определенные для сотрудника, имеют приоритет над зонами, определенными глобально. Чтобы на сотрудника не распространялось глобальное ограничение options.incompatible_zones, задайте для него в поле employees.incompatible_zones пустой список.

Пример 1

В планировании участвуют 5 сотрудников. 4 сотрудника работают только в пределах МКАД, и за каждым из них закреплена своя разрешенная зона (параметр allowed_zones). Пятый сотрудник работает только за пределами МКАД, поэтому для него все геозоны внутри МКАД перечислены в параметре forbidden_zones.

В решении участвуют все 5 сотрудников, каждый посещает локации в разрешенных зонах.

Пример ExcelЗапрос API (JSON)Ответ API

Пример 2

То же, что в примере 1, но ограничения мягкие — геозоны заданы как приоритетные (параметр optional_zones). За посещение этой геозоны назначен бонус 1000 единиц.

В результате планирования сотрудники чаще посещают локации в приоритетной зоне, но при необходимости могут выйти за ее пределы. Поэтому в решении участвуют только 3 сотрудника из 5.

То же, что в примере 1, но ограничения мягкие — геозоны заданы как приоритетные (параметр optional_zones). За посещение этой геозоны назначен бонус 1000 единиц.

В результате планирования сотрудники чаще посещают локации в приоритетной зоне, но при необходимости могут выйти за ее пределы. Поэтому в решении участвуют только 3 сотрудника из 5.

Пример ExcelЗапрос API (JSON)Ответ API

Стоимость работы и выплаты сотрудникам

Для определения стоимости работы сотрудника используется поле cost.

Для каждого сотрудника можно задать одну или несколько компонентов стоимости работы:

  • cost.fixed — фиксированная стоимость выхода на работу. По умолчанию 3000 единиц.

  • cost.hour — стоимость за час работы. По умолчанию 100 единиц.

  • cost.km — стоимость за километр маршрута. По умолчанию 8 единиц.

  • cost.location — стоимость посещения одной локации. По умолчанию 0.

  • cost.run — стоимость выполнения одного маршрута. По умолчанию 0.

  • cost.waiting_hour — стоимость за час ожидания между посещениями. По умолчанию 0.

  • cost.empty — стоимость простоя сотрудника. Начисляется, если для сотрудника не запланирован ни один маршрут. По умолчанию 0.

  • cost.empty_run — стоимость дня простоя сотрудника. Начисляется, если для сотрудника не запланирован ни один маршрут на день. По умолчанию 0.

Если задано несколько компонентов, стоимость рассчитывается как сумма этих компонентов.

Если на этапе планирования нужно рассчитать, какую оплату получит сотрудник за выполнение маршрута, используется поле payout. Оно не влияет на оптимизацию маршрута и рассчитывается уже после того, как задача планирования решена.

Арифметические выражения в расчетах стоимости и выплат

Стоимость работы сотрудника можно задать в виде арифметического выражения. При планировании можно рассчитать стоимость одним выражением на листе employees в поле cost или использовать выражения в полях:

  • cost.run — стоимость маршрута сотрудника;
  • cost.route — стоимость всех маршрутов сотрудника в решении.

Внимание

Если на листе employees в поле cost заданы формулы, то алгоритм рассчитывает стоимость сотрудника только по этим формулам. При этом стандартные компоненты стоимости участвуют в расчете, только если указаны в формулах в явном виде.

Для расчета выплат сотруднику можно указать выражение в поле payout или использовать выражения в полях:

  • payout.run — выплаты сотруднику за выполнение маршрута;
  • payout.route — выплаты сотруднику за выполнение всех его маршрутов в решении.

В выражении можно использовать ключевые слова и математические обозначения, которые приведены в таблицах ниже.

Ключевые слова для параметров маршрута

Группа

Ключевое слово и пояснение

Маршруты

  • runs — количество используемых дней. Если переменная используется для маршрута, то ее значение равно 1; если для всех маршрутов в решении, то runs = used_man_days.

Локации

  • locations — количество локаций;
  • total_custom_value — сумма значений поля custom_value (дополнительный параметр локации) по всем локациям в маршруте.

Длительность

  • duration_h — общая длительность маршрутов, в часах;
  • transit_duration_h — длительность движения;
  • service_duration_h — длительность обслуживания локаций;
  • wait_duration_h — длительность ожидания;
  • rest_duration_h — длительность отдыха.

Расстояние

  • distance_km — общая протяженность маршрутов, в км;
  • max_distance_to_garage_km — максимальное расстояние до конечной точки маршрута, в км;
  • max_distance_from_attraction_point_km — максимальное расстояние от точек маршрута до «точки притяжения», указанной в опции global_proximity_attraction_point. Если опция не задана, то max_distance_from_attraction_point_km = 0.

Остановки

  • stops — количество остановок (соседние локации с одинаковыми координатами считаются одной остановкой);
  • unique_stops — количество остановок с уникальными координатами.

Движение от начальной или к конечной точке маршрута (локации с типом base)

  • first_edges_distance_km — общая длина первых отрезков во всех маршрутах, начинающихся в локации с типом base, в км;
  • last_edges_distance_km — общая длина последних отрезков во всех маршрутах, завершающихся в локации с типом base, в км;
  • first_edges_duration_h — общая длительность первых отрезков во всех маршрутах, начинающихся в локации с типом base, в часах;
  • last_edges_duration_h — общая длительность последних отрезков во всех маршрутах, завершающихся в локации с типом base, в часах.

Параметры используются для реализации тех же сценариев, что и штрафы за начало или окончание маршрута как можно ближе к начальной или конечной точке маршрута.

Движение между локациями

  • max_edge_distance_km — максимальная протяженность отрезков между локациями во всех маршрутах, в км;
  • max_edge_duration_h — максимальная длительность перемещений между локациями во всех маршрутах, в часах.

Маршруты с пешеходной частью

  • walking_transit_duration_h — длительность движения пешком;
  • driving_transit_duration_h — длительность движения на автомобиле;
  • walking_distance_km — расстояние, которое сотрудник прошел пешком;
  • driving_distance_km — расстояние, которое сотрудник проехал на автомобиле.

Метрики маршрута рассчитываются по следующим формулам:

  • общая длительность маршрута transit_duration_h = walking_transit_duration_h + driving_transit_duration_h;
  • общая протяженность маршрута distance_km = walking_distance_km + driving_distance_km.

На вычисление переменных, которые используются в маршрутах с пешеходными частями, влияет способ передвижения:

  • walking — весь маршрут обслуживается пешком, расстояние driving_distance_km и длительность driving_transit_duration_h равны 0;
  • transit:
    • driving_distance_km = 0 — считается, что все локации сотрудник посетил пешком (для подсчета расстояния, пройденного на общественном транспорте, недостаточно данных);
    • driving_transit_duration_h — вычисляется на основании других данных, полученных при решении задачи (может быть ненулевым).

Математические обозначения и функции

Математические обозначения

Пояснение

Числа

Целые (положительные, отрицательные), рациональные.

Для десятичных дробей в качестве разделителя используйте точку.

Арифметические действия

+, -, *, /

Скобки

(…)

Математические функции

  • max()/min() с произвольным числом операндов;
  • Round() — округление до целого числа;
  • Ceil() — округление до большего целого числа;
  • Floor() — округление до меньшего целого числа;
  • Abs() — вычисление абсолютного значения (модуля) числа;
  • RoundTo()/CeilTо()/FloorTo() — округление дробей до цифры, которую задает пользователь, например (RoundTo(x, 100) == 100*Round(x/100)).

Логические функции

bool() — переводит любое ненулевое вещественное число в 1.0, а нулевое — в 0.0

Операции сравнения

<, >, =

Логические операции

  • & — логическое И;
  • | — логическое ИЛИ;
  • ! — логическое отрицание.

Метрики решения

Если для сотрудника заданы формулы для расчета стоимости маршрута (на листе employees в поле cost), в метриках решения вы увидите следующие поля:

  • run_custom_cost — стоимость маршрута по формуле для cost.run.
  • route_custom_cost — стоимость всех маршрутов сотрудника в решении по формуле для cost.route. Выводится только в первом маршруте сотрудника.
  • total_custom_cost — полная стоимость маршрута. Выводится только в первом маршруте, в остальных маршрутах выводится 0.

Если для сотрудника заданы формулы для расчета выплат (на листе employees в поле payout), в метриках решения вы увидите следующие поля:

  • run_payout — выплата за маршрут по формуле для payout.run.
  • route_payout — выплата за все маршруты сотрудника в решении по формуле для payout.route. Выводится только в первом маршруте.
  • total_payout — общая выплата сотрудникам за все маршруты в решении. Выводится только в первом маршруте, в остальных маршрутах выводится 0.

Если выплаты рассчитываются хотя бы для одного сотрудника (задано поле payout), в результатах планирования также присутствует метрика total_payout — общий объем выплат сотрудникам.

Ограничения на отрезки маршрута

Отрезок маршрута — перемещение между двумя последовательными локациями. Ограничение для отрезка можно задавать, чтобы сделать маршруты более локальными (например, если планирование покрывает сразу несколько городов, и нужно избежать переездов между ними).

Чтобы задать ограничение, на листе employees укажите следующие параметры:

  • max_edge_distance_m — задает максимальную длину отрезка, в метрах;
  • max_edge_duration_s — задает максимальную длительность перемещения по отрезку, в секундах.

При планировании маршрутов с использованием общественного транспорта следует помнить, что длина отрезка включает только длину пешего пути, поэтому в таких случаях параметром max_edge_distance_m лучше не пользоваться. Подробнее о стоимости маршрутов с использованием общественного транспорта см. в разделе Передвижение пешком и на общественном транспорте.

Пример использования ограничений см. в разделе Ограничения на отрезки маршрута.

Передвижение пешком и на общественном транспорте

Примечание

Способ передвижения routing_mode = transit не поддерживается при планировании с опцией matrix_router = global.

Если для сотрудника задан способ передвижения routing_mode = transit, то по умолчанию большую часть пути сотрудник передвигается на общественном транспорте, а пешком проходит только от остановки до локации. Чтобы сотрудник передвигался между близкими локациями пешком, там где это удобно и выгодно, укажите значение поля can_add_walking_edges = true (по умолчанию false).

Можно задать стоимость использования общественного транспорта на листе employees с помощью одного или нескольких параметров:

  • public_transport_cost.km — стоимость за километр маршрута на общественном транспорте;
  • public_transport_cost.hour — стоимость за час проезда на общественном транспорте;
  • public_transport_cost.edge — стоимость за каждый отрезок маршрута, где используется общественный транспорт;
  • public_transport_cost.run — стоимость за каждый маршрут, где используется общественный транспорт.

При расчете стоимости маршрута public_transport_cost прибавляется к стоимости работы сотрудника cost, см. раздел Стоимость работы и выплаты сотрудникам.

В результате планирования у каждой локации, в которую сотрудник пришел пешком, указывается поле arrive_by_walking = true. В метриках решения вы увидите следующие поля:

  • total_public_transport_distance_cost — общая стоимость за расстояние, пройденное на общественном транспорте.
  • total_public_transport_distance_m — общее расстояние, пройденное на общественном транспорте, в метрах.
  • total_public_transport_duration_cost — общая стоимость за время проезда на общественном транспорте.
  • total_public_transport_duration_s — общее время проезда на общественном транспорте, в секундах.
  • total_public_transport_edges_cost — общая стоимость переездов между локациями на общественном транспорте.
  • total_public_transport_runs_cost — общая стоимость работы сотрудника на маршрутах, где используется общественный транспорт.

Также можно задать ограничение по максимальной длительности отрезка на общественном транспорте в секундах с помощью параметра max_public_transport_edge_duration_s.

Пример

Сотруднику нужно посетить 14 локаций: с 1 по 7 локации находятся недалеко друг от друга на севере города, а локации 8-14 — на юге. Чтобы сотрудник использовал общественный транспорт только там, где это выгодно, задано значение поля can_add_walking_edges = true, а также задана дополнительная стоимость использования общественного транспорта.

В результате сотрудник едет на общественном транспорте в локацию 10 и обходит все близкие к ней локации на юге. Затем едет на общественном транспорте в локацию 6 и обходит все оставшиеся локации на севере.

Пример ExcelЗапрос API (JSON)Ответ API

Кучность маршрутов

Чтобы маршруты получались более кучными, то есть чтобы последовательные локации находились недалеко друг от друга, используйте параметр global_proximity_factor. Он учитывает расстояние до последней локации в маршруте. В результате получаются географически сгруппированные маршруты.

Параметр global_proximity_factor вычисляется на весь маршрут, на все дни в течение периода планирования. Чтобы задать кучность маршрута в течение дня, используйте аналогичный параметр daily_proximity_factor.

Параметры кучности global_proximity_factor и daily_proximity_factor можно задавать:

  • на листе options — они задают кучность маршрутов для всех сотрудников одинаково;
  • на листе employees — они задают кучность маршрутов для конкретного сотрудника и позволяют учесть особенности его маршрутов.

Параметры кучности могут принимать значение от 0 до 10, где 0 — отсутствие кучности, а 10 — максимальная кучность. Мы рекомендуем значения от 0 до 1 (по умолчанию 0).

Примечание

Параметры кучности, заданные на листе employees для конкретного сотрудника, имеют более высокий приоритет и полностью переопределяют параметры кучности, заданные на листе options для всех сотрудников.

Пример настроек см. в разделе Кучные маршруты.

Начало и завершение маршрута

Маршрут можно начинать и заканчивать как в специальных локациях с типом base (это может быть склад, офис или дом, где живет сотрудник), так и в первой обычной локации для обслуживания. В этом случае идентификаторы локаций base нужно указать в полях start_at и finish_at.

Начальные и конечные отрезки маршрута

При планировании маршрута начальные и конечные отрезки (из дома или офиса) можно учитывать по отдельной стоимости. Для этого на листе employees используются следующие параметры:

  • first_edges_penalty_factor — для пробега на первом отрезке каждого маршрута;
  • last_edges_penalty_factor — для пробега на последнем отрезке каждого маршрута;
  • distance_between_days_starts_factor — для пробега между начальными локациями маршрутов в соседние дни;
  • distance_between_days_ends_factor — для пробега между конечными локациями маршрутов в соседние дни;
  • duration_between_days_starts_factor — для длительности между начальными локациями маршрутов в соседние дни;
  • duration_between_days_ends_factor — для длительности между конечными локациями маршрутов в соседние дни.

Длительность удобно использовать вместо пробега, если сотрудники передвигаются на общественном транспорте.

Эти параметры задают коэффициенты, на которые умножается стоимость соответствующих отрезков маршрута. По умолчанию параметры равны 0 — это значит, что для расчетов коэффициенты не используются. Если задан коэффициент 1, то соответствующие отрезки будут входить в стоимость так, как если бы они были частью маршрута. Положительные коэффициенты увеличивают стоимость отрезков, и при планировании алгоритм стремится уменьшить их. Отрицательные коэффициенты уменьшают стоимость отрезков.

Пример использования коэффициентов см. в разделе Ограничения на отрезки маршрута.

Режимы работы сотрудников

При планировании в Excel параметры, задающие режим работы сотрудников, указываются на листе working_days. Каждая строка на листе working_days описывает условия работы для одного типа рабочих дней сотрудника (обычных, укороченных предпраздничных и т.п.). В поле employee.id указывается идентификатор сотрудника (значения могут повторяться, так как для одного сотрудника можно указать несколько различных режимов работы для разных рабочих дней), в поле id — уникальный идентификатор режима работы.

При планировании в API параметры указываются в объекте employees.working_days в виде массива. Каждый элемент массива описывает режим работы для одного рабочего дня сотрудника.

Рабочие и нерабочие дни сотрудника

Рабочие и нерабочие дни, общие для всех сотрудников, указываются в Excel на листе options в параметрах working_days и non_working_days, см. раздел Рабочие и нерабочие дни.

Если для конкретного сотрудника режим работы отличается, его рабочие дни можно указать на листе employees в поле working_days (в запросе API в блоке employees.working_days.day).

Параметры, заданные для конкретных сотрудников, имеют более высокий приоритет по сравнению с глобальными параметрами на листе options:

  • Если параметр working_days указан хотя бы для одного режима работы сотрудника, то глобальный параметр working_days для этого сотрудника игнорируется.
  • Если день отмечен как нерабочий в глобальном параметре non_working_days, но этот день указан как рабочий для конкретного сотрудника в параметре working_days, то для этого сотрудника день будет считаться рабочим.

Для обозначения дней поддерживаются форматы:

  • полные английские названия дней с большой буквы "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday";
  • 2- и 3-буквенные сокращения "Mo", "Mon", "Tu", "Tue", "We", "Wed", "Th", "Thu", "Fr", "Fri", "Sa", "Sat", "Su", "Sun";
  • даты в формате YYYY-MM-DD;
  • номера дней от начала планирования, начиная с 0.

Если для сотрудника указано отсутствие (нерабочий день), то посещения, которые должны быть выполнены в этот день согласно настройкам локаций, распределяются на другие дни этого сотрудника.

Если же для сотрудника указан отпуск (параметр vacations на листе employees), то посещения, которые должны быть выполнены в этот период, распределяются между другими сотрудниками. Дни отпуска, указанные в параметре vacations, вычитаются из рабочих дней в working_days.

Примечание

Если указать отпуск, но не задать режим работы в working_days, то рабочими будут считаться все дни, указанные в working_days_in_week (см. раздел Рабочие и нерабочие дни) за вычетом отпуска.

Для каждого рабочего дня можно указать дополнительную стоимость cost, которая будет добавляться к обычной стоимости выхода сотрудника. Таким образом можно сделать отдельные дни менее предпочтительными для посещений.

Пример

Для двух сотрудников на листе options указаны рабочие дни с понедельника по пятницу и нерабочие дни — 1 и 9 мая. Предпочтительные дни посещения локаций 4, 14, 28 и 39 — среда и четверг — приходятся на нерабочие дни. Поэтому для сотрудника Employee 2 на листе working_days дополнительно указан особый режим работы 1  и 9 мая с повышенной стоимостью cost. Штраф за пропуск посещения локаций в предпочтительный день penalty.preferred_days.fixed выше, чем стоимость выхода на работу в нерабочий день. В результате все маршруты 1  и 9 мая запланированы на сотрудника Employee 2.

Пример ExcelЗапрос API (JSON)Ответ API

Начало и окончание рабочего дня

Для определения рабочего времени сотрудника можно использовать параметры:

  • start_time — время начала рабочего дня. Параметр принимает одно временное окно, например 8:30-9:30.
  • max_finish_time — время окончания рабочего дня. Если допускается завершение рабочего дня с опозданием, то максимально допустимое время окончания рабочего дня укажите в параметре hard_max_finish_time.
  • max_duration_s — максимальная продолжительность рабочего дня в секундах. Если допускается превышение, то предельно допустимую продолжительность укажите в параметре hard_max_duration_s.

Примечание

Ограничение продолжительности рабочего дня следует использовать осторожно, поскольку для его выполнения алгоритм может искусственно растягивать слишком короткие рабочие дни за счет построения менее оптимальных маршрутов.

При нарушении мягких ограничений рабочего дня начисляются штрафы:

  • за нарушение ограничений по времени рабочего дня:

    • penalty.out_of_time.fixed — штраф за факт нарушения ограничений рабочего дня.
    • penalty.out_of_time.minute — штраф за минуту нарушения начала, окончания или продолжительности рабочего дня.
  • за позднее начало или завершение рабочего дня:

    • penalty.late.fixed — штраф за факт позднего начала рабочего дня (после окна, определенного в start_time) или завершения (продолжительность рабочего дня больше max_duration_s или время завершения позднее max_finish_time).
    • penalty.late.minute — штраф за минуту работы позже окончания рабочего дня или за минуту начала после окна start_time.

Пример 1

Сотрудники работают в разные рабочие дни:

  • рабочий день первого сотрудника начинается в интервале с 9:00 до 10:00, а заканчивается не позднее 15:00;
  • рабочий день второго сотрудника — с 14 до 15 часов, а заканчивается не позднее 21:00.

Пример ExcelЗапрос API (JSON)Ответ API

Пример 2

По умолчанию сотрудник начинает работу в интервале с 9:00 до 10:00 и заканчивает в 18:00. В праздничный день 29.12.2023 сотрудник работает в сокращенном режиме и заканчивает до 15:00.

Пример ExcelЗапрос API (JSON)Ответ API

Пример 3

По умолчанию сотрудник работает не больше 8 часов (28 800 секунд) в день. При необходимости он может работать 10 часов, поэтому задано жесткое ограничение на максимальную продолжительность рабочего дня hard_max_duration_s = 36 000. В предпраздничный день 30 апреля сотрудник работает 6 часов, но при необходимости может работать на час больше.

В результате планирования 09.04.2024 сотрудник работает 9 часов 29 минут.

Пример ExcelЗапрос API (JSON)Ответ API

Максимальное расстояние за день и остановки

Для ограничения максимального расстояния, которое преодолевает сотрудник за рабочий день, используется параметр max_mileage_km. Если запланированное расстояние больше max_mileage_km, начисляются штрафы:

  • penalty.max_mileage.fixed — за факт нарушения нарушения ограничения;
  • penalty.max_mileage.km — за каждый километр нарушения.

Также можно ограничить минимальное и максимальное количество остановок в маршруте. Для этого используются параметры minimal_stops и maximal_stops соответственно. При нарушении ограничения по минимальному количеству остановок применяются штрафы penalty.stop_lack.fixed (за факт остановок меньше минимального количества) и penalty.stop_lack.per_stop (за каждую остановку меньше минимального количества). Соответственно, при нарушении ограничения по максимальному количеству остановок начисляются штрафы penalty.stop_excess.fixed (за факт остановок больше максимального количества) и penalty.stop_excess.per_stop (за каждую остановку больше максимального количества).

Стоимость выхода в рабочий день

За выход в конкретный рабочий день можно назначить дополнительную стоимость employee.working_days.cost, которая будет добавлена к стоимости работы сотрудника employee.cost.

Написать в службу поддержки