EnVisageOnline/Main/Source/EnVisage/Code/WorkFlowEngine/Approvers.cs

150 lines
7.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EnVisage.Code.BLL;
namespace EnVisage.Code
{
public class Approvers
{
//Must be а public property to serialize to JSON
public Dictionary<Guid, bool> ApproversDictionary { get; set; }
public Dictionary<Guid, Dictionary<Guid, bool>> TeamApproversDictionary { get; set; }
public WorkFlowApprovalType Type { get; set; }
public Approvers(Guid ProcessId, WorkFlowApprovalType approvalType, string step, string workflowRole)
{
Type = approvalType;
TeamApproversDictionary = new Dictionary<Guid, Dictionary<Guid, bool>>();
ApproversDictionary = new Dictionary<Guid, bool>();
var _runtime = WorkFlowEngine.Runtime(null);
var p = (OptimaJet.Workflow.DbPersistence.MSSQLProvider) _runtime.PersistenceProvider;
using (var context = EnVisageEntities.PrevuEntity(p.ConnectionString, true))
{
var scenario = context.Scenarios.Where(x => x.Id == ProcessId).FirstOrDefault();
if (scenario == null)
return;
var ECLists = context.ScenarioDetail.Where(x => x.ParentID == scenario.Id).Select(x => x.ExpenditureCategoryId).Distinct().ToList();
var project = context.Projects.Where(x => x.Id == scenario.ParentId).FirstOrDefault();
if (project == null)
return;
var creditIds = context.ScenarioDetail.Where(x => x.ParentID == scenario.Id).Select(x => x.ExpenditureCategory.CreditId).Distinct().ToList();
if (approvalType == WorkFlowApprovalType.Project)
ApproversDictionary = (new WorkFlowManager(context)).GetProjectApproversForRole(project.Id, step, ProcessId, workflowRole);
if (approvalType == WorkFlowApprovalType.Team || approvalType == WorkFlowApprovalType.AllTeam || approvalType == WorkFlowApprovalType.COSTCENTER || approvalType == WorkFlowApprovalType.TeamToEC)
{
var teams = new List<Team>();
if (approvalType == WorkFlowApprovalType.AllTeam)
teams = context.Teams.ToList();
else if (approvalType == WorkFlowApprovalType.Team)
teams = project.Team2Project.Where(x => x.ProjectId == project.Id).Select(x => x.Team).ToList();
else if (approvalType == WorkFlowApprovalType.COSTCENTER)
teams = context.Teams.Where(x => creditIds.Contains((x.CostCenterId.HasValue ? x.CostCenterId.Value : Guid.Empty))).ToList();
else if (approvalType == WorkFlowApprovalType.TeamToEC) {
var teamids = context.VW_TeamResource.Where(x => ECLists.Contains(x.ExpenditureCategoryId)).Select(x => x.TeamId).Distinct().ToList();
teams = context.Teams.Where(x => teamids.Contains(x.Id)).Distinct().ToList();
}
var teamIds = teams.Select(x => x.Id).ToList();
var deadApprovals = context.WorkFlowParallelApprovals.Where(x => x.ProcessId == scenario.Id && x.IsActive == true && !teamIds.Contains(x.GroupId.Value));
if (deadApprovals.Count() > 0)
context.WorkFlowParallelApprovals.RemoveRange(deadApprovals);
foreach (var team in teams)
{
var userLevelApproval = new Dictionary<Guid, bool>();
var teamApvs = new Dictionary<Guid, bool>();
var approvalKey = Guid.NewGuid();
if (approvalType == WorkFlowApprovalType.COSTCENTER)
{
teamApvs = (new WorkFlowManager(context)).GetCostCenterApproversForRole(team.Id, step, ProcessId, workflowRole, team.CostCenterId.Value);
approvalKey = team.CostCenterId.Value;
}
else {
teamApvs = (new WorkFlowManager(context)).GetTeamApproversForRole(team.Id, step, ProcessId, workflowRole);
approvalKey = team.Id;
}
if (TeamApproversDictionary.ContainsKey(approvalKey))
userLevelApproval = TeamApproversDictionary[approvalKey];
foreach (var apv in teamApvs)
{
if (!userLevelApproval.ContainsKey(apv.Key))
userLevelApproval.Add(apv.Key, apv.Value);
}
if (userLevelApproval.Count > 0)
{
if (TeamApproversDictionary.ContainsKey(approvalKey))
TeamApproversDictionary[approvalKey] = userLevelApproval;
else
TeamApproversDictionary.Add(approvalKey, userLevelApproval);
}
}
}
if (approvalType == WorkFlowApprovalType.ADHOC)
{
var approvers = context.WorkFlowParallelApprovals.Where(x => x.StepName == step && x.ProcessId == ProcessId && x.IsActive == true).ToList();
foreach (var a in approvers)
{
if (!ApproversDictionary.ContainsKey(a.UserId))
ApproversDictionary.Add(a.UserId, a.Approved.HasValue ? a.Approved.Value : false);
}
}
context.SaveChanges();
}
}
[JsonIgnore]
public bool IsApproved
{
get
{
if (Type == WorkFlowApprovalType.Project || Type == WorkFlowApprovalType.ADHOC)
return ApproversDictionary.Values.All(v => v);
else
{
foreach (var teamApvs in TeamApproversDictionary.Values)
{
if (!teamApvs.Values.Any(v => v))
return false;
}
return true;
}
}
}
public bool NotApproved
{
get {
if (Type == WorkFlowApprovalType.Project || Type == WorkFlowApprovalType.ADHOC)
return !ApproversDictionary.Values.All(v => v);
else
{
foreach (var teamApvs in TeamApproversDictionary.Values)
{
if (!teamApvs.Values.All(v => v))
return true;
}
return false;
}
}
}
public void Approve(Guid userid,bool approved, Guid ProcessId,string step)
{
ApproversDictionary[userid] = true;
var _runtime = WorkFlowEngine.Runtime(null);
var p = (OptimaJet.Workflow.DbPersistence.MSSQLProvider) _runtime.PersistenceProvider;
using (var context = EnVisageEntities.PrevuEntity(p.ConnectionString, true))
{
var projectId = context.Scenarios.Where(x => x.Id == ProcessId).Select(x => x.ParentId).FirstOrDefault();
(new WorkFlowManager(context)).SetApprovalValue(userid, approved, ProcessId, step, this.Type, projectId.Value);
context.SaveChanges();
}
}
public List<Guid> GetAvailiableApprovers()
{
return ApproversDictionary.Where(s => !s.Value).Select(s => s.Key).ToList();
}
}
}