private CPMresult CPM(IEnumerable <dtoCPMactivity> activities, DateTime?startdate = null, FlagDayOfWeek workweek = FlagDayOfWeek.WorkWeek, IEnumerable <DateTime> exceptions = null, Int32 dailyworkhours = 8, IEnumerable <dtoCPMlink> links = null) { CPMresult result = new CPMresult(); Dictionary <Int64, dtoCPMactivity> dict = new Dictionary <long, dtoCPMactivity>(); foreach (var act in activities) { dict.Add(act.Id, act); } result.Activities = activities.ToList(); if (!result.Activities.Where(x => x.Id == -1).Any()) { dtoCPMactivity vActivity = new dtoCPMactivity(-1, "end") { Duration = 0, IsVirtual = true }; result.Activities.Add(vActivity); dict.Add(-1, vActivity); CPMExtensions.ParseActivityLinks(-1, "*", dict); } result.Activities.CriticalPathMethod(); result.ProjectLength = activities.CriticalPathLength(); if (startdate != null && startdate.HasValue) { result.AvailableDates = startdate.Value.GenerateAvailableDates(result.ProjectLength, workweek, exceptions).ToList(); result.Activities.CalculateDate(result.AvailableDates, dailyworkhours); result.ProjectStartDate = startdate; result.ProjectEndDate = result.Activities.CriticalPathEnd(); result.isDeadlined = result.Activities.isDeadlined(); result.DeadlinedActivities = result.Activities.DeadlinedActivities().ToList(); } result.Critical = activities.CriticalPath().ToList(); result.Activities = result.Activities.Where(x => x.Id > 0).ToList(); foreach (var item in result.Activities) { //todo check if it's correct item.Successors = item.Successors.Where(x => x.isVirtual == false).ToList(); } //todo remove virtual links and activities return(result); }
public IList <dtoCPMactivity> PreprocessSummaryMilestones(IList <dtoCPMactivity> activities) { //Start Preparation var summaries = activities.Where(x => x.IsSummary).OrderByDescending(x => x.Id).ToList(); //var summaries = activities.Where(x => x.IsSummary).ToList(); foreach (var summary in summaries) { dtoCPMactivity startMilestone = new dtoCPMactivity() { Name = String.Format("{0}-{1}", summary.Id, "start"), Duration = 0, IsVirtual = true, Id = activities.Max(x => x.Id) + 1, DisplayOrder = activities.Max(x => x.Id) + 1 }; dtoCPMactivity endMilestone = new dtoCPMactivity() { Name = String.Format("{0}-{1}", summary.Id, "end"), Duration = 0, IsVirtual = true, Id = activities.Max(x => x.Id) + 2, DisplayOrder = activities.Max(x => x.Id) + 2 }; startMilestone.Parent = summary; startMilestone.IdParent = summary.Id; endMilestone.Parent = summary; endMilestone.IdParent = summary.Id; summary.Children.Add(startMilestone); summary.Children.Add(endMilestone); activities.Add(startMilestone); activities.Add(endMilestone); if (summary.Parent != null) { dtoCPMlink parentlink = new dtoCPMlink() { IdSource = startMilestone.Id, Source = startMilestone, Target = summary.Parent, IdTarget = summary.IdParent, isVirtual = true }; startMilestone.Predecessors.Add(parentlink); summary.Parent.Successors.Add(parentlink); } foreach (var children in summary.Children.Where(x => x.IsVirtual == false && x.IsSummary == false)) { dtoCPMlink startlink = new dtoCPMlink() { IdSource = children.Id, Source = children, Target = startMilestone, IdTarget = startMilestone.Id, isVirtual = true }; startMilestone.Successors.Add(startlink); children.Predecessors.Add(startlink); dtoCPMlink endlink = new dtoCPMlink() { IdSource = endMilestone.Id, Source = endMilestone, Target = children, IdTarget = children.Id, isVirtual = true }; children.Successors.Add(endlink); endMilestone.Predecessors.Add(endlink); } //foreach (var children in summary.Children.Where(x => x.IsVirtual == false)) //{ //} foreach (var predec in summary.Predecessors.ToList()) { predec.Source = startMilestone; predec.IdSource = startMilestone.Id; //switch (predec.Type) //{ // case PmActivityLinkType.FinishStart: // //dtoCPMlink prefs = new dtoCPMlink() { IdTarget = vs.Id, Target = vs, Source = predec.Target, IdSource = predec.IdTarget, isVirtual = true }; // //vs.Predecessors.Add(prefs); // //predec.Target.Successors.Add(prefs); // break; // case PmActivityLinkType.StartStart: // //dtoCPMlink presss = new dtoCPMlink() { IdTarget = vs.Id, Target = vs, Source = predec.Target, IdSource = predec.IdTarget, isVirtual = true, Type = PmActivityLinkType.StartStart }; // //vs.Predecessors.Add(presss); // //predec.Target.Successors.Add(presss); // break; // default: // break; //} } foreach (var succ in summary.Successors.ToList()) { succ.Target = endMilestone; succ.IdTarget = endMilestone.Id; //succ.Source = ve; //succ.IdSource = ve.Id; //switch (succ.Type) //{ // case PmActivityLinkType.FinishStart: // //dtoCPMlink prefs = new dtoCPMlink() { IdTarget = ve.Id, Target = ve, Source = succ.Source, IdSource = succ.IdSource, isVirtual = true }; // //ve.Predecessors.Add(prefs); // //succ.Target.Successors.Add(prefs); // break; // case PmActivityLinkType.StartStart: // //dtoCPMlink presss = new dtoCPMlink() { IdTarget = ve.Id, Target = ve, Source = succ.Source, IdSource = succ.IdSource, isVirtual = true, Type = PmActivityLinkType.StartStart }; // //ve.Predecessors.Add(presss); // //succ.Target.Successors.Add(presss); // break; // default: // break; //} } //summary.Successors.Clear(); //summary.Predecessors.Clear(); } //End Preparation return(activities); }
//public static dtoCPMactivityLink CreateLink(dtoCPMactivity source, dtoCPMactivity target, Int32 leadlag = 0, PmActivityLinkType type = PmActivityLinkType.FinishStart) //{ // dtoCPMactivityLink link = new dtoCPMactivityLink() { Source = source, Target = target, LeadLag = leadlag, Type = type }; // return link; //} public static IEnumerable <dtoCPMactivity> Predecessors(this dtoCPMactivity activity) { return((from item in activity.Predecessors select item.Target).ToList()); }