|
- <%
- '=======================================================================================================================
- ' 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
- %>
|