<% '======================================================================================================================= ' STATS REPOSITORY ' Read-only counts for the dashboard. '======================================================================================================================= Class StatsRepository_Class ' Dictionary of counts about the list itself Public Function ListCounts() Dim rs, d Set d = CreateObject("Scripting.Dictionary") Set rs = Db_Query( _ "SELECT COUNT(*) AS total, " & _ "Sum(IIf(status = 'removed', 1, 0)) AS removed, " & _ "Sum(IIf(status <> 'removed' AND (is_customer = 0 OR is_customer IS NULL), 1, 0)) AS prospects, " & _ "Sum(IIf(status <> 'removed' AND is_customer = 1, 1, 0)) AS customers, " & _ "Sum(IIf(status <> 'removed' AND (is_customer = 0 OR is_customer IS NULL) AND last_contacted_at IS NULL, 1, 0)) AS never_contacted, " & _ "Sum(IIf(status = 'new', 1, 0)) AS st_new, " & _ "Sum(IIf(status = 'contacted', 1, 0)) AS st_contacted, " & _ "Sum(IIf(status = 'follow_up', 1, 0)) AS st_follow_up, " & _ "Sum(IIf(status <> 'removed' AND next_action_date < Date(), 1, 0)) AS overdue, " & _ "Sum(IIf(status <> 'removed' AND next_action_date = Date(), 1, 0)) AS due_today, " & _ "Sum(IIf(status <> 'removed' AND next_action_date > Date() AND next_action_date <= DateAdd('d', 7, Date()), 1, 0)) AS this_week, " & _ "Sum(IIf(status <> 'removed' AND phone_digits IS NULL, 1, 0)) AS no_phone " & _ "FROM businesses", Array()) Dim i For i = 0 To rs.Fields.Count - 1 d(rs.Fields(i).Name) = N(rs.Fields(i).Value) Next rs.Close d("active") = d("total") - d("removed") Set ListCounts = d End Function ' Counts of logged contacts: today, last 7 days (including today), last 30 days Public Function ActivityCounts() Dim rs, d Set d = CreateObject("Scripting.Dictionary") Set rs = Db_Query( _ "SELECT Sum(IIf(contacted_at = Date(), 1, 0)) AS n_today, " & _ "Sum(IIf(contacted_at >= DateAdd('d', -6, Date()), 1, 0)) AS n_week, " & _ "Sum(IIf(contacted_at >= DateAdd('d', -29, Date()), 1, 0)) AS n_month, " & _ "COUNT(*) AS everything FROM interactions", Array()) d("today") = N(rs("n_today")) : d("week") = N(rs("n_week")) : d("month") = N(rs("n_month")) : d("all") = N(rs("everything")) rs.Close Set ActivityCounts = d End Function ' Contacts per day for the last `days` days, oldest first: list of Array(date, count) including zero days Public Function DailyActivity(days) Dim rs, counts, list, i, dt, key Set counts = CreateObject("Scripting.Dictionary") Set rs = Db_Query("SELECT contacted_at, COUNT(*) FROM interactions WHERE contacted_at >= DateAdd('d', " & CLng(1 - days) & ", Date()) GROUP BY contacted_at", Array()) Do While Not rs.EOF If Not IsNull(rs(0)) Then counts(CStr(CLng(CDate(rs(0))))) = CLng(rs(1)) rs.MoveNext Loop rs.Close Set list = CreateObject("Scripting.Dictionary") For i = days - 1 To 0 Step -1 dt = Date - i key = CStr(CLng(dt)) If counts.Exists(key) Then list.Add list.Count, Array(dt, counts(key)) Else list.Add list.Count, Array(dt, 0) Next Set DailyActivity = list End Function ' Last 30 days grouped by a column ("method" or "outcome"): list of Array(key, count), biggest first Public Function ActivityBy(column) Dim rs, list If column <> "method" And column <> "outcome" Then Err.Raise 5, "StatsRepository.ActivityBy", "Unsupported column" Set list = CreateObject("Scripting.Dictionary") 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()) Do While Not rs.EOF list.Add list.Count, Array(rs(0) & "", CLng(rs(1))) rs.MoveNext Loop rs.Close Set ActivityBy = list End Function ' Biggest industries (active businesses only) with how many have been contacted at least once Public Function TopIndustries(maxRows) Dim rs, list Set list = CreateObject("Scripting.Dictionary") Set rs = Db_Query( _ "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 " & _ "FROM industries i INNER JOIN businesses b ON b.industry_id = i.id WHERE b.status <> 'removed' " & _ "GROUP BY i.id, i.name ORDER BY COUNT(b.id) DESC, i.name", Array()) Do While Not rs.EOF list.Add list.Count, Array(CLng(rs(0)), rs(1) & "", CLng(rs(2)), N(rs(3))) rs.MoveNext Loop rs.Close Set TopIndustries = list End Function Public Function RecentImports(maxRows) Dim rs, list Set list = CreateObject("Scripting.Dictionary") 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()) Do While Not rs.EOF list.Add list.Count, Array(CLng(rs(0)), rs(1) & "", rs(2), N(rs(3)), N(rs(4))) rs.MoveNext Loop rs.Close Set RecentImports = list End Function ' Null -> 0 Private Function N(v) If IsNull(v) Or IsEmpty(v) Then N = 0 Else N = CLng(v) End Function End Class Dim StatsRepository_Class__Singleton Function StatsRepository() If IsEmpty(StatsRepository_Class__Singleton) Then Set StatsRepository_Class__Singleton = New StatsRepository_Class End If Set StatsRepository = StatsRepository_Class__Singleton End Function %>