public ActionResult FixupUnitMemberGroups(string id, string group, bool?commit)
        {
            if (!Permissions.IsUserOrLocal(Request))
            {
                Response.StatusCode = 403;
                return(CreateLoginRedirect());
            }
            string result = "";

            SarUnit unit = UnitsController.ResolveUnit(this.db.Units, id);

            if (string.IsNullOrEmpty(group))
            {
                group = UnitNameAsGroupName(unit.DisplayName) + ".members";
            }

            var unitMembers = (from m in this.db.UnitMemberships
                               where m.Unit.Id == unit.Id && m.EndTime == null && m.Status.GetsAccount
                               select m.Person).OrderBy(f => f.LastName).ThenBy(f => f.FirstName).Distinct().ToArray();

            var usersInGroup = Roles.GetUsersInRole(group).ToList();

            foreach (var member in unitMembers)
            {
                if (usersInGroup.Contains(member.Username))
                {
                    result += string.Format("{0} in group as {1}<br/>", member.FullName, member.Username);
                    usersInGroup.Remove(member.Username);
                }
                else
                {
                    result += string.Format("## {0} not in group. Should add {1}<br/>", member.FullName, member.Username);
                }
            }

            foreach (string username in usersInGroup)
            {
                result += string.Format("## suggest remove {0}<br/>", username);
            }

            //if (commit.HasValue && commit.Value)
            //{
            //        if (usersToAdd.Count > 0)
            //        {
            //            Roles.AddUsersToRole(usersToAdd.ToArray(), group);
            //        }

            //        if (usersToRemove.Count > 0)
            //        {
            //            Roles.RemoveUsersFromRole(usersToRemove.ToArray(), group);
            //        }
            //    }
            //}

            return(new ContentResult {
                ContentType = "text/html", Content = "Done.\n" + result
            });
        }
Exemple #2
0
        public ActionResult MissionReadyList(Guid?id)
        {
            if (!Permissions.IsUserOrLocal(Request))
            {
                return(this.CreateLoginRedirect());
            }

            SarUnit unit = (from u in this.db.Units where u.Id == id select u).FirstOrDefault();

            Stream result = this.reports.GetMissionReadyList(unit);

            return(this.File(result, "application/vnd.ms-excel", string.Format("{0}-missionready-{1:yyMMdd}.xls", unit.DisplayName, DateTime.Now)));
        }
Exemple #3
0
        public ActionResult Roster(Guid id)
        {
            ViewData["Title"] = "Unit Roster";

            SarUnit unit = (from u in this.db.Units where u.Id == id select u).First();

            ViewData["Unit"] = unit;

            var members = this.db.UnitMemberships.Include("Person").Include("Status").Where(um => um.Unit.Id == id && um.EndTime == null);

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

            return(View(members));
        }
Exemple #4
0
        public T For <T>(SarUnit unit)
        {
            Dictionary <Type, Type> unitExtentions;

            if (this.extensions.TryGetValue(unit.Id, out unitExtentions))
            {
                Type implementationType;
                if (unitExtentions.TryGetValue(typeof(T), out implementationType))
                {
                    return((T)this.kernel.Get(implementationType, new Ninject.Parameters.ConstructorArgument("unit", unit)));
                }
            }
            return(default(T));
        }
Exemple #5
0
        protected override void AddRosterRowFrom4x4Sheet(ExpandedRowsContext model, SarUnit unit, IRosterEntry row)
        {
            TrainingRoster mrow = (TrainingRoster)row;

            Guid           personId = mrow.Person.Id;
            TrainingRoster newRow   = new TrainingRoster
            {
                Training = (Training)model.SarEvent,
                Person   = this.db.Members.Include("TrainingRosters").Single(f => f.Id == personId),
                TimeIn   = mrow.TimeIn,
                TimeOut  = mrow.TimeOut,
                Miles    = mrow.Miles,
            };

            mrow.Id = newRow.Id;
            this.db.TrainingRosters.Add(newRow);
        }
Exemple #6
0
        public ActionResult CreateStatus(Guid unitId)
        {
            SarUnit unit = (from u in this.db.Units where u.Id == unitId select u).FirstOrDefault();


            ViewData["Title"] = "New Unit Status for " + unit.DisplayName;

            UnitStatus status = new UnitStatus()
            {
                Unit = unit
            };

            Session.Add("NewStatusGuid", status.Id);
            ViewData["NewStatusGuid"] = Session["NewStatusGuid"];

            return(InternalEditStatus(status));
        }
