overviews.rb 6.7 KB

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