public override void Export(string filename) { if (this.columns == null) { return; } using (StreamWriter writer = new StreamWriter(filename, false, Encoding.UTF8)) { List <string> master = new List <string>(); foreach (var pair in from p in columns orderby p.Key select p) { BudgetColumn c = pair.Value; string name = c.Name; writer.Write(","); if (name == BudgetColumnHeader) { writer.Write("Budget"); } else { master.Add(name); // list of all columns we have found (not including "Budget" column) writer.Write(name); } } writer.WriteLine(", Balance"); // rows. foreach (BudgetRow row in from r in rows.Values orderby r.Name select r) { decimal balance = 0; writer.Write(row.Name); writer.Write(", "); writer.Write(row.Budget.ToString()); foreach (string col in master) { writer.Write(", "); int i = row.Headers.IndexOf(col); if (i >= 0) { decimal actual = row.Actuals[i]; writer.Write(actual.ToString()); balance += (row.Budget - actual); } else { writer.Write("0"); } } writer.Write(", "); writer.WriteLine(balance.ToString()); } } }
public override void Generate(IReportWriter writer) { writer.WriteHeading("Budget Report"); this.rows = new Dictionary <string, BudgetRow>(); this.columns = new Dictionary <DateTime, BudgetColumn>(); foreach (Category rc in money.Categories.GetRootCategories()) { if (rc.Type != CategoryType.Expense) { continue; } string rowHeader = rc.Name; this.CategoryFilter = rc; // Add column for the budget itself. BudgetColumn budgetColumn; if (!columns.TryGetValue(DateTime.MinValue, out budgetColumn)) { budgetColumn = new BudgetColumn() { Name = BudgetColumnHeader, }; columns[DateTime.MinValue] = budgetColumn; } budgetColumn.Total += rc.Budget; foreach (BudgetData b in this.Compute()) { BudgetRow row = null; if (!rows.TryGetValue(rowHeader, out row)) { row = new BudgetRow() { Name = rowHeader, Budget = rc.Budget }; rows[rowHeader] = row; } DateTime budgetDate = new DateTime(b.BudgetDate.Year, b.BudgetDate.Month, 1); row.Actuals.Add((decimal)b.Actual); row.Headers.Add(b.Name); // Add column for this BudgetData BudgetColumn col; if (!columns.TryGetValue(budgetDate, out col)) { col = new BudgetColumn() { Date = budgetDate, Name = b.Name }; columns[budgetDate] = col; } col.Total += (decimal)b.Actual; } } writer.StartTable(); writer.StartColumnDefinitions(); writer.WriteColumnDefinition("300", 300, 300); // category names foreach (var pair in from p in columns orderby p.Key select p) { writer.WriteColumnDefinition("Auto", 100, double.MaxValue); // decimal values. } writer.WriteColumnDefinition("Auto", 100, double.MaxValue); // total. writer.EndColumnDefinitions(); // write table headers List <string> master = new List <string>(); writer.StartHeaderRow(); writer.StartCell(); writer.EndCell(); foreach (var pair in from p in columns orderby p.Key select p) { BudgetColumn c = pair.Value; string name = c.Name; if (name != BudgetColumnHeader) { master.Add(name); // list of all columns we have found (not including "Budget" column) } writer.StartCell(); writer.WriteNumber(name); writer.EndCell(); } writer.StartCell(); writer.WriteNumber("Balance"); writer.EndCell(); writer.EndRow(); Brush overBudgetBrush = Brushes.Red; decimal totalBalance = 0; // Now write out the rows. foreach (BudgetRow row in from r in rows.Values orderby r.Name select r) { writer.StartRow(); writer.StartCell(); writer.WriteParagraph(row.Name); writer.EndCell(); writer.StartCell(); decimal budget = row.Budget; writer.WriteNumber(budget.ToString("C")); writer.EndCell(); decimal balance = 0; foreach (string col in master) { writer.StartCell(); int i = row.Headers.IndexOf(col); if (i >= 0) { decimal actual = row.Actuals[i]; writer.WriteNumber(actual.ToString("C"), FontStyles.Normal, FontWeights.Normal, actual > budget ? overBudgetBrush : null); balance += (row.Budget - actual); } writer.EndCell(); } totalBalance += balance; writer.StartCell(); writer.WriteNumber(balance.ToString("C")); writer.EndCell(); writer.EndRow(); } // Now write out the totals. writer.StartHeaderRow(); writer.StartCell(); writer.EndCell(); foreach (var pair in from p in columns orderby p.Key select p) { BudgetColumn c = pair.Value; writer.StartCell(); writer.WriteNumber(c.Total.ToString("C")); writer.EndCell(); } writer.StartCell(); writer.WriteNumber(totalBalance.ToString("C")); writer.EndCell(); writer.EndRow(); writer.EndTable(); writer.WriteParagraph("Generated on " + DateTime.Today.ToLongDateString(), System.Windows.FontStyles.Italic, System.Windows.FontWeights.Normal, System.Windows.Media.Brushes.Gray); }