예제 #1
0
        // GET: Transaction
        public ActionResult Index(int Id, string Type)
        {
            if (Type == "D")
            {
                return(View("Deposit", new Transaction {
                    AccountId = Id
                }));
            }
            if (Type == "W")
            {
                return(View("Withdrawal", new Transaction {
                    AccountId = Id
                }));
            }
            if (Type == "T")
            {
                var userId = _context.Accounts.Where(a => a.Id == Id).Select(a => new { a.UserId }).Single();

                List <Account> accounts = _context.Accounts.Where(a => a.UserId == userId.UserId).Where(a => a.Id != Id).ToList();

                TransferTransactionViewModel transferTransactionViewModel = new TransferTransactionViewModel
                {
                    Accounts    = accounts,
                    Transaction = new Transaction {
                        AccountId = Id
                    }
                };

                return(View("Transfer", transferTransactionViewModel));
            }

            return(View());
        }
        public void Transfer_to_other_bank_transaction_is_created_ok()
        {
            List <Accounts> accounts    = ctx.Accounts.ToList();
            var             fromAccount = accounts[0];

            fromAccount.Balance = 1000;
            ctx.Accounts.Update(fromAccount);
            ctx.SaveChanges();

            var model = new TransferTransactionViewModel
            {
                Date = DateTime.Now.Date,
                OldAccountBalance = fromAccount.Balance,
                Type          = "Debit",
                Operation     = "Remittance to Another Bank",
                Amount        = 500,
                FromAccountId = fromAccount.AccountId,
                Symbol        = null,
                Bank          = null,
                ToAccount     = null
            };

            var expectedTransaction = new Transactions
            {
                AccountId = model.FromAccountId,
                Date      = model.Date,
                Balance   = model.OldAccountBalance - model.Amount,
                Type      = model.Type,
                Operation = model.Operation,
                Amount    = -model.Amount,
                Symbol    = model.Symbol,
                Bank      = model.Bank,
                Account   = model.ToAccount
            };

            sut.CreateTransferToOtherBankTransaction(model);

            IQueryable <Transactions> transactions = ctx.Transactions;
            var transactionID      = transactions.Max(x => x.TransactionId);
            var createdTransaction = transactions.Where(x => x.TransactionId == transactionID).FirstOrDefault();

            Assert.AreEqual(expectedTransaction.AccountId, createdTransaction.AccountId);
            Assert.AreEqual(expectedTransaction.Date, createdTransaction.Date);
            Assert.AreEqual(expectedTransaction.Balance, createdTransaction.Balance);
            Assert.AreEqual(expectedTransaction.Type, createdTransaction.Type);
            Assert.AreEqual(expectedTransaction.Operation, createdTransaction.Operation);
            Assert.AreEqual(expectedTransaction.Amount, createdTransaction.Amount);
            Assert.AreEqual(expectedTransaction.Symbol, createdTransaction.Symbol);
            Assert.AreEqual(expectedTransaction.Bank, createdTransaction.Bank);
            Assert.AreEqual(expectedTransaction.Account, createdTransaction.Account);
        }
예제 #3
0
        public ActionResult Transfer(TransferTransactionViewModel transferTransaction)
        {
            if (transferTransaction.Transfer.TargetAccount == 0 || transferTransaction.Transaction.Amount == 0)
            {
                badTransfer         = true;
                TempData["message"] = "Transfer information incomplete";
            }


            //Fetch account and check if funds sufficient for withdrawal
            var account = _context.Accounts.Single(a => a.Id == transferTransaction.Transaction.AccountId);

            //If insufficient funds give chance to try again
            if (transferTransaction.Transaction.Amount > account.Balance)
            {
                badTransfer         = true;
                TempData["message"] = "Insufficient funds for a tranfer of $" + transferTransaction.Transaction.Amount;
            }

            if (badTransfer)
            {
                List <Account> accounts = _context.Accounts.Where(a => a.UserId == account.UserId).Where(a => a.Id != transferTransaction.Transaction.AccountId).ToList();
                transferTransaction.Accounts = accounts;
                return(View(transferTransaction));
            }

            transferTransaction.Transaction.Type = "T";
            _context.Transactions.Add(transferTransaction.Transaction);
            _context.SaveChanges();

            transferTransaction.Transfer.TransactionID = transferTransaction.Transaction.Id;
            _context.Transfers.Add(transferTransaction.Transfer);
            _context.SaveChanges();


            //Fetch source account and decrement balance by the transfer amount
            var account2 = _context.Accounts.SingleOrDefault(a => a.Id == transferTransaction.Transaction.AccountId);

            account2.Balance = account2.Balance - transferTransaction.Transaction.Amount;
            _context.SaveChanges();

            //Fetch traget account and increment balance by the transfer amount
            var account3 = _context.Accounts.SingleOrDefault(a => a.Id == transferTransaction.Transfer.TargetAccount);

            account3.Balance = account3.Balance + transferTransaction.Transaction.Amount;

            _context.SaveChanges();

            return(RedirectToAction("Index", "Account", new { Id = account.UserId }));
        }
        public void When_transferring_outside_bank_cant_take_more_money_than_balance_on_account()
        {
            var model = new TransferTransactionViewModel
            {
                Date              = DateTime.Now,
                Type              = "Debit",
                Operation         = "Remittance to Another Bank",
                FromAccountId     = 1,
                OldAccountBalance = 1000,
                Bank              = "Bitcoin Bank",
                ToAccount         = "1234",
                Amount            = 2000
            };

            var expectedErrorMessage = "Insufficient funds on account to perform the transaction.";

            var newModel = sut.CheckTransferOtherBankModelIsOkAndReturnViewmodel(model);

            Assert.AreEqual(expectedErrorMessage, newModel.ErrorMessageViewModel.ErrorMessage);
        }
