Формулировка проблемы: в текущей реализации прогресс групповых мероприятий высчитывается как среднее арифметическое значение прогрессов всех его дочерних мероприятий. Для реализации новых вариантов использования системы необходимо реализовать возможность расчета прогресса групповых мероприятий проекта также средними взвешенными значениями его дочерних мероприятий.
Решение:
Во-первых, необходимо доработать
справочник дополнительных полей проекта
pm_custom_fields
следующим образом:
к существующим значениям поля type
необходимо
добавить новое: non_negative_number
,
значениями которого могут быть только неотрицательные числа;
типом пересчёта (поле aggregate
) для типа
non_negative_number
может быть только «sum»;
необходимо также расширить функциональность поля
measure_code
таким образом, чтобы в нем также
можно было использовать новый тип
non_negative_number
.
Во-вторых, в настройках проекта
во вкладке «Настройки» переименовать опцию «Тип расчета» в «Тип
расчета сроков», после неё необходимо добавить две новые опции
Тип расчета прогресса
и
Вес мероприятия
.
Опция Тип расчета прогресса
представляет собой
выпадающий список со следующими возможными значениями:
«Среднее арифметическое» - выбрано по умолчанию, соответствует текущей (до 59 итерации включительно) реализации прогрессов в модуле «Проекты»;
«Среднее взвешенное» - новый тип расчета (см. ниже).
Опция Вес мероприятия
представляет собой
выпадающий список который содержит пустое значение (выбрано по
умолчанию) + все настроенные для данного проекта дополнительные поля
с типом non_negative_number
(вкладка
«Дополнительные поля» настроек проекта). Данный выпадающий список
доступен для выбора только для значения «Среднее взвешенное» в
настройке Тип расчета прогресса
.
Если список дополнительных полей пустой либо не было выбрано
значение опции Вес мероприятия
, то при
сохранении необходимо выдавать сообщение об ошибке
Необходимо выбрать поле, обозначающее вес мероприятия. Если список пуст, добавьте дополнительное числовое поле к проекту
.
Сохранение происходить не должно, поле должно выделиться красным
цветом.
При смене типа расчета прогресса в момент сохранения настроек проекта необходимо производить перерасчет всех прогрессов групповых мероприятий проекта.
В-третьих, необходимо реализовать новый тип расчета «Среднее взвешенное» по общей формуле:
$$PROGRESS = \frac{P_{1}V_{1} + P_{2}V_{2} + ... + P_{n}V_{n}}{V_{1} + V_{2} + ... + V_{n}}$$, где
Pn - прогресс
мероприятия n
;
Vn - вес мероприятия
n
, определяемый дополнительным полем типа
non_negative_number
в каждом мероприятии.
Примечание: невведенное значение веса мероприятия по смыслу приравнивается к нулю.
Прогресс каждого группового мероприятия проекта рассчитывается таким образом. При этом необходимо сначала рассчитать прогресс всех вложенных групповых мероприятий (при наличии), только затем вышестоящего группового. Вес группового мероприятия есть сумма весов всех его вложенных мероприятий.
Пример: проект имеет следующее дерево мероприятий:
-- Проект
----- Мероприятие 1
(прогресс 30%, вес 7,5)
----- Мероприятие 2
(прогресс 64%, вес 1)
----- Мероприятие 3
(прогресс 100%, вес 0)
Прогресс группового мероприятия Проект
по формуле
будет равняться:
$$PROGRESS = \frac{30*7,5 + 64*1 + 100*0}{7,5 + 1 + 0} = \frac{289}{8.5} = 34$$
Таким образом, в приведенном примере результирующий прогресс
корневого мероприятия Проект
будет равняться 34.
Для предотвращения некорректной работы реализуемого типа расчета прогресса нельзя давать возможность удаления дополнительного поля, использующегося в качестве поля для веса мероприятий.
Кроме того, если в справочнике pm_custom_fields
у
дополнительного поля, использующегося в качестве поля для веса
мероприятий, будет изменен тип на любой другой, отличный от
non_negative_number
, должно произойти следующее:
значение настройки Вес мероприятия
измениться
не должно (при этом в выпадающем списке такое значение уже
должно отсутствовать);
уже введенные значения весов и рассчитанные по ним прогрессы измениться не должны;
все некорректные значения веса, которые могут быть введены после смены типа дополнительного поля, по смыслу приравниваются к нулю.
Действия при обновлении системы
При обновлении системы в настройках всех проектов значением поля
Тип расчета прогресса
должно стать «Среднее
арифметическое». Никаких других видимых изменений (в частности, в
расчетах прогресса) произойти не должно.