screen_options.rb 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
  2. module Ticket::ScreenOptions
  3. =begin
  4. list of active agents
  5. result = Ticket::ScreenOptions.agents()
  6. returns
  7. result = [user1, user2]
  8. =end
  9. def self.agents
  10. User.where( :active => true ).joins(:roles).where( 'roles.name' => 'Agent', 'roles.active' => true ).uniq()
  11. end
  12. =begin
  13. list attributes
  14. result = Ticket::ScreenOptions.attributes_to_change(
  15. :ticket_id => 123,
  16. :article_id => 123,
  17. :ticket => ticket_model,
  18. )
  19. returns
  20. result = {
  21. :ticket_article_type_id => ticket_article_type_ids,
  22. :ticket_state_id => ticket_state_ids,
  23. :ticket_priority_id => ticket_priority_ids,
  24. :owner_id => owner_ids,
  25. :group_id => group_ids,
  26. :group_id__owner_id => groups_users,
  27. }
  28. =end
  29. def self.attributes_to_change(params)
  30. if params[:ticket_id]
  31. params[:ticket] = self.find( params[:ticket_id] )
  32. end
  33. if params[:article_id]
  34. params[:article] = self.find( params[:article_id] )
  35. end
  36. # get ticket states
  37. ticket_state_ids = []
  38. if params[:ticket]
  39. ticket_state_type = params[:ticket].ticket_state.state_type
  40. end
  41. ticket_state_types = ['open', 'closed', 'pending action', 'pending reminder']
  42. if ticket_state_type && !ticket_state_types.include?(ticket_state_type.name)
  43. ticket_state_ids.push params[:ticket].ticket_state.id
  44. end
  45. ticket_state_types.each {|type|
  46. ticket_state_type = Ticket::StateType.where( :name => type ).first
  47. if ticket_state_type
  48. ticket_state_type.states.each {|ticket_state|
  49. ticket_state_ids.push ticket_state.id
  50. }
  51. end
  52. }
  53. # get owner
  54. owner_ids = []
  55. if params[:ticket]
  56. params[:ticket].agent_of_group.each { |user|
  57. owner_ids.push user.id
  58. }
  59. end
  60. # get group
  61. group_ids = []
  62. Group.where( :active => true ).each { |group|
  63. group_ids.push group.id
  64. }
  65. # get group / user relations
  66. agents = {}
  67. Ticket::ScreenOptions.agents.each { |user|
  68. agents[ user.id ] = 1
  69. }
  70. groups_users = {}
  71. group_ids.each {|group_id|
  72. groups_users[ group_id ] = []
  73. Group.find( group_id ).users.each {|user|
  74. next if !agents[ user.id ]
  75. groups_users[ group_id ].push user.id
  76. }
  77. }
  78. # get priorities
  79. ticket_priority_ids = []
  80. Ticket::Priority.where( :active => true ).each { |priority|
  81. ticket_priority_ids.push priority.id
  82. }
  83. ticket_article_type_ids = []
  84. if params[:ticket]
  85. ticket_article_types = ['note', 'phone']
  86. if params[:ticket].group.email_address_id
  87. ticket_article_types.push 'email'
  88. end
  89. ticket_article_types.each {|ticket_article_type_name|
  90. ticket_article_type = Ticket::Article::Type.lookup( :name => ticket_article_type_name )
  91. if ticket_article_type
  92. ticket_article_type_ids.push ticket_article_type.id
  93. end
  94. }
  95. end
  96. return {
  97. :ticket_article_type_id => ticket_article_type_ids,
  98. :ticket_state_id => ticket_state_ids,
  99. :ticket_priority_id => ticket_priority_ids,
  100. :owner_id => owner_ids,
  101. :group_id => group_ids,
  102. :group_id__owner_id => groups_users,
  103. }
  104. end
  105. =begin
  106. list tickets by customer groupd in state categroie open and closed
  107. result = Ticket::ScreenOptions.list_by_customer(
  108. :customer_id => 123,
  109. :limit => 15, # optional, default 15
  110. )
  111. returns
  112. result = {
  113. :open => tickets_open,
  114. :closed => tickets_closed,
  115. }
  116. =end
  117. def self.list_by_customer(data)
  118. # get closed/open states
  119. ticket_state_list_open = Ticket::State.by_category( 'open' )
  120. ticket_state_list_closed = Ticket::State.by_category( 'closed' )
  121. # get tickets
  122. tickets_open = Ticket.where(
  123. :customer_id => data[:customer_id],
  124. :ticket_state_id => ticket_state_list_open
  125. ).limit( data[:limit] || 15 ).order('created_at DESC')
  126. tickets_closed = Ticket.where(
  127. :customer_id => data[:customer_id],
  128. :ticket_state_id => ticket_state_list_closed
  129. ).limit( data[:limit] || 15 ).order('created_at DESC')
  130. return {
  131. :open => tickets_open,
  132. :closed => tickets_closed,
  133. }
  134. end
  135. end