using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Web; using EnVisage.Models; namespace EnVisage.Code.BLL { public class TeamManager : ManagerBase { public TeamManager(EnVisageEntities dbContext) : base(dbContext) { } protected override Team InitInstance() { return new Team { Id = Guid.NewGuid() }; } protected override Team RetrieveReadOnlyById(Guid key) { var team = DataTable.AsNoTracking().FirstOrDefault(t => t.Id == key); team.PeopleResources = team.PeopleResources.OrderBy(r => r.LastName).ToList(); return team; } public override DbSet DataTable { get { return DbContext.Teams; } } public TeamModel LoadWithChildCollections(Guid? value, bool isReadOnly = true) { TeamModel result = (TeamModel)base.Load(value, isReadOnly); return result; } public override Team Save(TeamModel model) { Team team = null; if (Guid.Empty.Equals(model.Id)) { team = base.Save(model); var capScen = DbContext.Scenarios.Create(); capScen.Type = (int)ScenarioType.TeamPlannedCapacity; capScen.Name = model.Name + " Planned Capacity"; capScen.Id = Guid.NewGuid(); team.PlannedCapacityScenarioId = capScen.Id; team.Id = Guid.NewGuid(); DbContext.Scenarios.Add(capScen); DbContext.SaveChanges(); if (model.UserId != null) { foreach (var userId in model.UserId) { var user2Team = DbContext.User2Team.Create(); user2Team.Id = Guid.NewGuid(); user2Team.TeamId = team.Id; user2Team.UserId = userId.ToString(); DbContext.User2Team.Add(user2Team); } } if (model.ViewId != null) { foreach (var itemId in model.ViewId) { var team2View = DbContext.Team2View.Create(); team2View.Id = Guid.NewGuid(); team2View.TeamId = team.Id; team2View.ViewId = itemId; DbContext.Team2View.Add(team2View); } } } else { team = base.Save(model); var projects = (from c in DbContext.Team2Project where c.TeamId == model.Id select c.ProjectId).Distinct().ToList(); var users = DbContext.User2Team.Where(x => x.TeamId == model.Id).ToList(); var users2remove = users.Where(x => model.UserId == null || !model.UserId.Contains(Guid.Parse(x.UserId))).Select(x => x.UserId).ToList(); users.Where(x => model.UserId == null || !model.UserId.Contains(Guid.Parse(x.UserId))).ToList(). ForEach(x => DbContext.Entry(x).State = EntityState.Deleted); if (model.UserId != null) foreach (var userId in model.UserId.Where(c => users.All(u => !c.ToString().Equals(u.UserId, StringComparison.InvariantCultureIgnoreCase)))) { var user2Team = DbContext.User2Team.Create(); user2Team.Id = Guid.NewGuid(); user2Team.TeamId = team.Id; user2Team.UserId = userId.ToString(); DbContext.Entry(user2Team).State = EntityState.Added; } foreach (var project in projects) { var projectUsers = (from c in DbContext.ProjectAccesses where c.ProjectId == project select c.PrincipalId).Distinct().ToList(); DbContext.ProjectAccesses.RemoveRange(DbContext.ProjectAccesses.Where(x => x.ProjectId == project && users2remove.Contains(x.PrincipalId.ToString())).ToList()); foreach (var userId in (from c in model.UserId where !projectUsers.Contains(c) select c).Distinct().ToList()) { DbContext.ProjectAccesses.Add(new ProjectAccess() { PrincipalId = userId, ProjectId = project, Read = 1, Write = 1 }); } } var existingViews = DbContext.Team2View.Where(x => x.TeamId == model.Id).ToList(); existingViews.Where(x => model.ViewId == null || !model.ViewId.Contains(x.ViewId)).ToList(). ForEach(x => DbContext.Entry(x).State = EntityState.Deleted); if (model.ViewId != null) foreach (var itemId in model.ViewId.Where(c => existingViews.All(u => !c.Equals(u.ViewId)))) { var team2View = DbContext.Team2View.Create(); team2View.Id = Guid.NewGuid(); team2View.TeamId = team.Id; team2View.ViewId = itemId; DbContext.Entry(team2View).State = EntityState.Added; } } return team; } public IList GetTeamsByUser(Guid? userId) { if (userId.HasValue) { var user2team = DbContext.User2Team.Where(t => t.UserId == userId.Value.ToString()).Select(t => t.TeamId).ToArray(); var teams = DataTable.Where(t => user2team.Contains(t.Id)).AsNoTracking().ToList(); teams.ForEach(t => t.PeopleResources = t.PeopleResources.OrderBy(r => r.LastName).ToList()); return teams; } return new List(); } } }