Пример #1
0
        public ActionResult Create()
        {
            // check user role
            // if architect, go right to step two
            // if GC, go through dupe check process

            if (User.IsInRole("architect"))
            {
                var user = _service.GetUserProfile(_security.GetUserId(User.Identity.Name));
                ProjectEditModel viewModel = new ProjectEditModel();
                viewModel.ArchitectId = user.CompanyId;
                viewModel.Architect = user.Company.CompanyName;
                viewModel.BidDateTime = DateTime.Now;
                rePopViewModel(viewModel);
                return View("CreateStepTwo", viewModel);
            }
            else
            {
                return View("Create");
            }
        }
Пример #2
0
 public ActionResult CreateStepTwo(int architectId, string title, string number)
 {
     string archName = _service.GetCompanyProfile(architectId).CompanyName;
     ProjectEditModel viewModel = new ProjectEditModel();
     viewModel.ArchitectId = architectId;
     viewModel.Architect = archName;
     viewModel.Title = title;
     viewModel.Number = number;
     viewModel.BidDateTime = DateTime.Now;
     rePopViewModel(viewModel);
     return View("CreateStepTwo", viewModel);
 }
Пример #3
0
 private void rePopViewModel(ProjectEditModel viewModel)
 {
     viewModel.ProjectTypes = Util.CreateSelectListFromEnum(typeof(ProjectType), viewModel.ProjectType.ToString());
     viewModel.ProjectCategories = Util.CreateSelectListFromEnum(typeof(ProjectCategory), viewModel.ProjectCategory.ToString());
     viewModel.ConstructionTypes = _service.GetConstructionTypes().OrderBy(c => c.Name).Select(c => new SelectListItem { Text = c.Name, Value = c.Id.ToString(), Selected = c.Id == viewModel.ConstructionTypeId });
     viewModel.States = _service.GetStates().OrderBy(s => s.Abbr).Select(s => new SelectListItem { Text = s.Abbr, Value = s.Id.ToString(), Selected = s.Id == viewModel.StateId });
     viewModel.BuildingTypes = _service.GetBuildingTypes();
 }
