private static void CompletePeriodTunnel([NotNull] GanttSourceBuilder source) { void Loop(TicketBuilder ticket, IDateRange range) { if (ticket.EstimatedPeriod.Start == default) { ticket.EstimatedPeriod.Start = range.Start; } if (ticket.EstimatedPeriod.End == default) { ticket.EstimatedPeriod.End = range.End; } foreach (var child in ticket.Children) { Loop(child, ticket.EstimatedPeriod); } } foreach (var project in source.Projects) { var range = new DateRangeBuilder { Start = project.Tickets.Select(x => x.EstimatedPeriod).Minimum(), End = project.Tickets.Select(x => x.EstimatedPeriod).Maximum(), }; foreach (var ticket in project.Tickets) { Loop(ticket, range); } } }
/// <summary> /// ボトム アップ戦略で、<see cref="IGanttSource"/> のサブプロパティに可能な限り値を設定します。 /// </summary> /// <param name="source">値を設定する対象の <see cref="GanttSourceBuilder"/>。</param> /// <exception cref="ArgumentNullException"><paramref name="source"/> が <c>null</c> です。</exception> public static void CompleteBubble([NotNull] GanttSourceBuilder source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } foreach (var project in source.Projects) { foreach (var ticket in project.Tickets) { CompleteBubble(ticket); } } }
private static void CompleteStatus([NotNull] GanttSourceBuilder source) { void Loop(TicketBuilder ticket) { foreach (var child in ticket.Children) { Loop(child); } if (ticket.Status != TicketStatus.Unknown) { return; } if (ticket.EstimatedPeriod.Start == default || ticket.EstimatedPeriod.End == default) { return; } if (DateTime.Today < ticket.EstimatedPeriod.Start && (ticket.ActualPeriod.Start == default || ticket.ActualPeriod.End == default)) { return; } if (ticket.ActualPeriod.Start != default && ticket.ActualPeriod.End != default) { ticket.Status = TicketStatus.Completed; } else if (ticket.ActualPeriod.Start != default && DateTime.Today <= ticket.EstimatedPeriod.End) { ticket.Status = TicketStatus.Doing; } else { ticket.Status = TicketStatus.Delayed; } } foreach (var project in source.Projects) { foreach (var ticket in project.Tickets) { Loop(ticket); } } }
/// <summary> /// トップ ダウン戦略で、<see cref="IGanttSource"/> のサブプロパティに可能な限り値を設定します。 /// </summary> /// <param name="source">値を設定する対象の <see cref="GanttSourceBuilder"/>。</param> /// <exception cref="ArgumentNullException"><paramref name="source"/> が <c>null</c> です。</exception> public static void CompleteTunnel([NotNull] GanttSourceBuilder source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } foreach (var project in source.Projects) { var range = new DateRangeBuilder { Start = project.Tickets.Select(x => x.EstimatedPeriod).Minimum(), End = project.Tickets.Select(x => x.EstimatedPeriod).Maximum(), }; foreach (var ticket in project.Tickets) { CompleteTunnel(ticket, range); } } }
private static void CompletePeriodBubble([NotNull] GanttSourceBuilder source) { void Loop(TicketBuilder ticket) { if (ticket.Children.Count == 0) { return; } foreach (var child in ticket.Children) { Loop(child); } if (ticket.EstimatedPeriod.Start == default) { ticket.EstimatedPeriod.Start = ticket.Children.Select(x => x.EstimatedPeriod).Minimum(); } if (ticket.EstimatedPeriod.End == default) { ticket.EstimatedPeriod.End = ticket.Children.Select(x => x.EstimatedPeriod).Maximum(); } if (ticket.ActualPeriod.Start == default) { ticket.ActualPeriod.Start = ticket.Children.Select(x => x.ActualPeriod).Minimum(); } if (ticket.ActualPeriod.End == default && ticket.Children.All(x => x.ActualPeriod.End != default)) { ticket.ActualPeriod.End = ticket.Children.Select(x => x.ActualPeriod).Maximum(); } } foreach (var project in source.Projects) { foreach (var ticket in project.Tickets) { Loop(ticket); } } }