Exemple #7
0
        public ActionResult CreateStatus(Guid unitId, FormCollection fields)
        {
            if (Session["NewStatusGuid"] != null && Session["NewStatusGuid"].ToString() != fields["NewStatusGuid"])
            {
                throw new InvalidOperationException("Invalid operation. Are you trying to re-create a status?");
            }
            Session.Remove("NewStatusGuid");

            SarUnit unit = (from u in this.db.Units where u.Id == unitId select u).FirstOrDefault();

            ViewData["Title"] = "New Unit Status for " + unit.DisplayName;

            UnitStatus status = new UnitStatus();

            status.Unit = unit;
            this.db.UnitStatusTypes.Add(status);
            return(InternalSaveStatus(status, fields));
        }
        protected override void AddRosterRowFrom4x4Sheet(ExpandedRowsContext model, SarUnit unit, IRosterEntry row)
        {
            MissionRoster mrow = (MissionRoster)row;

            Guid          personId = mrow.Person.Id;
            MissionRoster newRow   = new MissionRoster
            {
                Mission      = (Mission)model.SarEvent,
                Unit         = unit,
                Person       = this.db.Members.Include("MissionRosters").Single(f => f.Id == personId),
                TimeIn       = mrow.TimeIn,
                TimeOut      = mrow.TimeOut,
                Miles        = mrow.Miles,
                InternalRole = mrow.InternalRole
            };

            mrow.Id = newRow.Id;
            this.db.MissionRosters.Add(newRow);
        }
Exemple #9
0
        public ActionResult Detail(Guid id)
        {
            SarUnit unit = (from u in this.db.Units.Include("StatusTypes") where u.Id == id select u).First();

            ViewData["Title"] = "Unit Detail: " + unit.DisplayName;

            Member actor = this.db.Members.Include("Memberships.Status").SingleOrDefault(f => f.Username == User.Identity.Name);

            ViewBag.CanApply = string.IsNullOrEmpty(unit.NoApplicationsText) &&
                               actor != null &&
                               !actor.Memberships.Any(f => f.Status.IsActive && f.EndTime == null && f.Unit.Id == unit.Id) &&
                               !actor.ApplyingTo.Any(f => f.Unit.Id == unit.Id && f.IsActive);
            ViewBag.NoApplyReason = unit.NoApplicationsText == "never" ? null : unit.NoApplicationsText;
            ViewBag.ActorId       = Permissions.UserId;

            ViewBag.CanEditDocuments = api.UnitsController.CanEditDocuments(Permissions, id);

            return(View(unit));
        }
Exemple #10
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="unit"></param>
        /// <returns></returns>
        public Stream GetMissionReadyList(SarUnit unit)
        {
            string templateFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Templates", "Report", "missionready-template.xls");

            ExcelFile xl;

            using (FileStream fs = new FileStream(templateFile, FileMode.Open, FileAccess.Read))
            {
                xl = ExcelService.Read(fs, ExcelFileType.XLS);
            }

            var goodList = xl.GetSheet(0);

            GenerateMissionReadySheets(unit, xl, goodList);

            MemoryStream ms = new MemoryStream();

            xl.Save(ms);
            ms.Seek(0, SeekOrigin.Begin);
            return(ms);
        }
Exemple #11
0
        public static SarUnit ResolveUnit(IQueryable <SarUnit> units, string id)
        {
            SarUnit unit = null;
            Guid    gID;

            if (Guid.TryParse(id, out gID))
            {
                unit = units.Where(f => f.Id == gID).FirstOrDefault();
            }
            else
            {
                var stringMatch = units.Where(f => f.DisplayName == id);
                if (stringMatch.Count() == 1)
                {
                    unit = stringMatch.First();
                }
            }

            if (unit == null)
            {
                throw new ArgumentException("Can't resolve unit '" + id + "'");
            }
            return(unit);
        }
Exemple #12
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();
                    }
                }
            }
        }