Пример #4
0
        public ActionResult Edit(ProjectEditModel viewModel)
        {
            if (!viewModel.ProjectCategory.HasValue)
                ModelState.AddModelError("ProjectCategory", "Project Category is required");
            if (!viewModel.ProjectType.HasValue)
                ModelState.AddModelError("ProjectType", "Project Type is required");

            if (ModelState.IsValid)
            {
                try
                {
                    int userId = _security.GetUserId(User.Identity.Name);
                    int companyId = _service.GetUserProfile(userId).CompanyId;

                    // get project
                    Project toUpdate = _service.Get(viewModel.Id);

                    // update project attributes

                    toUpdate.Title = viewModel.Title;
                    toUpdate.Description = viewModel.Description;
                    toUpdate.Address = viewModel.Address;
                    toUpdate.BidDateTime = viewModel.BidDateTime;
                    toUpdate.WalkThruDateTime = viewModel.WalkThruDateTime;
                    toUpdate.WalkThruStatus = viewModel.WalkThruStatus.Value;
                    toUpdate.BuildingTypeId = viewModel.BuildingTypeId;
                    toUpdate.City = viewModel.City;
                    toUpdate.ConstructionTypeId = viewModel.ConstructionTypeId;
                    toUpdate.PostalCode = viewModel.PostalCode;
                    toUpdate.ProjectType = viewModel.ProjectType.Value;
                    toUpdate.ProjectCategory = viewModel.ProjectCategory.Value;
                    toUpdate.StateId = viewModel.StateId;
                    toUpdate.Number = viewModel.Number;
                    toUpdate.InvitationOnly = viewModel.InvitationOnly;
                    toUpdate.HiddenFromSearch = viewModel.HiddenFromSearch;

                    // update primary bid package
                    var ProjectPackage = toUpdate.BidPackages.Where(b => b.IsMaster).FirstOrDefault();

                    // if it doesn't exist for some reason, create it
                    if (ProjectPackage == null)
                    {
                        ProjectPackage = new BidPackage
                        {
                            BidDateTime = toUpdate.BidDateTime,
                            CreatedById = toUpdate.ArchitectId,
                            IsMaster = true,
                            ProjectId = toUpdate.Id
                        };
                        toUpdate.BidPackages = new List<BidPackage>();
                        toUpdate.BidPackages.Add(ProjectPackage);
                    }

                    // update scopes
                    List<ProjectXScope> prjScopes = toUpdate.Scopes.ToList();
                    List<BidPackageXScope> bpScopes;

                    // error correction
                    if (ProjectPackage.Scopes == null || ProjectPackage.Scopes.Count() == 0)
                    {
                        var temp = new List<BidPackageXScope>();

                        for (int i = 0; i < prjScopes.Count(); i++)
                        {
                            temp.Add(new BidPackageXScope { BidPackage = ProjectPackage, BidPackageId = ProjectPackage.Id, ScopeId = prjScopes[i].ScopeId });
                        }
                        ProjectPackage.Scopes = temp;
                        bpScopes = temp;
                    }
                    else
                    {
                        bpScopes = ProjectPackage.Scopes.ToList();
                    }

                    // get scopes from new selection that are not in existing selection
                    var scopesToAdd = viewModel.SelectedScope.Where(x => !prjScopes.Select(s => s.ScopeId).Contains(x)).ToArray();

                    // get scopes in existing selection that are not in new selection
                    var prjScopesToRemove = prjScopes.Where(x => !viewModel.SelectedScope.Contains(x.ScopeId)).ToArray();
                    var bpScopesToRemove = bpScopes.Where(x => !viewModel.SelectedScope.Contains(x.ScopeId)).ToArray();

                    // add new selections
                    for (int i = 0; i < scopesToAdd.Count(); i++)
                    {
                        toUpdate.Scopes.Add(new ProjectXScope { Project = toUpdate, ProjectId = toUpdate.Id, ScopeId = scopesToAdd[i] });
                        ProjectPackage.Scopes.Add(new BidPackageXScope { BidPackageId = ProjectPackage.Id, ScopeId = scopesToAdd[i] });
                    }

                    // remove scopes from project
                    for (int i = 0; i < prjScopesToRemove.Count(); i++)
                    {
                        toUpdate.Scopes.Remove(prjScopesToRemove[i]);
                    }

                    // remove scope from master bid package
                    for (int i = 0; i < bpScopesToRemove.Count(); i++)
                    {
                        ProjectPackage.Scopes.Remove(bpScopesToRemove[i]);
                    }

                    // add project to system
                    if (_service.Update(toUpdate))
                    {

                        // send notifications to invited members
                        int[] invitees = _notice.GetInvitationsNotDeclined(toUpdate.Id, companyId).Select(s => s.SentToId).ToArray();

                        for (int i = 0; i < invitees.Length; i++)
                        {
                            _notice.SendNotification(invitees[i], RecipientType.company, NotificationType.ProjectChange, toUpdate.Id, EntityType.Project);
                        }

                        return RedirectToRoute("Default", new { controller = "Project", action = "Details", id = toUpdate.Id });
                    }
                    else
                    {
                        Util.MapValidationErrors(_service.ValidationDic, this.ModelState);
                        rePopViewModel(viewModel);
                        return View("Edit", viewModel);
                    }
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError("Exception", ex.Message);
                    rePopViewModel(viewModel);
                    return View("Edit", viewModel);
                }
            }
            else
            {
                rePopViewModel(viewModel);
                return View("Edit", viewModel);
            }
        }
Пример #5
0
 // GET: /Projects/Edit/3
 public ActionResult Edit(int id)
 {
     var raw = _service.Get(id);
     ProjectEditModel viewModel = new ProjectEditModel
     {
         Architect = raw.Architect.CompanyName,
         ArchitectId = raw.ArchitectId,
         Address = raw.Address,
         BidDateTime = raw.BidDateTime,
         BuildingTypeId = raw.BuildingTypeId,
         City = raw.City,
         ConstructionTypeId = raw.ConstructionTypeId,
         Description = raw.Description,
         Id = raw.Id,
         PostalCode = raw.PostalCode,
         StateId = raw.StateId,
         Title = raw.Title,
         WalkThruDateTime = raw.WalkThruDateTime,
         WalkThruStatus = raw.WalkThruStatus,
         Number = raw.Number,
         ProjectCategory = raw.ProjectCategory,
         ProjectType = raw.ProjectType,
         HiddenFromSearch = raw.HiddenFromSearch,
         InvitationOnly = raw.InvitationOnly
     };
     rePopViewModel(viewModel);
     return View("Edit", viewModel);
 }
