private void GenerateCapitalGains(IReportWriter writer) { DateTime toDate = new DateTime(year + 1, 1, 1); var calculator = new CapitalGainsTaxCalculator(this.money, toDate, this.consolidateOnDateSold, true); List <SecuritySale> errors = new List <SecuritySale>(from s in calculator.GetSales() where s.Error != null select s); if (errors.Count > 0) { writer.WriteHeading("Errors Found"); foreach (SecuritySale error in errors) { writer.WriteParagraph(error.Error.Message); } } if ((from u in calculator.Unknown where u.DateSold.Year == this.year select u).Any()) { writer.WriteHeading("Capital Gains with Unknown Cost Basis"); writer.StartTable(); writer.StartColumnDefinitions(); for (int i = 0; i < 4; i++) { writer.WriteColumnDefinition("Auto", 100, double.MaxValue); } writer.EndColumnDefinitions(); writer.StartHeaderRow(); writer.StartCell(); writer.WriteParagraph("Security"); writer.EndCell(); writer.StartCell(); writer.WriteNumber("Quantity"); writer.EndCell(); writer.StartCell(); writer.WriteNumber("Date Sold"); writer.EndCell(); writer.StartCell(); writer.WriteNumber("Sale Price"); writer.EndCell(); writer.StartCell(); writer.WriteNumber("Proceeds"); writer.EndCell(); writer.EndRow(); foreach (var data in calculator.Unknown) { if (data.DateSold.Year != this.year) { continue; } writer.StartRow(); writer.StartCell(); writer.WriteParagraph(data.Security.Name); writer.EndCell(); writer.StartCell(); writer.WriteNumber(Rounded(data.UnitsSold, 3)); writer.EndCell(); writer.StartCell(); writer.WriteNumber(data.DateSold.ToShortDateString()); writer.EndCell(); writer.StartCell(); writer.WriteNumber(data.SalePricePerUnit.ToString("C")); writer.EndCell(); writer.StartCell(); writer.WriteNumber(data.SaleProceeds.ToString("C")); writer.EndCell(); } writer.EndTable(); } if (calculator.ShortTerm.Count > 0) { decimal total = 0; writer.WriteHeading("Short Term Capital Gains and Losses"); WriteHeaders(writer); foreach (var data in calculator.ShortTerm) { if (data.DateSold.Year != this.year) { continue; } WriteCapitalGains(writer, data); total += data.TotalGain; } WriteCapitalGainsTotal(writer, total); writer.EndTable(); } if (calculator.LongTerm.Count > 0) { decimal total = 0; writer.WriteHeading("Long Term Capital Gains and Losses"); WriteHeaders(writer); foreach (var data in calculator.LongTerm) { if (data.DateSold.Year != this.year) { continue; } WriteCapitalGains(writer, data); total += data.TotalGain; } WriteCapitalGainsTotal(writer, total); } writer.EndTable(); }