article_by_type_sender.rb 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. class Report::ArticleByTypeSender < Report::Base
  2. =begin
  3. result = Report::ArticleByTypeSender.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. params: {
  9. type: 'phone',
  10. sender: 'Customer',
  11. }
  12. )
  13. returns
  14. [4,5,1,5,0,51,5,56,7,4]
  15. =end
  16. def self.aggs(params_origin)
  17. params = params_origin.dup
  18. result = []
  19. case params[:interval]
  20. when 'month'
  21. stop_interval = 12
  22. when 'week'
  23. stop_interval = 7
  24. when 'day'
  25. stop_interval = 31
  26. when 'hour'
  27. stop_interval = 24
  28. when 'minute'
  29. stop_interval = 60
  30. end
  31. query, bind_params, tables = Ticket.selector2sql(params[:selector])
  32. sender = Ticket::Article::Sender.lookup(name: params[:params][:sender])
  33. type = Ticket::Article::Type.lookup(name: params[:params][:type])
  34. (1..stop_interval).each do |_counter|
  35. case params[:interval]
  36. when 'month'
  37. params[:range_end] = params[:range_start].next_month
  38. when 'week'
  39. params[:range_end] = params[:range_start].next_day
  40. when 'day'
  41. params[:range_end] = params[:range_start].next_day
  42. when 'hour'
  43. params[:range_end] = params[:range_start] + 1.hour
  44. when 'minute'
  45. params[:range_end] = params[:range_start] + 1.minute
  46. end
  47. count = Ticket::Article.joins('INNER JOIN tickets ON tickets.id = ticket_articles.ticket_id')
  48. .where(query, *bind_params).joins(tables)
  49. .where(
  50. 'ticket_articles.created_at >= ? AND ticket_articles.created_at <= ? AND ticket_articles.type_id = ? AND ticket_articles.sender_id = ?',
  51. params[:range_start],
  52. params[:range_end],
  53. type.id,
  54. sender.id,
  55. ).count
  56. result.push count
  57. params[:range_start] = params[:range_end]
  58. end
  59. result
  60. end
  61. =begin
  62. result = Report::ArticleByTypeSender.items(
  63. range_start: Time.zone.parse('2015-01-01T00:00:00Z'),
  64. range_end: Time.zone.parse('2015-12-31T23:59:59Z'),
  65. selector: selector, # ticket selector to get only a collection of tickets
  66. selector: selector, # ticket selector to get only a collection of tickets
  67. params: {
  68. type: 'phone',
  69. sender: 'Customer',
  70. }
  71. )
  72. returns
  73. {}
  74. =end
  75. def self.items(_params)
  76. {}
  77. end
  78. end