screen_options.rb 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. module Ticket::ScreenOptions
  3. =begin
  4. list attributes
  5. result = Ticket::ScreenOptions.attributes_to_change(
  6. ticket_id: 123,
  7. ticket: ticket_model,
  8. current_user: User.find(123),
  9. )
  10. or only with user
  11. result = Ticket::ScreenOptions.attributes_to_change(
  12. current_user: User.find(123),
  13. )
  14. returns
  15. result = {
  16. :form_meta => {
  17. :filter => {
  18. :state_id => [1, 2, 4, 7, 3],
  19. :priority_id => [2, 1, 3],
  20. :type_id => [10, 5],
  21. :group_id => [12]
  22. },
  23. },
  24. :dependencies => {
  25. :group_id => {
  26. "" => {
  27. : owner_id => []
  28. },
  29. 12 => {
  30. : owner_id => [4, 5, 6, 7]
  31. }
  32. }
  33. }
  34. =end
  35. def self.attributes_to_change(params)
  36. raise 'current_user param needed' if !params[:current_user]
  37. if params[:ticket].blank? && params[:ticket_id].present?
  38. params[:ticket] = Ticket.find(params[:ticket_id])
  39. end
  40. filter = {}
  41. assets = {}
  42. # get ticket states
  43. state_ids = []
  44. if params[:ticket].present?
  45. state_type = params[:ticket].state.state_type
  46. end
  47. state_types = ['open', 'closed', 'pending action', 'pending reminder']
  48. if state_type && !state_types.include?(state_type.name)
  49. state_ids.push params[:ticket].state_id
  50. end
  51. state_types.each do |type|
  52. state_type = Ticket::StateType.find_by(name: type)
  53. next if !state_type
  54. state_type.states.each do |state|
  55. assets = state.assets(assets)
  56. state_ids.push state.id
  57. end
  58. end
  59. filter[:state_id] = state_ids
  60. # get priorities
  61. priority_ids = []
  62. Ticket::Priority.where(active: true).each do |priority|
  63. assets = priority.assets(assets)
  64. priority_ids.push priority.id
  65. end
  66. filter[:priority_id] = priority_ids
  67. type_ids = []
  68. if params[:ticket]
  69. types = %w[note phone]
  70. if params[:ticket].group.email_address_id
  71. types.push 'email'
  72. end
  73. types.each do |type_name|
  74. type = Ticket::Article::Type.lookup(name: type_name)
  75. next if type.blank?
  76. type_ids.push type.id
  77. end
  78. end
  79. filter[:type_id] = type_ids
  80. # get group / user relations
  81. dependencies = { group_id: { '' => { owner_id: [] } } }
  82. filter[:group_id] = []
  83. groups = if params[:current_user].permissions?('ticket.agent')
  84. params[:current_user].groups_access(%w[create change])
  85. else
  86. Group.where(active: true)
  87. end
  88. agents = {}
  89. agent_role_ids = Role.with_permissions('ticket.agent').pluck(:id)
  90. agent_user_ids = User.joins(:roles).where(users: { active: true }).where('roles_users.role_id IN (?)', agent_role_ids).pluck(:id)
  91. groups.each do |group|
  92. filter[:group_id].push group.id
  93. assets = group.assets(assets)
  94. dependencies[:group_id][group.id] = { owner_id: [] }
  95. group_agent_user_ids = User.joins(', groups_users').where("users.id = groups_users.user_id AND groups_users.access = 'full' AND groups_users.group_id = ? AND users.id IN (?)", group.id, agent_user_ids).pluck(:id)
  96. group_agent_roles_ids = Role.joins(', roles_groups').where("roles.id = roles_groups.role_id AND roles_groups.access = 'full' AND roles_groups.group_id = ? AND roles.id IN (?)", group.id, agent_role_ids).pluck(:id)
  97. group_agent_role_user_ids = User.joins(:roles).where(roles: { id: group_agent_roles_ids }).pluck(:id)
  98. User.where(id: group_agent_user_ids.concat(group_agent_role_user_ids).uniq, active: true).each do |user|
  99. dependencies[:group_id][group.id][:owner_id].push user.id
  100. next if agents[user.id]
  101. agents[user.id] = true
  102. assets = user.assets(assets)
  103. end
  104. end
  105. =begin
  106. # for performance reasons we moved from api calls to optimized sql queries
  107. groups.each do |group|
  108. filter[:group_id].push group.id
  109. assets = group.assets(assets)
  110. dependencies[:group_id][group.id] = { owner_id: [] }
  111. User.group_access(group.id, 'full').each do |user|
  112. dependencies[:group_id][ group.id ][:owner_id].push user.id
  113. next if agents[user.id]
  114. agents[user.id] = true
  115. assets = user.assets(assets)
  116. end
  117. end
  118. =end
  119. {
  120. assets: assets,
  121. form_meta: {
  122. filter: filter,
  123. dependencies: dependencies,
  124. }
  125. }
  126. end
  127. =begin
  128. list tickets by customer groupd in state categroie open and closed
  129. result = Ticket::ScreenOptions.list_by_customer(
  130. customer_id: 123,
  131. limit: 15, # optional, default 15
  132. )
  133. returns
  134. result = {
  135. ticket_ids_open: tickets_open,
  136. ticket_ids_closed: tickets_closed,
  137. assets: { ...list of assets... },
  138. }
  139. =end
  140. def self.list_by_customer(data)
  141. # get closed/open states
  142. state_list_open = Ticket::State.by_category(:open)
  143. state_list_closed = Ticket::State.by_category(:closed)
  144. # get tickets
  145. tickets_open = Ticket.where(
  146. customer_id: data[:customer_id],
  147. state_id: state_list_open
  148. ).limit( data[:limit] || 15 ).order('created_at DESC')
  149. assets = {}
  150. ticket_ids_open = []
  151. tickets_open.each do |ticket|
  152. ticket_ids_open.push ticket.id
  153. assets = ticket.assets(assets)
  154. end
  155. tickets_closed = Ticket.where(
  156. customer_id: data[:customer_id],
  157. state_id: state_list_closed
  158. ).limit( data[:limit] || 15 ).order('created_at DESC')
  159. ticket_ids_closed = []
  160. tickets_closed.each do |ticket|
  161. ticket_ids_closed.push ticket.id
  162. assets = ticket.assets(assets)
  163. end
  164. {
  165. ticket_ids_open: ticket_ids_open,
  166. ticket_ids_closed: ticket_ids_closed,
  167. assets: assets,
  168. }
  169. end
  170. end