overviews.rb 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. # Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
  2. module Ticket::Overviews
  3. =begin
  4. all overview by user
  5. result = Ticket::Overviews.all(
  6. :current_user => User.find(123),
  7. )
  8. returns
  9. result = [overview1, overview2]
  10. =end
  11. def self.all (data)
  12. # get customer overviews
  13. if data[:current_user].is_role('Customer')
  14. role = data[:current_user].is_role( 'Customer' )
  15. if data[:current_user].organization_id && data[:current_user].organization.shared
  16. overviews = Overview.where( :role_id => role.id, :active => true )
  17. else
  18. overviews = Overview.where( :role_id => role.id, :organization_shared => false, :active => true )
  19. end
  20. return overviews
  21. end
  22. # get agent overviews
  23. role = data[:current_user].is_role( 'Agent' )
  24. Overview.where( :role_id => role.id, :active => true )
  25. end
  26. =begin
  27. selected overview by user
  28. result = Ticket::Overviews.list(
  29. :current_user => User.find(123),
  30. :view => 'some_view_url',
  31. )
  32. returns
  33. result = {
  34. :tickets => tickets, # [ticket1, ticket2, ticket3]
  35. :tickets_count => tickets_count, # count of tickets
  36. :overview => overview_selected_raw, # overview attributes
  37. }
  38. =end
  39. def self.list (data)
  40. overviews = self.all(data)
  41. # build up attributes hash
  42. overview_selected = nil
  43. overview_selected_raw = nil
  44. overviews.each { |overview|
  45. # remember selected view
  46. if data[:view] && data[:view] == overview.link
  47. overview_selected = overview
  48. overview_selected_raw = Marshal.load( Marshal.dump(overview.attributes) )
  49. end
  50. # replace e.g. 'current_user.id' with current_user.id
  51. overview.condition.each { |item, value |
  52. if value && value.class.to_s == 'String'
  53. parts = value.split( '.', 2 )
  54. if parts[0] && parts[1] && parts[0] == 'current_user'
  55. overview.condition[item] = data[:current_user][parts[1].to_sym]
  56. end
  57. end
  58. }
  59. }
  60. if data[:view] && !overview_selected
  61. raise "No such view '#{ data[:view] }'"
  62. end
  63. # sortby
  64. # prio
  65. # state
  66. # group
  67. # customer
  68. # order
  69. # asc
  70. # desc
  71. # groupby
  72. # prio
  73. # state
  74. # group
  75. # customer
  76. # all = attributes[:myopenassigned]
  77. # all.merge( { :group_id => groups } )
  78. # @tickets = Ticket.where(:group_id => groups, attributes[:myopenassigned] ).limit(params[:limit])
  79. # get only tickets with permissions
  80. if data[:current_user].is_role('Customer')
  81. group_ids = Group.select( 'groups.id' ).
  82. where( 'groups.active = ?', true ).
  83. map( &:id )
  84. else
  85. group_ids = Group.select( 'groups.id' ).joins(:users).
  86. where( 'groups_users.user_id = ?', [ data[:current_user].id ] ).
  87. where( 'groups.active = ?', true ).
  88. map( &:id )
  89. end
  90. # overview meta for navbar
  91. if !overview_selected
  92. # loop each overview
  93. result = []
  94. overviews.each { |overview|
  95. # get count
  96. count = Ticket.where( :group_id => group_ids ).where( _condition( overview.condition ) ).count()
  97. # get meta info
  98. all = {
  99. :name => overview.name,
  100. :prio => overview.prio,
  101. :link => overview.link,
  102. }
  103. # push to result data
  104. result.push all.merge( { :count => count } )
  105. }
  106. return result
  107. end
  108. # get result list
  109. if data[:array]
  110. order_by = overview_selected[:order][:by].to_s + ' ' + overview_selected[:order][:direction].to_s
  111. if overview_selected.group_by && !overview_selected.group_by.empty?
  112. order_by = overview_selected.group_by + '_id, ' + order_by
  113. end
  114. tickets = Ticket.select( 'id' ).
  115. where( :group_id => group_ids ).
  116. where( _condition( overview_selected.condition ) ).
  117. order( order_by ).
  118. limit( 500 )
  119. ticket_ids = []
  120. tickets.each { |ticket|
  121. ticket_ids.push ticket.id
  122. }
  123. tickets_count = Ticket.where( :group_id => group_ids ).
  124. where( _condition( overview_selected.condition ) ).
  125. count()
  126. return {
  127. :ticket_ids => ticket_ids,
  128. :tickets_count => tickets_count,
  129. :overview => overview_selected_raw,
  130. }
  131. end
  132. # get tickets for overview
  133. data[:start_page] ||= 1
  134. tickets = Ticket.where( :group_id => group_ids ).
  135. where( _condition( overview_selected.condition ) ).
  136. order( overview_selected[:order][:by].to_s + ' ' + overview_selected[:order][:direction].to_s )#.
  137. # limit( overview_selected.view[ data[:view_mode].to_sym ][:per_page] ).
  138. # offset( overview_selected.view[ data[:view_mode].to_sym ][:per_page].to_i * ( data[:start_page].to_i - 1 ) )
  139. tickets_count = Ticket.where( :group_id => group_ids ).
  140. where( _condition( overview_selected.condition ) ).
  141. count()
  142. return {
  143. :tickets => tickets,
  144. :tickets_count => tickets_count,
  145. :overview => overview_selected_raw,
  146. }
  147. end
  148. private
  149. def self._condition(condition)
  150. sql = ''
  151. bind = [nil]
  152. condition.each {|key, value|
  153. if sql != ''
  154. sql += ' AND '
  155. end
  156. if value.class == Array
  157. sql += " #{key} IN (?)"
  158. bind.push value
  159. elsif value.class == Hash || value.class == ActiveSupport::HashWithIndifferentAccess
  160. time = Time.now
  161. if value['area'] == 'minute'
  162. if value['direction'] == 'last'
  163. time -= value['count'].to_i * 60
  164. else
  165. time += value['count'].to_i * 60
  166. end
  167. elsif value['area'] == 'hour'
  168. if value['direction'] == 'last'
  169. time -= value['count'].to_i * 60 * 60
  170. else
  171. time += value['count'].to_i * 60 * 60
  172. end
  173. elsif value['area'] == 'day'
  174. if value['direction'] == 'last'
  175. time -= value['count'].to_i * 60 * 60 * 24
  176. else
  177. time += value['count'].to_i * 60 * 60 * 24
  178. end
  179. elsif value['area'] == 'month'
  180. if value['direction'] == 'last'
  181. time -= value['count'].to_i * 60 * 60 * 24 * 31
  182. else
  183. time += value['count'].to_i * 60 * 60 * 24 * 31
  184. end
  185. elsif value['area'] == 'year'
  186. if value['direction'] == 'last'
  187. time -= value['count'].to_i * 60 * 60 * 24 * 365
  188. else
  189. time += value['count'].to_i * 60 * 60 * 24 * 365
  190. end
  191. end
  192. if value['direction'] == 'last'
  193. sql += " #{key} > ?"
  194. bind.push time
  195. else
  196. sql += " #{key} < ?"
  197. bind.push time
  198. end
  199. else
  200. sql += " #{key} = ?"
  201. bind.push value
  202. end
  203. }
  204. bind[0] = sql
  205. return bind
  206. end
  207. end