ticket_reopened.rb 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. class Report::TicketReopened < Report::Base
  2. =begin
  3. result = Report::TicketReopened.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. timezone: 'Europe/Berlin',
  9. )
  10. returns
  11. [4,5,1,5,0,51,5,56,7,4]
  12. =end
  13. def self.aggs(params_origin)
  14. params = params_origin.dup
  15. ticket_state_ids = ticket_ids
  16. interval = params[:interval]
  17. if params[:interval] == 'week'
  18. interval = 'day'
  19. end
  20. result = []
  21. if params[:interval] == 'month'
  22. stop_interval = 12
  23. elsif params[:interval] == 'week'
  24. stop_interval = 7
  25. elsif params[:interval] == 'day'
  26. stop_interval = 31
  27. elsif params[:interval] == 'hour'
  28. stop_interval = 24
  29. elsif params[:interval] == 'minute'
  30. stop_interval = 60
  31. end
  32. (1..stop_interval).each do |_counter|
  33. if params[:interval] == 'month'
  34. params[:range_end] = params[:range_start].next_month
  35. elsif params[:interval] == 'week'
  36. params[:range_end] = params[:range_start].next_day
  37. elsif params[:interval] == 'day'
  38. params[:range_end] = params[:range_start].next_day
  39. elsif params[:interval] == 'hour'
  40. params[:range_end] = params[:range_start] + 1.hour
  41. elsif params[:interval] == 'minute'
  42. params[:range_end] = params[:range_start] + 1.minute
  43. end
  44. without_merged_tickets = {
  45. 'ticket_state.name' => {
  46. 'operator' => 'is not',
  47. 'value' => 'merged'
  48. }
  49. }
  50. params[:selector].merge!(without_merged_tickets) # do not show merged tickets in reports
  51. count = history_count(
  52. object: 'Ticket',
  53. type: 'updated',
  54. attribute: 'state',
  55. id_from: ticket_state_ids,
  56. id_not_to: ticket_state_ids,
  57. start: params[:range_start],
  58. end: params[:range_end],
  59. selector: params[:selector]
  60. )
  61. result.push count
  62. params[:range_start] = params[:range_end]
  63. end
  64. result
  65. end
  66. =begin
  67. result = Report::TicketReopened.items(
  68. range_start: Time.zone.parse('2015-01-01T00:00:00Z'),
  69. range_end: Time.zone.parse('2015-12-31T23:59:59Z'),
  70. selector: selector, # ticket selector to get only a collection of tickets
  71. timezone: 'Europe/Berlin',
  72. )
  73. returns
  74. {
  75. count: 123,
  76. ticket_ids: [4,5,1,5,0,51,5,56,7,4],
  77. assets: assets,
  78. }
  79. =end
  80. def self.items(params)
  81. ticket_state_ids = ticket_ids
  82. result = history(
  83. object: 'Ticket',
  84. type: 'updated',
  85. attribute: 'state',
  86. id_from: ticket_state_ids,
  87. id_not_to: ticket_state_ids,
  88. start: params[:range_start],
  89. end: params[:range_end],
  90. selector: params[:selector]
  91. )
  92. return result if params[:sheet].present?
  93. assets = {}
  94. result[:ticket_ids].each do |ticket_id|
  95. ticket_full = Ticket.find(ticket_id)
  96. assets = ticket_full.assets(assets)
  97. end
  98. result[:assets] = assets
  99. result
  100. end
  101. def self.ticket_ids
  102. key = 'Report::TicketReopened::StateList'
  103. ticket_state_ids = Cache.get(key)
  104. return ticket_state_ids if ticket_state_ids
  105. ticket_state_types = Ticket::StateType.where(name: %w[closed merged removed])
  106. ticket_state_ids = []
  107. ticket_state_types.each do |ticket_state_type|
  108. ticket_state_type.states.each do |ticket_state|
  109. ticket_state_ids.push ticket_state.id
  110. end
  111. end
  112. Cache.write(key, ticket_state_ids, { expires_in: 2.days })
  113. ticket_state_ids
  114. end
  115. end