public bool Post(Transaction transaction) { var relatedAccounts = transaction .RelatedAccounts() .Distinct() .ToArray(); foreach (var account in relatedAccounts) { var budgets = GetBudgetsForAccount(account.Id).ToArray(); if (budgets.Length == 0) continue; ProcessBudgetPayout(transaction, account, budgets); } if (transaction.Check()) { transaction.Id = TransactionId.From(transaction); if (_repository.Post(transaction)) { foreach (var debitAmount in transaction.Debit) debitAmount.Post(); foreach (var creditAmount in transaction.Credit) creditAmount.Post(); } return true; } return false; }