/// <summary>アクティビティを定義する</summary> /// <param name="id">ID</param> /// <param name="name">名称</param> /// <param name="externalCost">支出</param> /// <param name="income">収入</param> /// <param name="fixTime">固定時間</param> /// <param name="workLoad">作業量</param> /// <param name="failRate">失敗確率</param> /// <param name="reworkRate">リワーク確率</param> /// <param name="costOverRate">コスト超過確率</param> /// <returns></returns> public static Activity Define( string id = null, string name = null, decimal externalCost = 0m, decimal income = 0m, decimal fixTime = 0m, decimal workLoad = 0m, decimal failRate = 0m, decimal reworkRate = 0m, decimal costOverRate = 0m) { Contract.Requires(!id.IsNullOrEmpty()); Contract.Requires(!name.IsNullOrEmpty()); var activity = new Activity() { Id = id, Name = name, }; activity.Estimate(Cost.Of(externalCost)); activity.Estimate(Income.Of(income)); activity.Estimate(LeadTime.Of(fixTime)); activity.Estimate(WorkLoad.Of(workLoad)); activity.Estimate(Risk.Of(failRate: failRate, reworkRate: reworkRate, costOverRate: costOverRate)); return(activity); }
/// <summary>演算子のオーバーロード</summary> /// <param name="x">1項</param> /// <param name="y">2項</param> /// <returns>積</returns> public static LeadTime operator /(WorkLoad x, IEnumerable <Resource> y) { Contract.Requires(!y.IsNullOrEmpty()); Contract.Requires(y.All(r => r.Quantity != 0)); Contract.Requires(y.All(r => r.Productivity != 0)); return(LeadTime.Of(x.Value / y.Sum(r => r.Quantity * r.Productivity))); }
public static Activity Activity( decimal income = 0m, decimal externalCost = 0m, decimal failRate = 0m, decimal reworkRate = 0m, decimal costoverRate = 0m, State state = State.ToDo, decimal fixTime = 0m, decimal workLoad = 0m, decimal resourceQuantity = 0m, decimal resourceProductivity = 0m ) { var activity = new Activity(); activity.Estimate(Income.Of(income)); activity.Estimate(Cost.Of(externalCost)); activity.Estimate(Risk.Of(failRate, reworkRate, costoverRate)); activity.Estimate(LeadTime.Of(fixTime)); activity.Estimate(WorkLoad.Of(workLoad)); if (resourceQuantity != 0m && resourceProductivity != 0m) { activity.Assign(new[] { Resource.Of(resourceQuantity, resourceProductivity) }); } activity.Progress(state); return(activity); }
/// <summary>最早着手日を求める</summary> /// <returns>最早着手日</returns> public LeadTime EarliestStart() { if (Parents.IsEmpty()) { return(LeadTime.Of(0m)); } return(Parents.Max(a => a.EarliestFinish())); }
public void 見積後のアクティビティの固定時間は与えられたものであるべき() { var expectedValue = 100m; var activity = Activity.Define(); activity.Estimate(LeadTime.Of(expectedValue)); activity.FixTime.Value.Is(expectedValue); }
/// <summary>LeadTime型用の集計関数</summary> /// <param name="source">対象</param> /// <returns>集計結果</returns> public static LeadTime Sum(this IEnumerable <LeadTime> source) { var sum = LeadTime.Of(); foreach (var item in source) { sum += item; } return(sum); }
/// <summary>所要期間を求める</summary> /// <returns>所要期間</returns> /// <remarks> /// 固定時間がある場合は固定時間 /// 固定時間がない場合は作業量/総資源生産性 /// </remarks> public LeadTime Duration() { if (FixTime.Value != 0m) { return(FixTime); } else if (WorkLoad.Value == 0m) { return(LeadTime.Of()); } else { return(WorkLoad / Resources); } }
/// <summary>DRAGを求める</summary> /// <returns>DRAG</returns> /// <remarks> /// アクティビティの所要時間をゼロにした場合の完了時間の変化 /// 非クリティカル・パスの場合はゼロ /// クリティカル・パスの場合は並列アクティビティの有無で変化する /// </remarks> public LeadTime Drag() { if (Children.IsNullOrEmpty()) { return(Duration()); } var originalEndTime = Descendants.Where(d => d.Children.IsEmpty()).First().EarliestFinish().Value; var originalFixTime = FixTime; var originalWorkload = WorkLoad; Estimate(LeadTime.Of()); Estimate(WorkLoad.Of()); var shortenedEndTime = Descendants.Where(d => d.Children.IsEmpty()).First().EarliestFinish().Value; var drag = originalEndTime - shortenedEndTime; Estimate(originalFixTime); Estimate(originalWorkload); return(LeadTime.Of(drag)); }
/// <summary>静的ファクトリーメソッド</summary> /// <param name="unitOfCurrency">通貨単位</param> /// <param name="unitOfTime">時間単位</param> /// <param name="term">プロジェクト期間</param> /// <param name="badjet"></param> /// <param name="liquidatedDamages"></param> /// <returns></returns> public static Project Define( Currency unitOfCurrency = Currency.JPY, TimeType unitOfTime = TimeType.Day, decimal term = 0m, decimal badjet = 0m, decimal liquidatedDamages = 0m ) { var project = new Project() { UnitOfCurrency = unitOfCurrency, UnitOfTime = unitOfTime, Term = LeadTime.Of(term), Badjet = Money.Of(badjet), LiquidatedDamages = Money.Of(liquidatedDamages), }; project.Start.Precede(project.End); project.Activities = new[] { project.Start, project.End }; return(project); }