Redmineの作業時間レポートをカスタムフィールド(テキスト)で集計する

Redmineの作業時間レポートではカスタムフィールドを使えるのですが、厳し目の制約があります。テキストタイプのカスタムフィールドでは集計できないので、できるようにする改修方法です。

集計できるカスタムフィールドはboolとlistだけ

redmine.orgのチケット #19121 を見ると、要約すると次のようなことが書いてあります。

ああ、それはドキュメントが足りない。使えるのは真偽値とリストだけ、それも複数選択可なやつはダメだ

というわけで、カスタムフィールドで集計に使えるのは「真偽値」と「リスト」だけです。「テキスト」は絞り込みには使えるのですが、集計には使えません。

コメントにカスタマイズ例があった

ところが、カスタムフィールドを集計に使えるようにした #1766 の コメント32 にはテキストで集計できるようにしているカスタマイズ例が記載されています。
svn diff を取ると、このようになります。

Index: lib/redmine/field_format.rb
===================================================================
--- lib/redmine/field_format.rb	(リビジョン 16304)
+++ lib/redmine/field_format.rb	(作業コピー)
@@ -325,6 +325,10 @@
           value.to_s
         end
       end
+
+      def group_statement(custom_field)
+        order_statement(custom_field)
+      end
     end

     class TextFormat < Unbounded
Index: lib/redmine/helpers/time_report.rb
===================================================================
--- lib/redmine/helpers/time_report.rb	(リビジョン 16304)
+++ lib/redmine/helpers/time_report.rb	(作業コピー)
@@ -137,7 +137,7 @@
         custom_fields += TimeEntryActivityCustomField.all

         # Add list and boolean custom fields as available criteria
-        custom_fields.select {|cf| %w(list bool).include?(cf.field_format) && !cf.multiple?}.each do |cf|
+        custom_fields.select {|cf| %w(list bool string).include?(cf.field_format) && !cf.multiple?}.each do |cf|
           @available_criteria["cf_#{cf.id}"] = {:sql => cf.group_statement,
                                                  :joins => cf.join_for_order_statement,
                                                  :format => cf.field_format,

コメントに「どうしてlistとboolにだけにしているのかわからない」「なんか見落としているかもしれない」とあるのですが、私もわかりませんでした。たぶんテキストで GROUP BY したくないとか、その程度の理由ではないかと思います。

comments powered by Disqus