コード例 #1
0
        private static void TrainingReport(SpartReports me, ExcelPackage package, NameValueCollection queries)
        {
            var id = new Guid("574cb2fe-1acc-4e04-919c-030546b0e7bd");
            var db = me.db.Value;

            DateTime today = DateTime.Today;

            var sheet = package.Workbook.Worksheets[1];

            var members = db.GetActiveMembers(id, today, "Memberships").OrderBy(f => f.LastName).ThenBy(f => f.FirstName);

            var spartCourses     = new[] { "OEC", "Avalanche I", "Avalanche II", "MT&R", "MT&R 2" };
            var courses          = db.TrainingCourses.Where(f => spartCourses.Contains(f.DisplayName) || f.WacRequired > 0);
            var spartCourseGuids = new Guid[spartCourses.Length];

            for (int i = 0; i < spartCourses.Length; i++)
            {
                string courseName = spartCourses[i];
                spartCourseGuids[i] = courses.Where(f => f.DisplayName == courseName).Select(f => f.Id).SingleOrDefault();
            }

            int row = 2;

            foreach (var member in members)
            {
                var expires = CompositeTrainingStatus.Compute(member, courses, today);

                int col = 1;
                sheet.Cells[row, col++].Value = member.LastName;
                sheet.Cells[row, col++].Value = member.FirstName;

                foreach (var courseId in spartCourseGuids)
                {
                    if (courseId != Guid.Empty)
                    {
                        var expire = expires.Expirations[(Guid)courseId];
                        if (expire.CourseName.StartsWith("Avalanche") && expire.Completed.HasValue)
                        {
                            expire.Expires = expire.Completed.Value.AddYears(3);
                        }
                        sheet.Cells[row, col].Value = expire.ToString();
                    }
                    col++;
                }

                var now       = DateTime.Now;
                var yearStart = new DateTime(now.Year, 1, 1);
                var lastYear  = new DateTime(now.Year - 1, 1, 1);

                sheet.Cells[row, col++].Value = member.MissionRosters.Where(f => f.Unit.Id == id && f.TimeIn >= yearStart).Select(f => f.Mission.Id).Distinct().Count();
                sheet.Cells[row, col++].Value = member.MissionRosters.Where(f => f.Unit.Id == id && f.TimeIn >= lastYear && f.TimeIn < yearStart).Select(f => f.Mission.Id).Distinct().Count();

                row++;
            }

            sheet.Cells["A:I"].AutoFitColumns();
        }
コード例 #2
0
        public Stream GetMembershipReport()
        {
            ExcelFile xl       = ExcelService.Create(ExcelFileType.XLS);
            var       goodList = xl.CreateSheet("Mission Ready");

            this.GenerateMissionReadySheets(null, xl, goodList);

            var dataSheet = xl.CreateSheet("Member Data");

            var interestingCourses = this.db.GetCoreCompetencyCourses();

            IQueryable <Member> members = this.db.Members.Include("Addresses", "Memberships", "ComputedAwards.Course").Where(f => f.Memberships.Any(g => g.Status.IsActive && g.EndTime == null));

            members = members.OrderBy(f => f.LastName).ThenBy(f => f.FirstName);

            // Set column header titles. A static list, followed by a list of "interesting" training courses
            var columns = new[] { "DEM", "Lastname", "Firstname", "WAC Card", "Street", "City", "State", "ZIP", "Phone", "Email", "HAM", "Units" }.Union(interestingCourses.Select(f => f.DisplayName)).ToArray();

            for (int i = 0; i < columns.Length; i++)
            {
                dataSheet.CellAt(0, i).SetValue(columns[i]);
                dataSheet.CellAt(0, i).SetBold(true);
            }

            int row = 1;

            foreach (var m in members)
            {
                int col = 0;
                dataSheet.CellAt(row, col++).SetValue(m.DEM);
                dataSheet.CellAt(row, col++).SetValue(m.LastName);
                dataSheet.CellAt(row, col++).SetValue(m.FirstName);
                dataSheet.CellAt(row, col++).SetValue(m.WacLevel.ToString());

                var address = m.Addresses.OrderBy(f => f.InternalType).FirstOrDefault();
                if (address != null)
                {
                    dataSheet.CellAt(row, col++).SetValue(address.Street);
                    dataSheet.CellAt(row, col++).SetValue(address.City);
                    dataSheet.CellAt(row, col++).SetValue(address.State);
                    dataSheet.CellAt(row, col++).SetValue(address.Zip);
                }
                else
                {
                    col += 4;
                }

                Action <Member, string> doContact = (member, type) =>
                {
                    var phone = m.ContactNumbers.Where(f => f.Type == type).OrderBy(f => f.Priority).FirstOrDefault();
                    if (phone != null)
                    {
                        dataSheet.CellAt(row, col).SetValue(phone.Value);
                    }
                    col++;
                };
                doContact(m, "phone");
                doContact(m, "email");
                doContact(m, "hamcall");

                dataSheet.CellAt(row, col++).SetValue(string.Join(" ",
                                                                  m.Memberships.Where(f => f.Status.IsActive && f.EndTime == null).Select(f => f.Unit.DisplayName).OrderBy(f => f)
                                                                  ));

                var trainingStatus = CompositeTrainingStatus.Compute(m, interestingCourses, DateTime.Now);
                for (int i = 0; i < interestingCourses.Count; i++)
                {
                    dataSheet.CellAt(row, col++).SetValue(trainingStatus.Expirations[interestingCourses[i].Id].ToString());
                }
                row++;
            }
            //IQueryable<UnitMembership> memberships = this.db.UnitMemberships.Include("Person.Addresses", "Person.ContactNumbers").Include("Status");
            //memberships = memberships.Where(um => um.EndTime == null && um.Status.IsActive);
            //memberships = memberships.OrderBy(f => f.Person.LastName).ThenBy(f => f.Person.FirstName);



            MemoryStream ms = new MemoryStream();

            xl.Save(ms);
            ms.Seek(0, SeekOrigin.Begin);
            return(ms);
        }
