Алгоритм расчета Срока — даты, отстоящей на расчетное время от точки отсчета
При расчете срока выполнения задач, срока обработки подписи и других аналогичных задач используются функции добавления рабочих дней/часов/минут. Такие функции доступны при редактировании смарт-выражений (ДобавитьРабочихДней, ДобавитьРабочихЧасов, ДобавитьРабочихМинут) и при разработке хранимых процедур (tc_AddWorkingDays, tc_AddWorkingHours, tc_AddWorkingMinutes).
При расчете сроков используются точка отсчета (например, момент запроса подписи) и интервал времени (например, время, выделенное на обработку подписи), а также учитываются системные параметры из Общих настроек приложения: Рабочее время (с... по...) и Рабочих часов в дне, и системный Производственный календарь (для определения рабочих и выходных/праздничных дней).
Алгоритм расчета срока основан на следующих правилах:
№ |
Правило |
Пример |
Пояснения |
1 |
Если точка отсчета приходится на нерабочее время (до начала рабочего дня, после окончания рабочего дня или на выходной день), то она сдвигается на начало ближайшего рабочего дня. |
Подпись запрошена в 08:00, Подпись запрошена в 20:00, Подпись запрошена в 15:00 в субботу, |
|
2 |
Обычно время от начала до конца рабочего дня больше чем продолжительность рабочего дня, т.е. в середине дня предусмотрен перерыв (например, рабочий день с 10:00 до 19:00, а продолжительность рабочего дня 8 часов – в середине дня есть 1 час перерыва). Но поскольку конкретные часы перерыва неизвестны, считается, что сотрудник может взять перерыв в любое время, даже в самом начале дня. Поэтому если срок переходит на другой рабочий день, время начала рабочего дня сдвигается на время перерыва (например, вместо 10:00 отсчитывается от 11:00). |
||
2.1 |
Если точка отсчета и срок приходятся на один и тот же день и интервал времени меньше продолжительности рабочего дня, время на перерыв не учитывается. |
Точка отсчета – 12:00, |
|
2.2 |
Если точка отсчета и срок приходятся на разные дни, то при переходе на следующий день к началу рабочего дня прибавляется время перерыва. |
Точка отсчета – 16:00, |
С 16:00 до 19:00 – 3 часа, |
3 |
Если интервал времени больше продолжительности рабочего дня, то есть содержит один или несколько рабочих дней, то вместо продолжительности каждого рабочего дня при расчете откладываются сутки. |
||
3.1 |
Интервал времени равен продолжительности рабочего дня. |
Точка отсчета – 14:00 1 октября 2018, |
|
3.2 |
Интервал времени больше одного рабочего дня, но остаток не переходит на следующий рабочий день. |
Точка отсчета – 14:00 1 октября 2018, |
12 часов = 8 часов (продолжительность рабочего дня) + 4 часа. К 14:00 прибавляются сутки – 14:00 следующего рабочего дня, |
3.3 |
Интервал времени больше нескольких рабочих дней, но остаток не переходит на следующий рабочий день. |
Точка отсчета – 14:00 1 октября 2018, |
18 часов = 16 часов (продолжительность двух рабочих дней) + 2 часа. К 14:00 1 октября прибавляются двое суток – 14:00 3 октября, |
3.4 |
Интервал времени больше рабочего дня, и остаток переходит на следующий день. |
Точка отсчета – 18:00 1 октября 2018, |
12 часов = 8 часов (продолжительность рабочего дня) + 4 часа. К 18:00 1 октября прибавляются сутки – 18:00 2 октября, |
Алгоритм расчета рабочего времени между датами
Расчет рабочего времени ведется между двумя датами -- Точкой Отсчета и Сроком.
Алгоритм в виде блок-схемы:
Алгоритм в виде пошаговых схем:
Подготовительные расчеты |
||
---|---|---|
1. Если время какой-либо из дат раньше, чем начало рабочего дня, то сдвинем эту дату вперед, на начало рабочего дня. |
2. Если время какой-либо из дат позже, чем окончание рабочего дня, то сдвинем эту дату назад, на конец рабочего дня. |
3. Если какая-то из дат попадает на выходной день, то перенесем ее на первый следующий рабочий день, на то же время.
|
4. Если Точка Отсчета и Срок попадают на один и тот же рабочий день, то вычислим разницу времени между двумя этими датами. Если получившаяся разница больше длины рабочего дня, то примем ее равной длине рабочего дня. На этом завершим расчет. Пример: Начало рабочего дня: 9:00 Конец рабочего дня: 21:00 Длина рабочего дня: 8 часов Точка Отсчета: 10 августа 2015 10:00 Срок: 10 августа 2015 16:00 Оставшееся время = 6 часов |
5. Время, оставшееся в день начала расчета между Точкой Отсчета и концом рабочего дня, назовем Остаток дня отсчета. |
6. Время, оставшееся в день срока между началом рабочего дня и Сроком, назовем Остаток дня срока.
|
7. Вычислим количество полных рабочих дней, расположенных между Точкой Отсчета и Сроком (то есть количество полных суток, за исключением выходных и праздничных дней). Пример: |
||
8. Если между Точкой Отсчета и Сроком нет полных рабочих дней |
||
8.1. Если между Точкой Отсчета и Сроком больше суток. В этом случае в расчете заменяем промежуток времени в 24 часа (сутки) на длину рабочего дня и прибавляем к нему остаток.
Пример: Начало рабочего дня: 9:00 Конец рабочего дня: 21:00 Длина рабочего дня: 8 часов Точка Отсчета: 10 августа 2015 10:00 Срок: 11 августа 2015 16:00 Оставшееся время = 8 часов длина рабочего дня + 6 часов остаток = 14 часов |
8.2. Если между Точкой Отсчета и Сроком меньше суток, а сумма остатков дней отсчета и срока больше длины рабочего дня. В этом случае время, оставшееся между Точкой Отсчета и Сроком, принимаем равным длине рабочего дня.
Пример: Начало рабочего дня: 9:00 Конец рабочего дня: 21:00 Длина рабочего дня: 8 часов Точка Отсчета: 10 августа 2015 12:00 Срок: 11 августа 2015 11:00 Остаток дня отсчета = 9 часов Остаток дня срока = 2 часа (9 часов + 2 часа) > 8 часов Оставшееся время = 8 часов длина рабочего дня |
8.3. Если между Точкой Отсчета и Сроком меньше суток, а сумма остатков дней отсчета и срока меньше длины рабочего дня. В этом случае время, оставшееся между Точкой Отсчета и Сроком, принимаем равным сумме двух остатков.
Пример: Начало рабочего дня: 9:00 Конец рабочего дня: 21:00 Длина рабочего дня: 8 часов Точка Отсчета: 10 августа 2015 17:00 Срок: 11 августа 2015 11:00 Остаток дня отсчета = 4 часа Остаток дня срока = 2 часа (4 часа + 2 часа) < 8 часов Оставшееся время = (4 часа + 2 часа) = 6 часов |
9. Если между Точкой Отсчета и Сроком есть один или несколько полных рабочих дней |
||
9.1. Если сумма остатков дней отсчета и срока больше суток. В этом случае расчет выполняется как в пункте 8.1, но к этому времени прибавляется количество полных рабочих дней между Точкой Отсчета и Сроком (подсчитанное в пункте 7), умноженное на длину рабочего дня.
Пример: Начало рабочего дня: 9:00 Конец рабочего дня: 21:00 Длина рабочего дня: 8 часов Точка Отсчета: 12 августа 2015 11:00 Срок: 18 августа 2015 17:00 Количество полных рабочих дней: 3 Оставшееся время = 8 часов длина рабочего дня + 6 часов остаток + (3 * 8 часов длина рабочего дня) = 38 часов |
9.2. Если сумма остатков дней отсчета и срока меньше суток, но больше длины рабочего дня. В этом случае расчет выполняется как в пункте 8.2, но к этому времени прибавляется количество полных рабочих дней между Точкой Отсчета и Сроком (подсчитанное в пункте 7), умноженное на длину рабочего дня.
Пример: Начало рабочего дня: 9:00 Конец рабочего дня: 21:00 Длина рабочего дня: 8 часов Точка Отсчета: 12 августа 2015 13:00 Срок: 19 августа 2015 12:00 Количество полных рабочих дней: 4 Остаток дня отсчета = 8 часов Остаток дня срока = 3 часа (8 часов + 3 часа) > 8 часов Оставшееся время = 8 часов длина рабочего дня + (4 * 8 часов длина рабочего дня) = 40 часов |
9.3. Если сумма остатков дней отсчета и срока меньше длины рабочего дня. В этом случае расчет выполняется как в пункте 8.3, но к этому времени прибавляется количество полных рабочих дней между Точкой Отсчета и Сроком (подсчитанное в пункте 7), умноженное на длину рабочего дня.
Пример: Начало рабочего дня: 9:00 Конец рабочего дня: 21:00 Длина рабочего дня: 8 часов Точка Отсчета: 13 августа 2015 17:00 Срок: 17 августа 2015 11:00 Количество полных рабочих дней: 1 Остаток дня отсчета = 4 часа Остаток дня срока = 2 часа (4 часов + 2 часа) < 8 часов Оставшееся время = (4 часа + 2 часа) + (1 * 8 часов длина рабочего дня) = 6 часов + 8 часов = 14 часов |
Алгоритм расчета фактических трудозатрат по календарным событиям
1. Если для события включен признак "Целый день", то объем фактических трудозатрат каждого участника считается равным количеству рабочих часов в дне (задается в Общих настройках приложения, обычно это 8 часов).
2. Если для события признак "Целый день" НЕ включен, то считается разница между концом и началом встречи встречи, при этом учитывается только рабочее время. Дополнительно учитываются следующие условия:
Если начало календарного события раньше начала или позже окончания рабочего дня, то к полученному количеству прибавляется 1 час;
Если прибавления часов не было, но конец календарного события раньше начала или позже окончания рабочего дня, то к полученному количеству прибавляется 1 час.
3. Если итог получился более 8 часов часов в день, то объем фактических трудозатрат за день считается равным количеству рабочих часов в дне, остальное отбрасывается.
Пример
Встреча началась в 6 часов утра и закончилась на следующий день в 23 часа.
1. По алгоритму расчета получается 16 часов.
2. Т.к. встреча в первый и во второй день начинается раньше начала рабочего дня, к полученному количеству дважды добавляется по 1 часу. Итого 18 часов.
3. Т.к. встреча занимает 2 календарных дня, то результат считается равным 16 часам (2*8 часов), остальное отбрасывается.