ticket_first_solution.rb 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. class Report::TicketFirstSolution < Report::BaseSql
  3. =begin
  4. result = Report::TicketFirstSolution.aggs(
  5. range_start: Time.zone.parse('2015-01-01T00:00:00Z'),
  6. range_end: Time.zone.parse('2015-12-31T23:59:59Z'),
  7. interval: 'month', # quarter, month, week, day, hour, minute, second
  8. selector: selector, # ticket selector to get only a collection of tickets
  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.deep_dup
  15. result = []
  16. case params[:interval]
  17. when 'month'
  18. stop_interval = 12
  19. when 'week'
  20. stop_interval = 7
  21. when 'day'
  22. stop_interval = 31
  23. when 'hour'
  24. stop_interval = 24
  25. when 'minute'
  26. stop_interval = 60
  27. end
  28. (1..stop_interval).each do |_counter|
  29. case params[:interval]
  30. when 'month'
  31. params[:range_end] = params[:range_start].next_month
  32. when 'week', 'day'
  33. params[:range_end] = params[:range_start].next_day
  34. when 'hour'
  35. params[:range_end] = params[:range_start] + 1.hour
  36. when 'minute'
  37. params[:range_end] = params[:range_start] + 1.minute
  38. end
  39. local_selector = params[:selector].clone
  40. local_selector.merge!(without_merged_tickets_selector) # do not show merged tickets in reports
  41. query, bind_params, tables = Ticket.selector2sql(local_selector)
  42. ticket_list = Ticket.select('tickets.id, tickets.close_at, tickets.created_at').where(
  43. 'tickets.close_at IS NOT NULL AND tickets.close_at >= ? AND tickets.close_at < ?',
  44. params[:range_start],
  45. params[:range_end],
  46. ).where(query, *bind_params).joins(tables)
  47. count = 0
  48. ticket_list.each do |ticket|
  49. closed_at = ticket.close_at
  50. created_at = ticket.created_at
  51. if (closed_at - (60 * 15)) < created_at
  52. count += 1
  53. end
  54. end
  55. result.push count
  56. params[:range_start] = params[:range_end]
  57. end
  58. result
  59. end
  60. =begin
  61. result = Report::TicketFirstSolution.items(
  62. range_start: Time.zone.parse('2015-01-01T00:00:00Z'),
  63. range_end: Time.zone.parse('2015-12-31T23:59:59Z'),
  64. selector: selector, # ticket selector to get only a collection of tickets
  65. timezone: 'Europe/Berlin',
  66. )
  67. returns
  68. {
  69. count: 123,
  70. ticket_ids: [4,5,1,5,0,51,5,56,7,4],
  71. assets: assets,
  72. }
  73. =end
  74. def self.items(params)
  75. local_selector = params[:selector].clone
  76. local_selector.merge!(without_merged_tickets_selector) # do not show merged tickets in reports
  77. query, bind_params, tables = Ticket.selector2sql(local_selector)
  78. ticket_list = Ticket.select('tickets.id, tickets.close_at, tickets.created_at').where(
  79. 'tickets.close_at IS NOT NULL AND tickets.close_at >= ? AND tickets.close_at < ?',
  80. params[:range_start],
  81. params[:range_end],
  82. ).where(query, *bind_params).joins(tables).reorder(close_at: :asc)
  83. count = 0
  84. assets = {}
  85. ticket_ids = []
  86. ticket_list.each do |ticket|
  87. closed_at = ticket.close_at
  88. created_at = ticket.created_at
  89. if (closed_at - (60 * 15)) < created_at
  90. count += 1
  91. ticket_ids.push ticket.id
  92. end
  93. ticket_full = Ticket.find(ticket.id)
  94. assets = ticket_full.assets(assets)
  95. end
  96. {
  97. count: count,
  98. ticket_ids: ticket_ids,
  99. assets: assets,
  100. }
  101. end
  102. end