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); }
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); }