ticket_reopened.rb 3.4 KB

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