overviews.rb 6.6 KB

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