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 }); }
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))); }
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)); }
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)); }
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); }
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)); }
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); }
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)); }
/// <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); }
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); }
/// <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(); } } } }
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 }))); }
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)); }
protected abstract void AddRosterRowFrom4x4Sheet(ExpandedRowsContext model, SarUnit unit, IRosterEntry row);
public MissionReadyExtension(SarUnit unit) { this.unit = unit; }
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)); }