private static decimal CalculateSavingsToDateWithTrackedLedgers(StatementModel statement, LedgerBook ledger)
{
if (ledger == null)
{
return 0;
}
List<BudgetBucket> trackedSavingsLedgers = ledger.Ledgers
.Where(l => l.BudgetBucket is SavingsCommitmentBucket)
.Select(l => l.BudgetBucket)
.ToList();
if (!trackedSavingsLedgers.Any())
{
return SumDebitSavingsTransactions(statement);
}
var savingsToDate = CalculateTrackedSavingLedgersContributions(statement, trackedSavingsLedgers);
// Other non-ledger-book-tracked savings will appear as debits in the statement so need to be negated.
IEnumerable<Transaction> otherNontrackedSavings =
statement.Transactions.Where(
t =>
t.BudgetBucket is SavingsCommitmentBucket && trackedSavingsLedgers.All(b => b != t.BudgetBucket));
savingsToDate += otherNontrackedSavings.Sum(t => -t.Amount);
return savingsToDate;
}