overviews.rb 6.9 KB

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