예제 #5
0
        public TransferTransactionViewModel CreateTransferViewModel(int accountId)
        {
            var account    = _accountsRepository.GetOneByID(accountId);
            var oldBalance = _accountServices.GetBalanceOnAccount(account);

            var model = new TransferTransactionViewModel()
            {
                Date              = DateTime.Now,
                Type              = "Debit",
                Operation         = "Remittance to Another Bank",
                FromAccountId     = accountId,
                OldAccountBalance = oldBalance,
            };

            model.ErrorMessageViewModel = new ErrorMessageViewModel()
            {
                ErrorMessage = ""
            };

            return(model);
        }
예제 #6
0
        public IActionResult TransferOtherBank(TransferTransactionViewModel model)
        {
            bool ok = true;

            if (!ModelState.IsValid || !ok)
            {
                ModelState.AddModelError(string.Empty, "Please fill in all the required fields.");

                var newModel = _viewmodelsServices.CreateTransferViewModel(model.FromAccountId);

                return(View(newModel));
            }

            model = _transactionServices.CheckTransferOtherBankModelIsOkAndReturnViewmodel(model);

            if (model.ErrorMessageViewModel.ErrorMessage != "")
            {
                return(View(model));
            }

            _transactionServices.CreateTransferToOtherBankTransaction(model);

            return(View("SuccessConfirmation"));
        }
예제 #7
0
        public void CreateTransferToOtherBankTransaction(TransferTransactionViewModel model)
        {
            var account    = _accountsRepository.GetOneByID(model.FromAccountId);
            var oldBalance = model.OldAccountBalance;
            var newBalance = oldBalance - model.Amount;

            var newTransaction = new Transactions()
            {
                AccountId = model.FromAccountId,
                Date      = model.Date,
                Type      = model.Type,
                Operation = model.Operation,
                Amount    = -model.Amount,
                Balance   = newBalance,
                Symbol    = model.Symbol,
                Bank      = model.Bank,
                Account   = model.ToAccount,
            };

            _transactionsRepository.Create(newTransaction);

            account.Balance = newBalance;
            _accountsRepository.Update(account);
        }
예제 #8
0
        public TransferTransactionViewModel CheckTransferOtherBankModelIsOkAndReturnViewmodel(TransferTransactionViewModel viewModel)
        {
            if (!IsAmountOk(viewModel.Amount))
            {
                viewModel.ErrorMessageViewModel = new ErrorMessageViewModel()
                {
                    ErrorMessage = "The amount entered cannot be negative or 0."
                };

                return(viewModel);
            }

            if (!IsDateOk(viewModel.Date))
            {
                viewModel.ErrorMessageViewModel = new ErrorMessageViewModel()
                {
                    ErrorMessage = "You cannot make a transaction in the past."
                };

                return(viewModel);
            }

            if (!IsBalanceEnough(viewModel.Amount, viewModel.OldAccountBalance))
            {
                viewModel.ErrorMessageViewModel = new ErrorMessageViewModel()
                {
                    ErrorMessage = "Insufficient funds on account to perform the transaction."
                };

                return(viewModel);
            }

            viewModel.ErrorMessageViewModel = new ErrorMessageViewModel()
            {
                ErrorMessage = ""
            };

            return(viewModel);
        }