Задача [PROJECTS2]: Вес мероприятий проекта для вычисления прогресса проекта

Формулировка проблемы: в текущей реализации прогресс групповых мероприятий высчитывается как среднее арифметическое значение прогрессов всех его дочерних мероприятий. Для реализации новых вариантов использования системы необходимо реализовать возможность расчета прогресса групповых мероприятий проекта также средними взвешенными значениями его дочерних мероприятий.

Решение:

Во-первых, необходимо доработать справочник дополнительных полей проекта pm_custom_fields следующим образом:

Во-вторых, в настройках проекта во вкладке «Настройки» переименовать опцию «Тип расчета» в «Тип расчета сроков», после неё необходимо добавить две новые опции Тип расчета прогресса и Вес мероприятия.

Опция Тип расчета прогресса представляет собой выпадающий список со следующими возможными значениями:

Опция Вес мероприятия представляет собой выпадающий список который содержит пустое значение (выбрано по умолчанию) + все настроенные для данного проекта дополнительные поля с типом non_negative_number (вкладка «Дополнительные поля» настроек проекта). Данный выпадающий список доступен для выбора только для значения «Среднее взвешенное» в настройке Тип расчета прогресса.

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

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

Рисунок 149. Новые опции в настройках проекта

Новые опции в настройках проекта

В-третьих, необходимо реализовать новый тип расчета «Среднее взвешенное» по общей формуле:

$$PROGRESS = \frac{P_{1}V_{1} + P_{2}V_{2} + ... + P_{n}V_{n}}{V_{1} + V_{2} + ... + V_{n}}$$, где

Примечание: невведенное значение веса мероприятия по смыслу приравнивается к нулю.

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

Пример: проект имеет следующее дерево мероприятий:

-- Проект

----- Мероприятие 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, должно произойти следующее:

Действия при обновлении системы

При обновлении системы в настройках всех проектов значением поля Тип расчета прогресса должно стать «Среднее арифметическое». Никаких других видимых изменений (в частности, в расчетах прогресса) произойти не должно.