public Dictionary <Person, string> NoticesToSend() { var leaderNotices = new Dictionary <Person, string>(); var olist = FetchOrgs().Select(oo => oo.OrganizationId).ToList(); var cn = new SqlConnection(Util.ConnectionString); cn.Open(); var orgs = string.Join(",", olist); var alist = cn.Query <RecentAbsentsInfo>("RecentAbsentsSP2", new { orgs }, commandType: CommandType.StoredProcedure, commandTimeout: 600).ToList(); var mlist = (from r in CurrentDatabase.LastMeetings(orgs) where olist.Contains(r.OrganizationId) select r).ToList(); var plist = (from om in CurrentDatabase.ViewOrganizationLeaders where olist.Contains(om.OrganizationId) group om.OrganizationId by om.PeopleId into leaderlist select leaderlist).ToList(); PythonModel.RegisterHelpers(CurrentDatabase); var template = HandlebarsDotNet.Handlebars.Compile(Resource1.RecentVisitsAbsents); var sb = new StringBuilder("Notices sent to:</br>\n<table>\n"); foreach (var p in plist) { var leader = CurrentDatabase.LoadPersonById(p.Key); var orgids = p.ToList(); var meetings = (from m in mlist where orgids.Contains(m.OrganizationId) let visitors = CurrentDatabase.OrgVisitorsAsOfDate(m.OrganizationId, m.Lastmeeting, true).ToList() let absents = (from a in alist where a.OrganizationId == m.OrganizationId select a).ToList() let org = CurrentDatabase.LoadOrganizationById(m.OrganizationId) select new { m.MeetingId, m.OrganizationId, m.Lastmeeting, OrgName = Organization.FormatOrgName(m.OrganizationName, m.LeaderName, m.Location), m.LeaderName, ConsecutiveAbsentsThreshold = org.ConsecutiveAbsentsThreshold ?? 2, HasAbsents = absents.Any(), Absents = (from a in absents orderby a.LastAttend descending select new { a.PeopleId, a.Consecutive, a.Name2, HomePhone = a.HomePhone.FmtFone(), CellPhone = a.CellPhone.FmtFone(), a.EmailAddress, a.LeaderName, a.OrganizationName, a.OtherAttends, a.LastAttend }).ToList(), HasVisits = visitors.Any(), Visits = (from a in visitors select new { a.PeopleId, a.LastName, a.PreferredName, a.LastAttended, HomePhone = a.HomePhone.FmtFone(), CellPhone = a.CellPhone.FmtFone(), a.Email, }).ToList(), }).ToList(); foreach (var m in meetings) { sb.Append($"<tr><td>{leader.Name}</td><td>{m.OrgName}</td><td>{m.Lastmeeting:g}</td></tr>\n"); } leaderNotices.Add(leader, template(meetings)); } sb.Append("</table>\n"); noticelist = sb.ToString(); return(leaderNotices); }