Beispiel #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);
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// 指定したテンプレートをもとにガント チャートを構築します。
        /// </summary>
        /// <param name="source">ガント チャートの構築に使用するデータ。</param>
        /// <param name="template">ガント チャートのテンプレート。</param>
        /// <param name="destination">構築したガント チャートの出力先。</param>
        /// <exception cref="ArgumentNullException"><paramref name="source"/> または <paramref name="template"/> または <paramref name="destination"/> が <c>null</c> です。</exception>
        public static void BuildGanttChart([NotNull] this IGanttSource source, [NotNull] string template, [NotNull] string destination)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }
            if (template == null)
            {
                throw new ArgumentNullException(nameof(template));
            }
            if (destination == null)
            {
                throw new ArgumentNullException(nameof(destination));
            }

            XSSFWorkbook workbook;

            using (var stream = File.OpenRead(template))
            {
                workbook = new XSSFWorkbook(stream);
            }

            var worksheet = workbook.GetSheet("ガントチャート");

            var dateRange = new DateRangeBuilder
            {
                Start = source.Projects.SelectMany(x => x.Tickets).SelectMany(x => new[] { x.EstimatedPeriod, x.ActualPeriod }).Minimum(),
                End   = source.Projects.SelectMany(x => x.Tickets).SelectMany(x => new[] { x.EstimatedPeriod, x.ActualPeriod }).Maximum(),
            };

            // metadata
            worksheet.GetRow(0).GetCell(0).SetCellValue(DateTime.Now);

            // calendar
            BuildCalendar(source, worksheet, dateRange);

            // projects
            BuildProjects(source, worksheet, dateRange);

            using (var stream = File.OpenWrite(destination))
            {
                workbook.Write(stream);
            }
        }
 /// <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);
         }
     }
 }