Аналитика в Redmine

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

Custom Report

Для визуализации аналитической информации можно использовать простой генератор отчетов Custom Report. Отчеты простейшие, но лучше чем ничего. Можно назначить отображение отчета для сотрудника с определенной ролью.

Переход в состояние

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

В компоненте Computed custom field добавляем вычисляемое custom field с типом int. В моих предыдущих статьях подробно написано, что и как нужно делать. Код на Ruby будет следующий:

# ID for status "Тестирование" - 10
if (cfs[53].blank?)
   cfs[53] = 0
end

if (self.status_id == 10 && self.status_id_was != 10)
   cfs[53] + 1;
else
   cfs[53]
end

Время этапа

Интересно посмотреть сколько времени занимает определенный этап разработки. Например, сколько при выполнении задачи было затрачено суммарно времени на этап «Тестирование».

Создадим переменную дата последнего этапа с типом DateTime, куда будем заносить дату и время когда был начат предыдущий этап в процессе:

#Переменная в списке custom fields должна быть в самом конце. 
if (self.status_id != self.status_id_was)
  cfs[55] = DateTime.now;
else
  cfs[55];
end

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

Создадим ещё один computed custom field с типом Float. Для статуса «Тестирование» скрипт будет такой:

# ID for status "Тестирование" - 10
if (cfs[56].blank?)
   cfs[56] = 0
end

if (cfs[55].blank? || !cfs[55].present?)
   cfs[55] = DateTime.now;
end

if ((self.status_id == 10 && self.status_id_was != 10) ||
   (self.status_id_was == 10 && self.status_id != 10))
   diff = DateTime.now.to_time - cfs[55].to_time;
   #self.description = (diff).to_s + "\r\n";
   cfs[56] = (cfs[56] + diff)/60; #In minutes 
else
   cfs[56]
end

Ключевй статус по которому производится отсечка времени — «Тестирование». Соответственно, с момента, когда другие отделы перевели с любого другого статуса на статус «Начать тестирование» происходит сохранение даты и времени перехода на этот статус. Как только статус будет изменен, вычисляется время затраченное на переход со статуса «Начать тестирование» на статус «Тестирование».

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

Понятно, что такой простой вариант рассчета времени этапа дает суммарное значение которое потребовалось на этап. Если статус был переведен перед окончанием рабочего дня, то нерабочее время также быдет учтено. Корректно вычленить нерабочее время — штука довольно трудоемкая для случая, когда график относительно свободный. Скажем, сотрудник может приехать на пару часов позже остальных и задержаться на это время.

В простейшем случае, если более или менее выдерживается время на отдых, скажем, сотрудник ушел с работы в 18.00 и пришел в 9.00, а если ушел в 20.00, то и пришел на работу в 11.00, то код для корректировки будет несложным:

    numofdays = (DateTime.now.to_date - cfs[55].to_date).to_i;
    excludetime = numofdays * 15*3600;
    cfs[56] = (cfs[56] + diff - excludetime)/60; #In minutes 

15 — это примерное количество нерабочих часов. Соответственно, если оба статуса переводились в один день, то разница между датами будет равна 0 и поправки не будет. Если между сменой статусов прошли 1 сутки, то из рассчитанного суммарного кол-ва времени в секундах будет вычтена 15-ти часовая поправка.

Отображение аналитических полей

Рядовым сотрудникам отображать аналитические поля не нужно, поэтому в настройках полей нужно проставить Visibility («Видимое») только для отдельных ролей. Например, менеджеров.

Spread the love
Запись опубликована в рубрике IT tools, IT решения для бизнеса с метками . Добавьте в закладки постоянную ссылку.