コード例 #3
0
        private static void TrainingReport(IstReports me, ExcelPackage package, NameValueCollection queries)
        {
            Guid id = new Guid("c118ce30-cd28-4635-ba3d-adf7c21358e2");
            var  db = me.db.Value;

            DateTime today = DateTime.Today;
            // Take current month and subtract 1 to move to Jan = 0 counting system
            // Take away one more so that reports run during the first month of a new quarter report on last quarter.
            // Then, convert -1 to 12 with +12,%12
            // Divide by 3 months to get the quarter
            int      quarter      = ((today.Month + 10) % 12) / 3;
            DateTime quarterStart = new DateTime(today.AddMonths(-1).Year, 1, 1).AddMonths(quarter * 3);
            DateTime quarterStop  = quarterStart.AddMonths(3);


            var sheet = package.Workbook.Worksheets[1];

            var members = db.GetActiveMembers(id, today, "ContactNumbers", "Memberships").OrderBy(f => f.LastName).ThenBy(f => f.FirstName);

            var istCourses = new[] { "ICS-300", "ICS-400", "ICS-200", "ICS-800" };
            var courses    = db.TrainingCourses.Where(f => istCourses.Contains(f.DisplayName) || f.WacRequired > 0).OrderBy(f => f.DisplayName);

            sheet.Cells[1, 1].Value           = today;
            sheet.Cells[1, 1].Style.Font.Bold = true;

            var headers = new[] { "Last Name", "First Name", "Ham Call", "Card Type", "Status", "Missing Training", "Mission Ready",
                                  string.Format("Q{0} Missions", quarter + 1), string.Format("Q{0} Meetings", quarter + 1),
                                  string.Format("Q{0} Missions", ((quarter + 3) % 4) + 1), string.Format("Q{0} Meetings", ((quarter + 3) % 4) + 1), // "quarter + 3 % 4" is same as "(quarter - 1) + 4 % 4"
                                  string.Format("Q{0} Missions", ((quarter + 2) % 4) + 1), string.Format("Q{0} Meetings", ((quarter + 2) % 4) + 1),
                                  string.Format("Q{0} Missions", ((quarter + 1) % 4) + 1), string.Format("Q{0} Meetings", ((quarter + 1) % 4) + 1) };

            for (int i = 0; i < headers.Length; i++)
            {
                sheet.Cells[2, i + 1].Value           = headers[i];
                sheet.Cells[2, i + 1].Style.Font.Bold = true;
                if (i >= headers.Length - 8)
                {
                    sheet.Column(i + 1).Style.Numberformat.Format = "0";
                }
            }

            int row = 3;

            foreach (var member in members)
            {
                sheet.Cells[row, 1].Value = member.LastName;
                sheet.Cells[row, 2].Value = member.FirstName;
                sheet.Cells[row, 3].Value = member.ContactNumbers.Where(f => f.Type == "hamcall").Select(f => f.Value).FirstOrDefault();
                sheet.Cells[row, 4].Value = member.WacLevel.ToString();
                sheet.Cells[row, 5].Value = member.Memberships.Where(f => f.Unit.Id == id && f.EndTime == null).Select(f => f.Status.StatusName).FirstOrDefault();


                var expires = CompositeTrainingStatus.Compute(member, courses, today);

                List <string> missingCourses = new List <string>();
                foreach (var course in courses)
                {
                    if (!expires.Expirations[course.Id].Completed.HasValue)
                    {
                        missingCourses.Add(course.DisplayName);
                    }
                }

                sheet.Cells[row, 6].Value = string.Join(", ", missingCourses);

                var qstart = quarterStart;
                var qstop  = quarterStop;
                for (int i = 0; i < 4; i++)
                {
                    sheet.Cells[row, 8 + i * 2].Value = member.MissionRosters.Where(f => f.Unit.Id == id && f.TimeIn >= qstart && f.TimeIn < qstop).Select(f => f.Mission.Id).Distinct().Count();
                    var trainingRosters = member.TrainingRosters.Where(f => f.TimeIn >= qstart && f.TimeIn < qstop).ToList();
                    sheet.Cells[row, 9 + i * 2].Value = trainingRosters.Where(f => Regex.IsMatch(f.Training.Title, "IST .*Meeting.*", RegexOptions.IgnoreCase)).Select(f => f.Training.Id).Distinct().Count();
                    qstop  = qstart;
                    qstart = qstart.AddMonths(-3);
                }

                row++;
            }


            sheet.Cells["A:Z"].AutoFitColumns();
        }
