public Transaction Transfer(Guid userId, Transfer transfer) { Transaction res = null; var userDetail = _UserCollection.GetById(userId); transfer.SourceAccountNumber = userDetail.AccountNumber; transfer.SourceLinkingBankId = Guid.Empty; if (userDetail != null) { User recepient = null; if (transfer.DestinationLinkingBankId == Guid.Empty) { recepient = _UserCollection.GetByAccountNumber(transfer.DestinationAccountNumber); } else { // Get recepient info from linking bank // TODO // Khuê IExternalBanking externalBanking = null; if (transfer.DestinationLinkingBankId == Guid.Parse("8df09f0a-fd6d-42b9-804c-575183dadaf3")) { externalBanking = new ExternalBanking_BKTBank(_Encrypt, _Setting); externalBanking.SetPartnerCode(); } // test only transfer.DestinationAccountNumber = "0000000034"; var result = externalBanking.GetInfoUser(transfer.DestinationAccountNumber); if (result != null) { recepient = new User(); } } if (recepient != null) { string otp = null; using (var sessionTask = _MongoDBClient.StartSessionAsync()) { var session = sessionTask.Result; session.StartTransaction(); try { // Create OTP while (true) { otp = _Context.MakeOTP(6); if (!_TransactionCollection.GetMany(new TransactionFilter() { Otp = otp, Type = 0 }).Any()) { break; } } _TransferCollection.Create(transfer); if (!transfer.Id.Equals(Guid.Empty)) { // Lưu thông tin giao dịch var transaction = new Transaction(); transaction.Id = Guid.Empty; transaction.ReferenceId = transfer.Id; transaction.Otp = otp; transaction.CreateTime = DateTime.Now; transaction.ExpireTime = transaction.CreateTime.AddMinutes(_Setting.TransferExpiration); transaction.Type = 0; _TransactionCollection.Create(transaction); if (transaction.Id != Guid.Empty) { // Send mail var sb = new StringBuilder(); sb.AppendFormat($"Dear {userDetail.Name},"); sb.AppendFormat("<br /><br /><b>Bạn đang yêu cầu chuyển tiền từ hệ thống của chúng tôi, mã xác thực của bạn là:</b>"); sb.AppendFormat($"<br /><br /><b>{transaction.Otp}</b>"); sb.AppendFormat($"<br /><br /><b>Mã xác thực này sẽ hết hạn lúc {transaction.ExpireTime.ToLongTimeString()}.</b>"); sb.AppendFormat($"<br /><br /><b>Nếu yêu cầu không phải của bạn, vui lòng bỏ qua mail này.</b>"); if (_Context.SendMail("Xác thực yêu cầu chuyển tiền", sb.ToString(), userDetail.Email, userDetail.Name)) { res = transaction; } } } session.CommitTransactionAsync(); } catch (Exception) { session.AbortTransactionAsync(); } } } else { _Setting.Message.SetMessage("Không tìm thấy tài khoản người nhận!"); } } else { _Setting.Message.SetMessage("Không tìm thấy tài khoản người gửi!"); } return(res); }
public IEnumerable <TransactionHistory> HistoryOut(Guid userId) { var res = new List <TransactionHistory>(); var userDetail = _UserCollection.GetById(userId); if (userDetail != null) { var userTransfers = _TransferCollection.GetMany(new TransferFilter() { SourceAccountNumber = userDetail.AccountNumber, IsConfirmed = true }); userTransfers = userTransfers.Where(x => x.SourceLinkingBankId == Guid.Empty && (x.IsPayIn == null || x.IsPayIn.Value == false)); if (userTransfers.Any()) { foreach (var transfer in userTransfers) { var hisTransaction = new TransactionHistory(); // Nội bộ if (transfer.DestinationLinkingBankId == Guid.Empty) { // Get chi tiết người nhận var dest = _UserCollection.GetByAccountNumber(transfer.DestinationAccountNumber); if (dest != null) { hisTransaction.AccountName = dest.Name; hisTransaction.AccountNumber = dest.AccountNumber; hisTransaction.Description = transfer.Description; if (!transfer.IsSenderPay) { hisTransaction.Money = transfer.Money; } else { hisTransaction.Money = transfer.Money + transfer.Fee; } var linkingBank = _LinkingBankCollection.GetById(transfer.DestinationLinkingBankId); if (linkingBank != null) { hisTransaction.BankName = linkingBank.Name; } else { continue; } } else { continue; } } // Linking bank else { // TODO // Get chi tiết người nhận IExternalBanking externalBanking = null; if (transfer.DestinationLinkingBankId == Guid.Parse("8df09f0a-fd6d-42b9-804c-575183dadaf3")) { externalBanking = new ExternalBanking_BKTBank(_Encrypt, _Setting); externalBanking.SetPartnerCode(); } var dest = externalBanking.GetInfoUser(transfer.DestinationAccountNumber); if (dest != null) { hisTransaction.AccountName = dest.full_name; hisTransaction.AccountNumber = dest.account_number; hisTransaction.Description = transfer.Description; if (!transfer.IsSenderPay) { hisTransaction.Money = transfer.Money; } else { hisTransaction.Money = transfer.Money + transfer.Fee; } var linkingBank = _LinkingBankCollection.GetById(transfer.DestinationLinkingBankId); if (linkingBank != null) { hisTransaction.BankName = linkingBank.Name; } else { continue; } } else { continue; } } res.Add(hisTransaction); } } } return(res); }
public bool ConfirmTransfer(Guid userId, Guid transactionId, string otp) { var res = false; using (var sessionTask = _MongoDBClient.StartSessionAsync()) { var session = sessionTask.Result; session.StartTransaction(); try { // Get detail user var userDetail = _UserCollection.GetById(userId); if (userDetail != null) { // Get Get chi tiết giao dịch var transaction = _TransactionCollection.GetById(transactionId); if (transaction != null) { // Check OTP if (transaction.Otp == otp) { // Check hết hạn if (transaction.ExpireTime >= DateTime.Now) { // Get chi tiết chuyển tiền var transfer = _TransferCollection.GetById(transaction.ReferenceId); // Check user hiện tại có tạo yêu cầu chuyển tiền if (transfer != null && transfer.SourceLinkingBankId == Guid.Empty && transfer.SourceAccountNumber == userDetail.AccountNumber) { // Tru so du userDetail.CheckingAccount.AccountBalance -= transfer.Money; transfer.Fee = _Context.TransactionCost(transfer.Money); // Tru phi if (transfer.IsSenderPay) { userDetail.CheckingAccount.AccountBalance -= transfer.Fee; } if (userDetail.CheckingAccount.AccountBalance >= 0) { // Luu thong tin nguoi gui var payOut = _UserCollection.UpdateCheckingAccount(new UserFilter() { Id = userId }, userDetail.CheckingAccount); if (payOut > 0) { // Cong tien nguoi nhan var success = false; if (transfer.DestinationLinkingBankId == Guid.Empty) { // noi bo var detailRecepients = _UserCollection.Get(new UserFilter() { AccountNumber = transfer.DestinationAccountNumber }); if (detailRecepients.Any()) { var detailRecepient = detailRecepients.FirstOrDefault(); detailRecepient.CheckingAccount.AccountBalance += transfer.Money; // Tru phi if (!transfer.IsSenderPay) { detailRecepient.CheckingAccount.AccountBalance -= transfer.Fee; } payOut = _UserCollection.UpdateCheckingAccount(new UserFilter() { Id = detailRecepient.Id }, detailRecepient.CheckingAccount); if (payOut > 0) { success = true; } } else { _Setting.Message.SetMessage("Không tìm thấy thông tin người nhận!"); } } else { // lien ngan hang // TODO // Khuê IExternalBanking externalBanking = null; if (transfer.DestinationLinkingBankId == Guid.Parse("8df09f0a-fd6d-42b9-804c-575183dadaf3")) { externalBanking = new ExternalBanking_BKTBank(_Encrypt, _Setting); externalBanking.SetPartnerCode(); } var result = externalBanking.PayIn(transfer.SourceAccountNumber, transfer.DestinationAccountNumber, transfer.Money, transfer.Description); success = result; } if (success) { // Update trạng thái chuyển tiền transfer.IsConfirmed = true; var updateTransfer = _TransferCollection.Replace(transfer); if (updateTransfer > 0) { // Update trạng thái giao dịch transaction.ConfirmTime = DateTime.Now; var updateTransaction = _TransactionCollection.Replace(transaction); if (updateTransaction > 0) { // Send mail // TODO res = true; } } } } } else { _Setting.Message.SetMessage("Số dư không đủ!"); } } else { _Setting.Message.SetMessage("Không tìm thấy thông tin chuyển tiền!"); } } else { _Setting.Message.SetMessage("Phiên giao dịch hết hạn!"); } } else { _Setting.Message.SetMessage("Sai mã OTP!"); } } else { _Setting.Message.SetMessage("Không tìm thấy thông tin giao dịch!"); } } else { _Setting.Message.SetMessage("Không tìm thấy thông tin người gửi yêu cầu!"); } if (res) { session.CommitTransactionAsync(); } else { session.AbortTransactionAsync(); } } catch (Exception) { session.AbortTransactionAsync().Wait(); throw; } } return(res); }
public IEnumerable <TransactionHistory> HistoryIn(Guid userId) { var res = new List <TransactionHistory>(); var userDetail = _UserCollection.GetById(userId); if (userDetail != null) { var userTransfers = _TransferCollection.GetMany(new TransferFilter() { DestinationAccountNumber = userDetail.AccountNumber, IsConfirmed = true }); userTransfers = userTransfers.Where(x => x.DestinationLinkingBankId == Guid.Empty); if (userTransfers.Any()) { var bank = _LinkingBankCollection.Get(new LinkingBankFilter() { Code = _Setting.BankCode }).FirstOrDefault(); foreach (var transfer in userTransfers) { var hisTransaction = new TransactionHistory(); // Nội bộ if (transfer.SourceLinkingBankId == Guid.Empty) { // Get chi tiết người gửi var source = _UserCollection.GetByAccountNumber(transfer.SourceAccountNumber); if (source != null) { hisTransaction.AccountName = source.Name; hisTransaction.AccountNumber = source.AccountNumber; hisTransaction.Description = transfer.Description; hisTransaction.IsPayIn = transfer.IsPayIn; if (transfer.IsSenderPay) { hisTransaction.Money = transfer.Money; } else { hisTransaction.Money = transfer.Money - transfer.Fee; } if (transfer.SourceLinkingBankId == bank.Id || (hisTransaction.IsPayIn.HasValue && hisTransaction.IsPayIn.Value == true)) { // noi bo hisTransaction.BankName = bank.Name; } else { var linkingBank = _LinkingBankCollection.GetById(transfer.SourceLinkingBankId); if (linkingBank != null) { hisTransaction.BankName = linkingBank.Name; } else { continue; } } } else { continue; } } // Linking bank else { // TODO // Khuê IExternalBanking externalBanking = null; if (transfer.DestinationLinkingBankId == Guid.Parse("8df09f0a-fd6d-42b9-804c-575183dadaf3")) { externalBanking = new ExternalBanking_BKTBank(_Encrypt, _Setting); externalBanking.SetPartnerCode(); } var source = externalBanking.GetInfoUser(transfer.DestinationAccountNumber); if (source != null) { hisTransaction.AccountName = source.full_name; hisTransaction.AccountNumber = source.account_number; hisTransaction.Description = transfer.Description; if (transfer.IsSenderPay) { hisTransaction.Money = transfer.Money; } else { hisTransaction.Money = transfer.Money - transfer.Fee; } var linkingBank = _LinkingBankCollection.GetById(transfer.SourceLinkingBankId); if (linkingBank != null) { hisTransaction.BankName = linkingBank.Name; } else { continue; } } else { continue; } } res.Add(hisTransaction); } } } return(res); }
public IEnumerable <CrossChecking> CrossCheckingOut(DateTime?from, DateTime?to, Guid?bankId) { var res = new List <CrossChecking>(); var transfers = _TransferCollection.GetMany(new TransferFilter() { IsConfirmed = true }); transfers = transfers.Where(x => x.SourceLinkingBankId == Guid.Empty); if (bankId.HasValue) { transfers = transfers.Where(x => x.DestinationLinkingBankId == bankId.Value); } foreach (var transfer in transfers) { var bank = _LinkingBankCollection.Get(new LinkingBankFilter() { Code = _Setting.BankCode }).FirstOrDefault(); // Get ngân hàng liên kết var linkBank = _LinkingBankCollection.GetById(transfer.DestinationLinkingBankId); if (linkBank != null) { // Get thông tin giao dịch var transactions = _TransactionCollection.GetMany(new TransactionFilter() { ReferenceId = transfer.Id, Type = 0 }); if (from.HasValue) { transactions = transactions.Where(x => x.ConfirmTime.Value.Date >= from.Value.Date); } if (to.HasValue) { transactions = transactions.Where(x => x.ConfirmTime.Value.Date <= to.Value.Date); } if (transactions.Any()) { var transaction = transactions.FirstOrDefault(); // Get thông tin tài khoản nguồn var sourceAccount = _UserCollection.GetByAccountNumber(transfer.SourceAccountNumber); if (sourceAccount != null) { // Get thông tin tài khoản đích // TODO var destAccount = new ExternalAccount(); IExternalBanking externalBanking = null; if (transfer.DestinationLinkingBankId == Guid.Parse("8df09f0a-fd6d-42b9-804c-575183dadaf3")) { externalBanking = new ExternalBanking_BKTBank(_Encrypt, _Setting); externalBanking.SetPartnerCode(); } var source = externalBanking.GetInfoUser(transfer.DestinationAccountNumber); if (source != null) { destAccount.AccountNumber = source.account_number; destAccount.Name = source.full_name; } else { destAccount = null; } if (destAccount != null) { var history = new CrossChecking(); history.SourceAccountName = sourceAccount.Name; history.SourceAccountNumber = sourceAccount.AccountNumber; history.SourceBankName = linkBank.Name; history.DestinationAccountName = destAccount.Name; history.DestinationAccountNumber = destAccount.AccountNumber; history.DestinationBankName = bank.Name; history.Description = transfer.Description; history.Money = transfer.Money; if (transfer.IsSenderPay) { history.Money += transfer.Fee; } history.ConfirmTime = transaction.ConfirmTime.Value; res.Add(history); } } } } } return(res); }