예제 #1
0
        public bool UpdateBalance(Account account, Transaction historyTransaction)
        {
            DbConnection.Instance().OpenConnection();                                // đảm bảo rằng đã kết nối đến db thành công.
            var transaction = DbConnection.Instance().Connection.BeginTransaction(); // Khởi tạo transaction.

            try
            {
                /**
                 * 1. Lấy thông tin số dư mới nhất của tài khoản.
                 * 2. Kiểm tra kiểu transaction. Chỉ chấp nhận deposit và withdraw.
                 *     2.1. Kiểm tra số tiền rút nếu kiểu transaction là withdraw.
                 * 3. Update số dư vào tài khoản.
                 *     3.1. Tính toán lại số tiền trong tài khoản.
                 *     3.2. Update số tiền vào database.
                 * 4. Lưu thông tin transaction vào bảng transaction.
                 */

                // 1. Lấy thông tin số dư mới nhất của tài khoản.
//                kiem tra tinh trang cua tai khoan
                var currentBalance = GetCurrentBalanceByAccountNumber(account.AccountNumber);

                // 2. Kiểm tra kiểu transaction. Chỉ chấp nhận deposit và withdraw.
                if (historyTransaction.Type != Transaction.TransactionType.DEPOSIT &&
                    historyTransaction.Type != Transaction.TransactionType.WITHDRAW)
                {
                    throw new SpringHeroTransactionException("Invalid transaction type!");
                }

                // 2.1. Kiểm tra số tiền rút nếu kiểu transaction là withdraw.
                if (historyTransaction.Type == Transaction.TransactionType.WITHDRAW &&
                    historyTransaction.Amount > currentBalance)
                {
                    throw new SpringHeroTransactionException("You dont have enough money to do this transaction!");
                }

                // 3. Update số dư vào tài khoản.
                // 3.1. Tính toán lại số tiền trong tài khoản.
                if (historyTransaction.Type == Transaction.TransactionType.DEPOSIT)
                {
                    currentBalance += historyTransaction.Amount;
                }
                else
                {
                    currentBalance -= historyTransaction.Amount;
                }

                // 3.2. Update số dư vào database.
                var updateAccountResult       = 0;
                var queryUpdateAccountBalance =
                    "update `accounts` set balance = @balance where username = @username and status = 1";
                var cmdUpdateAccountBalance =
                    new MySqlCommand(queryUpdateAccountBalance, DbConnection.Instance().Connection);
                cmdUpdateAccountBalance.Parameters.AddWithValue("@username", account.Username);
                cmdUpdateAccountBalance.Parameters.AddWithValue("@balance", currentBalance);
                updateAccountResult = cmdUpdateAccountBalance.ExecuteNonQuery();

                // 4. Lưu thông tin transaction vào bảng transaction.
                var transModel = new TransactionModel();
                if (updateAccountResult == 1 && transModel.Save(historyTransaction))
                {
                    transaction.Commit();
                    return(true);
                }
            }
            catch (SpringHeroTransactionException e)
            {
                transaction.Rollback();
                return(false);
            }

            DbConnection.Instance().CloseConnection();
            return(false);
        }
예제 #2
0
        public bool UpdateTransferBalance(Account account, Transaction historyTransaction, string receiverAccountNumber)
        {
            DbConnection.Instance().OpenConnection();                                // đảm bảo rằng đã kết nối đến db thành công.
            var transaction = DbConnection.Instance().Connection.BeginTransaction(); // Khởi tạo transaction.

            try
            {
                /**
                 * 1. Lấy thông tin số dư mới nhất của tài khoản ng gửi.
                 * 2. Kiểm tra kiểu transaction có phải TRANSFER hay không và kiểm tra số tiền rút.
                 * 3. Update số dư vào tài khoản ng gửi.
                 *     3.1. Tính toán lại số tiền trong tài khoản.
                 *     3.2. Update số tiền vào database.
                 * 4. Lưu thông tin transaction vào bảng transaction.
                 */

                // 1. Lấy thông tin số dư mới nhất của tài khoản ng gửi.
//                kiem tra tinh trang cua tai khoan
                var currentSenderBalance = GetCurrentBalanceByAccountNumber(account.AccountNumber);

                // 2. Kiểm tra kiểu transaction có phải TRANSFER hay không và kiểm tra số tiền rút.
                if (historyTransaction.Type != Transaction.TransactionType.TRANSFER)
                {
                    throw new SpringHeroTransactionException("Invalid transaction type");
                }
                else if (historyTransaction.Amount > currentSenderBalance)
                {
                    throw new SpringHeroTransactionException("You dont have enough money to do this transaction!");
                }

                // 3. Update số dư vào tài khoản ng gửi.
                // 3.1. Tính toán lại số tiền trong tài khoản.
                currentSenderBalance -= historyTransaction.Amount;

                // 3.2. Update số dư tài khoảng ng gửi vào database.
                var updateSenderAccountResult       = 0;
                var querySenderUpdateAccountBalance =
                    "update `accounts` set balance = @balance where username = @username and status = 1";
                var cmdUpdateSenderAccountBalance =
                    new MySqlCommand(querySenderUpdateAccountBalance, DbConnection.Instance().Connection);
                cmdUpdateSenderAccountBalance.Parameters.AddWithValue("@username", account.Username);
                cmdUpdateSenderAccountBalance.Parameters.AddWithValue("@balance", currentSenderBalance);
                updateSenderAccountResult = cmdUpdateSenderAccountBalance.ExecuteNonQuery();

                // 4. Lấy thông tin số dư mới nhất của tài khoản ng nhận.
                var currentReceiverBalance = GetCurrentBalanceByAccountNumber(receiverAccountNumber);
                // 4.1 Update số dư vào tài khoản ng nhận.
                // Tính toán lại số tiền trong tài khoản.
                currentReceiverBalance += historyTransaction.Amount;

                // Update số dư tài khoảng ng nhận vào database.
                var updateReciverAccountResult        = 0;
                var queryUpdateReceiverAccountBalance =
                    "update `accounts` set balance = @balance where accountNumber = @accountNumber and status = 1";
                var cmdUpdateReceiverAccountBalance =
                    new MySqlCommand(queryUpdateReceiverAccountBalance, DbConnection.Instance().Connection);
                cmdUpdateReceiverAccountBalance.Parameters.AddWithValue("@accountNumber", receiverAccountNumber);
                cmdUpdateReceiverAccountBalance.Parameters.AddWithValue("@balance", currentReceiverBalance);
                updateReciverAccountResult = cmdUpdateReceiverAccountBalance.ExecuteNonQuery();

                // 5. Lưu thông tin transaction vào bảng transaction.
                var transModel = new TransactionModel();
                if (updateSenderAccountResult == 1 && updateReciverAccountResult == 1 && transModel.Save(historyTransaction))
                {
                    transaction.Commit();
                    return(true);
                }
            }
            catch (SpringHeroTransactionException e)
            {
                transaction.Rollback();
                return(false);
            }

            DbConnection.Instance().CloseConnection();
            return(false);
        }