public bool ChangePassword(Guid userId, string oldPassword, string newPassword)
        {
            var res = false;

            var detail = _UserCollection.GetById(userId);

            if (detail != null)
            {
                if (Encrypting.BcryptVerify(oldPassword, detail.Password))
                {
                    // Change mật khẩu
                    if (_UserCollection.ChangePassword(new UserFilter()
                    {
                        Id = userId
                    }, Encrypting.Bcrypt(newPassword)) > 0)
                    {
                        res = true;
                    }
                    else
                    {
                        _Setting.Message.SetMessage("Không thể cập nhật thông tin mật khẩu!");
                    };
                }
                else
                {
                    _Setting.Message.SetMessage("Mật khẩu hiện tại không đúng!");
                }
            }
            else
            {
                _Setting.Message.SetMessage("Không tìm thấy thông tin người dùng!");
            }

            return(res);
        }
        public Payee AddPayee(Guid userId, Payee payee)
        {
            Payee res    = null;
            var   detail = _UserCollection.GetById(userId);

            if (detail != null)
            {
                var linkingBank = _LinkingBankCollection.GetById(payee.LinkingBankId);

                if (linkingBank != null)
                {
                    // get payee detail
                    var payeeDetail = _UserCollection.GetByAccountNumber(payee.AccountNumber);


                    if (payeeDetail != null)
                    {
                        if (string.IsNullOrEmpty(payee.MnemonicName))
                        {
                            payee.MnemonicName = payeeDetail.Name;
                        }
                        payee.Id = Guid.NewGuid();
                        var countModified = _UserCollection.AddPayee(userId, payee);
                        if (countModified > 0)
                        {
                            res = payee;
                        }
                    }
                }
            }

            return(res);
        }
        public DeptReminder AddDeptReminder(Guid userId, DeptReminder deptReminder)
        {
            DeptReminder res        = null;
            var          userDetail = _UserCollection.GetById(userId);

            if (userDetail != null)
            {
                // requestor
                deptReminder.RequestorAccountNumber = userDetail.AccountNumber;
                deptReminder.RequestorId            = userDetail.Id;


                var recipientUsers = _UserCollection.Get(new UserFilter()
                {
                    AccountNumber = deptReminder.RecipientAccountNumber
                });

                if (recipientUsers.Any())
                {
                    var recipientUser = recipientUsers.FirstOrDefault();
                    deptReminder.RecipientId = recipientUser.Id;

                    while (true)
                    {
                        deptReminder.Code = _Context.MakeOTP(15);
                        if (!_DeptReminderCollection.GetMany(new DeptReminderFilter()
                        {
                            Code = deptReminder.Code
                        }).Any())
                        {
                            break;
                        }
                    }

                    _DeptReminderCollection.Create(deptReminder);
                    if (deptReminder.Id != Guid.Empty)
                    {
                        // Send mail
                        var sb = new StringBuilder();
                        sb.AppendFormat($"Dear {recipientUser.Name},");
                        sb.AppendFormat($"<br /><br /><b>Bạn đang được nhắc nợ từ số tài khoản {userDetail.AccountNumber} - {userDetail.Name}.</b>");
                        sb.AppendFormat($"<br /><br /><b>Vui lòng đăng nhập vào hệ thống để xem chi tiết.</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("Thông báo nhắc nợ", sb.ToString(), recipientUser.Email, recipientUser.Name))
                        {
                            res = deptReminder;
                        }
                    }
                }

                //var lstLinkingBank = _LinkingBankCollection.Get(new LinkingBankFilter() { Code = _Setting.BankCode });
                //if (lstLinkingBank.Any())
                //{
                //    deptReminder.Requestor.LinkingBankId = lstLinkingBank.FirstOrDefault().Id;

                //    // check recipient
                //    var recipientLinkingBank = _LinkingBankCollection.GetById(deptReminder.Recipient.LinkingBankId);
                //    if (recipientLinkingBank != null)
                //    {
                //        if (recipientLinkingBank.Code != _Setting.BankCode) // other bank
                //        {
                //            /*TODO*/
                //            //// get user from linking bank
                //        }
                //        else // same bank
                //        {

                //        }
                //    }
                //}
            }
            return(res);
        }
        public bool PayIn(Guid userId, PayInfo payInfo)
        {
            var res = false;

            var details = _UserCollection.Get(new UserFilter()
            {
                AccountNumber = payInfo.AccountNumber, Username = payInfo.Username
            });
            var detailsEmployee = _UserCollection.GetById(userId);

            if (details.Any() && detailsEmployee != null)
            {
                var detail = details.FirstOrDefault();
                detail.CheckingAccount.AccountBalance += payInfo.Money;

                // luu giao dich
                var transfer = new Transfer();
                transfer.Description = "Nạp tiền";
                transfer.DestinationAccountNumber = detail.AccountNumber;
                transfer.DestinationLinkingBankId = Guid.Empty;
                transfer.Fee                 = 0;
                transfer.IsConfirmed         = true;
                transfer.IsSenderPay         = true;
                transfer.Money               = payInfo.Money;
                transfer.SourceAccountNumber = detailsEmployee.AccountNumber;
                transfer.SourceLinkingBankId = Guid.Empty;
                transfer.IsPayIn             = true;

                using (var sessionTask = _MongoDBClient.StartSessionAsync())
                {
                    var session = sessionTask.Result;
                    session.StartTransaction();
                    try
                    {
                        _TransferCollection.Create(transfer);

                        if (transfer.Id == Guid.Empty)
                        {
                            throw new Exception();
                        }

                        var resUp = _UserCollection.UpdateCheckingAccount(new UserFilter()
                        {
                            AccountNumber = payInfo.AccountNumber, Id = detail.Id
                        }, detail.CheckingAccount) > 0;

                        if (!resUp)
                        {
                            throw new Exception();
                        }

                        var transaction = new Transaction();
                        transaction.Id          = Guid.Empty;
                        transaction.ReferenceId = transfer.Id;
                        transaction.Otp         = "";
                        transaction.CreateTime  = DateTime.Now;
                        transaction.ExpireTime  = transaction.CreateTime.AddMinutes(_Setting.TransferExpiration);
                        transaction.Type        = 0;
                        transaction.ConfirmTime = transaction.CreateTime;

                        _TransactionCollection.Create(transaction);

                        if (transaction.Id == Guid.Empty)
                        {
                            throw new Exception();
                        }
                        res = true;
                        session.CommitTransactionAsync();
                    }
                    catch (Exception)
                    {
                        session.AbortTransactionAsync();
                    }
                }
            }
            else
            {
                _Setting.Message.SetMessage("Không tìm thấy thông tin tài khoản!");
            }

            return(res);
        }