コード例 #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="unit"></param>
        /// <param name="xl"></param>
        /// <param name="goodList"></param>
        private void GenerateMissionReadySheets(SarUnit unit, ExcelFile xl, ExcelSheet goodList)
        {
            IMissionReadyPlugin extension = null;

            string longName = this.settings.GroupFullName ?? this.settings.GroupName;
            IQueryable <UnitMembership> memberships = this.db.UnitMemberships.Include("Person.ComputedAwards.Course").Include("Status");

            if (unit != null)
            {
                memberships = memberships.Where(um => um.Unit.Id == unit.Id);
                longName    = unit.LongName;
                extension   = this.extensions.For <IMissionReadyPlugin>(unit);
            }
            memberships = memberships.Where(um => um.EndTime == null && um.Status.IsActive);
            memberships = memberships.OrderBy(f => f.Person.LastName).ThenBy(f => f.Person.FirstName);

            goodList.Header = longName + " Mission Active Roster";
            goodList.Footer = DateTime.Now.ToShortDateString();

            var courses = (from c in this.db.TrainingCourses where c.WacRequired > 0 select c).OrderBy(x => x.DisplayName).ToList();

            int             headerIdx    = 0;
            Action <string> appendHeader = head =>
            {
                var cell = goodList.CellAt(0, headerIdx++);
                cell.SetValue(head);
                cell.SetBold(true);
                cell.SetTextWrap(true);
            };

            Action <MissionReadyColumns> insertExtensionHeaders = group =>
            {
                if (extension == null)
                {
                    return;
                }
                foreach (var value in extension.GetHeadersAfter(group))
                {
                    appendHeader(value);
                }
            };


            insertExtensionHeaders(MissionReadyColumns.Start);
            appendHeader("DEM");
            insertExtensionHeaders(MissionReadyColumns.WorkerNumber);
            appendHeader("Lastname");
            appendHeader("Firstname");
            insertExtensionHeaders(MissionReadyColumns.Name);
            appendHeader("Card Type");
            insertExtensionHeaders(MissionReadyColumns.WorkerType);
            foreach (var course in courses)
            {
                var cell = goodList.CellAt(0, headerIdx++);
                cell.SetValue(course.DisplayName);

                cell.SetBold(true);
                cell.SetTextWrap(true);
            }
            insertExtensionHeaders(MissionReadyColumns.Courses);


            ExcelSheet badList      = xl.CopySheet(goodList.Name, "Non-Mission Members");
            ExcelSheet nonFieldList = xl.CopySheet(goodList.Name, "Admin Members");

            using (SheetAutoFitWrapper good = new SheetAutoFitWrapper(xl, goodList))
            {
                using (SheetAutoFitWrapper bad = new SheetAutoFitWrapper(xl, badList))
                {
                    using (SheetAutoFitWrapper admin = new SheetAutoFitWrapper(xl, nonFieldList))
                    {
                        int  idx    = 1;
                        int  c      = 0;
                        Guid lastId = Guid.Empty;

                        foreach (UnitMembership membership in memberships)
                        {
                            Member member = membership.Person;
                            if (member.Id == lastId)
                            {
                                continue;
                            }
                            lastId = member.Id;

                            CompositeTrainingStatus stats = CompositeTrainingStatus.Compute(member, courses, DateTime.Now);

                            SheetAutoFitWrapper wrap = bad;
                            // If the person isn't supposed to keep up a WAC card, then they're administrative...
                            if (membership.Status.WacLevel == WacLevel.None)
                            {
                                wrap = admin;
                            }
                            // If they're current on training and have a DEM card, they're good...
                            else if (stats.IsGood && member.WacLevel != WacLevel.None)
                            {
                                wrap = good;
                            }
                            idx = wrap.Sheet.NumRows + 1;
                            c   = 0;

                            Action <MissionReadyColumns> insertExtensionColumns = group =>
                            {
                                if (extension == null)
                                {
                                    return;
                                }
                                foreach (var value in extension.GetColumnsAfter(group, member))
                                {
                                    wrap.SetCellValue(value, idx, c++);
                                }
                            };

                            insertExtensionColumns(MissionReadyColumns.Start);
                            wrap.SetCellValue(string.Format("{0:0000}", member.DEM), idx, c++);
                            insertExtensionColumns(MissionReadyColumns.WorkerNumber);
                            wrap.SetCellValue(member.LastName, idx, c++);
                            wrap.SetCellValue(member.FirstName, idx, c++);
                            insertExtensionColumns(MissionReadyColumns.Name);
                            ExcelCell cell = wrap.Sheet.CellAt(idx, c);
                            switch (member.WacLevel)
                            {
                            case WacLevel.Field:
                                cell.SetFillColor(Color.Green);
                                cell.SetFontColor(Color.White);
                                break;

                            case WacLevel.Novice:
                                cell.SetFillColor(Color.Red);
                                cell.SetFontColor(Color.White);
                                break;

                            case WacLevel.Support:
                                cell.SetFillColor(Color.Orange);
                                break;
                            }
                            wrap.SetCellValue(member.WacLevel.ToString(), idx, c++);
                            insertExtensionColumns(MissionReadyColumns.WorkerType);

                            foreach (var course in courses)
                            {
                                TrainingStatus stat = stats.Expirations[course.Id];

                                if ((stat.Status & ExpirationFlags.Okay) != ExpirationFlags.Okay)
                                {
                                    wrap.Sheet.CellAt(idx, c).SetFillColor(Color.Pink);
                                    wrap.Sheet.CellAt(idx, c).SetBorderColor(Color.Red);
                                }

                                wrap.SetCellValue(stat.ToString(), idx, c);
                                if (stat.Expires.HasValue)
                                {
                                    wrap.Sheet.CellAt(idx, c).SetValue(stat.Expires.Value.Date.ToString("yyyy-MM-dd"));
                                }

                                c++;
                            }
                            insertExtensionColumns(MissionReadyColumns.Courses);

                            if (wrap == bad)
                            {
                                wrap.Sheet.CellAt(idx, c).SetValue(member.ContactNumbers.Where(f => f.Type == "email").OrderBy(f => f.Priority).Select(f => f.Value).FirstOrDefault());
                            }
                            insertExtensionColumns(MissionReadyColumns.End);
                            idx++;
                        }
                        admin.Sheet.AutoFitAll();
                        good.Sheet.AutoFitAll();
                        bad.Sheet.AutoFitAll();
                    }
                }
            }
        }