Пример #6
0
        public ActionResult CreateStepTwo(ProjectEditModel viewModel)
        {
            if (!viewModel.ProjectCategory.HasValue)
                ModelState.AddModelError("ProjectCategory", "Project Category is required");
            if (!viewModel.ProjectType.HasValue)
                ModelState.AddModelError("ProjectType", "Project Type is required");

            if (ModelState.IsValid)
            {
                try
                {

                    int userId = _security.GetUserId(User.Identity.Name);
                    int companyId = _service.GetUserProfile(userId).CompanyId;

                    // create project
                    BCModel.Projects.Project toCreate = new BCModel.Projects.Project
                    {
                        Number = viewModel.Number,
                        ArchitectId = viewModel.ArchitectId,
                        Address = viewModel.Address,
                        BidDateTime = viewModel.BidDateTime,
                        BuildingTypeId = viewModel.BuildingTypeId,
                        City = viewModel.City,
                        ConstructionTypeId = viewModel.ConstructionTypeId,
                        CreatedById = userId,
                        Description = viewModel.Description,
                        PostalCode = viewModel.PostalCode,
                        ProjectType = viewModel.ProjectType.Value,
                        ProjectCategory = viewModel.ProjectCategory.Value,
                        StateId = viewModel.StateId,
                        Title = viewModel.Title,
                        Scopes = new List<ProjectXScope>(),
                        BidPackages = new List<BidPackage>(),
                        WalkThruDateTime = viewModel.WalkThruDateTime,
                        WalkThruStatus = viewModel.WalkThruStatus.Value,
                        HiddenFromSearch = viewModel.HiddenFromSearch,
                        InvitationOnly = viewModel.InvitationOnly
                    };

                    GeoLocator locator = new GeoLocator();

                    string state = _service.GetStates().Where(x => x.Id == viewModel.StateId).FirstOrDefault().Abbr;

                    if (viewModel.Address == null || viewModel.Address == string.Empty)
                    {
                        toCreate.GeoLocation = locator.GetFromCityStateZip(viewModel.City, state, viewModel.PostalCode);
                    }
                    else
                    {
                        toCreate.GeoLocation = locator.GetFromAddress(viewModel.Address, viewModel.City, state, viewModel.PostalCode);
                    }

                    // create master bid package
                    BidPackage projectPackage = new BidPackage
                    {
                        IsMaster = true,
                        BidDateTime = toCreate.BidDateTime,
                        Description = "Master Bid Package",
                        CreatedById = viewModel.ArchitectId,
                        Project = toCreate,
                        Scopes = new List<BidPackageXScope>(),
                        Invitees = new List<Invitation>()
                    };

                    // if user is a GC, self-invite
                    if (_security.IsUserInRole("general_contractor"))
                    {
                        projectPackage.Invitees.Add(new Invitation
                        {
                            BidPackage = projectPackage,
                            SentToId = companyId,
                            SentDate = DateTime.Now,
                            AcceptedDate = DateTime.Now,
                            InvitationType = InvitationType.SentFromCreatedBy
                        });
                    }

                    // add bp to project
                    toCreate.BidPackages.Add(projectPackage);

                    // set selected scopes for bp and project
                    for (int i = 0; i < viewModel.SelectedScope.Count(); i++)
                    {
                        toCreate.Scopes.Add(new ProjectXScope { Project = toCreate, ScopeId = viewModel.SelectedScope.ElementAt(i) });
                        projectPackage.Scopes.Add(new BidPackageXScope { BidPackage = projectPackage, ScopeId = viewModel.SelectedScope.ElementAt(i) });
                    }

                    // add project to system
                    if (_service.Create(toCreate))
                    {
                        return RedirectToRoute("Default", new { controller = "Project", action = "Details", id = toCreate.Id });
                    }
                    else
                    {
                        Util.MapValidationErrors(_service.ValidationDic, this.ModelState);
                        rePopViewModel(viewModel);
                        return View("CreateStepTwo", viewModel);
                    }
                }
                catch (Exception ex)
                {

                    ModelState.AddModelError("Exception", ex.Message);
                    rePopViewModel(viewModel);
                    return View("CreateStepTwo", viewModel);
                }
            }

            // modelstate is not valid
            rePopViewModel(viewModel);
            return View("CreateStepTwo", viewModel);
        }
Пример #7
0
        public void Post_CreateStepTwo_ValidProject_RedirectsTo_Details()
        {
            // arrange
            ProjectEditModel viewModel = new ProjectEditModel();
            viewModel.SelectedScope = new int[0];

            Mock<IProjectServiceLayer> service = new Mock<IProjectServiceLayer>();
            service.Setup(s => s.Create(It.IsAny<BCModel.Projects.Project>())).Returns(true);
            service.Setup(s => s.GetUserProfile(It.IsAny<int>())).Returns(new BCModel.UserProfile { CompanyId = 1, UserId = 1 });

            Mock<IWebSecurityWrapper> security = new Mock<IWebSecurityWrapper>();
            security.Setup(s => s.GetUserId(It.IsAny<string>())).Returns(1);
            Mock<INotificationSender> notice = new Mock<INotificationSender>();
            ProjectController controller = new ProjectController(service.Object, security.Object, notice.Object);

            Mock<IPrincipal> principal = new Mock<IPrincipal>();
            principal.Setup(p => p.Identity.Name).Returns("*****@*****.**");

            Mock<ControllerContext> context = new Mock<ControllerContext>();
            context.SetupGet(c => c.HttpContext.User.Identity.Name).Returns("*****@*****.**");
            context.SetupGet(c => c.HttpContext.Request.IsAuthenticated).Returns(true);

            controller.ControllerContext = context.Object;

            // act
            var result = controller.CreateStepTwo(viewModel);

            // assert
            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
            Assert.AreEqual("Details", ((RedirectToRouteResult)result).RouteValues["action"]);
        }