Exemple #13
0
        public ActionResult Submit4x4Roster(Guid missionId)
        {
            if (!Has4x4RosterPermissions())
            {
                return(CreateLoginRedirect());
            }

            ExpandedRowsContext model = (ExpandedRowsContext)GetSessionValue("reviewRoster");

            if (model == null)
            {
                throw new InvalidOperationException("Lost temporary roster data. Please start over.");
            }

            bool          errors  = false;
            StringBuilder results = new StringBuilder();
            //using (var ctx = GetContext())
            //{
            SarUnit unit = this.db.Units.Where(f => f.DisplayName == "4x4").Single();

            if (model.EventId == missionId)
            {
                AddEventToContext((E)model.SarEvent);
            }
            else
            {
                model.SarEvent = GetEvent(missionId);
            }

            results.AppendLine(Url.Action("Roster", new { id = model.EventId }));

            foreach (var row in model.Rows)
            {
                AddRosterRowFrom4x4Sheet(model, unit, row);
            }

            try
            {
                this.db.SaveChanges();

                byte[] fileData = (byte[])GetSessionValue("reviewRosterData");
                string filename = (string)GetSessionValue("reviewRosterName");

                Document doc = new Document
                {
                    Size        = fileData.Length,
                    FileName    = System.IO.Path.GetFileName(filename),
                    Contents    = fileData,
                    ReferenceId = missionId,
                    MimeType    = Documents.GuessMime(filename),
                    Type        = "roster"
                };
                this.db.Documents.Add(doc);
                this.db.SaveChanges();
            }
            catch (RuleViolationsException ex)
            {
                errors = true;
                foreach (var error in ex.Errors)
                {
                    var modelRow = model.Rows.SingleOrDefault(f => f.Id == error.EntityKey);
                    results.AppendFormat("\"error\",\"{0}\",\"{1}\",\"{2}\",\"{3}\"\n",
                                         (modelRow == null) ? "" : modelRow.Person.ReverseName,
                                         (modelRow == null) ? error.PropertyName : modelRow.TimeIn.ToString(),
                                         (modelRow == null) ? error.PropertyValue : modelRow.TimeOut.ToString(),
                                         error.ErrorMessage);
                }
            }
            //            }

            bool?bot = (bool?)GetSessionValue("reviewRosterBot") ?? false;

            return((bot.Value || errors) ?
                   (ActionResult)(new ContentResult {
                Content = results.ToString(), ContentType = "text/plain"
            }) :
                   new RedirectResult(Url.Action("Roster", new { id = missionId })));
        }
Exemple #14
0
        public ActionResult DownloadRoster(Guid?id, bool?includeHidden)
        {
            // The method almost supports id=null as downloading the KCSARA roster
            // It doesn't do a distinct(person), so people in multiple units are recorded more than once.
            ExcelFile xl;

            using (FileStream fs = new FileStream(Server.MapPath(Url.Content("~/Content/roster-template.xls")), FileMode.Open, FileAccess.Read))
            {
                xl = ExcelService.Read(fs, ExcelFileType.XLS);
            }
            ExcelSheet ws = xl.GetSheet(0);

            string filename = string.Format("roster-{0:yyMMdd}.xls", DateTime.Now);
            IQueryable <UnitMembership> memberships = this.db.UnitMemberships.Include("Person").Include("Person.Addresses").Include("Person.ContactNumbers").Include("Status");
            string unitShort = ConfigurationManager.AppSettings["dbNameShort"];
            string unitLong  = Strings.GroupName;

            if (id.HasValue)
            {
                memberships = memberships.Where(um => um.Unit.Id == id.Value);
                SarUnit sarUnit = (from u in this.db.Units where u.Id == id.Value select u).First();
                unitShort = sarUnit.DisplayName;
                unitLong  = sarUnit.LongName;
            }
            memberships = memberships.Where(um => um.EndTime == null && um.Status.IsActive);
            memberships = memberships.OrderBy(f => f.Person.LastName).ThenBy(f => f.Person.FirstName);

            ws.Header = unitLong + " Active Roster";
            ws.Footer = DateTime.Now.ToShortDateString();
            filename  = unitShort + "-" + filename;

            using (SheetAutoFitWrapper wrap = new SheetAutoFitWrapper(xl, ws))
            {
                int idx = 1;
                int c   = 0;
                foreach (UnitMembership membership in memberships)
                {
                    Member member = membership.Person;
                    c = 0;
                    wrap.SetCellValue(string.Format("{0:0000}", member.DEM), idx, c++);
                    wrap.SetCellValue(member.LastName, idx, c++);
                    wrap.SetCellValue(member.FirstName, idx, c++);
                    wrap.SetCellValue(string.Join("\n", member.Addresses.Select(f => f.Street).ToArray()), idx, c++);
                    wrap.SetCellValue(string.Join("\n", member.Addresses.Select(f => f.City).ToArray()), idx, c++);
                    wrap.SetCellValue(string.Join("\n", member.Addresses.Select(f => f.State).ToArray()), idx, c++);
                    wrap.SetCellValue(string.Join("\n", member.Addresses.Select(f => f.Zip).ToArray()), idx, c++);
                    wrap.SetCellValue(string.Join("\n", member.ContactNumbers.Where(f => f.Type == "phone" && f.Subtype == "home").Select(f => f.Value).ToArray()), idx, c++);
                    wrap.SetCellValue(string.Join("\n", member.ContactNumbers.Where(f => f.Type == "phone" && f.Subtype == "cell").Select(f => f.Value).ToArray()), idx, c++);
                    wrap.SetCellValue(string.Join("\n", member.ContactNumbers.Where(f => f.Type == "email").Select(f => f.Value).ToArray()), idx, c++);
                    wrap.SetCellValue(string.Join("\n", member.ContactNumbers.Where(f => f.Type == "hamcall").Select(f => f.Value).ToArray()), idx, c++);
                    wrap.SetCellValue(member.WacLevel.ToString(), idx, c++);
                    wrap.SetCellValue(membership.Status.StatusName, idx, c++);

                    if ((includeHidden ?? false) && (Permissions.IsAdmin || (id.HasValue && Permissions.IsMembershipForUnit(id.Value))))
                    {
                        wrap.SetCellValue("DOB", 0, c);
                        wrap.SetCellValue(string.Format("{0:yyyy-MM-dd}", member.BirthDate), idx, c++);
                        wrap.SetCellValue("Gender", 0, c);
                        wrap.SetCellValue(member.Gender.ToString(), idx, c++);
                    }

                    idx++;
                }

                wrap.Sheet.AutoFitAll();
            }

            MemoryStream ms = new MemoryStream();

            xl.Save(ms);
            ms.Seek(0, SeekOrigin.Begin);
            return(this.File(ms, "application/vnd.ms-excel", filename));
        }
