//[Authorize(Roles = "User")]
        public IActionResult GetInfoTransfer([FromQuery] string accountNumber, [FromQuery] Guid bankId)
        {
            if (bankId == Guid.Empty)
            {
                var records = _Service.GetUsers(new UserFilter()
                {
                    AccountNumber = accountNumber
                });
                if (records.Any())
                {
                    return(Ok(records.Select(x => new
                    {
                        x.AccountNumber,
                        x.Name
                    }).FirstOrDefault()));
                }
                else
                {
                    return(NotFound());
                }
            }
            else
            {
                IExternalBanking externalBanking = null;
                if (bankId == Guid.Parse("8df09f0a-fd6d-42b9-804c-575183dadaf3"))
                {
                    externalBanking = new ExternalBanking_BKTBank(_Encrypt, _Setting);
                    externalBanking.SetPartnerCode();
                }

                var result = externalBanking.GetInfoUser(accountNumber);
                if (result != null)
                {
                    return(Ok(new
                    {
                        AccountNumber = result.account_number,
                        Name = result.full_name
                    }));
                }
                else
                {
                    return(NotFound());
                }
            }
        }
Beispiel #2
0
 public UtilsController(IEncrypt encrypt, IExternalBanking external)
 {
     _encrypt  = encrypt;
     _external = external;
 }
        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 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 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 <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);
        }