private void CopyOutputFromAnalyser(BurnDownChartAnalyserResult analysisResult) { ActualSpendingAxesMinimum = analysisResult.GraphLines.GraphMinimumValue; BalanceLine = analysisResult.GraphLines.Series.Single(s => s.SeriesName == BurnDownChartAnalyserResult.BalanceSeriesName); BudgetLine = analysisResult.GraphLines.Series.Single(s => s.SeriesName == BurnDownChartAnalyserResult.BudgetSeriesName); ZeroLine = analysisResult.GraphLines.Series.Single(s => s.SeriesName == BurnDownChartAnalyserResult.ZeroSeriesName); ChartTitle = analysisResult.ChartTitle; }
private static void CreateZeroLine(IEnumerable <DateTime> datesOfTheMonth, BurnDownChartAnalyserResult result) { var series = new SeriesData { SeriesName = BurnDownChartAnalyserResult.ZeroSeriesName, Description = "Zero line" }; result.GraphLines.SeriesList.Add(series); foreach (var day in datesOfTheMonth) { series.PlotsList.Add(new DatedGraphPlot { Amount = 0, Date = day }); } }
private static void CalculateBudgetLineValues(decimal budgetTotal, List <DateTime> datesOfTheMonth, BurnDownChartAnalyserResult result) { var average = budgetTotal / datesOfTheMonth.Count(); var seriesData = new SeriesData { Description = "The budget line shows ideal linear spending over the month to keep within your budget.", SeriesName = BurnDownChartAnalyserResult.BudgetSeriesName }; result.GraphLines.SeriesList.Add(seriesData); var iteration = 0; foreach (var day in datesOfTheMonth) { seriesData.PlotsList.Add(new DatedGraphPlot { Amount = budgetTotal - average * iteration++, Date = day }); } }
public BurnDownChartAnalyserResult Analyse(StatementModel statementModel, BudgetModel budgetModel, IEnumerable<BudgetBucket> bucketsSubset, LedgerBook ledgerBook, DateTime beginDate) { if (statementModel == null) { throw new ArgumentNullException(nameof(statementModel)); } if (budgetModel == null) { throw new ArgumentNullException(nameof(budgetModel)); } List<BudgetBucket> bucketsCopy = bucketsSubset.ToList(); this.logger.LogInfo( l => "BurnDownChartAnalyser.Analyse: " + string.Join(" ", bucketsCopy.Select(b => b.Code))); var result = new BurnDownChartAnalyserResult(); List<DateTime> datesOfTheMonth = YieldAllDaysInDateRange(beginDate); var lastDate = datesOfTheMonth.Last(); CreateZeroLine(datesOfTheMonth, result); var openingBalance = GetBudgetedTotal(budgetModel, ledgerBook, bucketsCopy, beginDate); CalculateBudgetLineValues(openingBalance, datesOfTheMonth, result); List<ReportTransactionWithRunningBalance> spendingTransactions = CollateStatementTransactions(statementModel, bucketsCopy, beginDate, lastDate, openingBalance); // Only relevant when calculating surplus burndown - ovespent ledgers are supplemented from surplus so affect its burndown. if (ledgerBook != null && bucketsCopy.OfType<SurplusBucket>().Any()) { List<ReportTransaction> overSpentLedgers = this.ledgerCalculator.CalculateOverspentLedgers(statementModel, ledgerBook, beginDate).ToList(); if (overSpentLedgers.Any()) { spendingTransactions.AddRange( overSpentLedgers.Select(t => new ReportTransactionWithRunningBalance(t))); spendingTransactions = spendingTransactions.OrderBy(t => t.Date).ToList(); UpdateReportTransactionRunningBalances(spendingTransactions); } } // Copy running balance from transaction list into burndown chart data var actualSpending = new SeriesData { SeriesName = BurnDownChartAnalyserResult.BalanceSeriesName, Description = "Running balance over time as transactions spend, the balance decreases." }; result.GraphLines.SeriesList.Add(actualSpending); foreach (var day in datesOfTheMonth) { if (day > DateTime.Today) { break; } var dayClosingBalance = GetDayClosingBalance(spendingTransactions, day); actualSpending.PlotsList.Add(new DatedGraphPlot { Date = day, Amount = dayClosingBalance }); var copyOfDay = day; this.logger.LogInfo(l => l.Format(" {0} Close Bal:{1:N}", copyOfDay, dayClosingBalance)); } result.ReportTransactions = spendingTransactions; return result; }
private static void CreateZeroLine(IEnumerable<DateTime> datesOfTheMonth, BurnDownChartAnalyserResult result) { var series = new SeriesData { SeriesName = BurnDownChartAnalyserResult.ZeroSeriesName, Description = "Zero line" }; result.GraphLines.SeriesList.Add(series); foreach (var day in datesOfTheMonth) { series.PlotsList.Add(new DatedGraphPlot { Amount = 0, Date = day }); } }
private static void CalculateBudgetLineValues(decimal budgetTotal, List<DateTime> datesOfTheMonth, BurnDownChartAnalyserResult result) { var average = budgetTotal / datesOfTheMonth.Count(); var seriesData = new SeriesData { Description = "The budget line shows ideal linear spending over the month to keep within your budget.", SeriesName = BurnDownChartAnalyserResult.BudgetSeriesName }; result.GraphLines.SeriesList.Add(seriesData); var iteration = 0; foreach (var day in datesOfTheMonth) { seriesData.PlotsList.Add(new DatedGraphPlot { Amount = budgetTotal - average * iteration++, Date = day }); } }
private void LoadCustomChart(BurnDownChartAnalyserResult analysisResult) { IsCustomChart = true; Background = ConverterHelper.SecondaryBackgroundBrush; CopyOutputFromAnalyser(analysisResult); }
private void LoadBucketChart(BurnDownChartAnalyserResult analysisResult) { Background = ConverterHelper.TileBackgroundBrush; CopyOutputFromAnalyser(analysisResult); }
public BurnDownChartAnalyserResult Analyse(StatementModel statementModel, BudgetModel budgetModel, IEnumerable <BudgetBucket> bucketsSubset, LedgerBook ledgerBook, DateTime beginDate) { if (statementModel == null) { throw new ArgumentNullException(nameof(statementModel)); } if (budgetModel == null) { throw new ArgumentNullException(nameof(budgetModel)); } List <BudgetBucket> bucketsCopy = bucketsSubset.ToList(); this.logger.LogInfo( l => "BurnDownChartAnalyser.Analyse: " + string.Join(" ", bucketsCopy.Select(b => b.Code))); var result = new BurnDownChartAnalyserResult(); List <DateTime> datesOfTheMonth = YieldAllDaysInDateRange(beginDate); var lastDate = datesOfTheMonth.Last(); CreateZeroLine(datesOfTheMonth, result); var openingBalance = GetBudgetedTotal(budgetModel, ledgerBook, bucketsCopy, beginDate); CalculateBudgetLineValues(openingBalance, datesOfTheMonth, result); List <ReportTransactionWithRunningBalance> spendingTransactions = CollateStatementTransactions(statementModel, bucketsCopy, beginDate, lastDate, openingBalance); // Only relevant when calculating surplus burndown - ovespent ledgers are supplemented from surplus so affect its burndown. if (ledgerBook != null && bucketsCopy.OfType <SurplusBucket>().Any()) { List <ReportTransaction> overSpentLedgers = this.ledgerCalculator.CalculateOverspentLedgers(statementModel, ledgerBook, beginDate).ToList(); if (overSpentLedgers.Any()) { spendingTransactions.AddRange( overSpentLedgers.Select(t => new ReportTransactionWithRunningBalance(t))); spendingTransactions = spendingTransactions.OrderBy(t => t.Date).ToList(); UpdateReportTransactionRunningBalances(spendingTransactions); } } // Copy running balance from transaction list into burndown chart data var actualSpending = new SeriesData { SeriesName = BurnDownChartAnalyserResult.BalanceSeriesName, Description = "Running balance over time as transactions spend, the balance decreases." }; result.GraphLines.SeriesList.Add(actualSpending); foreach (var day in datesOfTheMonth) { if (day > DateTime.Today) { break; } var dayClosingBalance = GetDayClosingBalance(spendingTransactions, day); actualSpending.PlotsList.Add(new DatedGraphPlot { Date = day, Amount = dayClosingBalance }); var copyOfDay = day; this.logger.LogInfo(l => l.Format(" {0} Close Bal:{1:N}", copyOfDay, dayClosingBalance)); } result.ReportTransactions = spendingTransactions; return(result); }
protected virtual BucketBurnDownController BuildBucketBurnDownController(BurnDownChartAnalyserResult analysis) { var controller = new BucketBurnDownController(); controller.Load(analysis); return controller; }