OSDN Git Service

added svn:eol-style native property on /app files
[redminele/redmine.git] / app / controllers / reports_controller.rb
index aa26e24..37c6cf1 100644 (file)
-# redMine - project management software\r
-# Copyright (C) 2006  Jean-Philippe Lang\r
-#\r
-# This program is free software; you can redistribute it and/or\r
-# modify it under the terms of the GNU General Public License\r
-# as published by the Free Software Foundation; either version 2\r
-# of the License, or (at your option) any later version.\r
-# \r
-# This program is distributed in the hope that it will be useful,\r
-# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-# GNU General Public License for more details.\r
-# \r
-# You should have received a copy of the GNU General Public License\r
-# along with this program; if not, write to the Free Software\r
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
-\r
-class ReportsController < ApplicationController\r
-  layout 'base'\r
-  before_filter :find_project, :authorize\r
-\r
-  def issue_report\r
-    @statuses = IssueStatus.find(:all, :order => 'position')\r
-    \r
-    case params[:detail]\r
-    when "tracker"\r
-      @field = "tracker_id"\r
-      @rows = Tracker.find :all, :order => 'position'\r
-      @data = issues_by_tracker\r
-      @report_title = l(:field_tracker)\r
-      render :template => "reports/issue_report_details"\r
-    when "priority"\r
-      @field = "priority_id"\r
-      @rows = Enumeration::get_values('IPRI')\r
-      @data = issues_by_priority\r
-      @report_title = l(:field_priority)\r
-      render :template => "reports/issue_report_details"   \r
-    when "category"\r
-      @field = "category_id"\r
-      @rows = @project.issue_categories\r
-      @data = issues_by_category\r
-      @report_title = l(:field_category)\r
-      render :template => "reports/issue_report_details"   \r
-    when "author"\r
-      @field = "author_id"\r
-      @rows = @project.members.collect { |m| m.user }\r
-      @data = issues_by_author\r
-      @report_title = l(:field_author)\r
-      render :template => "reports/issue_report_details"  \r
-    else\r
-      @queries = @project.queries.find :all, :conditions => ["is_public=? or user_id=?", true, (logged_in_user ? logged_in_user.id : 0)]\r
-      @trackers = Tracker.find(:all, :order => 'position')\r
-      @priorities = Enumeration::get_values('IPRI')\r
-      @categories = @project.issue_categories\r
-      @authors = @project.members.collect { |m| m.user }\r
-      issues_by_tracker\r
-      issues_by_priority\r
-      issues_by_category\r
-      issues_by_author\r
-      render :template => "reports/issue_report"\r
-    end\r
-  end  \r
-  \r
-  def delays\r
-    @trackers = Tracker.find(:all)\r
-    if request.get?\r
-      @selected_tracker_ids = @trackers.collect {|t| t.id.to_s }\r
-    else\r
-      @selected_tracker_ids = params[:tracker_ids].collect { |id| id.to_i.to_s } if params[:tracker_ids] and params[:tracker_ids].is_a? Array\r
-    end\r
-    @selected_tracker_ids ||= []    \r
-    @raw = \r
-      ActiveRecord::Base.connection.select_all("SELECT datediff( a.created_on, b.created_on ) as delay, count(a.id) as total\r
-      FROM issue_histories a, issue_histories b, issues i\r
-      WHERE a.status_id =5\r
-      AND a.issue_id = b.issue_id\r
-      AND a.issue_id = i.id\r
-      AND i.tracker_id in (#{@selected_tracker_ids.join(',')})\r
-      AND b.id = (\r
-      SELECT min( c.id )\r
-      FROM issue_histories c\r
-      WHERE b.issue_id = c.issue_id ) \r
-      GROUP BY delay") unless @selected_tracker_ids.empty?    \r
-    @raw ||=[]\r
-    \r
-    @x_from = 0\r
-    @x_to = 0\r
-    @y_from = 0\r
-    @y_to = 0\r
-    @sum_total = 0\r
-    @sum_delay = 0\r
-    @raw.each do |r|\r
-      @x_to = [r['delay'].to_i, @x_to].max\r
-      @y_to = [r['total'].to_i, @y_to].max\r
-      @sum_total = @sum_total + r['total'].to_i\r
-      @sum_delay = @sum_delay + r['total'].to_i * r['delay'].to_i\r
-    end    \r
-  end\r
-  \r
-private\r
-  # Find project of id params[:id]\r
-  def find_project\r
-    @project = Project.find(params[:id])               \r
-  rescue ActiveRecord::RecordNotFound\r
-    render_404\r
-  end\r
-\r
-  def issues_by_tracker\r
-    @issues_by_tracker ||= \r
-        ActiveRecord::Base.connection.select_all("select    s.id as status_id, \r
-                                                  s.is_closed as closed, \r
-                                                  t.id as tracker_id,\r
-                                                  count(i.id) as total \r
-                                                from \r
-                                                  issues i, issue_statuses s, trackers t\r
-                                                where \r
-                                                  i.status_id=s.id \r
-                                                  and i.tracker_id=t.id\r
-                                                  and i.project_id=#{@project.id}\r
-                                                group by s.id, s.is_closed, t.id")     \r
-  end\r
-       \r
-  def issues_by_priority    \r
-    @issues_by_priority ||= \r
-      ActiveRecord::Base.connection.select_all("select    s.id as status_id, \r
-                                                  s.is_closed as closed, \r
-                                                  p.id as priority_id,\r
-                                                  count(i.id) as total \r
-                                                from \r
-                                                  issues i, issue_statuses s, enumerations p\r
-                                                where \r
-                                                  i.status_id=s.id \r
-                                                  and i.priority_id=p.id\r
-                                                  and i.project_id=#{@project.id}\r
-                                                group by s.id, s.is_closed, p.id")     \r
-  end\r
-       \r
-  def issues_by_category   \r
-    @issues_by_category ||= \r
-      ActiveRecord::Base.connection.select_all("select    s.id as status_id, \r
-                                                  s.is_closed as closed, \r
-                                                  c.id as category_id,\r
-                                                  count(i.id) as total \r
-                                                from \r
-                                                  issues i, issue_statuses s, issue_categories c\r
-                                                where \r
-                                                  i.status_id=s.id \r
-                                                  and i.category_id=c.id\r
-                                                  and i.project_id=#{@project.id}\r
-                                                group by s.id, s.is_closed, c.id")     \r
-  end\r
-       \r
-  def issues_by_author\r
-    @issues_by_author ||= \r
-      ActiveRecord::Base.connection.select_all("select    s.id as status_id, \r
-                                                  s.is_closed as closed, \r
-                                                  a.id as author_id,\r
-                                                  count(i.id) as total \r
-                                                from \r
-                                                  issues i, issue_statuses s, users a\r
-                                                where \r
-                                                  i.status_id=s.id \r
-                                                  and i.author_id=a.id\r
-                                                  and i.project_id=#{@project.id}\r
-                                                group by s.id, s.is_closed, a.id")     \r
+# redMine - project management software
+# Copyright (C) 2006  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+class ReportsController < ApplicationController
+  layout 'base'
+  before_filter :find_project, :authorize
+
+  def issue_report
+    @statuses = IssueStatus.find(:all, :order => 'position')
+    
+    case params[:detail]
+    when "tracker"
+      @field = "tracker_id"
+      @rows = Tracker.find :all, :order => 'position'
+      @data = issues_by_tracker
+      @report_title = l(:field_tracker)
+      render :template => "reports/issue_report_details"
+    when "priority"
+      @field = "priority_id"
+      @rows = Enumeration::get_values('IPRI')
+      @data = issues_by_priority
+      @report_title = l(:field_priority)
+      render :template => "reports/issue_report_details"   
+    when "category"
+      @field = "category_id"
+      @rows = @project.issue_categories
+      @data = issues_by_category
+      @report_title = l(:field_category)
+      render :template => "reports/issue_report_details"   
+    when "author"
+      @field = "author_id"
+      @rows = @project.members.collect { |m| m.user }
+      @data = issues_by_author
+      @report_title = l(:field_author)
+      render :template => "reports/issue_report_details"  
+    else
+      @queries = @project.queries.find :all, :conditions => ["is_public=? or user_id=?", true, (logged_in_user ? logged_in_user.id : 0)]
+      @trackers = Tracker.find(:all, :order => 'position')
+      @priorities = Enumeration::get_values('IPRI')
+      @categories = @project.issue_categories
+      @authors = @project.members.collect { |m| m.user }
+      issues_by_tracker
+      issues_by_priority
+      issues_by_category
+      issues_by_author
+      render :template => "reports/issue_report"
+    end
+  end  
+  
+  def delays
+    @trackers = Tracker.find(:all)
+    if request.get?
+      @selected_tracker_ids = @trackers.collect {|t| t.id.to_s }
+    else
+      @selected_tracker_ids = params[:tracker_ids].collect { |id| id.to_i.to_s } if params[:tracker_ids] and params[:tracker_ids].is_a? Array
+    end
+    @selected_tracker_ids ||= []    
+    @raw = 
+      ActiveRecord::Base.connection.select_all("SELECT datediff( a.created_on, b.created_on ) as delay, count(a.id) as total
+      FROM issue_histories a, issue_histories b, issues i
+      WHERE a.status_id =5
+      AND a.issue_id = b.issue_id
+      AND a.issue_id = i.id
+      AND i.tracker_id in (#{@selected_tracker_ids.join(',')})
+      AND b.id = (
+      SELECT min( c.id )
+      FROM issue_histories c
+      WHERE b.issue_id = c.issue_id ) 
+      GROUP BY delay") unless @selected_tracker_ids.empty?    
+    @raw ||=[]
+    
+    @x_from = 0
+    @x_to = 0
+    @y_from = 0
+    @y_to = 0
+    @sum_total = 0
+    @sum_delay = 0
+    @raw.each do |r|
+      @x_to = [r['delay'].to_i, @x_to].max
+      @y_to = [r['total'].to_i, @y_to].max
+      @sum_total = @sum_total + r['total'].to_i
+      @sum_delay = @sum_delay + r['total'].to_i * r['delay'].to_i
+    end    
+  end
+  
+private
+  # Find project of id params[:id]
+  def find_project
+    @project = Project.find(params[:id])               
+  rescue ActiveRecord::RecordNotFound
+    render_404
+  end
+
+  def issues_by_tracker
+    @issues_by_tracker ||= 
+        ActiveRecord::Base.connection.select_all("select    s.id as status_id, 
+                                                  s.is_closed as closed, 
+                                                  t.id as tracker_id,
+                                                  count(i.id) as total 
+                                                from 
+                                                  issues i, issue_statuses s, trackers t
+                                                where 
+                                                  i.status_id=s.id 
+                                                  and i.tracker_id=t.id
+                                                  and i.project_id=#{@project.id}
+                                                group by s.id, s.is_closed, t.id")     
+  end
+       
+  def issues_by_priority    
+    @issues_by_priority ||= 
+      ActiveRecord::Base.connection.select_all("select    s.id as status_id, 
+                                                  s.is_closed as closed, 
+                                                  p.id as priority_id,
+                                                  count(i.id) as total 
+                                                from 
+                                                  issues i, issue_statuses s, enumerations p
+                                                where 
+                                                  i.status_id=s.id 
+                                                  and i.priority_id=p.id
+                                                  and i.project_id=#{@project.id}
+                                                group by s.id, s.is_closed, p.id")     
+  end
+       
+  def issues_by_category   
+    @issues_by_category ||= 
+      ActiveRecord::Base.connection.select_all("select    s.id as status_id, 
+                                                  s.is_closed as closed, 
+                                                  c.id as category_id,
+                                                  count(i.id) as total 
+                                                from 
+                                                  issues i, issue_statuses s, issue_categories c
+                                                where 
+                                                  i.status_id=s.id 
+                                                  and i.category_id=c.id
+                                                  and i.project_id=#{@project.id}
+                                                group by s.id, s.is_closed, c.id")     
+  end
+       
+  def issues_by_author
+    @issues_by_author ||= 
+      ActiveRecord::Base.connection.select_all("select    s.id as status_id, 
+                                                  s.is_closed as closed, 
+                                                  a.id as author_id,
+                                                  count(i.id) as total 
+                                                from 
+                                                  issues i, issue_statuses s, users a
+                                                where 
+                                                  i.status_id=s.id 
+                                                  and i.author_id=a.id
+                                                  and i.project_id=#{@project.id}
+                                                group by s.id, s.is_closed, a.id")     
   end
 end