private bool TryInsertNewDonationTransaction(DonorSimpleEntryViewModel vm)
        {
            bool success = false;

            try
            {
                AccountingTransaction transaction = new AccountingTransaction();
                transaction.AccountTransactionID = Guid.NewGuid();
                transaction.Amount = vm.Amount.GetValueOrDefault();
                transaction.TransactionDate = vm.TransactionDate.GetValueOrDefault();
                transaction.AccountingTransactionSource = new AccountingTransactionSource() { DonationDonorEntityID = vm.DonationDonorEntityID };
                transaction.Description = "Donation Entry (" + vm.DonorEntryTitle + ")";

                IEnumerable<AccountingTransactionAccount> accounts = unitOfWork.AccountingTransactionAccountRepository.Get(x => x.Active && x.IsDonation && (x.IsDefaultCredit || x.IsDefaultDebit));

                foreach (var account in accounts)
                {
                    transaction.AccountingTransactionAccountingTransactionAccounts.Add(new AccountingTransactionAccountingTransactionAccount()
                    {
                        AccountingTransactionAccount = account,
                        IsTransactionCredit = account.IsDefaultCredit
                    });
                }

                unitOfWork.AccountingTransactionRepository.Insert(transaction);
                unitOfWork.Save();
                success = true;
            }
            catch (Exception e)
            {
                e.LogException();
            }

            return success;
        }
        public ActionResult Create(AccountingTransactionBaseViewModel accountingTransactionBaseViewModel)
        {
            if (ModelState.IsValid)
            {
                AccountingTransaction newAccountingTransaction = new AccountingTransaction();
                AccountingPeriodOpeningClosingTransaction accountingPeriodOpeningClosingTransaction = null;

                newAccountingTransaction = accountingTransactionBaseViewModel.AccountingTransaction;
                newAccountingTransaction.AccountTransactionID = Guid.NewGuid();

                SetupAccountForTransaction(ref newAccountingTransaction, accountingTransactionBaseViewModel);

                CheckAndUpdateTheDonorTransactionSource(ref newAccountingTransaction, accountingTransactionBaseViewModel.AccountingTransaction.AccountingTransactionSource);

                if (accountingTransactionBaseViewModel.IsTransactionOpeningClosingTransaction)
                {
                    accountingPeriodOpeningClosingTransaction = new AccountingPeriodOpeningClosingTransaction();

                    AccountingPeriodTimeFrame pf = unitOfWork.AccountingPeriodTimeFrameRepository.GetByID(accountingTransactionBaseViewModel.AccountingPeriodTimeFrameID);
                    newAccountingTransaction.TransactionDate = accountingTransactionBaseViewModel.IsTransactionOpening ? pf.StartDate : pf.EndDate;

                    accountingPeriodOpeningClosingTransaction.IsTransactionOpening = accountingTransactionBaseViewModel.IsTransactionOpening;
                    accountingPeriodOpeningClosingTransaction.AccountingPeriodTimeFrameID = accountingTransactionBaseViewModel.AccountingPeriodTimeFrameID;
                    accountingPeriodOpeningClosingTransaction.AccountTransactionID = newAccountingTransaction.AccountTransactionID;
                    accountingPeriodOpeningClosingTransaction.Active = true;
                }

                SetupTagInfosForAccount(ref accountingTransactionBaseViewModel);

                newAccountingTransaction = unitOfWork.AccountingTransactionRepository.Insert(newAccountingTransaction);
                unitOfWork.Save();

                if (accountingTransactionBaseViewModel.IsTransactionOpeningClosingTransaction)
                {
                    accountingPeriodOpeningClosingTransaction.AccountTransactionID = newAccountingTransaction.AccountTransactionID;
                    unitOfWork.AccountingPeriodOpeningClosingTransactionRepository.Insert(accountingPeriodOpeningClosingTransaction);
                    unitOfWork.Save();
                }

                if (accountingTransactionBaseViewModel.AccountingTransaction.AccountingTransactionSource.DonationDonorEntityID != null)
                {
                    return RedirectToAction("Index", "Donor");
                }
                else if (accountingTransactionBaseViewModel.IsTransactionOpeningClosingTransaction)
                {
                    return RedirectToAction("Index", "AccountingPeriodOpeningClosingTransaction");
                }
                else if (newAccountingTransaction.IsTemplateTransaction)
                {
                    return RedirectToAction("Index", "AccountingTransactionTemplate");
                }
                else
                {
                    return RedirectToAction("Index");
                }
            }

            return View(AccountingTransactionBaseViewModelBaseSetup(accountingTransactionBaseViewModel));
        }
        private void SetupAccountForTransaction(ref AccountingTransaction accountingTransaction, AccountingTransactionBaseViewModel accountingTransactionBaseViewModel)
        {
            int[] AccountsToCreditIDs = accountingTransactionBaseViewModel.AccountsToCredit.Where(x => x.Selected).Select(x => Convert.ToInt32(x.Value)).ToArray<int>();
            int[] AccountsToDebitIDs = accountingTransactionBaseViewModel.AccountsToDebit.Where(x => x.Selected).Select(x => Convert.ToInt32(x.Value)).ToArray<int>();

            IEnumerable<AccountingTransactionAccount> accountsSelected = unitOfWork.AccountingTransactionAccountRepository.Get(x => AccountsToCreditIDs.Contains(x.AccountTransactionAccountID) || AccountsToDebitIDs.Contains(x.AccountTransactionAccountID)).ToArray();

            foreach (var account in accountsSelected)
            {
                AccountingTransactionAccountingTransactionAccount newAccountingTransactionAccountingTransactionAccount = new AccountingTransactionAccountingTransactionAccount();
                newAccountingTransactionAccountingTransactionAccount.IsTransactionCredit = AccountsToCreditIDs.Contains(account.AccountTransactionAccountID);
                newAccountingTransactionAccountingTransactionAccount.AccountTransactionID = accountingTransaction.AccountTransactionID;
                newAccountingTransactionAccountingTransactionAccount.AccountTransactionAccountID = account.AccountTransactionAccountID;
                accountingTransaction.AccountingTransactionAccountingTransactionAccounts.Add(newAccountingTransactionAccountingTransactionAccount);
            }

        }
 private void CheckAndUpdateTheDonorTransactionSource(ref AccountingTransaction accountingTransaction, AccountingTransactionSource transactionSource)
 {
     //Remove the donor from transaction if not selected
     if (!transactionSource.IsFromADonor)
     {
         accountingTransaction.AccountingTransactionSource.DonationDonorEntity = null;
         accountingTransaction.AccountingTransactionSource.DonationDonorEntityID = null;
     }
 }