ticket_moved.rb 4.5 KB

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