Exemple #15
0
 protected abstract void AddRosterRowFrom4x4Sheet(ExpandedRowsContext model, SarUnit unit, IRosterEntry row);
 public MissionReadyExtension(SarUnit unit)
 {
     this.unit = unit;
 }
Exemple #17
0
        public ActionResult Review4x4Roster(bool?bot)
        {
            if (!Has4x4RosterPermissions())
            {
                return(CreateLoginRedirect());
            }

            // Value is pre-incremented in while loop.
            int startRow = 13;

            if (Request.Files.Count != 1)
            {
                throw new InvalidOperationException("Can only submit one roster");
            }

            var postedFile = Request.Files[0];

            byte[] fileData = new byte[postedFile.ContentLength];
            postedFile.InputStream.Read(fileData, 0, fileData.Length);

            var stream = new System.IO.MemoryStream(fileData);

            stream.Position = 0;

            ExcelFile xl = null; // new ExcelFile();

            if (postedFile.FileName.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase))
            {
                xl = ExcelService.Read(postedFile.InputStream, ExcelFileType.XLSX);
            }
            else
            {
                xl = ExcelService.Read(postedFile.InputStream, ExcelFileType.XLS);
            }
            ExcelSheet sheet = xl.GetSheet(0);

            object   start     = sheet.CellAt(13, 4).StringValue.ToUpperInvariant().Replace("DATE", "").Replace("TIME", "").Replace("IN", "").Replace("OUT", "").Trim();
            DateTime startDate = DateTime.Parse(start.ToString());

            ExpandedRowsContext model = new ExpandedRowsContext();

            model.EventId = Guid.NewGuid();
            if (typeof(E) == typeof(Mission))
            {
                model.Type     = RosterType.Mission;
                model.SarEvent = new Mission {
                    Id = model.EventId
                };
            }
            else
            {
                model.Type     = RosterType.Training;
                model.SarEvent = new Training {
                    Id = model.EventId
                };
            }
            model.SarEvent.StateNumber = sheet.CellAt(9, 2).StringValue.Split(' ')[0];
            model.SarEvent.Title       = sheet.CellAt(10, 2).StringValue;
            model.SarEvent.Location    = sheet.CellAt(11, 2).StringValue;
            model.SarEvent.County      = sheet.CellAt(9, 10).StringValue.ToLowerInvariant();

            model.BadRows     = new List <IRosterEntry>();
            model.Rows        = new List <IRosterEntry>();
            model.NumDays     = 3;
            model.RosterStart = startDate;


            SarUnit unit = this.db.Units.Where(f => f.DisplayName == "4x4").Single();

            //ctx.Detach(unit);

            while (!string.IsNullOrWhiteSpace((sheet.CellAt(++startRow, 1).StringValue ?? "").ToString()))
            {
                R      roster = new R();
                string name   = sheet.CellAt(startRow, 1).StringValue;
                string dem    = sheet.CellAt(startRow, 2).StringValue.PadLeft(4, '0');
                var    member = this.db.Members
                                .Where(f => f.LastName + ", " + f.FirstName == name && f.DEM == dem)
                                .SingleOrDefault();

                if (member == null)
                {
                    //throw new InvalidOperationException(string.Format("Member {0} not found", sheet.CellAt(startRow, 1]));
                    continue;
                }

                //                    ctx.Detach(member);
                roster.Person = member;

                for (int i = 0; i < 3; i++)
                {
                    string v = (sheet.CellAt(startRow, 8 - i * 2).StringValue ?? "").ToString();
                    if (!string.IsNullOrWhiteSpace(v))
                    {
                        v = v.PadLeft(4, '0');
                        int hours   = int.Parse(v.Substring(0, 2));
                        int minutes = int.Parse(v.Substring(2, 2));
                        roster.TimeIn = startDate.AddDays(2 - i).AddHours(hours).AddMinutes(minutes);
                    }
                    v = (sheet.CellAt(startRow, 5 + i * 2).StringValue ?? "").ToString();
                    if (!string.IsNullOrWhiteSpace(v))
                    {
                        v = v.PadLeft(4, '0');
                        int hours   = int.Parse(v.Substring(0, 2));
                        int minutes = int.Parse(v.Substring(2, 2));
                        roster.TimeOut = startDate.AddDays(i).AddHours(hours).AddMinutes(minutes);
                    }
                }

                string miles = (sheet.CellAt(startRow, 11).StringValue ?? "").ToString();
                if (miles != "")
                {
                    double numericMiles;
                    if (double.TryParse(miles, out numericMiles))
                    {
                        roster.Miles = (int)Math.Ceiling(numericMiles);
                    }
                }

                MissionRoster missionRoster = roster as MissionRoster;
                if (missionRoster != null)
                {
                    missionRoster.Unit = unit;

                    if ("CO".Equals(sheet.CellAt(startRow, 3).StringValue))
                    {
                        missionRoster.InternalRole = "InTown";
                    }
                    else if ("OL".Equals(sheet.CellAt(startRow, 3).StringValue))
                    {
                        missionRoster.InternalRole = "OL";
                    }
                    else if (new[] { "AS", "ATL", "OUA", "TL", "TLT", "TM" }.Contains(sheet.CellAt(startRow, 3).StringValue))
                    {
                        missionRoster.InternalRole = "Field";
                    }
                    else if ("VAN".Equals(sheet.CellAt(startRow, 3).StringValue))
                    {
                        missionRoster.InternalRole = "Base";
                    }
                    else
                    {
                        missionRoster.InternalRole = "Responder";
                    }
                }
                model.Rows.Add(roster);
            }

            if (model.Rows.Count > 0)
            {
                model.SarEvent.StartTime = model.Rows.Min(f => f.TimeIn).Value;
                model.SarEvent.StopTime  = model.Rows.Max(f => f.TimeOut).Value;
            }

            DateTime early = model.SarEvent.StartTime.AddDays(-1);
            DateTime late  = model.SarEvent.StartTime.AddDays(1);

            E[] alternates = this.GetEventSource().Where(f => f.StateNumber == model.SarEvent.StateNumber || (f.StartTime > early && f.StartTime < late)).OrderBy(f => f.StartTime).ToArray();

            ViewData["alternateMissions"] = alternates;

            ViewData["CanEditRoster"] = false;
            ViewData["IsTemp"]        = true;

            SetSessionValue("reviewRosterBot", bot);
            SetSessionValue("reviewRoster", model);
            SetSessionValue("reviewRosterData", fileData);
            SetSessionValue("reviewRosterName", postedFile.FileName);
            return(View(model));
        }