ticket_moved.rb 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. class Report::TicketMoved < Report::Base
  2. =begin
  3. result = Report::TicketMoved.aggs(
  4. range_start: Time.zone.parse('2015-01-01T00:00:00Z'),
  5. range_end: Time.zone.parse('2015-12-31T23:59:59Z'),
  6. interval: 'month', # quarter, month, week, day, hour, minute, second
  7. selector: selector, # ticket selector to get only a collection of tickets
  8. params: { type: 'in' }, # in|out
  9. timezone: 'Europe/Berlin',
  10. )
  11. returns
  12. [4,5,1,5,0,51,5,56,7,4]
  13. =end
  14. def self.aggs(params_origin)
  15. params = params_origin.dup
  16. selector = params[:selector]['ticket.group_id']
  17. if !selector
  18. return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  19. end
  20. result = []
  21. case params[:interval]
  22. when 'month'
  23. stop_interval = 12
  24. when 'week'
  25. stop_interval = 7
  26. when 'day'
  27. stop_interval = 31
  28. when 'hour'
  29. stop_interval = 24
  30. when 'minute'
  31. stop_interval = 60
  32. end
  33. (1..stop_interval).each do |_counter|
  34. case params[:interval]
  35. when 'month'
  36. params[:range_end] = params[:range_start].next_month
  37. when 'week'
  38. params[:range_end] = params[:range_start].next_day
  39. when 'day'
  40. params[:range_end] = params[:range_start].next_day
  41. when 'hour'
  42. params[:range_end] = params[:range_start] + 1.hour
  43. when 'minute'
  44. params[:range_end] = params[:range_start] + 1.minute
  45. end
  46. local_params = group_attributes(selector, params)
  47. local_selector = params[:selector].clone
  48. without_merged_tickets = {
  49. 'ticket_state.name' => {
  50. 'operator' => 'is not',
  51. 'value' => 'merged'
  52. }
  53. }
  54. local_selector.merge!(without_merged_tickets) # do not show merged tickets in reports
  55. if params[:params][:type] == 'out'
  56. local_selector.delete('ticket.group_id')
  57. end
  58. defaults = {
  59. object: 'Ticket',
  60. type: 'updated',
  61. attribute: 'group',
  62. start: params[:range_start],
  63. end: params[:range_end],
  64. selector: local_selector
  65. }
  66. local_params = defaults.merge(local_params)
  67. count = history_count(local_params)
  68. result.push count
  69. params[:range_start] = params[:range_end]
  70. end
  71. result
  72. end
  73. =begin
  74. result = Report::TicketMoved.items(
  75. range_start: Time.zone.parse('2015-01-01T00:00:00Z'),
  76. range_end: Time.zone.parse('2015-12-31T23:59:59Z'),
  77. selector: selector, # ticket selector to get only a collection of tickets
  78. params: { type: 'in' }, # in|out
  79. )
  80. returns
  81. {
  82. count: 123,
  83. ticket_ids: [4,5,1,5,0,51,5,56,7,4],
  84. assets: assets,
  85. }
  86. =end
  87. def self.items(params)
  88. selector = params[:selector]['ticket.group_id']
  89. if !selector
  90. return {
  91. count: 0,
  92. ticket_ids: [],
  93. }
  94. end
  95. local_params = group_attributes(selector, params)
  96. without_merged_tickets = {
  97. 'ticket_state.name' => {
  98. 'operator' => 'is not',
  99. 'value' => 'merged'
  100. }
  101. }
  102. local_selector = params[:selector].merge!(without_merged_tickets) # do not show merged tickets in reports
  103. if params[:params][:type] == 'out'
  104. local_selector.delete('ticket.group_id')
  105. end
  106. defaults = {
  107. object: 'Ticket',
  108. type: 'updated',
  109. attribute: 'group',
  110. start: params[:range_start],
  111. end: params[:range_end],
  112. selector: local_selector
  113. }
  114. local_params = defaults.merge(local_params)
  115. result = history(local_params)
  116. return result if params[:sheet].present?
  117. assets = {}
  118. result[:ticket_ids].each do |ticket_id|
  119. ticket_full = Ticket.find(ticket_id)
  120. assets = ticket_full.assets(assets)
  121. end
  122. result[:assets] = assets
  123. result
  124. end
  125. def self.group_attributes(selector, params)
  126. group_id = selector['value']
  127. case selector['operator']
  128. when 'is'
  129. if params[:params][:type] == 'in'
  130. return {
  131. id_not_from: group_id,
  132. id_to: group_id,
  133. }
  134. else
  135. return {
  136. id_from: group_id,
  137. id_not_to: group_id,
  138. }
  139. end
  140. when 'is not'
  141. if params[:params][:type] == 'in'
  142. return {
  143. id_from: group_id,
  144. id_not_to: group_id,
  145. }
  146. else
  147. return {
  148. id_not_from: group_id,
  149. id_to: group_id,
  150. }
  151. end
  152. end
  153. raise "Unknown selector params '#{selector.inspect}'"
  154. end
  155. end