예제 #1
0
        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);
                }
            }
        }
예제 #2
0
 /// <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);
         }
     }
 }
예제 #3
0
        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);
                }
            }
        }
예제 #4
0
 /// <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);
         }
     }
 }
예제 #5
0
        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);
                }
            }
        }