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(); } } }