Files

55 lines
2.5 KiB
C#

using General_Ledger_Service.DTOs.Reports;
namespace General_Ledger_Service.Services.CsvDocuments
{
// Same simplification as Services/PdfDocuments/CashFlowPdfDocument - no printed opening/closing
// balance row (still in the outputFormat=Json response for the reconciliation check); non-cash
// adjustments and working-capital changes combined and re-bucketed by sign.
public static class CashFlowCsvDocument
{
public static byte[] Generate(CashFlowReportDto data)
{
var operating = data.OperatingActivities;
var operatingProfitBeforeWorkingCapital = operating.ProfitForPeriod + operating.NonCashAdjustments.Sum(a => a.Amount);
var movements = operating.NonCashAdjustments
.Select(a => (Description: a.Description, Amount: a.Amount))
.Concat(operating.WorkingCapitalChanges.Select(c => (Description: $"{c.Direction} in {c.AccountName}", Amount: c.ChangeAmount)))
.ToList();
var csv = new CsvBuilder();
csv.AddRow("Category", "Description", "Amount");
csv.AddRow("Operating", "Profit for the period", operating.ProfitForPeriod);
csv.AddRow("Operating", "Operating profit before working capital changes", operatingProfitBeforeWorkingCapital);
foreach (var line in movements.Where(m => m.Amount > 0))
{
csv.AddRow("Operating - Additions to Cash", line.Description, line.Amount);
}
foreach (var line in movements.Where(m => m.Amount <= 0))
{
csv.AddRow("Operating - Subtractions From Cash", line.Description, line.Amount);
}
csv.AddRow("Operating", "Net Cash from Operating Activities", operating.NetCashFromOperatingActivities);
foreach (var line in data.InvestingActivities.Lines)
{
csv.AddRow("Investing", line.AccountName, line.Amount);
}
csv.AddRow("Investing", "Net Cash from/(used in) Investing Activities", data.InvestingActivities.NetCashFromInvestingActivities);
foreach (var line in data.FinancingActivities.Lines)
{
csv.AddRow("Financing", line.AccountName, line.Amount);
}
csv.AddRow("Financing", "Net Cash from/(used in) Financing Activities", data.FinancingActivities.NetCashFromFinancingActivities);
csv.AddRow("", "Net Increase/(Decrease) in Cash and Cash Equivalents", data.NetIncreaseDecreaseInCash);
return csv.Build();
}
}
}