article_by_type_sender.rb 2.8 KB

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