Пример #1
0
        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);
        }