/* Helper Methods below: */ private void PrepareCarsForViewModel(ReportStartupViewModel model) { ICollection <Car> cars = _db.Cars.Where(c => c.Active).ToList(); ReportDAL rDB = new ReportDAL(_db); // User doesn't need to select cars if there is only one available int?latestOdometerStatus = null; if (cars.Count == 1) { Car selectedCar = cars.FirstOrDefault(); model.SelectedCarRegistrationNumber = selectedCar.RegistrationNumber; model.SelectedCarId = selectedCar.Id; latestOdometerStatus = rDB.GetLatestOdometerStatus(selectedCar.Id);; } else { latestOdometerStatus = rDB.GetLatestOdometerStatus(cars.ToArray()[0].Id); model.AvailableCars = new SelectList(cars, "Id", "RegistrationNumber"); } if (latestOdometerStatus != null) { model.OdometerStart = (int)latestOdometerStatus; } }
public ActionResult Startup(bool reportCompleted = false, int?associatedProjectId = null) { Project associatedProject = null; if (reportCompleted) { ViewBag.AppMessage = new AppMessage() { Type = AppMessage.Success, Message = AppString.ReportCompleted } } ; if (associatedProjectId != null) { associatedProject = _db.Projects.Single(p => p.Id == associatedProjectId); ViewBag.AppMessage = new AppMessage() { Type = AppMessage.Success, Message = String.Format(AppString.ProjectAssociated, associatedProject.Name) }; } string userId = User.Identity.GetUserId(); ErrorLogger.LogString(User.IsInRole("Admin").ToString()); // Makes sure that users finish previous reports first. ReportDAL rDb = new ReportDAL(_db); if (rDb.UserHasIncompleteReport(userId)) { return(RedirectToAction("Index")); } ReportStartupViewModel model = new ReportStartupViewModel(); try { PrepareProjectsForViewModel(model, associatedProject); } catch (Exception e) { // User is not logged in properly. Maybe a threading issue? (This code is a workaround) ErrorLogger.LogString("Could not log in. userId = " + User.Identity.GetUserId()); return(RedirectToAction("Index", "Report")); } // A user must have atleast one associated project to be able to report. Values are set in the PrepareProjectForStartup method call. if (model.AvailableProjects == null && model.SelectedProjectName == null) { return(RedirectToAction("Associate", "Project")); } PrepareCarsForViewModel(model); return(View(model)); }
private void PrepareProjectsForViewModel(ReportStartupViewModel model, Project associatedProject) { string userId = User.Identity.GetUserId(); List <ProjectSelectListViewModel> selectList = new List <ProjectSelectListViewModel>(); ProjectDAL pDb = new ProjectDAL(_db); List <Project> userProjects = pDb.GetUserProjects(userId).Where(p => p.Active).ToList(); Project notProjectBound = _db.Projects.Single(p => p.Name == "DefaultProject"); // Add default project first. It should always be first in the list. selectList.Add(new ProjectSelectListViewModel() { Id = notProjectBound.Id, FullInfo = "[ " + AppString.ProjectNotBound + " ]" }); // Add the rest. foreach (Project p in userProjects) { selectList.Add(new ProjectSelectListViewModel() { Id = p.Id, FullInfo = p.FullInfo }); } if (selectList.Count == 1) { ProjectSelectListViewModel foundProject = selectList.First(); model.SelectedProjectName = foundProject.FullInfo; model.SelectedProjectId = foundProject.Id; } else { int id = -1; if (associatedProject != null) { id = associatedProject.Id; } else { id = selectList.First().Id; } model.AvailableProjects = new SelectList(selectList.ToArray(), "Id", "FullInfo", id); } }
public ActionResult Startup(ReportStartupViewModel model) { if (ModelState.IsValid) { ReportDAL dal = new ReportDAL(_db); string currUserId = User.Identity.GetUserId(); // Calling GetUserId() within a Lambda-expression causes errors int?lastOdometerStatus = dal.GetLatestOdometerStatus(model.SelectedCarId); if (lastOdometerStatus != null && model.OdometerStart < lastOdometerStatus) { ViewBag.OdometerError = String.Format(AppString.ErrorOdometerStart, lastOdometerStatus - 1); PrepareCarsForViewModel(model); PrepareProjectsForViewModel(model, null); return(View(model)); } Report report = new Report() { Date = DateTime.Now, OdometerStart = model.OdometerStart, AssociatedCar = _db.Cars.Single(c => c.Id == model.SelectedCarId), AssociatedProject = _db.Projects.Single(p => p.Id == model.SelectedProjectId), AssociatedUser = _db.Users.Single(u => u.Id == currUserId), FromLocation = model.FromLocation }; // TODO: Perform checks on the received data to make sure that there isn't any user shenanigans going on. For example if a project id was passed that the user isn't associated with. _db.Reports.Add(report); _db.SaveChanges(); return(RedirectToAction("Complete", "Report", new { reportStarted = true })); } return(View(model)); }