Redmineのガントチャートに日付を出したい。

プロジェクト管理にRedmineを導入してみました。状況を報告する為にガントチャートをPDF出力してみたのですが、時間の単位が日付ではなく週で表示されるのでちょっと不評でした。。。

自分としてはそんなもんかなぁと気にならなかったのですが、同僚がRedmineのガントチャートに日付の表示を追加を見つけてきてくれたので、ブラウザでの閲覧時には日付を表示出来るように対応してみました。

やったことは参照先のまんまなんではしょりますが、ブラウザで日付で見れるとなると今度はPDFには反映されないの?ってことになります。

PDFの生成をどこでやっているのかわからないので、ムリです。って答えていたのですが色々調べているウチに/lib/redmine/export/pdf.rbでPDFを生成していそうって事がわかったので実験してみたところ日付が出るようになりました。

rubyがちゃんとわかっているわけではないので、ブラウザに対応した時の対応の真似事をしただけなのですが備忘録として書いておきます。(#addが追加した部分です。)

300行あたり

if gantt.months < 7
  show_weeks = true
  headers_heigth = 2*header_heigth
  if gantt.months < 3
    show_days = true
#   headers_heigth = 3*header_heigth
    headers_heigth = 4*header_heigth #add
  end
end
 
g_width = 210
zoom = (g_width) / (gantt.date_to - gantt.date_from + 1)
g_height = 120
t_height = g_height + headers_heigth
 
y_start = pdf.GetY
 
# Months headers
month_f = gantt.date_from
left = subject_width
height = header_heigth
gantt.months.times do 
  width = ((month_f >> 1) - month_f) * zoom 
  pdf.SetY(y_start)
  pdf.SetX(left)
  pdf.Cell(width, height, "#{month_f.year}-#{month_f.month}", "LTR", 0, "C")
  left = left + width
  month_f = month_f >> 1
end  
 
# Weeks headers
if show_weeks
  left = subject_width
  height = header_heigth
  if gantt.date_from.cwday == 1
    # gantt.date_from is monday
    week_f = gantt.date_from
  else
    # find next monday after gantt.date_from
    week_f = gantt.date_from + (7 - gantt.date_from.cwday + 1)
    width = (7 - gantt.date_from.cwday + 1) * zoom-1
    pdf.SetY(y_start + header_heigth)
    pdf.SetX(left)
    pdf.Cell(width + 1, height, "", "LTR")
    left = left + width+1
  end
  while week_f <= gantt.date_to
    width = (week_f + 6 <= gantt.date_to) ? 7 * zoom : (gantt.date_to - week_f + 1) * zoom
    pdf.SetY(y_start + header_heigth)
    pdf.SetX(left)
    pdf.Cell(width, height, (width >= 5 ? week_f.cweek.to_s : ""), "LTR", 0, "C")
    left = left + width
    week_f = week_f+7
  end
end
 
# Days headers
 
if show_days
  left = subject_width
  height = header_heigth
  wday = gantt.date_from.cwday 
  day_num = gantt.date_from #add
  pdf.SetFontStyle('B',7)
  (gantt.date_to - gantt.date_from + 1).to_i.times do 
    width = zoom
    pdf.SetY(y_start + 2 * header_heigth)
    pdf.SetX(left)
    pdf.Cell(width, height, day_name(wday).first, "LTR", 0, "C")
    # add ここから
    pdf.SetY(y_start + 3 * header_heigth)
    pdf.SetX(left)
    pdf.Cell(width, height, day_num.day.to_s, "LTR", 0, "C")
    day_num = day_num + 1
   # ここまで   
    left = left + width
    wday = wday + 1
    wday = 1 if wday > 7
  end
end

About this entry