Пример #8
0
        public void PostEditValidProjectRedirectsToDetails()
        {
            // arrange
            ProjectEditModel viewModel = new ProjectEditModel { Id = 1, PostalCode = "98008" };
            viewModel.SelectedScope = new int[0];
            Project aProject = new Project
            {
                Id = 1,
                ArchitectId = 1,
                Scopes = new List<ProjectXScope>(),
                BidPackages = new List<BidPackage>(),
                Title = "foo"
            };
            aProject.BidPackages.Add(new BidPackage { Id = 1, IsMaster = true, Project = aProject, ProjectId = aProject.Id, Scopes = new List<BidPackageXScope>(), CreatedById = 1 });

            Mock<IProjectServiceLayer> service = new Mock<IProjectServiceLayer>();
            service.Setup(s => s.Update(It.IsAny<BCModel.Projects.Project>())).Returns(true);
            service.Setup(s => s.GetUserProfile(It.IsAny<int>())).Returns(new BCModel.UserProfile { CompanyId = 1, UserId = 1 });
            service.Setup(s => s.Get(It.IsAny<int>())).Returns(aProject);

            Mock<IWebSecurityWrapper> security = new Mock<IWebSecurityWrapper>();
            security.Setup(s => s.GetUserId(It.IsAny<string>())).Returns(1);
            Mock<INotificationSender> notice = new Mock<INotificationSender>();
            ProjectController controller = new ProjectController(service.Object, security.Object, notice.Object);

            Mock<IPrincipal> principal = new Mock<IPrincipal>();
            principal.Setup(p => p.Identity.Name).Returns("*****@*****.**");

            Mock<ControllerContext> context = new Mock<ControllerContext>();
            context.SetupGet(c => c.HttpContext.User.Identity.Name).Returns("*****@*****.**");
            context.SetupGet(c => c.HttpContext.Request.IsAuthenticated).Returns(true);

            controller.ControllerContext = context.Object;

            // act
            var result = controller.Edit(viewModel);

            // assert
            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
            Assert.AreEqual("Details", ((RedirectToRouteResult)result).RouteValues["action"]);
        }
Пример #9
0
        public void PostCreateStepTwoProjectValidationFailReturnsModelStateErrors()
        {
            // arrange
            ProjectEditModel viewModel = new ProjectEditModel();
            viewModel.SelectedScope = new int[0];

            Mock<IProjectServiceLayer> service = new Mock<IProjectServiceLayer>();
            service.Setup(s => s.Create(It.IsAny<BCModel.Projects.Project>())).Returns(false);
            service.Setup(s => s.GetUserProfile(It.IsAny<int>())).Returns(new BCModel.UserProfile { CompanyId = 1, UserId = 1 });
            service.SetupGet(s => s.ValidationDic).Returns(new Dictionary<string, string> { { "Duplicate", "Title already exists" } });

            Mock<IWebSecurityWrapper> security = new Mock<IWebSecurityWrapper>();
            security.Setup(s => s.GetUserId(It.IsAny<string>())).Returns(1);
            Mock<INotificationSender> notice = new Mock<INotificationSender>();
            ProjectController controller = new ProjectController(service.Object, security.Object, notice.Object);

            Mock<IPrincipal> principal = new Mock<IPrincipal>();
            principal.Setup(p => p.Identity.Name).Returns("*****@*****.**");

            Mock<ControllerContext> context = new Mock<ControllerContext>();
            context.SetupGet(c => c.HttpContext.User.Identity.Name).Returns("*****@*****.**");
            context.SetupGet(c => c.HttpContext.Request.IsAuthenticated).Returns(true);

            controller.ControllerContext = context.Object;

            // act
            var result = controller.CreateStepTwo(viewModel);

            // assert
            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(ViewResult));
            Assert.AreEqual("CreateStepTwo", ((ViewResult)result).ViewName);
            Assert.IsTrue(((ViewResult)result).ViewData.ModelState.ContainsKey("Duplicate"));
            Assert.AreEqual("Title already exists", ((ViewResult)result).ViewData.ModelState["Duplicate"].Errors[0].ErrorMessage.ToString());
        }