スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

バージョンガントチャートPlugin作成(作業記録) その2

アプリケーションメニューからトップメニューに移動



アプリケーションメニューだと画面によってはメニューが選択できなくて不便だったので、
vendor/plugins/redmine_version_gantt_chart/init.rbを編集してトップメニューに変更

 menu :application_menu, :version_gantt_chart, {:controller => 'version_gantt_chart', :action => 'index'}, :caption => 'バージョンガントチャート', :last => true

↑を↓に変更
 menu :top_menu, :version_gantt_chart, {:controller => 'version_gantt_chart', :action => 'index'}, :caption => 'バージョンガントチャート', :last => true


チャートに表示したい情報を集める


最遅開始日
期日
完了予定日
終了割合
作業済み割合

上の情報をユーザの担当するバージョンごとにコントローラで集めてみた

vendor/plugins/redmine_version_gantt_chart/app/controllers/version_gantt_chart_controller.rb
require 'user_tasks'

class VersionGanttChartController < ApplicationController

def index
#ユーザごとのタスク情報を集める
@user_tasks_list = []

user_list = User.find(:all)
user_list.each do |user|
user_tasks = UserTasks.new( user )

user.projects.each do |project|
project.versions.each do |version|
version.fixed_issues.each do |issue|
user_tasks.add issue
end
end
end

@user_tasks_list.push( user_tasks ) unless user_tasks.empty?
end
end
end


vendor/plugins/redmine_version_gantt_chart/app/controllers/user_tasks.rb
class UserTasks
attr_reader :user
attr_reader :version_list

def initialize( user )
@user = user
@version_task_hash = {}
@version_list = []
end

def empty?
@version_task_hash.empty?
end

def add( issue )
if( issue.assigned_to == @user )
add_task_by_version( issue )
end
end

def add_task_by_version( issue )
unless @version_task_hash[issue.fixed_version]
@version_task_hash[issue.fixed_version] = TaskInfoCollector.new
@version_list.push( issue.fixed_version )
end

@version_task_hash[issue.fixed_version].add( issue )
end
private :add_task_by_version

#最遅開始日
def latest_start_day( version )
return version.due_date - @version_task_hash[version].estimated_days + 1 #+1は期日当日分の調整
end

#バージョンの予定工数のうち終了の割合
def complete_percent( version )
return @version_task_hash[version].complete_percent
end

#バージョンの予定工数のうち作業済みの割合(終了状態を除いて)
def done_percent( version )
return @version_task_hash[version].done_percent
end

#完了予想日
def able_day( version )
return Date.today + @version_task_hash[version].remain_estimated_days - 1 #-1は今日の作業分の調整
end

#超過日数
def over_days( version )
return @version_task_hash[version].over_days
end
end


vendor/plugins/redmine_version_gantt_chart/app/controllers/task_info_collector.rb
class TaskInfoCollector
WORKABLE_HOUR_A_DAY = 6
def initialize
@estimated_hours = 0
@complete_hours = 0
@done_hours = 0
@complete_over_hours = 0
@done_over_hours = 0
end

def add( issue )
add_estimated_hours issue.estimated_hours

if issue.closed?
add_complete_hours issue.estimated_hours
add_complete_over_hours issue.spent_hours - issue.estimated_hours
else
done_ratio = issue.done_ratio / 100.0
add_done_hours( issue.estimated_hours * done_ratio )
add_done_over_hours( issue.spent_hours - (issue.estimated_hours * done_ratio) )
end
end

def estimated_days
estimated_days = @estimated_hours / WORKABLE_HOUR_A_DAY
return estimated_days.ceil
end

def remain_estimated_days
remain_hours = @estimated_hours - @complete_hours - @done_hours
remain_estimated_days = remain_hours / WORKABLE_HOUR_A_DAY
return remain_estimated_days.ceil
end

def over_days
over_days = ( @complete_over_hours + @done_over_hours ) / WORKABLE_HOUR_A_DAY
return over_days.ceil
end

def complete_percent
return ratio_to_percent(@complete_hours / @estimated_hours)
end

def done_percent
return ratio_to_percent(@done_hours / @estimated_hours)
end

def add_estimated_hours( new_hours )
@estimated_hours += new_hours
end
private :add_estimated_hours

def add_complete_hours( new_hours )
@complete_hours += new_hours
end
private :add_complete_hours

def add_done_hours( new_hours )
@done_hours += new_hours
end
private :add_done_hours

def add_complete_over_hours( new_hours )
@complete_over_hours += new_hours
end
private :add_complete_over_hours

def add_done_over_hours( new_hours )
@done_over_hours += new_hours
end
private :add_done_over_hours

def ratio_to_percent( ratio )
percent = ratio * 100
return percent.round
end
private :ratio_to_percent
end


ビューに集めた情報を表示(文字で)



vendor/plugins/redmine_version_gantt_chart/app/views/version_gantt_chart/index.html.erb
を編集して情報を表示
<ul class="version_gantt_chart">
<% @user_tasks_list.each do |user_task| -%>
<li>
<%= "#{user_task.user.name}" %>
<ul>
<% user_task.version_list.each do |version| -%>
<li>
<%= "#{version.name} - #{version.project.name}" %>
<ul>
<li><%= "最遅開始日 #{user_task.latest_start_day(version)}" -%></li>
<li><%= "期日 #{version.due_date}" -%></li>
<li><%= "完了予想日 #{user_task.able_day(version)}" -%></li>
<li><%= "終了割合 #{user_task.complete_percent(version)} %" -%></li>
<li><%= "作業済み割合 #{user_task.done_percent(version)} %" -%></li>
</ul>
</li>
<% end -%>
</ul>
</li>
<% end -%>
</ul>


出てきたビュー↓
0.0.1スクリーンショット

コントローラディレクトリ内に追加したクラスが使えるので、処理を結構簡単にかけた。

次回は、ガントチャートのビューを参考にして、今回集めた情報を使ってチャートを描く予定。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメント

Secret

プロフィール

tenma

Author:tenma


AI好きのプログラマ
基本伊豆ダイバー(100本達成)
ゲーム実況好きのニコ厨(プレミアム会員)


follow _tenma at http://twitter.com

最新記事
最新コメント
最新トラックバック
カテゴリ
検索フォーム
リンク
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。