ticket_reopened.rb 3.4 KB

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