Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

124 wiersze
5.9KB

  1. <%
  2. '=======================================================================================================================
  3. ' STATS REPOSITORY
  4. ' Read-only counts for the dashboard.
  5. '=======================================================================================================================
  6. Class StatsRepository_Class
  7. ' Dictionary of counts about the list itself
  8. Public Function ListCounts()
  9. Dim rs, d
  10. Set d = CreateObject("Scripting.Dictionary")
  11. Set rs = Db_Query( _
  12. "SELECT COUNT(*) AS total, " & _
  13. "Sum(IIf(status = 'removed', 1, 0)) AS removed, " & _
  14. "Sum(IIf(status <> 'removed' AND (is_customer = 0 OR is_customer IS NULL), 1, 0)) AS prospects, " & _
  15. "Sum(IIf(status <> 'removed' AND is_customer = 1, 1, 0)) AS customers, " & _
  16. "Sum(IIf(status <> 'removed' AND (is_customer = 0 OR is_customer IS NULL) AND last_contacted_at IS NULL, 1, 0)) AS never_contacted, " & _
  17. "Sum(IIf(status = 'new', 1, 0)) AS st_new, " & _
  18. "Sum(IIf(status = 'contacted', 1, 0)) AS st_contacted, " & _
  19. "Sum(IIf(status = 'follow_up', 1, 0)) AS st_follow_up, " & _
  20. "Sum(IIf(status <> 'removed' AND next_action_date < Date(), 1, 0)) AS overdue, " & _
  21. "Sum(IIf(status <> 'removed' AND next_action_date = Date(), 1, 0)) AS due_today, " & _
  22. "Sum(IIf(status <> 'removed' AND next_action_date > Date() AND next_action_date <= DateAdd('d', 7, Date()), 1, 0)) AS this_week, " & _
  23. "Sum(IIf(status <> 'removed' AND phone_digits IS NULL, 1, 0)) AS no_phone " & _
  24. "FROM businesses", Array())
  25. Dim i
  26. For i = 0 To rs.Fields.Count - 1
  27. d(rs.Fields(i).Name) = N(rs.Fields(i).Value)
  28. Next
  29. rs.Close
  30. d("active") = d("total") - d("removed")
  31. Set ListCounts = d
  32. End Function
  33. ' Counts of logged contacts: today, last 7 days (including today), last 30 days
  34. Public Function ActivityCounts()
  35. Dim rs, d
  36. Set d = CreateObject("Scripting.Dictionary")
  37. Set rs = Db_Query( _
  38. "SELECT Sum(IIf(contacted_at = Date(), 1, 0)) AS n_today, " & _
  39. "Sum(IIf(contacted_at >= DateAdd('d', -6, Date()), 1, 0)) AS n_week, " & _
  40. "Sum(IIf(contacted_at >= DateAdd('d', -29, Date()), 1, 0)) AS n_month, " & _
  41. "COUNT(*) AS everything FROM interactions", Array())
  42. d("today") = N(rs("n_today")) : d("week") = N(rs("n_week")) : d("month") = N(rs("n_month")) : d("all") = N(rs("everything"))
  43. rs.Close
  44. Set ActivityCounts = d
  45. End Function
  46. ' Contacts per day for the last `days` days, oldest first: list of Array(date, count) including zero days
  47. Public Function DailyActivity(days)
  48. Dim rs, counts, list, i, dt, key
  49. Set counts = CreateObject("Scripting.Dictionary")
  50. Set rs = Db_Query("SELECT contacted_at, COUNT(*) FROM interactions WHERE contacted_at >= DateAdd('d', " & CLng(1 - days) & ", Date()) GROUP BY contacted_at", Array())
  51. Do While Not rs.EOF
  52. If Not IsNull(rs(0)) Then counts(CStr(CLng(CDate(rs(0))))) = CLng(rs(1))
  53. rs.MoveNext
  54. Loop
  55. rs.Close
  56. Set list = CreateObject("Scripting.Dictionary")
  57. For i = days - 1 To 0 Step -1
  58. dt = Date - i
  59. key = CStr(CLng(dt))
  60. If counts.Exists(key) Then list.Add list.Count, Array(dt, counts(key)) Else list.Add list.Count, Array(dt, 0)
  61. Next
  62. Set DailyActivity = list
  63. End Function
  64. ' Last 30 days grouped by a column ("method" or "outcome"): list of Array(key, count), biggest first
  65. Public Function ActivityBy(column)
  66. Dim rs, list
  67. If column <> "method" And column <> "outcome" Then Err.Raise 5, "StatsRepository.ActivityBy", "Unsupported column"
  68. Set list = CreateObject("Scripting.Dictionary")
  69. Set rs = Db_Query("SELECT " & column & ", COUNT(*) AS n FROM interactions WHERE contacted_at >= DateAdd('d', -29, Date()) GROUP BY " & column & " ORDER BY COUNT(*) DESC", Array())
  70. Do While Not rs.EOF
  71. list.Add list.Count, Array(rs(0) & "", CLng(rs(1)))
  72. rs.MoveNext
  73. Loop
  74. rs.Close
  75. Set ActivityBy = list
  76. End Function
  77. ' Biggest industries (active businesses only) with how many have been contacted at least once
  78. Public Function TopIndustries(maxRows)
  79. Dim rs, list
  80. Set list = CreateObject("Scripting.Dictionary")
  81. Set rs = Db_Query( _
  82. "SELECT TOP " & CLng(maxRows) & " i.id, i.name, COUNT(b.id) AS n, Sum(IIf(b.last_contacted_at IS NULL, 0, 1)) AS contacted " & _
  83. "FROM industries i INNER JOIN businesses b ON b.industry_id = i.id WHERE b.status <> 'removed' " & _
  84. "GROUP BY i.id, i.name ORDER BY COUNT(b.id) DESC, i.name", Array())
  85. Do While Not rs.EOF
  86. list.Add list.Count, Array(CLng(rs(0)), rs(1) & "", CLng(rs(2)), N(rs(3)))
  87. rs.MoveNext
  88. Loop
  89. rs.Close
  90. Set TopIndustries = list
  91. End Function
  92. Public Function RecentImports(maxRows)
  93. Dim rs, list
  94. Set list = CreateObject("Scripting.Dictionary")
  95. Set rs = Db_Query("SELECT TOP " & CLng(maxRows) & " id, file_name, imported_at, rows_read, rows_added FROM import_batches ORDER BY id DESC", Array())
  96. Do While Not rs.EOF
  97. list.Add list.Count, Array(CLng(rs(0)), rs(1) & "", rs(2), N(rs(3)), N(rs(4)))
  98. rs.MoveNext
  99. Loop
  100. rs.Close
  101. Set RecentImports = list
  102. End Function
  103. ' Null -> 0
  104. Private Function N(v)
  105. If IsNull(v) Or IsEmpty(v) Then N = 0 Else N = CLng(v)
  106. End Function
  107. End Class
  108. Dim StatsRepository_Class__Singleton
  109. Function StatsRepository()
  110. If IsEmpty(StatsRepository_Class__Singleton) Then
  111. Set StatsRepository_Class__Singleton = New StatsRepository_Class
  112. End If
  113. Set StatsRepository = StatsRepository_Class__Singleton
  114. End Function
  115. %>

Powered by TurnKey Linux.