/// <summary>
        /// This action returns AgentDetails view
        /// with required data passed as model
        /// </summary>
        /// <returns></returns>
        public ActionResult AgentDetails(int agentID)
        {
            try
            {
                if (SessionManagement.UserInfo != null)
                {
                    LoginInformation      loginInfo = SessionManagement.UserInfo;
                    AccountNumberRuleInfo ruleInfo  = SessionManagement.AccountRuleInfo;

                    var agentDetail = agentBO.GetAgentDetails(agentID, loginInfo.UserID);
                    var model       = new AgentDetailsModel();

                    if (agentDetail != null)
                    {
                        model.FirstName         = agentDetail.FirstName;
                        model.LastName          = agentDetail.LastName;
                        model.BirthDate         = Convert.ToDateTime(agentDetail.BirthDate).ToString("dd/MM/yyyy");
                        model.PhoneNumber       = agentDetail.PhoneNumber;
                        model.EmailAddress      = agentDetail.EmailAddress;
                        model.PhoneID           = agentDetail.PhoneID;
                        model.Password          = agentDetail.Password;
                        model.AgentAddress      = agentDetail.AgentAddress;
                        model.AgentCity         = agentDetail.City;
                        model.AgentCountry      = countryBO.GetSelectedCountry((int)agentDetail.FK_CountryID);
                        model.AgentPostalCode   = agentDetail.PostalCode;
                        model.BankName          = agentDetail.BankName;
                        model.AccountNumber     = agentDetail.AccountNumber;
                        model.BicOrSwiftCode    = agentDetail.BicOrSwiftCode;
                        model.ReceivingBankInfo = agentDetail.FK_ReceivingBankInfoID != null?receivingBankInfoBO.GetSelectedRecievingBankInfo((int)agentDetail.FK_ReceivingBankInfoID) : null;

                        model.ReceivingBankInfoDetail = agentDetail.ReceivingBankInfo;
                        model.BankAddress             = agentDetail.BankAddress;
                        model.BankCity    = agentDetail.BankCity;
                        model.BankCountry = agentDetail.FK_BankCountryID != null?countryBO.GetSelectedCountry((int)agentDetail.FK_BankCountryID) : null;

                        model.BankPostalCode = agentDetail.BankPostalCode;
                        model.AgentID        = (int)agentDetail.AgentIntroducingBrokerCode;
                    }

                    //For referral links
                    ViewData["CustomizedLink"] = introducingBrokerBO.GetCustomizedLinkOfIB(loginInfo.UserID);
                    ViewData["AccountNumber"]  = clientAccBO.GetAccountNumberOfUser(loginInfo.LogAccountType, loginInfo.UserID).Split('-')[ruleInfo.AccountNumberPosition - 1];

                    return(View(model));
                }
                else
                {
                    return(RedirectToAction("Login", "Account", new { Area = "" }));
                }
            }
            catch (Exception ex)
            {
                CurrentDeskLog.Error(ex.Message, ex);
                return(View("ErrorMessage"));
            }
        }
        /// <summary>
        /// This action returns WithdrawFunds view with required
        /// data passed as model
        /// </summary>
        /// <param name="accountNumber">accountNumber</param>
        /// <returns></returns>
        public ActionResult WithdrawFunds(string accountNumber)
        {
            try
            {
                if (SessionManagement.UserInfo != null)
                {
                    LoginInformation      loginInfo = SessionManagement.UserInfo;
                    AccountNumberRuleInfo ruleInfo  = SessionManagement.AccountRuleInfo;

                    ViewData["Country"]           = new SelectList(countryBO.GetCountries(), "PK_CountryID", "CountryName");
                    ViewData["ReceivingBankInfo"] = new SelectList(receivingBankInfoBO.GetReceivingBankInfo((int)SessionManagement.OrganizationID), "PK_RecievingBankID", "RecievingBankName");

                    var model = new TransfersModel();
                    model.BankInformation       = new List <BankInformation>();
                    model.LandingAccInformation = new List <LandingAccInformation>();
                    model.AccountNumber         = accountNumber;

                    //Get all bank accounts
                    var userBankInfos = bankBO.GetAllBankInfosForUser(loginInfo.LogAccountType, loginInfo.UserID);
                    foreach (var bank in userBankInfos)
                    {
                        var bankInfo = new BankInformation();
                        bankInfo.BankID        = bank.PK_BankAccountInformationID;
                        bankInfo.BankName      = bank.BankName;
                        bankInfo.BankAccNumber = bank.AccountNumber;
                        model.BankInformation.Add(bankInfo);
                    }

                    //Get all landing accounts
                    var landingAccs = clientAccBo.GetAllLandingAccountForUser(loginInfo.LogAccountType, loginInfo.UserID);
                    foreach (var lAcc in landingAccs)
                    {
                        var lAccInfo = new LandingAccInformation();
                        lAccInfo.LCurrencyName = lCurrValueBO.GetCurrencySymbolFromCurrencyAccountCode(lAcc.LandingAccount.Split('-')[ruleInfo.CurrencyPosition - 1]);
                        lAccInfo.LAccNumber    = lAcc.LandingAccount;

                        lAccInfo.LAccBalance = Utility.FormatCurrencyValue((decimal)lAcc.CurrentBalance, "");

                        model.LandingAccInformation.Add(lAccInfo);
                    }

                    return(View("WithdrawFunds", model));
                }
                else
                {
                    return(RedirectToAction("Login", "Account", new { Area = "" }));
                }
            }
            catch (Exception ex)
            {
                CurrentDeskLog.Error(ex.Message, ex);
                return(View("ErrorMessage"));
            }
        }
        /// <summary>
        /// This action does internal conversion transfer between accounts and logs in Transactions table
        /// </summary>
        /// <param name="fromAcc">fromAcc</param>
        /// <param name="toAcc">toAcc</param>
        /// <param name="amount">amount</param>
        /// <param name="exchangeRate">exchangeRate</param>
        /// <param name="notes">notes</param>
        /// <returns></returns>
        public ActionResult ConversionFundTransfer(string fromAcc, string toAcc, double amount, double exchangeRate, string notes)
        {
            try
            {
                if (SessionManagement.UserInfo != null)
                {
                    LoginInformation      loginInfo = SessionManagement.UserInfo;
                    AccountNumberRuleInfo ruleInfo  = SessionManagement.AccountRuleInfo;
                    var organizationID = (int)SessionManagement.OrganizationID;

                    var fromCurrID = lCurrValueBO.GetCurrencyIDFromAccountCode(fromAcc.Split('-')[ruleInfo.CurrencyPosition - 1]);
                    var toCurrID   = lCurrValueBO.GetCurrencyIDFromAccountCode(toAcc.Split('-')[ruleInfo.CurrencyPosition - 1]);

                    var clientName = introducingBrokerBO.GetPartnerName(loginInfo.UserID);

                    var fromAccDetails = clientAccBO.GetAnyAccountDetails(fromAcc, organizationID);
                    var toAccDetails   = clientAccBO.GetAnyAccountDetails(toAcc, organizationID);

                    //Get from acc balance
                    var balance       = (decimal)fromAccDetails.CurrentBalance;
                    var pendingAmount = adminTransactionBO.GetPendingTransferAmount(fromAcc, organizationID);

                    var isToSucessful   = true;
                    var isFromSucessful = true;

                    //Get transaction settings from database
                    var transacSett =
                        transactionSettingBO.GetTransactionSetting((int)AdminTransactionType.ConversionsRequests, organizationID);

                    if (transacSett != null)
                    {
                        //If approval settings is immediate or approval settings is limited
                        //and transfer amount less than limit, do immediate transfer
                        if (transacSett.InternalTransferApprovalOptions == (int)TransferApprovalOptions.Immediate ||
                            (transacSett.InternalTransferApprovalOptions == (int)TransferApprovalOptions.Limited &&
                             amount <= (double)transacSett.InternalTransferLimitedAmount))
                        {
                            //Check balance
                            if (balance >= (decimal)amount)
                            {
                                //Check pending request balance
                                if (balance >= (pendingAmount + (decimal)amount))
                                {
                                    if (fromAccDetails.PlatformLogin != null)
                                    {
                                        isFromSucessful = DoPlatformTransaction((int)fromAccDetails.PlatformLogin,
                                                                                -amount, "Debit");
                                    }

                                    if (toAccDetails.PlatformLogin != null && isFromSucessful)
                                    {
                                        isToSucessful = DoPlatformTransaction((int)toAccDetails.PlatformLogin,
                                                                              (amount * exchangeRate), "Credit");
                                    }

                                    //If platform transactions are successful
                                    if (isToSucessful && isFromSucessful)
                                    {
                                        //If transaction is successful, then log in Transactions table
                                        if (clientAccBO.TransferFundInternal(fromAcc, toAcc, amount, exchangeRate, organizationID))
                                        {
                                            var pkTransactionId = transactionBO.InternalFundTransfer(fromAcc, toAcc,
                                                                                                     fromCurrID,
                                                                                                     toCurrID, amount,
                                                                                                     exchangeRate, notes, organizationID);

                                            //Logs fund transfers details(Withdrawal/Deposit) in TransferLogs table
                                            transferLogBO.AddTransferLogForTransaction(pkTransactionId, fromAcc, toAcc,
                                                                                       fromCurrID, toCurrID, amount,
                                                                                       exchangeRate, organizationID);

                                            //Log activity details
                                            InsertConversionActivityDetails(fromCurrID, toCurrID, amount, exchangeRate,
                                                                            fromAcc, toAcc,
                                                                            Constants.K_STATUS_TRANSFERRED);

                                            //Insert into admin transaction table for records
                                            var convTransac = new AdminTransaction();
                                            convTransac.TransactionDate           = DateTime.UtcNow;
                                            convTransac.FK_UserID                 = loginInfo.UserID;
                                            convTransac.AccountNumber             = fromAcc;
                                            convTransac.FK_CurrencyID             = fromCurrID;
                                            convTransac.TransactionAmount         = (decimal)amount;
                                            convTransac.FK_AdminTransactionTypeID =
                                                (int)AdminTransactionType.ConversionsRequests;
                                            convTransac.IsApproved        = true;
                                            convTransac.IsDeleted         = false;
                                            convTransac.Notes             = notes;
                                            convTransac.ClientName        = clientName;
                                            convTransac.ApprovedDate      = DateTime.UtcNow;
                                            convTransac.ToAccountNumber   = toAcc;
                                            convTransac.ToClientName      = clientName;
                                            convTransac.FK_ToUserID       = loginInfo.UserID;
                                            convTransac.ExchangeRate      = exchangeRate;
                                            convTransac.FK_ToCurrencyID   = toCurrID;
                                            convTransac.FK_OrganizationID = organizationID;

                                            //Add conv transaction to Admin Transaction
                                            adminTransactionBO.AddNewAdminTransactionRequest(convTransac);

                                            return
                                                (Json(
                                                     new
                                            {
                                                status = true,
                                                message = "Conversion transfer has been successfully completed."
                                            }));
                                        }
                                    }
                                    else
                                    {
                                        return(Json(new { status = false, message = "Some error occurred in platform!" }));
                                    }
                                }
                                else
                                {
                                    return
                                        (Json(
                                             new
                                    {
                                        status = false,
                                        message = "Insufficient balance due to pending transfer requests!"
                                    }));
                                }
                            }
                            else
                            {
                                return
                                    (Json(new { status = false, message = "Transfer failed due to insufficient balance." }));
                            }
                        }
                        //Make admin conversion request
                        else
                        {
                            //Check balance
                            if (balance >= (decimal)amount)
                            {
                                //Check pending request balance
                                if (balance >= (pendingAmount + (decimal)amount))
                                {
                                    //Register transfer request
                                    var convTransac = new AdminTransaction();
                                    convTransac.TransactionDate           = DateTime.UtcNow;
                                    convTransac.FK_UserID                 = loginInfo.UserID;
                                    convTransac.AccountNumber             = fromAcc;
                                    convTransac.FK_CurrencyID             = fromCurrID;
                                    convTransac.TransactionAmount         = (decimal)amount;
                                    convTransac.FK_AdminTransactionTypeID =
                                        (int)AdminTransactionType.ConversionsRequests;
                                    convTransac.Notes             = notes;
                                    convTransac.ClientName        = clientName;
                                    convTransac.FeeAmount         = transacSett.TransferFee;
                                    convTransac.ToAccountNumber   = toAcc;
                                    convTransac.ToClientName      = clientName;
                                    convTransac.FK_ToUserID       = loginInfo.UserID;
                                    convTransac.ExchangeRate      = exchangeRate;
                                    convTransac.FK_ToCurrencyID   = toCurrID;
                                    convTransac.IsApproved        = false;
                                    convTransac.IsDeleted         = false;
                                    convTransac.FK_OrganizationID = organizationID;

                                    //Add request to Admin Transaction
                                    adminTransactionBO.AddNewAdminTransactionRequest(convTransac);

                                    //Log activity details for pending transaction
                                    InsertConversionActivityDetails(fromCurrID, toCurrID, amount, exchangeRate, fromAcc,
                                                                    toAcc, Constants.K_STATUS_PENDING);

                                    return
                                        (Json(
                                             new
                                    {
                                        status = true,
                                        message = "Internal transfer request has been submitted."
                                    }));
                                }
                                else
                                {
                                    return
                                        (Json(
                                             new
                                    {
                                        status = false,
                                        message = "Insufficient balance due to pending transfer requests!"
                                    }));
                                }
                            }
                            else
                            {
                                return
                                    (Json(new { status = false, message = "Transfer failed due to insufficient balance." }));
                            }
                        }
                    }
                    return(Json(new { status = false, message = "No transaction settings found!" }));
                }
                else
                {
                    return(RedirectToAction("Login", "Account", new { Area = "" }));
                }
            }
            catch (Exception ex)
            {
                CurrentDeskLog.Error(ex.Message, ex);
                return(Json(new { status = false, message = "Some error occurred!" }));
            }
        }