private SetTransactionsForReconciliation ( List |
||
newTransactions | List |
The list of new transactions for this entry. This includes the monthly budgeted amount. |
reconciliationDate | System.DateTime | /// The reconciliation date - this is used to give automatically created transactions a /// date. /// |
return | void |
/// <summary> /// This is effectively stage 2 of the Reconciliation process. /// Called by <see cref="ReconciliationBuilder.CreateNewMonthlyReconciliation" />. It builds the contents of the new /// ledger line based on budget and /// statement input. /// </summary> /// <param name="budget">The current applicable budget</param> /// <param name="statement">The current period statement.</param> /// <param name="startDateIncl"> /// The date of the previous ledger line. This is used to include transactions from the /// Statement starting from this date and including this date. /// </param> private void AddNew( BudgetModel budget, StatementModel statement, DateTime startDateIncl) { if (!this.newReconciliationLine.IsNew) { throw new InvalidOperationException( "Cannot add a new entry to an existing Ledger Line, only new Ledger Lines can have new entries added."); } var reconciliationDate = this.newReconciliationLine.Date; // Date filter must include the start date, which goes back to and includes the previous ledger date up to the date of this ledger line, but excludes this ledger date. // For example if this is a reconciliation for the 20/Feb then the start date is 20/Jan and the finish date is 20/Feb. So transactions pulled from statement are between // 20/Jan (inclusive) and 19/Feb (inclusive). List<Transaction> filteredStatementTransactions = statement?.AllTransactions.Where( t => t.Date >= startDateIncl && t.Date < reconciliationDate).ToList() ?? new List<Transaction>(); IEnumerable<LedgerEntry> previousLedgerBalances = CompileLedgersAndBalances(LedgerBook); var entries = new List<LedgerEntry>(); foreach (var previousLedgerEntry in previousLedgerBalances) { LedgerBucket ledgerBucket; var openingBalance = previousLedgerEntry.Balance; var currentLedger = LedgerBook.Ledgers.Single(l => l.BudgetBucket == previousLedgerEntry.LedgerBucket.BudgetBucket); if (previousLedgerEntry.LedgerBucket.StoredInAccount != currentLedger.StoredInAccount) { // Check to see if a ledger has been moved into a new default account since last reconciliation. ledgerBucket = currentLedger; } else { ledgerBucket = previousLedgerEntry.LedgerBucket; } var newEntry = new LedgerEntry(true) { Balance = openingBalance, LedgerBucket = ledgerBucket }; List<LedgerTransaction> transactions = IncludeBudgetedAmount(budget, ledgerBucket, reconciliationDate); transactions.AddRange(IncludeStatementTransactions(newEntry, filteredStatementTransactions)); AutoMatchTransactionsAlreadyInPreviousPeriod(filteredStatementTransactions, previousLedgerEntry, transactions); newEntry.SetTransactionsForReconciliation(transactions, reconciliationDate); entries.Add(newEntry); } this.newReconciliationLine.SetNewLedgerEntries(entries); CreateBalanceAdjustmentTasksIfRequired(); if (statement != null) { AddBalanceAdjustmentsForFutureTransactions(statement, reconciliationDate); } CreateTasksToTransferFundsIfPaidFromDifferentAccount(filteredStatementTransactions); }
/// <summary> /// Called by <see cref="LedgerBook.Reconcile" />. It builds the contents of the new ledger line based on budget and /// statement input. /// </summary> /// <param name="previousEntries"> /// A collection of previous <see cref="LedgerEntry" />s to construct the running balance for /// the entries this line contains. /// </param> /// <param name="currentBudget">The current applicable budget</param> /// <param name="statement">The current period statement.</param> /// <param name="startDateIncl">The date for this ledger line.</param> internal void AddNew(IEnumerable<KeyValuePair<LedgerColumn, LedgerEntry>> previousEntries, BudgetModel currentBudget, StatementModel statement, DateTime startDateIncl) { if (!IsNew) { throw new InvalidOperationException("Cannot add a new entry to an existing Ledger Line, only new Ledger Lines can have new entries added."); } DateTime finishDateExcl = Date; List<Transaction> filteredStatementTransactions = statement == null ? new List<Transaction>() : statement.AllTransactions.Where(t => t.Date >= startDateIncl && t.Date < finishDateExcl).ToList(); foreach (var previousEntry in previousEntries) { LedgerColumn ledger = previousEntry.Key; decimal balance = previousEntry.Value == null ? 0 : previousEntry.Value.Balance; var newEntry = new LedgerEntry(true) { Balance = balance, LedgerColumn = ledger }; Expense expenseBudget = currentBudget.Expenses.FirstOrDefault(e => e.Bucket.Code == ledger.BudgetBucket.Code); var transactions = new List<LedgerTransaction>(); if (expenseBudget != null) { var budgetedAmount = new BudgetCreditLedgerTransaction { Credit = expenseBudget.Amount, Narrative = "Budgeted Amount" }; transactions.Add(budgetedAmount); } transactions.AddRange(IncludeStatementTransactions(newEntry, filteredStatementTransactions)); newEntry.SetTransactionsForReconciliation(transactions); this.entries.Add(newEntry); } }