EnVisageOnline/Beta/Source/EnVisage/Code/BLL/TeamManager.cs

146 lines
6.0 KiB
C#

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<Team, TeamModel>
{
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<Team> 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<Team> 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<Team>();
}
}
}