from appservices.common.util import *
from appservices.common.payment_gateways.wowpe_payment_gateways import *
# from appservices.common.payment_gateways.fstac_payment_gateways import *
from appservices.common.payment_gateways.payaid_payment_gateways import *
from appservices.common.payment_gateways.accurepay_payment_gateways import *
from appservices.common.payment_gateways.idfc_payment_gateways import *
from appservices.common.payment_gateways.axis_payment_gateways import *


payout_apis = Blueprint("payout_apis",__name__)

csrf.exempt(payout_apis)

# sample_wowpe_static_data = {
#     "api_key":"66c43d14b131cbb3c5aba543-8bf0a73fda352bcc0da5509ae4372bd7",
#     "merchant_reference_number":str(random_digit_generate(15)),
#     "account_name":"Sai Krishna",
#     "amount":"204",
#     "account_number":"159502971443",
#     "ifsc_code":"INDB0000226",
#     "bank_name":"Indusind Bank",
#     "transfer_type":"NEFT",
#     "bank_branch":"MADHAPUR",
#     "customer_email":"sai.kerla@apptrinity.com",
#     "customer_phone":"9988776655",
#     "remark":"Testing remark",
# }


# sample_payaid_static_data = {
#     "api_key":"66913229282201bdc31be6bb-54c219889963b93ee45507e3577d443c",
#     "merchant_reference_number":"ORD1469fdgfdgfd5",
#     "account_name":"Sai Krishna",
#     "amount":"1",
#     "account_number":"159502971443",
#     "ifsc_code":"INDB0000226",
#     "bank_name":"Indusind Bank",
#     "transfer_type":"IMPS",
#     "bank_branch":"MADHAPUR"
# }

sample_axis_fund_transfer_static_data = {
    "api_key":"66c43d14b131cbb3c5aba543-8bf0a73fda352bcc0da5509ae4372bd7",
    "merchant_reference_number":str(random_digit_generate(15)),
    "account_name":"KERLA VEERA VENKATA SRI SAI KRISHNA",
    "amount":"11",
    "account_number":"159502971443",
    "ifsc_code":"INDB0000226",
    "bank_name":"",
    # "bene_code":"benecode00080",
    "transfer_type":"IMPS",
    "bank_branch":"",
    "customer_email":"",
    "customer_phone":"",
    "remark":"Testing",
}

@payout_apis.route("/fundtransfer",methods=["POST"])
def fundtransfer():
    data_status = {"responseStatus":0,"result":""}
    if SERVER_STATUS == "DOWN":
        data_status["result"]= SERVER_MAINTAINCE_MESSAGE
        return data_status

    merchant_id = request.headers.get("Merchant-Id","")
    api_key = request.headers.get("Api-Key","")
    # encryption_data = request.form.get("encryption_data","")
    # iv = request.form.get("iv","")

    responseDict = {}
    paymentgatewayresponseDict = {}

    wowpeTransactionId = random_digit_generate(16)

    secretKey = "f51085df02812201344f6f0cb6959647"
    encryption_key = bytes(secretKey, 'utf-8')
    responseEncrypt = encrypt(sample_axis_fund_transfer_static_data,encryption_key)
    encryption_data = responseEncrypt.get('encryption_data')
    iv = responseEncrypt.get('iv')

    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"):
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    # print(request.headers,"?????????????")

    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

    payOutPaymentGatewayId = ""
    userId = ""
    bank_reference_number = ""
    requestData = [{"encryption_data":encryption_data,"iv":iv}]

    # Here Create Client Logs Table
    save_client_table = save_client_logs_data(userId,"payout","fund_transfer","fundtransfer",None,requestData,client_ip,"api")

    try:
        if merchant_id and api_key and encryption_data and iv:
            merchant_queryset = Users.objects(merchantUniqueNumber=merchant_id,status=1).first()
            if not merchant_queryset:
                data_status["result"]="Invalid merchant id!!"
                return data_status

            check_kyc_status = merchant_kyc_status(str(merchant_queryset.id))
            if check_kyc_status.get("responseStatus") != 1:
                data_status["result"]="Merchant KYC is not completed please contact to admin!!"
                return data_status

            kycStatus = check_kyc_status.get("merchantKycDetails", {}).get("kycStatus")
            if kycStatus == False:
                data_status["result"]="Merchant KYC is not completed please contact to admin!!"
                return data_status

            userId = str(merchant_queryset.id)
            print(userId,"((((USERID))))")
            print(api_key,"((((api_key))))")
            api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payout",userId=userId,status=1).first()
            if not api_security_queryset:
                data_status["result"]="Invalid api key!!"
                return data_status

            # if client_ip not in api_security_queryset.ipAddressList:
            #   data_status["result"]="Your ip adress is not whitelisted please contact admin!!"
            #   return data_status

            if not merchant_queryset.patternId.payoutPaymentGatewayId:
                data_status["result"]="Payout option is disabled please contact admin!!"
                return data_status

            payOutPaymentGatewayId = str(merchant_queryset.patternId.payoutPaymentGatewayId.id)

            payout_gate_way_queryset = TransactionAPI.objects(id=payOutPaymentGatewayId,status=1).first()
            if not payout_gate_way_queryset:
                data_status["result"]="Payout option is disabled please contact to admin!!"
                return data_status

            paymentGateWayCode = payout_gate_way_queryset.code

            try:
                secretKey = api_security_queryset.secretKey
                encryption_key = bytes(secretKey, 'utf-8')

                jsonData = decrypt(encryption_data,encryption_key,iv)
                decryptResponse = json.loads(jsonData)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                data_status["result"]="Invalid encryption data!!"
                return data_status

            save_client_table.update(userId=ObjectId(userId),transactionAPIId=ObjectId(payOutPaymentGatewayId))
            

            ################################ Switch Router Code ##############################
            currentDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
            routing_switch_counts_queryset = RoutingSwitchCounts.objects(userId=userId,transactionAPIId=payOutPaymentGatewayId,createdOn=currentDate).first()
            if routing_switch_counts_queryset:
                numberOfFails = routing_switch_counts_queryset.numberOfFails
                numberOfSuccess = routing_switch_counts_queryset.numberOfSuccess

            else:
                save_routing_switch_table=save_routing_switch_logs_data(userId,"payout",payOutPaymentGatewayId)

            ################################ Check api keys Code ##############################

            api_key = decryptResponse.get("api_key")
            req_bank_name=decryptResponse.get("bank_name")
            req_merchant_reference_number=decryptResponse.get("merchant_reference_number")
            req_bank_branch=decryptResponse.get("bank_branch")
            req_account_number=decryptResponse.get("account_number")
            req_ifsc_code=decryptResponse.get("ifsc_code")
            req_account_name=decryptResponse.get("account_name")
            req_amount=decryptResponse.get("amount")
            req_customer_email=decryptResponse.get("customer_email")
            req_customer_phone=decryptResponse.get("customer_phone")
            req_transfer_type=decryptResponse.get("transfer_type")
            req_remark=decryptResponse.get("remark")
            if not api_key and not req_merchant_reference_number and not req_bank_name and not req_account_number and not req_ifsc_code and not req_account_name and not req_amount and not req_customer_email and not req_customer_phone and not req_transfer_type:
                data_status['result']="Required Fields are missing!!"
                return data_status

            errorList = []
            
            if len(req_account_number) < 12 and len(req_account_number) > 15:
                errorList.append("Invalid length for Account number")
            
            if len(req_ifsc_code) != 11:
                errorList.append("Invalid length for IFSC code")
            
            if len(errorList) > 0:
                data_status['result']="Required Fields are missing!!"
                data_status['errors']=errorList
                return data_status

            ################################################ Checking For Velocity Rule Engine Conditions Code ###################################################
            velocity_rule_check = check_payout_velocity_rule_engine_conditions(userId,req_amount,req_account_number)
            if velocity_rule_check.get("responseStatus") == 0:
                data_status["result"]=velocity_rule_check.get("result")
                return data_status
            ######################################################################################################################################################

            
                
            if api_key == api_security_queryset.apiKey:
                if decryptResponse.get('merchant_reference_number')=="":
                    data_status['result']="Merchant Reference Number missing"
                    return data_status

                checkorder_queryset = FundTransfers.objects(merchantReferenceNumber=decryptResponse.get('merchant_reference_number'),userId=str(userId)).first()
                if checkorder_queryset:
                    data_status['result']="Duplicate Merchant Reference Number!!"
                    return data_status

                checkamount = float(decryptResponse.get("amount"))
                
                if checkamount <= 0:
                    data_status['result']="Transaction amount is insufficient!!"
                    return data_status


                check_transaction_limits = merchant_transaction_limit_settings("Payout",payOutPaymentGatewayId,userId,checkamount)
                if check_transaction_limits.get("responseStatus") == 0:
                    data_status['result']=check_transaction_limits.get("result")
                    return data_status

                amount = float(decryptResponse.get("amount"))

                merchantUniqueNumber=merchant_id
                mid_extracted = merchantUniqueNumber[1:].lstrip("0")
                # clientOrderId = transaction_id_prefix + mid_extracted + str(get_epoch_milli_time())+str(random_digit_generate(2))
                clientOrderId = str(transaction_id_prefix)+str(mid_extracted)+str(req_merchant_reference_number)

                ###################################################### Slab Calculation for payout code ###########################################################
                payment_mode_queryset = PaymentMode.objects(paymentMode=decryptResponse.get("transfer_type")).first()
                if not payment_mode_queryset:
                    data_status["result"]="Invalid Transfer Type!!"
                    return data_status
                paymentModeId = str(payment_mode_queryset.id)
                sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=decryptResponse.get("transfer_type")).first()
                subPaymentModeId = str(sub_payment_mode_queryset.id)
                patternId = str(merchant_queryset.patternId.id)
                
                commissionCharges = slab_calculation_for_payout(amount,paymentModeId,subPaymentModeId,patternId,payOutPaymentGatewayId)
                if commissionCharges.get("slabId") == None:
                    slabId = None
                    transactionAmount = amount
                else:
                    slabId = commissionCharges.get("slabId")
                    transactionAmount = float(commissionCharges.get("transactionAmount"))
                ####################################################################################################################################################

                # try:
                #     payout_balance_queryset = PayoutBalances.objects(userId=userId,transactionAPIId=payOutPaymentGatewayId).first()
                #     if payout_balance_queryset.currentBalance:
                #         userPayoutBalance = payout_balance_queryset.currentBalance
                #     else:
                #         userPayoutBalance = 0
                # except Exception as e:
                #     userPayoutBalance = 0

                # if float(userPayoutBalance) < float(transactionAmount):
                #     insufficient_table = InsufficientBalanceLogs(
                #         userId=userId,
                #         orderId=req_merchant_reference_number,
                #         orderAmount=amount,
                #         walletAmount=float(merchant_queryset.payoutBalance),
                #         createdOn=datetime.datetime.now(),
                #         status=1
                #         ).save()
                #     data_status["result"]="Insufficient balance!!"
                #     return data_status
                

                ########################################################### Common Code ############################################################################
                save_api_request_data_table = ApiRequestData(
                    userId=str(merchant_queryset.id),
                    userOrderId=decryptResponse.get("merchant_reference_number"),
                    orderId=clientOrderId,
                    requestData=[decryptResponse],
                    createdOn=datetime.datetime.now(),
                    status=1
                    )
                save_table=save_api_request_data_table.save()

                transactionId=random_digit_generate(16)

                balanceResult=user_payout_balance_update(str(merchant_queryset.id),float(transactionAmount),"Debit",str(payOutPaymentGatewayId))
                # if balanceResult.get('responseStatus')==0:
                #     insufficient_table = InsufficientBalanceLogs(
                #         userId=userId,
                #         orderId=req_merchant_reference_number,
                #         orderAmount=amount,
                #         walletAmount=float(merchant_queryset.payoutBalance),
                #         createdOn=datetime.datetime.now(),
                #         status=1
                #         ).save()
                #     data_status["result"]="Insufficient balance!!"
                #     return data_status
                
                # payoutbalancelog_queryset=PayoutBalanceLogs(
                #     userId =str(merchant_queryset.id),
                #     transactionAPIId =str(payOutPaymentGatewayId),
                #     previousBalance = round(float(balanceResult.get('transactionPreviousBalance')),2),
                #     currentBalance = round(float(balanceResult.get('transactionCurrentBalance')),2),
                #     amount=round(float(amount),2),
                #     grandTotal=round(float(transactionAmount),2),
                #     orderId=decryptResponse.get("merchant_reference_number"),
                #     transferType = "Debit",
                #     userType = "user",
                #     transactionId = transactionId,
                #     createdOn = datetime.datetime.now(),
                #     status = 1
                #     ).save()
                transactionUniqueId = str(random_digit_generate(15))
                fund_transfer_table = FundTransfers(
                    userId=str(merchant_queryset.id),
                    transactionAPIId=payOutPaymentGatewayId,
                    bankId=None,
                    bankName=decryptResponse.get("bank_name"),
                    merchantReferenceNumber=decryptResponse.get("merchant_reference_number"),
                    pgOrderId=clientOrderId,
                    fundTransferType="instant",
                    accountType="bank",
                    apiType="api",
                    slabId=slabId,
                    transferType="Debit",
                    bankBranch=decryptResponse.get("bank_branch"),
                    accountNumber=decryptResponse.get("account_number"),
                    accountIFSCCode=decryptResponse.get("ifsc_code"),
                    beneficiaryName=decryptResponse.get("account_name"),
                    uniqueRequestNumber=None,
                    amount=round(float(decryptResponse.get("amount")),2),
                    grandTotal=round(float(transactionAmount),2),
                    previousBalance = round(float(balanceResult.get('userPreviousBalance')),2),
                    currentBalance = round(float(balanceResult.get('userCurrentBalance')),2),
                    beneficiaryMail=decryptResponse.get("customer_email"),
                    beneficiaryPhone=decryptResponse.get("customer_phone"),
                    paymentMode=decryptResponse.get("transfer_type"),
                    narration=decryptResponse.get("remark"),
                    createdOn=datetime.datetime.now(),
                    userType="user",
                    status=2,
                    clientIp=client_ip,
                    statusCheckId = clientOrderId,
                    transactionUniqueId = transactionUniqueId,
                    commissionCharges=commissionCharges
                    )
                save_table = fund_transfer_table.save()
                instantTransferId = str(save_table.id)
                fund_transfer_queryset = FundTransfers.objects(id=instantTransferId).first()


                amount = decryptResponse.get("amount")
                transfer_type = decryptResponse.get("transfer_type")
                account_name = decryptResponse.get("account_name")
                account_number = decryptResponse.get("account_number")
                ifsc_code = decryptResponse.get("ifsc_code")
                bank_name = decryptResponse.get("bank_name")
                merchant_reference_number = decryptResponse.get("merchant_reference_number")

                number = decryptResponse.get("customer_phone")
                transferMode = decryptResponse.get("transfer_type")
                accountNo = decryptResponse.get("account_number")
                ifscCode = decryptResponse.get("ifsc_code")
                beneficiaryName = decryptResponse.get("account_name")
                benecode = decryptResponse.get("bene_code")
                # clientOrderId = merchant_queryset.merchantUniqueNumber+"-"+decryptResponse.get("merchant_reference_number")
                

                bank_branch=decryptResponse.get("bank_branch")


                if merchant_queryset.payOutPaymentGatewayId:
                    if paymentGateWayCode == "AccurePay_Payout":
                        get_api_key = ""
                        get_salt = ""
                        for each_key in payout_gate_way_queryset.paramsList:
                            get_key = each_key.get("key")
                            if get_key == "api_key":
                                get_api_key = each_key.get("value")
                            if get_key == "salt":
                                get_salt = each_key.get("value")
                            if get_key == "base_url":
                                get_base_url = each_key.get("value")

                        ###################### Accurepay Payout Fundtransfer Functionality Code #####################################
                        paymentgatewayresponseDict = accurepay_payout_fundtransfer(get_api_key,get_salt,get_base_url,userId,payOutPaymentGatewayId,client_ip,amount,transfer_type,account_name,account_number,ifsc_code,bank_name,clientOrderId,"api")
                        ##########################################################################################################

                    elif paymentGateWayCode == "WowPe_Payout":
                        get_client = ""
                        get_secret = ""
                        get_base_url = ""

                        for each_key in payout_gate_way_queryset.paramsList:
                            get_key = each_key.get("key")        
                            if get_key == "api_key":
                                get_client = each_key.get("value").strip()
                            if get_key == "secret_key":
                                get_secret = each_key.get("value").strip()
                            if get_key == "base_url":
                                get_base_url = each_key.get("value").strip()
                        
                        ########################################################## Wowpe Payout Fundtransfer Functionality Code #######################################################
                        paymentgatewayresponseDict = wowpe_payout_fundtransfer(get_client,get_secret,get_base_url,number,amount,transferMode,accountNo,ifscCode,beneficiaryName,clientOrderId,userId,payOutPaymentGatewayId,client_ip,"api")
                        ################################################################################################################################################################

                    elif paymentGateWayCode == "PAYAID_PAYOUT":
                        get_api_key = ""
                        get_salt = ""
                        get_base_url = ""
                        for each_key in payout_gate_way_queryset.paramsList:
                            get_key = each_key.get("key")        
                            if get_key == "api_key":
                                get_api_key = each_key.get("value").strip()
                            if get_key == "salt":
                                get_salt = each_key.get("value").strip()
                            if get_key == "base_url":
                                get_base_url = each_key.get("value").strip()
                        
                        ########################################################## PayAid Payout Fundtransfer Functionality Code #######################################################
                        paymentgatewayresponseDict = payaid_payout_fundtransfer(get_api_key,get_salt,get_base_url,clientOrderId,account_name,amount,account_number,ifsc_code,bank_name,transfer_type,bank_branch,payOutPaymentGatewayId,client_ip,userId,"api")
                        ################################################################################################################################################################

                    elif paymentGateWayCode == "Idfc_Payout":
                        client_id = ""
                        secretKey = ""
                        kid = ""
                        get_base_url = ""
                        aud_url = ""
                        auth_url = ""
                        grant_type = ""
                        scope = ""
                        source = ""
                        client_assertion_type = ""
                        debitAcountNumber = ""
                        remitterName = ""

                        for each_key in payout_gate_way_queryset.paramsList:
                            get_key = each_key.get("key")        
                            if get_key == "client_id":
                                client_id = each_key.get("value").strip()
                            if get_key == "secret_key":
                                secretKey = each_key.get("value").strip()
                            if get_key == "base_url":
                                get_base_url = each_key.get("value").strip()
                            if get_key == "kid":
                                kid = each_key.get("value").strip()
                            if get_key == "aud_url":
                                aud_url = each_key.get("value").strip()
                            if get_key == "auth_url":
                                auth_url = each_key.get("value").strip()
                            if get_key == "scope":
                                scope = each_key.get("value").strip()
                            if get_key == "grant_type":
                                grant_type = each_key.get("value").strip()
                            if get_key == "source":
                                source = each_key.get("value").strip()
                            if get_key == "client_assertion_type":
                                client_assertion_type = each_key.get("value").strip()
                            if get_key == "debit_acount_number":
                                debitAcountNumber = each_key.get("value").strip()
                            if get_key == "remitter_name":
                                remitterName = each_key.get("value").strip()

                        
                        ########################################################## Idfc Payout Fundtransfer Functionality Code #######################################################
                        paymentgatewayresponseDict = idfc_payout_fundtransfer(client_id,secretKey,kid,get_base_url,aud_url,auth_url,grant_type,scope,source,client_assertion_type,debitAcountNumber,remitterName,number,amount,transfer_type,account_number,ifsc_code,account_name,bank_branch,clientOrderId,userId,payOutPaymentGatewayId,client_ip,"api",req_remark,req_customer_email)
                        ################################################################################################################################################################


                    elif paymentGateWayCode == "Axis_Payout":
                        client_id = ""
                        client_secret = ""
                        get_api_key=""
                        channelId=""
                        serviceRequestId=""
                        corpCode=""
                        serviceRequestVersion=""
                        get_base_url=""
                        corp_account_number=""

                        for each_key in payout_gate_way_queryset.paramsList:
                            get_key = each_key.get("key")
                            if get_key=="client_id":
                                client_id=each_key.get("value")
                            if get_key=="client_secret":
                                client_secret=each_key.get("value")
                            if get_key=="encryption_key":
                                get_api_key=each_key.get("value")
                            if get_key=="channel_id":
                                channelId=each_key.get("value")
                            if get_key=="service_request_id":
                                serviceRequestId=each_key.get("value")
                            if get_key=="service_request_version":
                                serviceRequestVersion=each_key.get("value")
                            if get_key=="corp_code":
                                corpCode=each_key.get("value")
                            if get_key=="get_base_url":
                                get_base_url=each_key.get("value")
                            if get_key=="corp_account_number":
                                corp_account_number=each_key.get("value")


                        requestUUID = str(random_digit_generate(15))

                        ########################################################## Axis Payout Fundtransfer Functionality Code #######################################################
                        paymentgatewayresponseDict = axis_payout_fundtransfer(client_id,client_secret,get_api_key,channelId,get_base_url,requestUUID,serviceRequestId,serviceRequestVersion,corpCode,corp_account_number,amount,beneficiaryName,userId,ifsc_code,transfer_type,benecode,clientOrderId,account_number,req_bank_name)
                        ################################################################################################################################################################


                    else:
                        data_status["result"]="Invalid Request!!"
                        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
                        # For count update number of failures in routing switch counts table
                        if routing_switch_counts_queryset:
                            existingFailuresCount = routing_switch_counts_queryset.numberOfFails
                            updateFailuresCount = existingFailuresCount+1

                            routing_switch_counts_queryset.update(numberOfFails=updateFailuresCount)
                        else:
                            save_routing_switch_table.update(numberOfFails=1)
                        return data_status


                    ################################## Common Code For All Payout Payment Gateways ######################################################
                    if paymentgatewayresponseDict.get("responseStatus") == 1:
                        if paymentgatewayresponseDict.get("bank_reference_number"):
                            bank_reference_number = paymentgatewayresponseDict.get("bank_reference_number")
                        else:
                            bank_reference_number = fund_transfer_queryset.bankReferenceNumber

                        transactionData = paymentgatewayresponseDict.get("transactionData")

                        latest_fund_transfer_queryset = FundTransfers.objects(id=instantTransferId).first()
                        previousstatus=latest_fund_transfer_queryset.status

                        if paymentgatewayresponseDict.get("transactionstatus")==0 or paymentgatewayresponseDict.get("transactionstatus")==4:
                            getrefund_record=FundTransfers.objects(pgOrderId=latest_fund_transfer_queryset.pgOrderId,userId=str(merchant_queryset.id)).count()
                            if (previousstatus==1 or previousstatus==2) and getrefund_record==0:
                                balanceResult=user_payout_balance_update(str(userId),float(transactionAmount),"Credit",str(payOutPaymentGatewayId))
                                if balanceResult.get('responseStatus')==0:
                                    flash("Unable to connect with server. Please Try again.")
                                    return redirect(url_for("wallet_credits_debits.credit_to_wallet"))

                                merchantReferenceNumber=random_digit_generate(16)
                                refund_transfer_table = FundTransfers(
                                    userId=str(merchant_queryset.id),
                                    transactionAPIId=payOutPaymentGatewayId,
                                    bankId=None,
                                    bankName=decryptResponse.get("bank_name"),
                                    merchantReferenceNumber=merchantReferenceNumber,
                                    transactionUniqueId=str(latest_fund_transfer_queryset.transactionUniqueId),
                                    pgOrderId=str(latest_fund_transfer_queryset.pgOrderId),
                                    fundTransferType="instant",
                                    accountType="bank",
                                    apiType="api",
                                    slabId=slabId,
                                    transferType="Refund",
                                    bankBranch=decryptResponse.get("bank_branch"),
                                    accountNumber=decryptResponse.get("account_number"),
                                    accountIFSCCode=decryptResponse.get("ifsc_code"),
                                    beneficiaryName=decryptResponse.get("account_name"),
                                    bankReferenceNumber=bank_reference_number,
                                    uniqueRequestNumber=None,
                                    fundTransferId=str(instantTransferId),
                                    amount=decryptResponse.get("amount"),
                                    grandTotal=round(float(transactionAmount),2),
                                    previousBalance = round(float(balanceResult.get('userPreviousBalance')),2),
                                    currentBalance = round(float(balanceResult.get('userCurrentBalance')),2),
                                    beneficiaryMail=decryptResponse.get("customer_email"),
                                    beneficiaryPhone=decryptResponse.get("customer_phone"),
                                    paymentMode=decryptResponse.get("transfer_type"),
                                    narration=decryptResponse.get("remark"),
                                    createdOn=datetime.datetime.now(),
                                    userType="user",
                                    status=5,
                                    transactionData=transactionData,
                                    transactionDate=paymentgatewayresponseDict.get("transactionDate"),
                                    requestData=paymentgatewayresponseDict.get("requestData"),
                                    clientIp=client_ip,
                                    statusCheckId=latest_fund_transfer_queryset.statusCheckId,
                                    commissionCharges=commissionCharges
                                    )
                                save_table = refund_transfer_table.save()
                                
                                payoutbalancelog_queryset=PayoutBalanceLogs(
                                    userId =str(merchant_queryset.id),
                                    transactionAPIId =str(payOutPaymentGatewayId),
                                    previousBalance = round(float(balanceResult.get('transactionPreviousBalance')),2),
                                    currentBalance = round(float(balanceResult.get('transactionCurrentBalance')),2),
                                    amount=round(float(amount),2),
                                    grandTotal=round(float(transactionAmount),2),
                                    orderId=decryptResponse.get("merchant_reference_number"),
                                    transferType = "Refund",
                                    userType = "user",
                                    transactionId = paymentgatewayresponseDict.get("transaction_id"),
                                    createdOn = datetime.datetime.now(),
                                    status = 1
                                    ).save()

                        latest_fund_transfer_queryset.update(
                            transactionData=paymentgatewayresponseDict.get("transactionData"),
                            errorMessage=paymentgatewayresponseDict.get("messages"),
                            transactionUniqueId=paymentgatewayresponseDict.get("transaction_id"),
                            bankReferenceNumber=bank_reference_number,
                            status=paymentgatewayresponseDict.get("transactionstatus"),
                            transactionDate=paymentgatewayresponseDict.get("transactionDate"),
                            requestData=paymentgatewayresponseDict.get("requestData"),
                            )
                        responseDict = {
                        "status":paymentgatewayresponseDict.get("status"),
                        "merchant_reference_number":decryptResponse.get("merchant_reference_number"),
                        "account_name":decryptResponse.get('account_name'),
                        "amount":decryptResponse.get('amount'),
                        "account_number":decryptResponse.get('account_number'),
                        "ifsc_code":decryptResponse.get('ifsc_code'),
                        "bank_name":decryptResponse.get('bank_name'),
                        "bank_reference_number":bank_reference_number,
                        "transfer_type":decryptResponse.get('transfer_type'),
                        "bank_branch":decryptResponse.get('bank_branch'),
                        "customer_email":decryptResponse.get('customer_email'),
                        "customer_phone":decryptResponse.get('customer_phone'),
                        "remark":decryptResponse.get('remark'),
                        "errorMessage":paymentgatewayresponseDict.get("messages"),
                        "transaction_id":paymentgatewayresponseDict.get("transaction_id")
                        }
                        data_status["responseStatus"]=1
                        data_status["result"]="Success"
                        data_status["responseBody"]=responseDict
                        return data_status

                        # For count update number of success in routing switch counts table
                        if routing_switch_counts_queryset:
                            existingSuccessCount = routing_switch_counts_queryset.numberOfSuccess
                            updateSuccessCount = existingSuccessCount+1

                            existingSuccessAmount = float(routing_switch_counts_queryset.maxVolume)
                            updateSuccessAmount = float(existingSuccessAmount)+float(decryptResponse.get('amount'))

                            routing_switch_counts_queryset.update(numberOfSuccess=updateSuccessCount,maxVolume=updateSuccessAmount)
                        else:
                            save_routing_switch_table.update(numberOfSuccess=1,maxVolume=float(decryptResponse.get('amount')))

                        return data_status
                    else:
                        data_status["responseStatus"]=paymentgatewayresponseDict.get("responseStatus")
                        data_status["result"]=paymentgatewayresponseDict.get("result")
                        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())

                        # For count update number of failures in routing switch counts table
                        if routing_switch_counts_queryset:
                            existingFailuresCount = routing_switch_counts_queryset.numberOfFails
                            updateFailuresCount = existingFailuresCount+1

                            routing_switch_counts_queryset.update(numberOfFails=updateFailuresCount)
                        else:
                            save_routing_switch_table.update(numberOfFails=1)
                        return data_status
                else:
                    data_status["result"]="Please contact to admin to enable payout option!!"
                    save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
                    # For count update number of failures in routing switch counts table
                    if routing_switch_counts_queryset:
                        existingFailuresCount = routing_switch_counts_queryset.numberOfFails
                        updateFailuresCount = existingFailuresCount+1

                        routing_switch_counts_queryset.update(numberOfFails=updateFailuresCount)
                    else:
                        save_routing_switch_table.update(numberOfFails=1)
                    return data_status

            else:
                data_status["result"]="Mis-matched api keys!!"
                save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
                # For count update number of failures in routing switch counts table
                if routing_switch_counts_queryset:
                    existingFailuresCount = routing_switch_counts_queryset.numberOfFails
                    updateFailuresCount = existingFailuresCount+1

                    routing_switch_counts_queryset.update(numberOfFails=updateFailuresCount)
                else:
                    save_routing_switch_table.update(numberOfFails=1)
                return data_status
        else:
            data_status["result"]="Required fields are missing!!"
            save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get payout data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payout","fund_transfer","fundtransfer",exceptionData,client_ip,"api")
        return data_status


# @payout_apis.route("/checking_ip",methods=["POST"])
# def checking_ip():
#     try:
#         # Extracting client IP address
#         if request.headers.getlist("X-Forwarded-For"):
#             client_ip = request.headers.getlist("X-Forwarded-For")[0]
#         else:
#             client_ip = request.remote_addr

#         print(client_ip,"CLIENT IP")

#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         data_status["result"]="Unable to get fundtransfer statu data!!"
#         return data_status


@payout_apis.route("/getfundtransferstatus",methods=["POST"])
def getfundtransferstatus():
    print(request.headers,'*****request.headers******')
    data_status = {"responseStatus":0,"result":""}
    if SERVER_STATUS == "DOWN":
        data_status["result"]= SERVER_MAINTAINCE_MESSAGE
        return data_status
    merchant_id = request.headers.get("Merchant-Id","")
    api_key = request.headers.get("Api-Key","")
    order_id = request.form.get("order_id","")

    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"):
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    print(client_ip,"CLIENT IP")

    try:
        if not order_id and not merchant_id and not api_key:
            data_status["result"]="Required fields are missing!!"
            return data_status
        merchant_queryset = Users.objects(merchantUniqueNumber=merchant_id,status=1).first()
        if not merchant_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status

        check_kyc_status = merchant_kyc_status(str(merchant_queryset.id))
        if check_kyc_status.get("responseStatus") != 1:
            data_status["result"]="Merchant KYC is not completed please contact to admin!!"
            return data_status
        kycStatus = check_kyc_status.get("merchantKycDetails", {}).get("kycStatus")
        if kycStatus == False:
            data_status["result"]="Merchant KYC is not completed please contact to admin!!"
            return data_status

        userId = str(merchant_queryset.id)
        api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payout",userId=userId,status__in=[1]).first()
        if not api_security_queryset:
            data_status["result"]="Invalid api key!!"
            return data_status

        # if client_ip not in api_security_queryset.ipAddressList:
        #     data_status["result"]="Your ip adress is not whitelisted please contact admin!!"
        #     return data_status

        # merchantReferenceNumber = str(merchant_queryset.merchantUniqueNumber)+"-"+str(order_id)
        # pgOrderId = transaction_id_prefix + mid_extracted + str(get_epoch_milli_time())+str(random_digit_generate(2))
        # print(order_id,"374035780792900")
        order_queryset = FundTransfers.objects(merchantReferenceNumber=order_id).first()
        print(order_queryset,"(((((((((order_queryset)))))))))")
        if not order_queryset:
            data_status["result"]="Invalid order id!!"
            return data_status

        get_fundtransfer_status = get_fundtransfer_payment_status(order_id,userId,client_ip="")

        print(get_fundtransfer_status,"((((((((((((GET FundTransfer Status))))))))))))")

        data_status["responseStatus"]=1
        data_status["result"]="Success"
        data_status["responseBody"]=get_fundtransfer_status
        return data_status

    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get fundtransfer status data!!"
        return data_status

@payout_apis.route("/checkfundtransferstatus",methods=["GET"])
def checkfundtransferstatus():
    data_status={'responseStatus':0,"result":""}
    try:
        fundtransfers_queryset = FundTransfers.objects(status__in=[0,2]).order_by("statusCount").limit(1)
        # print(fundtransfers_queryset.count(),"fundtransfers_queryset")
        # return data_status
        for each_record in fundtransfers_queryset:
          userId = str(each_record.userId.id)
          get_fundtransfer_status = get_fundtransfer_payment_status(each_record.merchantReferenceNumber,userId)

        return redirect(url_for('admin_reports.update_transaction_reports'))

    except Exception as e:
        app.logger.error(traceback.format_exc())
        return redirect(url_for('admin_reports.update_transaction_reports'))

# @payout_apis.route("/checkfundtransferstatus",methods=["GET"])
# def checkfundtransferstatus():
#     data_status={'responseStatus':0,"result":""}
#     try:
#         fundtransfers_queryset = FundTransfers.objects(id=ObjectId("6691500f6dc174a9b86cbecc")).order_by("statusCount").limit(50)
#         print(fundtransfers_queryset.count(),"fundtransfers_queryset")
#         return data_status
#         # for each_record in fundtransfers_queryset:
#         #   userId = str(each_record.userId.id)
#         #   get_fundtransfer_status = get_fundtransfer_payment_status(each_record.merchantReferenceNumber,userId)

#         # return redirect(url_for('admin_reports.update_transaction_reports'))

#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         return redirect(url_for('admin_reports.update_transaction_reports'))

@payout_apis.route("/checkduplicaterefunds",methods=["POST"])
def checkduplicaterefunds():
    data_status={'responseStatus':0,"result":""}
    refundlist=[]
    try:
        userId="667d13c17ebce740151a9437"
        order_queryset = FundTransfers.objects(status=5,userId = str(userId)).distinct('transactionUniqueId')
        i=0
        deductSum=0
        print(order_queryset,'**************order_queryset_records**************')
        for each_record in order_queryset:
            print(each_record,"*****************each_recorddata*******************")
            distrecord=FundTransfers.objects(transactionUniqueId=str(each_record)).first()
            refundorder_queryset = FundTransfers.objects(status=5,userId = str(userId),transactionUniqueId=str(each_record),id__ne=str(distrecord.id)).all()
            noofrefunds=refundorder_queryset.count()
            deductSum=float(deductSum)+(noofrefunds*float(distrecord.grandTotal))
            i=i+noofrefunds
            if noofrefunds>0:
                refundlistdict={
                'transactionUniqueId':str(distrecord.transactionUniqueId),
                'id':str(distrecord.id),
                'grandTotal':float(distrecord.grandTotal),
                'noofrefunds':noofrefunds,
                'totaldeductAmount':float(distrecord.grandTotal)*noofrefunds
                }
                refundlist.append(refundlistdict)
                    
        data_status["responseStatus"]=1
        data_status["result"]=refundlist
        data_status["deductSum"]=deductSum
        data_status["noofrecords"]=i
        return data_status

    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get fundtransfer statu data!!"
        return data_status

def get_fundtransfer_payment_status(statusCheckId,userId,client_ip):
    responseBody = {}
    paymentgatewayResponseStatusDict = {}
    try:
        # fund_transfer_queryset = FundTransfers.objects(statusCheckId=statusCheckId,userId=str(userId)).first()
        fund_transfer_queryset = FundTransfers.objects(merchantReferenceNumber=statusCheckId,userId=str(userId)).first()
        if fund_transfer_queryset:
            if fund_transfer_queryset.csvFileUpload=="manual":
                responseBody = {
                "status":"SUCCESS",
                "merchant_reference_number":statusCheckId,
                "bankReferenceNumber":str(fund_transfer_queryset.bankReferenceNumber),
                "error_message":"Success",
                "transaction_id":str(fund_transfer_queryset.transactionUniqueId)
                }
                return responseBody
            user_queryset = Users.objects(id=str(fund_transfer_queryset.userId.id),status=1).first()
            if not user_queryset:
                responseBody["error"]="Invalid merchant id!!"
                return responseBody
            transaction_amount=0
            apiId = str(fund_transfer_queryset.transactionAPIId.id)
            transaction_amount = float(fund_transfer_queryset.grandTotal)
            if fund_transfer_queryset.statusCount:
                previousStatusCount = fund_transfer_queryset.statusCount
            else:
                previousStatusCount=0

            api_queryset = TransactionAPI.objects(id=apiId).first()


            actuallBalance=0
            updateAmount=0
            previousBalance=0
            payoutCurrentBalance=0
            actuallBalance = user_queryset.payoutBalance
            # payout_balance_queryset = PayoutBalances.objects(userId=str(fund_transfer_queryset.userId.id),transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id)).first()
            # previousBalance=payout_balance_queryset.currentBalance

            if api_queryset.code == "AccurePay_Payout":
                get_api_key = ""
                get_salt = ""
                get_base_url = ""

                for each_key in api_queryset.paramsList:
                    get_key = each_key.get("key")        
                    if get_key == "api_key":
                        get_api_key = each_key.get("value")
                    if get_key == "salt":
                        get_salt = each_key.get("value")
                    if get_key == "base_url":
                        get_base_url = each_key.get("value")

                ##################################### Accurepay Payout Fundtransfer Check Status Code ##############################################
                paymentgatewayResponseStatusDict = accurepay_payout_fundtransfer_status(get_api_key,get_salt,statusCheckId,get_base_url,fund_transfer_queryset)
                ####################################################################################################################################

            elif api_queryset.code == "WowPe_Payout":
                get_api_key = ""
                get_secret = ""
                get_base_url = ""

                for each_key in api_queryset.paramsList:
                    get_key = each_key.get("key")        
                    if get_key == "api_key":
                        get_api_key = each_key.get("value").strip()
                    if get_key == "secret_key":
                        get_secret = each_key.get("value").strip()
                    if get_key == "base_url":
                        get_base_url = each_key.get("value").strip()

                ##################################### Wowpe Payout Fundtransfer Check Status Code ##############################################
                paymentgatewayResponseStatusDict = wowpe_payout_fundtransfer_status(get_api_key,get_secret,get_base_url,statusCheckId,fund_transfer_queryset)
                ################################################################################################################################

            elif api_queryset.code == "PAYAID_PAYOUT":
                get_api_key = ""
                get_salt = ""
                get_base_url = ""

                for each_key in api_queryset.paramsList:
                    get_key = each_key.get("key")        
                    if get_key == "api_key":
                        get_api_key = each_key.get("value").strip()
                    if get_key == "salt":
                        get_salt = each_key.get("value").strip()
                    if get_key == "base_url":
                        get_base_url = each_key.get("value").strip()

                ##################################### PAYAID Payout Fundtransfer Check Status Code ##############################################
                pgCheckStatusResponseDict = payaid_payout_fundtransfer_check_status(get_api_key,statusCheckId,get_salt,get_base_url)
                ################################################################################################################################

            elif api_queryset.code == "Idfc_Payout":
                client_id = ""
                secretKey = ""
                kid = ""
                get_base_url = ""
                aud_url = ""
                auth_url = ""
                grant_type = ""
                scope = ""
                source = ""
                client_assertion_type = ""
                debitAcountNumber = ""
                remitterName = ""

                for each_key in api_queryset.paramsList:
                    get_key = each_key.get("key")        
                    if get_key == "client_id":
                        client_id = each_key.get("value").strip()
                    if get_key == "secret_key":
                        secretKey = each_key.get("value").strip()
                    if get_key == "base_url":
                        get_base_url = each_key.get("value").strip()
                    if get_key == "kid":
                        kid = each_key.get("value").strip()
                    if get_key == "aud_url":
                        aud_url = each_key.get("value").strip()
                    if get_key == "auth_url":
                        auth_url = each_key.get("value").strip()
                    if get_key == "scope":
                        scope = each_key.get("value").strip()
                    if get_key == "grant_type":
                        grant_type = each_key.get("value").strip()
                    if get_key == "source":
                        source = each_key.get("value").strip()
                    if get_key == "client_assertion_type":
                        client_assertion_type = each_key.get("value").strip()
                    if get_key == "debit_acount_number":
                        debitAcountNumber = each_key.get("value").strip()
                    if get_key == "remitter_name":
                        remitterName = each_key.get("value").strip()

                
                ########################################################## Idfc Payout Fundtransfer Functionality Code #######################################################
                paymentgatewayResponseStatusDict = idfc_payout_fundtransfer_status(source,kid,aud_url,auth_url,grant_type,scope,client_id,client_assertion_type,fund_transfer_queryset,secretKey,get_base_url)
                ################################################################################################################################################################


            elif api_queryset.code == "Axis_Payout":
                client_id = ""
                client_secret = ""
                get_api_key=""
                channelId=""
                serviceRequestId=""
                corpCode=""
                serviceRequestVersion=""
                get_base_url=""
                corp_account_number=""

                for each_key in api_queryset.paramsList:
                    get_key = each_key.get("key")
                    if get_key=="client_id":
                        client_id=each_key.get("value")
                    if get_key=="client_secret":
                        client_secret=each_key.get("value")
                    if get_key=="encryption_key":
                        get_api_key=each_key.get("value")
                    if get_key=="channel_id":
                        channelId=each_key.get("value")
                    if get_key=="service_request_id":
                        serviceRequestId=each_key.get("value")
                    if get_key=="service_request_version":
                        serviceRequestVersion=each_key.get("value")
                    if get_key=="corp_code":
                        corpCode=each_key.get("value")
                    if get_key=="get_base_url":
                        get_base_url=each_key.get("value")
                    if get_key=="corp_account_number":
                        corp_account_number=each_key.get("value")

                requestUUID = str(random_digit_generate(15))
                ########################################################## Axis Payout Fundtransfer Status Functionality Code #######################################################
                paymentgatewayResponseStatusDict = axis_payout_fundtransfer_check_status(client_id, client_secret, get_api_key, channelId, get_base_url, requestUUID, serviceRequestId, serviceRequestVersion, corpCode,statusCheckId,fund_transfer_queryset)
                ################################################################################################################################################################
            else:
                responseBody["error"]="Unable to connect to the server!!"
                return responseBody

            if paymentgatewayResponseStatusDict.get("responseStatus") == 2:
                if fund_transfer_queryset.status==1:
                    textStatus="SUCCESS"
                elif fund_transfer_queryset.status==0:
                    textStatus="FAILED"
                elif fund_transfer_queryset.status==4:
                    textStatus="REVERSAL"
                else:
                    textStatus="PROCESSING"

                responseBody = {
                "status":textStatus,
                "merchant_reference_number":statusCheckId,
                "bankReferenceNumber":"",
                "error_message":textStatus,
                "transaction_id":paymentgatewayResponseStatusDict.get("transaction_id")
                }
                return responseBody
            elif paymentgatewayResponseStatusDict.get("responseStatus") == 1:
                # if paymentgatewayResponseStatusDict.get("transactionStatus")==0 or paymentgatewayResponseStatusDict.get("transactionStatus")==4:
                #     latest_fund_transfer_queryset=FundTransfers.objects(id=str(fund_transfer_queryset.id)).first()
                #     getrefund_record=FundTransfers.objects(fundTransferId=str(latest_fund_transfer_queryset.id)).count()
                #     if (latest_fund_transfer_queryset.status==1 or latest_fund_transfer_queryset.status==2) and getrefund_record==0:

                #         balanceResult=user_payout_balance_update(str(fund_transfer_queryset.userId.id),float(fund_transfer_queryset.grandTotal),"Credit",str(fund_transfer_queryset.transactionAPIId.id))
                #         if balanceResult.get('responseStatus')==0:
                #             responseBody["error"]="Unable to connect to the server!!"
                #             return responseBody
                #         merchantReferenceNumber=str(random_digit_generate(16))
                #         if fund_transfer_queryset.slabId:
                #             slabId = str(fund_transfer_queryset.slabId.id)
                #         else:
                #             slabId = None
                            
                #         fund_transfer_table = FundTransfers(
                #             userId=str(fund_transfer_queryset.userId.id),
                #             transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id),
                #             bankId=None,
                #             transactionUniqueId=str(statusCheckId),
                #             bankName=str(fund_transfer_queryset.bankName),
                #             merchantReferenceNumber=str(merchantReferenceNumber),
                #             fundTransferId=str(fund_transfer_queryset.id),
                #             pgOrderId=str(fund_transfer_queryset.pgOrderId),
                #             fundTransferType="instant",
                #             accountType="bank",
                #             apiType="api",
                #             slabId=slabId,
                #             transferType="Credit",
                #             bankBranch=str(fund_transfer_queryset.bankBranch),
                #             accountNumber=str(fund_transfer_queryset.accountNumber),
                #             accountIFSCCode=str(fund_transfer_queryset.accountIFSCCode),
                #             beneficiaryName=str(fund_transfer_queryset.beneficiaryName),
                #             uniqueRequestNumber=str(fund_transfer_queryset.beneficiaryName),
                #             amount=round(float(fund_transfer_queryset.amount),2),
                #             grandTotal=round(float(fund_transfer_queryset.grandTotal),2),
                #             beneficiaryMail=str(fund_transfer_queryset.beneficiaryMail),
                #             beneficiaryPhone=str(fund_transfer_queryset.beneficiaryPhone),
                #             paymentMode=str(fund_transfer_queryset.paymentMode),
                #             narration=str(fund_transfer_queryset.narration),
                #             commissionCharges=fund_transfer_queryset.commissionCharges,
                #             transactionData=paymentgatewayResponseStatusDict.get("transactionData"),
                #             currentBalance=round(float(balanceResult.get('userCurrentBalance')),2),
                #             previousBalance=round(float(balanceResult.get('userPreviousBalance')),2),
                #             createdOn=datetime.datetime.now(),
                #             statusCount = int(previousStatusCount)+1,
                #             errorMessage="Refunded",
                #             clientIp=client_ip,
                #             status=5
                #             )
                #         save_table = fund_transfer_table.save()
                        
                        
                #         payoutbalancelog_queryset=PayoutBalanceLogs(
                #             userId =str(fund_transfer_queryset.userId.id),
                #             transactionAPIId =str(fund_transfer_queryset.transactionAPIId.id),
                #             previousBalance = round(float(balanceResult.get('transactionPreviousBalance')),2),
                #             currentBalance = round(float(balanceResult.get('transactionCurrentBalance')),2),
                #             amount=round(float(fund_transfer_queryset.amount),2),
                #             grandTotal=round(float(fund_transfer_queryset.grandTotal),2),
                #             orderId=fund_transfer_queryset.merchantReferenceNumber,
                #             transferType = "Refund",
                #             userType = "user",
                #             transactionId = paymentgatewayResponseStatusDict.get("transaction_id"),
                #             createdOn = datetime.datetime.now(),
                #             status = 1
                #             ).save()

                updatePreviousStatusCount = int(previousStatusCount)+1
                if fund_transfer_queryset.responseCallBackTime:
                    responseCallBackTime=fund_transfer_queryset.responseCallBackTime
                else:
                    responseCallBackTime=datetime.datetime.now()

                finalStatus=2
                if paymentgatewayResponseStatusDict.get("transactionStatus")==1:
                    finalStatus=1

                fund_transfer_queryset.update(
                    responseCallBackTime=responseCallBackTime,
                    errorMessage = paymentgatewayResponseStatusDict.get("error_message"),
                    transactionUniqueId=paymentgatewayResponseStatusDict.get("transaction_id"),
                    bankReferenceNumber=paymentgatewayResponseStatusDict.get("bankReferenceNumber"),
                    statusCount = updatePreviousStatusCount,
                    status=finalStatus
                    )

                if fund_transfer_queryset.payoutResponseCallBackData == []:
                    fund_transfer_queryset.update(payoutResponseCallBackData=paymentgatewayResponseStatusDict.get("transactionData"))

                responseBody = {
                "status":paymentgatewayResponseStatusDict.get("textStatus"),
                "merchant_reference_number":statusCheckId,
                "bank_reference_number":paymentgatewayResponseStatusDict.get("bankReferenceNumber"),
                "error_message":paymentgatewayResponseStatusDict.get("error_message"),
                "transaction_id":paymentgatewayResponseStatusDict.get("transaction_id")
                }
                return responseBody
            else:
                responseBody["error"]=paymentgatewayResponseStatusDict.get("result")
                return responseBody
        else:
            responseBody["error"]="Invalid Status Check Id!!"
            return responseBody
    except Exception as e:
        app.logger.error(traceback.format_exc())
        responseBody["error"]="Unable to connect to the server!!"
        return responseBody

# @payout_apis.route("/getaxisbanktoken",methods=["POST"])
# def getaxisbanktoken():
#   data_status = {"responseStatus":0,"result":""}
#     print(request.json,"axis payout call back url request.json response result")
#     print(request.form,"axis payout call back url request.form response result")
#     return data_status

# @payout_apis.route("/axisbanktokenvalidation",methods=["POST"])
# def axisbanktokenvalidation():
#   data_status = {"responseStatus":0,"result":""}
#     print(request.json,"axis payout call back url request.json response result")
#     print(request.form,"axis payout call back url request.form response result")
#     return data_status




sample_axis_beni_crea_static_data = {
    "api_key":"66c43d14b131cbb3c5aba543-8bf0a73fda352bcc0da5509ae4372bd7",
    # "merchant_reference_number":str(random_digit_generate(15)),
    "account_name":"Sai Krishna",
    # "amount":"204",
    "account_number":"159502971443",
    "ifsc_code":"INDB0000226",
    "bank_name":"Indusind Bank",
    "bene_code":"Testing1234",
    # "transfer_type":"NEFT",
    # "bank_branch":"MADHAPUR",
    # "customer_email":"sai.kerla@apptrinity.com",
    # "customer_phone":"9988776655",
    # "remark":"Testing remark",
}

# @payout_apis.route("/beneficiary_creation",methods=["POST"])
# def beneficiary_creation():
#   data_status = {"responseStatus":0,"result":""}
#   if SERVER_STATUS == "DOWN":
#       data_status["result"] = SERVER_MAINTAINCE_MESSAGE
#       return data_status
#   merchant_id = request.headers.get("Merchant-Id","")
#   api_key =  request.headers.get("Api-Key")
#   encryption_data = request.form.get("encryptionData","")
#   iv = request.form.get("iv","")

#   # secretKey = "f51085df02812201344f6f0cb6959647"
#   # encryption_key = bytes(secretKey, 'utf-8')
#   # responseEncrypt = encrypt(sample_axis_beni_crea_static_data,encryption_key)
#   # encryption_data = responseEncrypt.get('encryption_data')
#   # iv = responseEncrypt.get('iv')

#   responseDict = {}
#   paymentgatewayResponseStatusDict = {}

#   if request.headers.getlist("X-Forwarded-For"):
#       client_ip = request.headers.getlist("X-Forwarded-For")[0]
#   else:
#       client_ip = request.remote_addr

#   loginBrowser = request.headers.get("Sec-Ch-Ua")
#   if loginBrowser:
#       loginBrowseData = loginBrowser.split(";")
#       browser = loginBrowseData[0]
#   else:
#       loginBrowseData = request.headers.get('User-Agent').split(";")
#       browser = loginBrowseData[0]

#   payOutPaymentGatewayId = ""
#   userId=""
#   requestData = [{"encryptionData":encryption_data,"iv":iv}]

#   # Here Create client Logs Table 
#   save_client_table = save_client_logs_data(userId,"payout","beneficiary_creation","beneficiary_creation",None,requestData,client_ip,"api")

#   print(client_ip,"CLIENT IP")

#   try:
#       # if not order_id and merchant_id and not api_key:
#       if not merchant_id and not api_key:
#           data_status["result"] =  "required fields are missing!!"
#           return data_status
#       merchant_queryset = Users.objects(merchantUniqueNumber=merchant_id,status=1).first()
#       if not merchant_queryset:
#           data_status["result"] = "Invalid merchant id!!"
#           return data_status
        
#       check_kyc_status = merchant_kyc_status(str(merchant_queryset.id))
#       if check_kyc_status.get("responseStatus") != 1:
#           data_status["result"] = "Merchant KYC is not completed please contact to admin!!"
#           return data_status

#       kycStatus = check_kyc_status.get("merchantKycDetails", {}).get("kycStatus")
#       if kycStatus ==False:
#           data_status["result"] = "Merchant KYC is not completed please contact to admin!!"
#           return data_status
        
#       userId = str(merchant_queryset.id)
#       merchantUniqueNumber = str(merchant_queryset.merchantUniqueNumber)
        
#       api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payout",userId=userId,status=1).first()

#       if not api_security_queryset:
#           data_status["result"]="Invalid api key!!"
#           return data_status

#       try:
#           if not merchant_queryset.patternId.payoutPaymentGatewayId:
#               data_status["result"] = "Payout option is disabled please contact to admin!!"
#               return data_status
#       except Exception as e:
#           data_status["result"] = "Payout option is disabled please contact to admin!!"
#           return data_status
        

#       payOutPaymentGatewayId = str(merchant_queryset.patternId.payoutPaymentGatewayId.id)

#       payout_gate_way_queryset = TransactionAPI.objects(id=payOutPaymentGatewayId,status=1).first()

#       if not payout_gate_way_queryset:
#           data_status["result"] = "Payout option is disabled please contact to admin!!"
#           return data_status

#       paymentGatewayCodee = payout_gate_way_queryset.code

#       try:
#           secretKey = api_security_queryset.secretKey
#           encryption_key = bytes(secretKey,'utf-8')

#           jsonData = decrypt(encryption_data,encryption_key,iv)
#           decryptResponse = json.loads(jsonData)
#       except Exception as e:
#           app.logger.error(traceback.format_exc())
#           data_status["result"] =  "Invalid encryption data!!"
#           return data_status

#       save_client_table.update(userId=ObjectId(userId),transactionAPIId=ObjectId(payOutPaymentGatewayId))

        
#       errorList =[]
#       mid_extracted = merchantUniqueNumber[1:].lstrip("0")
#       beneficiaryCode = str(mid_extracted) + str(get_epoch_milli_time())
#       req_bank_name=decryptResponse.get("bank_name")
#       req_bene_code=decryptResponse.get("bene_code") ###3 need to send our code
#       req_account_number = decryptResponse.get("account_number")
#       req_ifsc_code = decryptResponse.get("ifsc_code")
#       req_account_name = decryptResponse.get("account_name")
#       req_customer_email = decryptResponse.get("customer_email","")
#       req_customer_phone = decryptResponse.get("customer_phone","")

#        ######### check for required fields for each record
#       if not (req_account_number and req_ifsc_code and req_account_name and req_bene_code ):
#           data_status["result"] = "Required Fields are missing!!"
#           return data_status
        
#       if len(req_account_number) < 11 and len(req_account_number) > 15:
#               errorList.append("Invalid length for Account number for ",req_account_number)
            
#       if len(req_ifsc_code) != 11:
#           errorList.append("Invalid length for IFSC code for ", req_account_number)
        
#       if not validate_alphanumeric(req_account_name):
#           errorList.append("Special characters not allowed in account name, use only alpha numeric", req_account_number)
        
#       if len(errorList) > 0:
#           data_status["result"] = "Invalid request"
#           data_status["errors"] = errorList
#           return data_status
        
#       check_beneficiary = Beneficiaries.objects(beneficiaryId=req_bene_code).first()

#       if check_beneficiary:
#           for each_bene in check_beneficiary.beneCodeList:
#               if str(each_bene.get("transactionApiId")) == str(payout_gate_way_queryset.id):
#                   data_status["result"] = "Beneficiary Code already Registered"
#                   return data_status
        
#       save_api_request_data_table = ApiRequestData(
#           userId=str(merchant_queryset.id),
#           userOrderId="",
#           orderId="",
#           requestData=[decryptResponse],
#           createdOn=datetime.datetime.now(),
#           status=1)

#       save_table=save_api_request_data_table.save()

#       uuid=random_alphanumeric_generate(20)
        
#       if payout_gate_way_queryset:
#           if payout_gate_way_queryset.code == "Axis_Payout":
#               client_id = ""
#               client_secret = ""
#               get_api_key=""
#               channelId=""
#               serviceRequestId=""
#               corpCode=""
#               serviceRequestVersion=""
#               get_base_url=""
#               corp_account_number=""

#               for each_key in payout_gate_way_queryset.paramsList:
#                   get_key = each_key.get("key")
#                   if get_key=="client_id":
#                       client_id=each_key.get("value")
#                   if get_key=="client_secret":
#                       client_secret=each_key.get("value")
#                   if get_key=="encryption_key":
#                       get_api_key=each_key.get("value")
#                   if get_key=="channel_id":
#                       channelId=each_key.get("value")
#                   if get_key=="service_request_id":
#                       serviceRequestId=each_key.get("value")
#                   if get_key=="service_request_version":
#                       serviceRequestVersion=each_key.get("value")
#                   if get_key=="corp_code":
#                       corpCode=each_key.get("value")
#                   if get_key=="get_base_url":
#                       get_base_url=each_key.get("value")
#                   if get_key=="corp_account_number":
#                       corp_account_number=each_key.get("value")
                
#               requestUUID = str(random_alphanumeric_generate(15))
                
#               ###################### Axis Beneficiary Creation Functionality Code #####################################
#               paymentgatewayResponseStatusDict = axis_beneficiary_registration(
#                                           client_id=client_id,
#                                           client_secret=client_secret,
#                                           get_api_key=get_api_key,
#                                           channelId=channelId,
#                                           serviceRequestId=serviceRequestId,
#                                           serviceRequestVersion=serviceRequestVersion,
#                                           corpCode=corpCode,
#                                           userId=userId,
#                                           get_base_url=get_base_url,
#                                           requestUUID=requestUUID,
#                                           apiVersion="1.0",
#                                           beneCode=beneficiaryCode,
#                                           beneName=req_account_name,
#                                           beneAccNum=req_account_number,
#                                           beneIfscCode=req_ifsc_code,
#                                           beneBankName=req_bank_name,
#                                           beneEmailAddr1=req_customer_email,
#                                           beneMobileNo=req_customer_phone)
#                       ##########################################################################################################
#           else:
#               responseBody["error"]="Unable to connect to the server!!"
#               return responseBody
#           ##################  Common code for Bene Creations #####################

#           if paymentgatewayResponseStatusDict.get("responseStatus") == 1:
#               transactionData = paymentgatewayResponseStatusDict.get("transactionData")
#               beneList = paymentgatewayResponseStatusDict.get("beneList")
#               responseList = paymentgatewayResponseStatusDict.get("responseList")
#               beneList[0]["beneCode"] = req_bene_code


#               beneficiary_queryset = Beneficiaries.objects(beneficiaryId=req_bene_code).first()

#               new_bene_code_entry = {
#                   "beneCode": responseList[0].get("beneCode"),
#                   "transactionApiId": str(payout_gate_way_queryset.id),
#                   "status": "Pending",
#               }
#               if beneficiary_queryset and responseList:
#                   existing_entry = None
#                   for entry in beneficiary_queryset.beneCodeList:
#                       if entry.get("transactionApiId") == str(payout_gate_way_queryset.id):
#                           existing_entry = entry
#                           break
                    
#                   if existing_entry:
#                       print("Entry with the same bankId already exists. Skipping append.")
#                   else:
#                       existingBenecodesList = beneficiary_queryset.beneCodeList
#                       existingBenecodesList.append(new_bene_code_entry)
#                       beneficiary_queryset.update(beneCodeList=existingBenecodesList)
#               else:
#                   beneficary_creation_table =  Beneficiaries(
#                       userId=ObjectId(merchant_queryset.id),
#                       masterBankId=None,
#                       remitterId=None,
#                       beneficiaryId=req_bene_code,
#                       fullName=responseList[0].get("beneName"),
#                       mobileNumber="",
#                       verifyStatus="Pending",
#                       accountNumber=responseList[0].get("beneAccNum"),
#                       ifscCode=beneList[0].get("bene_ifsc_code"),
#                       transactionAPIId=ObjectId(payout_gate_way_queryset.id),
#                       createdOn=datetime.datetime.now(),
#                       beneCodeList=[new_bene_code_entry],
#                       status = 1
#                   ).save()


#               responseBody = {
#               "status": paymentgatewayResponseStatusDict.get("result"),
#               "BeneData": beneList[0],
#               "error_message":paymentgatewayResponseStatusDict.get("message"),
#               }

#               data_status["responseStatus"]=1
#               data_status["result"]="Benificary created successfully!"
#               data_status["beniDetails"]=responseBody
#               return data_status

#           elif paymentgatewayResponseStatusDict.get("responseStatus") == 0:
#               responseBody = {
#               "status": paymentgatewayResponseStatusDict.get("result"),
#               "error_message":paymentgatewayResponseStatusDict.get("message"),
#               }
#               data_status["result"]=paymentgatewayResponseStatusDict.get("message")
#               return data_status
#           else:
#               data_status["result"]=paymentgatewayResponseStatusDict.get("message")
#               return data_status
#       else:
#           data_status["result"]="Please contact to admin to enable payout option!!"
#           save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
#           return data_status

#   except Exception as e:
#       app.logger.error(traceback.format_exc())
#       data_status["result"]="Unable to get required data!!"
#       save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
#       exceptionData = [traceback.format_exc()]
#       exception_log_table = save_exception_logs_data(None,"payout","beneficiary_creation","beneficiary_creation",exceptionData,client_ip,"api")
#       return data_status


fromDate=(datetime.datetime.now() - timedelta(days=25)).strftime("%Y-%m-%d")
toDate=datetime.datetime.now().strftime("%Y-%m-%d")
sample_axis_beni_enquiry_static_data = {
    "api_key":"66c43d14b131cbb3c5aba543-8bf0a73fda352bcc0da5509ae4372bd7",
    "beneCodesList":["Bene054948339"],
    "fromDate": fromDate,
    "toDate": toDate
}

@payout_apis.route("/beneficiary_enquiry",methods=["POST"])
def beneficiary_enquiry():
    data_status = {"responseStatus":0,"result":""}
    if SERVER_STATUS == "DOWN":
        data_status["result"] = SERVER_MAINTAINCE_MESSAGE
        return data_status
    merchant_id = request.headers.get("Merchant-Id","")
    api_key =  request.headers.get("Api-Key")
    # encryption_data = request.form.get("encryptionData","")
    # iv = request.form.get("iv","")

    secretKey = "f51085df02812201344f6f0cb6959647"
    encryption_key = bytes(secretKey, 'utf-8')
    responseEncrypt = encrypt(sample_axis_beni_enquiry_static_data,encryption_key)
    encryption_data = responseEncrypt.get('encryption_data')
    iv = responseEncrypt.get('iv')

    responseDict = {}
    paymentgatewayResponseStatusDict = {}

    if request.headers.getlist("X-Forwarded-For"):
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

    payOutPaymentGatewayId = ""
    userId=""
    requestData = [{"encryptionData":encryption_data,"iv":iv}]

    # Here Create client Logs Table 
    save_client_table = save_client_logs_data(userId,"payout","beneficiary_enquiry","beneficiary_enquiry",None,requestData,client_ip,"api")

    try:
        if not merchant_id and not api_key:
            data_status["result"] =  "required fields are missing!!"
            return data_status
        merchant_queryset = Users.objects(merchantUniqueNumber=merchant_id,status=1).first()
        if not merchant_queryset:
            data_status["result"] = "Invalid merchant id!!"
            return data_status
        
        check_kyc_status = merchant_kyc_status(str(merchant_queryset.id))
        if check_kyc_status.get("responseStatus") != 1:
            data_status["result"] = "Merchant KYC is not completed please contact to admin!!"
            return data_status
        
        kycStatus = check_kyc_status.get("merchantKycDetails", {}).get("kycStatus")
        if kycStatus ==False:
            data_status["result"] = "Merchant KYC is not completed please contact to admin!!"
            return data_status
        
        userId = str(merchant_queryset.id)
        
        api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payout",userId=userId,status=1).first()
        if not api_security_queryset:
            data_status["result"]="Invalid api key!!"
            return data_status

        try:
            if not merchant_queryset.patternId.payoutPaymentGatewayId:
                data_status["result"] = "Payout option is disabled please contact to admin!!"
                return data_status
        except Exception as e:
            data_status["result"] = "Payout option is disabled please contact to admin!!"
            return data_status

        payOutPaymentGatewayId = str(merchant_queryset.patternId.payoutPaymentGatewayId.id)

        payout_gate_way_queryset = TransactionAPI.objects(id=payOutPaymentGatewayId,status=1).first()
        if not payout_gate_way_queryset:
            data_status["result"] = "Payout option is disabled please contact to admin!!"
            return data_status

        try:
            secretKey = api_security_queryset.secretKey
            encryption_key = bytes(secretKey,'utf-8')

            jsonData = decrypt(encryption_data,encryption_key,iv)
            decryptResponse = json.loads(jsonData)
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] =  "Invalid encryption data!!"
            return data_status

        save_client_table.update(userId=ObjectId(userId),transactionAPIId=ObjectId(payOutPaymentGatewayId))
        beneList=[]
    
        req_to_date=decryptResponse.get("toDate")
        req_from_date = decryptResponse.get("fromDate")
        req_benecodes_List = decryptResponse.get("beneCodesList")

        for each_bene in req_benecodes_List:
            bene_code_queryst = Beneficiaries.objects(beneficiaryId = each_bene).first()
            if bene_code_queryst:
                exisitingBenecodesList=bene_code_queryst.beneCodeList
                for each_bene_code in exisitingBenecodesList:
                    if each_bene_code.get("transactionApiId") == str(payout_gate_way_queryset.id):
                        matchBenicode = each_bene_code.get("beneCode")
                        beneList.append(matchBenicode)

        if not req_to_date and not req_from_date :
            data_status["result"] = "Required Fields are missing!!"
            return data_status

        # bene_data_queryset = Beneficiaries.objects(createdOn__gte=fromDate,createdOn__lte=toDate,userId=merchant_queryset.id)
        
        # bencodesList = []
        # for each_bene in bene_data_queryset:
        #     benecodesList.append(each_bene.beneficiaryId)
        
        save_api_request_data_table = ApiRequestData(
            userId=str(merchant_queryset.id),
            userOrderId="",
            orderId="",
            requestData=[decryptResponse],
            createdOn=datetime.datetime.now(),
            status=1
            )
        save_table=save_api_request_data_table.save()
        
        if payout_gate_way_queryset:
            if payout_gate_way_queryset.code == "Axis_Payout":
                client_id = ""
                client_secret = ""
                get_api_key=""
                channelId=""
                serviceRequestId=""
                corpCode=""
                serviceRequestVersion=""
                get_base_url=""
                corp_account_number=""

                for each_key in payout_gate_way_queryset.paramsList:
                    get_key = each_key.get("key")
                    if get_key=="client_id":
                        client_id=each_key.get("value")
                    if get_key=="client_secret":
                        client_secret=each_key.get("value")
                    if get_key=="encryption_key":
                        get_api_key=each_key.get("value")
                    if get_key=="channel_id":
                        channelId=each_key.get("value")
                    if get_key=="service_request_id":
                        serviceRequestId=each_key.get("value")
                    if get_key=="service_request_version":
                        serviceRequestVersion=each_key.get("value")
                    if get_key=="corp_code":
                        corpCode=each_key.get("value")
                    if get_key=="get_base_url":
                        get_base_url=each_key.get("value")
                    if get_key=="corp_account_number":
                        corp_account_number=each_key.get("value")
                
                requestUUID = str(random_alphanumeric_generate(15))
                ###################### Axis Beneficiary Enquiry Functionality Code #####################################
                paymentgatewayResponseStatusDict = axis_beneficiary_enquiry(
                                            client_id=client_id,
                                            client_secret=client_secret,
                                            key=get_api_key,
                                            channelId=channelId,
                                            serviceRequestId=serviceRequestId,
                                            serviceRequestVersion=serviceRequestVersion,
                                            corpCode=corpCode,
                                            userId=userId,
                                            get_base_url=get_base_url,
                                            apiVersion="1.0",
                                            requestUUID=requestUUID,
                                            beneCode=beneList,
                                            toDate=req_to_date,
                                            fromDate=req_from_date,
                                            emailId=admin_recieve_email, ## assign the email to which data should be sent if records > 10k...Note the data from bank also has corpcode etc !!! not to be shared to client 
                                            status="All"
                                            )
                        ##########################################################################################################
            else:
                responseBody["error"]="Unable to connect to the server!!"
                return responseBody

            if paymentgatewayResponseStatusDict.get("responseStatus") == 1:
                jsondecryptResponse = paymentgatewayResponseStatusDict.get("jsondecryptResponse")
                # data = transactionData["BeneficiaryEnquiryResponse"]["BeneficiaryEnquiryResponseBodyEncrypted"]["data"]
                data = jsondecryptResponse.get("data")
                beneDetails = data["beneDetails"]

                for each_bene in beneDetails:
                    beneId = each_bene.get("beneCode")
                    bene_data_queryset = Beneficiaries.objects(beneCodeList__beneCode=beneId).first()

                    if bene_data_queryset:
                        if each_bene.get("status").lower() == "active":
                            # Copy the existing beneCodeList
                            existingBenecodesList = bene_data_queryset.beneCodeList
                            for each_dict in existingBenecodesList:
                                # Check if transactionAPIId matches
                                if each_dict.get("transactionApiId") == str(payout_gate_way_queryset.id):
                                    # Update the matched dictionary
                                    each_dict.update({
                                        "beneCode": each_dict.get("beneCode"),
                                        "transactionApiId": each_dict.get("transactionApiId"),
                                        "status": "Active"
                                    })
                                    break

                            # Save the updated list back to the database
                            bene_data_queryset.beneCodeList = existingBenecodesList
                            bene_data_queryset.save()

                
                responseBody = {
                "status": paymentgatewayResponseStatusDict.get("result"),
                "beneList": paymentgatewayResponseStatusDict.get("beneList"),
                "error_message":paymentgatewayResponseStatusDict.get("message"),
                }

                data_status["responseStatus"]=1
                data_status["result"]="Benificary enquiry successfully!"
                data_status["beniDetails"]=responseBody
                return data_status

            elif paymentgatewayResponseStatusDict.get("responseStatus") == 0:
                responseBody = {
                "status": paymentgatewayResponseStatusDict.get("result"),
                "error_message":paymentgatewayResponseStatusDict.get("message"),
                }
                data_status["result"]=paymentgatewayResponseStatusDict.get("message")
                return data_status
            else:
                data_status["result"]=paymentgatewayResponseStatusDict.get("message")
                return data_status
        else:
            data_status["result"]="Please contact to admin to enable payout option!!"
            save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get required data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payout","beneficiary_enquiry","beneficiary_enquiry",exceptionData,client_ip,"api")
        return data_status


sample_idfc_bulk_transfer_static_data = {
    "api_key":"66c43d14b131cbb3c5aba543-8bf0a73fda352bcc0da5509ae4372bd7",
    "payment_data": [
    {
    "customerReferenceNumber":str(random_digit_generate(16)),
    "beneficaryAccuntNumber":"159502971443",
    "accountIfscCode":"INDB0000226",
    "beneficaryName":"Sai Krishna",
    "amount":"1",
    "beneficaryEmailId":"sai.kerla@viyonafintech.com",
    "beneficiaryMobile":"9502971443",
    "transfer_type":"IMPS",
    "remark":"Testing"
    },
    {
    "customerReferenceNumber":str(random_digit_generate(16)),
    "beneficaryAccuntNumber":"158985991588",
    "accountIfscCode":"INDB0000004",
    "beneficaryName":"Chaitanya",
    "amount":"1",
    "beneficaryEmailId":"chaitanya@viyonafintech.com",
    "beneficiaryMobile":"8985991588",
    "transfer_type":"IMPS",
    "remark":"Testing"
    }
    ]
}

@payout_apis.route("/bulkfundtransfer",methods=["POST"])
def bulkfundtransfer():
    data_status = {"responseStatus":0,"result":""}
    if SERVER_STATUS == "DOWN":
        data_status["result"]= SERVER_MAINTAINCE_MESSAGE
        return data_status

    merchant_id = request.headers.get("Merchant-Id","")
    api_key = request.headers.get("Api-Key","")
    # encryption_data = request.form.get("encryptionData","")
    # iv = request.form.get("iv","")

    secretKey = "f51085df02812201344f6f0cb6959647"
    encryption_key = bytes(secretKey, 'utf-8')
    responseEncrypt = encrypt(sample_idfc_bulk_transfer_static_data,encryption_key)
    encryption_data = responseEncrypt.get('encryption_data')
    iv = responseEncrypt.get('iv')

    responseDict = {}
    paymentgatewayresponseDict = {}

    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"):
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    print(request.headers,"?????????????")

    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

    payOutPaymentGatewayId = ""
    userId = ""
    bank_reference_number = ""
    requestData = [{"encryption_data":encryption_data,"iv":iv}]

    # Here Create Client Logs Table
    save_client_table = save_client_logs_data(userId,"payout","fund_transfer","fundtransfer",None,requestData,client_ip,"api")

    try:
        if merchant_id and api_key and encryption_data and iv:
            merchant_queryset = Users.objects(merchantUniqueNumber=merchant_id,status=1).first()
            if not merchant_queryset:
                data_status["result"]="Invalid merchant id!!"
                return data_status

            check_kyc_status = merchant_kyc_status(str(merchant_queryset.id))
            if check_kyc_status.get("responseStatus") != 1:
                data_status["result"]="Merchant KYC is not completed please contact to admin!!"
                return data_status

            kycStatus = check_kyc_status.get("merchantKycDetails", {}).get("kycStatus")
            if kycStatus == False:
                data_status["result"]="Merchant KYC is not completed please contact to admin!!"
                return data_status

            userId = str(merchant_queryset.id)
            api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payout",userId=userId,status=1).first()
            if not api_security_queryset:
                data_status["result"]="Invalid api key!!"
                return data_status

            # if client_ip not in api_security_queryset.ipAddressList:
            #   data_status["result"]="Your ip adress is not whitelisted please contact admin!!"
            #   return data_status

            try:
                if not merchant_queryset.patternId.payoutPaymentGatewayId:
                    data_status["result"] = "Payout option is disabled please contact to admin!!"
                    return data_status
            except Exception as e:
                data_status["result"] = "Payout option is disabled please contact to admin!!"
                return data_status

            payOutPaymentGatewayId = str(merchant_queryset.patternId.payoutPaymentGatewayId.id)

            payout_gate_way_queryset = TransactionAPI.objects(id=payOutPaymentGatewayId,status=1).first()
            if not payout_gate_way_queryset:
                data_status["result"]="Payout option is disabled please contact to admin!!"
                return data_status

            try:
                secretKey = api_security_queryset.secretKey
                encryption_key = bytes(secretKey, 'utf-8')

                jsonData = decrypt(encryption_data,encryption_key,iv)
                decryptResponse = json.loads(jsonData)
                print(decryptResponse,"((((((((((IN GRAAMPAY IDFC BULK))))))))))")
            except Exception as e:
                app.logger.error(traceback.format_exc())
                data_status["result"]="Invalid encryption data!!"
                return data_status

            save_client_table.update(userId=ObjectId(userId),transactionAPIId=ObjectId(payOutPaymentGatewayId))

            api_key = decryptResponse.get("api_key")

            if api_key == api_security_queryset.apiKey:
                ################################ Check api keys Code ##############################
                payment_data = decryptResponse.get("payment_data")
                errorList =[]
                payment_details_list = []
 
                if len(payment_data) > 100:
                    data_status["result"] = "List size exceeded. Please provide only 100 or less Records"
                    return data_status

                merchantUniqueNumber=merchant_id
                mid_extracted = merchantUniqueNumber[1:].lstrip("0")
                total_amount = 0
                total_transaction_amount = 0
                total_txn_count = 0
                merchant_ref_numbers = set()
                transactionId=random_digit_generate(16)
                errorList = []
                seen_merchant_ref_numbers = ()
                prepareBulkfundtransferList = []

                print(payment_data,"((((((((((((payment_data list))))))))))))")
                for each_bene_data in payment_data:
                    print(each_bene_data,"(((((each_bene_data)))))")
                    req_amount=each_bene_data.get("amount")

                    total_amount=float(total_amount) + float(req_amount)
                    total_txn_count = total_txn_count + 1
 
                    req_beneCode = each_bene_data.get("beneficiaryId")  ### need to confirm later putting it for now
                    
                    req_merchant_reference_number = each_bene_data.get("customerReferenceNumber")
                    req_account_number = each_bene_data.get("beneficaryAccuntNumber")
                    req_account_name = each_bene_data.get("beneficaryName")
                    req_ifsc_code = each_bene_data.get("accountIfscCode")
                    req_transfer_type = each_bene_data.get("transfer_type")
                    req_bank_branch = each_bene_data.get("bank_branch")
                    req_bank_name = each_bene_data.get("bank_name")
                    req_customer_email = each_bene_data.get("beneficaryEmailId")
                    req_customer_phone = each_bene_data.get("beneficiaryMobile")
                    req_remark = each_bene_data.get("remark")
                    beneCode = each_bene_data.get("beneCode","")
                    clientOrderId = transaction_id_prefix + mid_extracted + each_bene_data.get("customerReferenceNumber")

                    # bene_user_queryset = Beneficiaries.objects()

                    if not api_key and not req_merchant_reference_number and not req_account_number and not req_ifsc_code and not req_account_name and not req_amount and not req_transfer_type:
                        errorList.append("Required Fields are missing for Account Number " +req_account_number)
                    
                    # if req_beneCode:
                    #     benecode = Beneficiaries.objects(beneficiaryId=req_beneCode).first()
                    
                    if req_transfer_type not in ["NEFT","RTGS","IMPS"]:
                        errorList.append("transfer should be ones in ['NEFT','RTGS','IMPS'] " +req_account_number)
 
                    if req_merchant_reference_number in seen_merchant_ref_numbers:
                        errorList.append("Two or more transactions have same Reference Number for Account Number" +req_account_number)
 
                    merchant_ref_numbers.add(req_merchant_reference_number)
 
                    checkorder_queryset = FundTransfers.objects(merchantReferenceNumber=req_merchant_reference_number,userId=str(userId)).first()
                    if checkorder_queryset:
                        errorList.append("Duplicate Merchant Reference Number for Account Number "+req_account_number)
                   
                    if len(req_account_number) < 11 and len(req_account_number) > 15:
                        errorList.append("Invalid length for Account number for " +req_account_number)
                   
                    if len(req_ifsc_code) != 11:
                        errorList.append("Invalid length for IFSC code for "+ req_account_number)

                    check_transaction_limits = merchant_transaction_limit_settings("Payout",payOutPaymentGatewayId,userId,req_amount)

                    # if check_transaction_limits.get("responseStatus") == 0:
                    #     errorList.append(check_transaction_limits.get("result")+req_account_number)
                        
                    ###################################################### Slab Calculation for payout code ###########################################################
                    payment_mode_queryset = PaymentMode.objects(paymentMode=req_transfer_type).first()
                    if not payment_mode_queryset:
                        errorList.append(check_transaction_limits.get("result")+req_account_number)

                    paymentModeId = str(payment_mode_queryset.id)
                    sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=req_transfer_type).first()
                    subPaymentModeId = str(sub_payment_mode_queryset.id)
                    patternId = str(merchant_queryset.patternId.id)
                    commissionCharges={}
                    commissionCharges = slab_calculation_for_payout(req_amount,paymentModeId,subPaymentModeId,patternId,payOutPaymentGatewayId)
                    if commissionCharges.get("slabId") == None:
                        slabId = None
                        transactionAmount = req_amount
                    else:
                        slabId = commissionCharges.get("slabId")
                        transactionAmount = float(commissionCharges.get("transactionAmount"))
                    total_transaction_amount=float(total_transaction_amount)+float(transactionAmount)
                    ####################################################################################################################################################
                    
                    bulkDict = {
                        "txnPaymode": req_transfer_type,
                        "custUniqRef": clientOrderId,
                        "amount": req_amount,
                        "account_name": req_account_name,
                        "req_beneCode": req_beneCode,
                        "account_number": req_account_number,
                        "ifsc_code": req_ifsc_code,
                        "bank_name": req_bank_name,
                        "bank_branch": req_bank_branch,
                        "commissionCharges":commissionCharges,
                        "transactionAmount":transactionAmount,
                        "slabId":slabId,
                        "merchant_reference_number": req_merchant_reference_number,
                        "customer_email":req_customer_email,
                        "customer_phone": req_customer_phone,
                        "req_remark": req_remark
                    }
                    prepareBulkfundtransferList.append(bulkDict)
 
                fund_transfer_table = BulkFundTransfers(
                    userId = str(merchant_queryset.id),
                    BulkTransactionId = transactionId,
                    BatchNumber = "0",
                    BulkCsvFileUpload = "",
                    status = 2,
                    totalAmount = total_amount,
                    totalTransactionAmount = total_transaction_amount,
                    totalTransactionCount = total_txn_count,
                    clientRequestData = prepareBulkfundtransferList,
                    requestData = prepareBulkfundtransferList,
                    responseData = [],
                    errorMessage = errorList,
                    ErrorType = "", # "ApiProvider" or "Internal"
                    createdOn = datetime.datetime.now(),
                    )
                save_table = fund_transfer_table.save()
                BulkTransferId = str(save_table.id)
                if len(errorList) > 0:
                    data_status['result']="Required Fields are missing!!!!"
                    data_status['errors']=errorList
                    fund_transfer_table.errorMessage = errorList
                    fund_transfer_table.ErrorType = "Internal"
                    fund_transfer_table.status = 0
                    fund_transfer_table.save(update_fields=["errorMessage", "ErrorType", "status"])
                    return data_status
 
                # checkamount = float(decryptResponse.get("amount"))
                checkamount = total_amount ## taking total amount here
               
                if checkamount <= 0:
                    data_status['result']="Transaction amount is insufficient!!"
                    fund_transfer_table.errorMessage = ["Transaction amount is insufficient!!"]
                    fund_transfer_table.ErrorType = "Internal"
                    fund_transfer_table.status = 0
                    fund_transfer_table.save(update_fields=["errorMessage", "ErrorType", "status"])
                    return data_status
               
                check_transaction_limits = merchant_transaction_limit_settings("Payout",payOutPaymentGatewayId,userId,total_amount,"bulk")
                if check_transaction_limits.get("responseStatus") == 0:
                    data_status['result']=check_transaction_limits.get("result")
                    fund_transfer_table.errorMessage = [check_transaction_limits.get("result")]
                    fund_transfer_table.ErrorType = "Internal"
                    fund_transfer_table.status = 0
                    fund_transfer_table.save(update_fields=["errorMessage", "ErrorType", "status"])
                    return data_status
                                       
                try:
                    payout_balance_queryset = PayoutBalances.objects(userId=userId,transactionAPIId=payOutPaymentGatewayId).first()
                    if payout_balance_queryset.currentBalance:
                        userPayoutBalance = payout_balance_queryset.currentBalance
                    else:
                        userPayoutBalance = 0
                except Exception as e:
                    userPayoutBalance = 0
  
                if float(userPayoutBalance) < float(total_amount + float(merchant_queryset.capBalance)):
                    insufficient_table = InsufficientBalanceLogs(
                        userId=userId,
                        orderId=transactionId, # id generated in our side for bulk
                        orderAmount=total_amount,
                        walletAmount=float(merchant_queryset.payoutBalance),
                        createdOn=datetime.datetime.now(),
                        status=1
                        ).save()
                    data_status["result"]="Insufficient balance!!"
                    fund_transfer_table.errorMessage = ["Insufficient balance!!"]
                    fund_transfer_table.ErrorType = "Internal"
                    fund_transfer_table.status = 0
                    fund_transfer_table.save(update_fields=["errorMessage", "ErrorType", "status"])
                    return data_status
 
                if float(merchant_queryset.payoutBalance) < float(total_amount + float(merchant_queryset.capBalance)):
                    insufficient_table = InsufficientBalanceLogs(
                        userId=userId,
                        orderId=transactionId, # id generated in our side for bulk
                        orderAmount=total_amount,
                        walletAmount=float(merchant_queryset.payoutBalance),
                        createdOn=datetime.datetime.now(),
                        status=1
                        ).save()

                    data_status["result"]="Insufficient balance!!"
                    fund_transfer_table.errorMessage = ["Insufficient balance!!"]
                    fund_transfer_table.ErrorType = "Internal"
                    fund_transfer_table.status = 0
                    fund_transfer_table.save(update_fields=["errorMessage", "ErrorType", "status"])
                    return data_status

                ### 
                # merchant_queryset.capBalance = merchant_queryset.capBalance + float(total_amount)
                totalCapBalance = float(merchant_queryset.capBalance) + float(total_amount)
                merchant_queryset.update(capBalance=totalCapBalance)
                    
                if payOutPaymentGatewayId:
                    if payout_gate_way_queryset.code == "Axis_Payout":
                        client_id = ""
                        client_secret = ""
                        get_api_key=""
                        channelId=""
                        serviceRequestId=""
                        corpCode=""
                        serviceRequestVersion=""
                        get_base_url=""
                        corp_account_number=""

                        for each_key in payout_gate_way_queryset.paramsList:
                            get_key = each_key.get("key")
                            if get_key=="client_id":
                                client_id=each_key.get("value")
                            if get_key=="client_secret":
                                client_secret=each_key.get("value")
                            if get_key=="encryption_key":
                                get_api_key=each_key.get("value")
                            if get_key=="channel_id":
                                channelId=each_key.get("value")
                            if get_key=="service_request_id":
                                serviceRequestId=each_key.get("value")
                            if get_key=="service_request_version":
                                serviceRequestVersion=each_key.get("value")
                            if get_key=="corp_code":
                                corpCode=each_key.get("value")
                            if get_key=="get_base_url":
                                get_base_url=each_key.get("value")
                            if get_key=="corp_account_number":
                                corp_account_number=each_key.get("value")
    
    
                        requestUUID = str(random_alphanumeric_generate(15))

                        ########################################################## Axis Payout Fundtransfer Functionality Code #######################################################
                        paymentgatewayresponseDict = axis_payout_bulk_fundtransfer(client_id,client_secret,get_api_key,channelId,get_base_url,requestUUID,serviceRequestId,serviceRequestVersion,corpCode,corp_account_number,prepareBulkfundtransferList,bulk_transactionId=transactionId)
                        ################################################################################################################################################################

                    elif payout_gate_way_queryset.code == "Idfc_Payout":
                        client_id = ""
                        secretKey = ""
                        kid = ""
                        get_base_url = ""
                        aud_url = ""
                        auth_url = ""
                        grant_type = ""
                        scope = ""
                        source = ""
                        client_assertion_type = ""
                        debitAcountNumber = ""
                        remitterName = ""

                        for each_key in payout_gate_way_queryset.paramsList:
                            get_key = each_key.get("key")        
                            if get_key == "client_id":
                                client_id = each_key.get("value").strip()
                            if get_key == "secret_key":
                                secretKey = each_key.get("value").strip()
                            if get_key == "base_url":
                                get_base_url = each_key.get("value").strip()
                            if get_key == "kid":
                                kid = each_key.get("value").strip()
                            if get_key == "aud_url":
                                aud_url = each_key.get("value").strip()
                            if get_key == "auth_url":
                                auth_url = each_key.get("value").strip()
                            if get_key == "scope":
                                scope = each_key.get("value").strip()
                            if get_key == "grant_type":
                                grant_type = each_key.get("value").strip()
                            if get_key == "source":
                                source = each_key.get("value").strip()
                            if get_key == "client_assertion_type":
                                client_assertion_type = each_key.get("value").strip()
                            if get_key == "debit_acount_number":
                                debitAcountNumber = each_key.get("value").strip()
                            if get_key == "remitter_name":
                                remitterName = each_key.get("value").strip()

                            bank_branch = ""
                    
                        ########################################################## Idfc Bulk Payout Fundtransfer Functionality Code #######################################################
                        paymentgatewayresponseDict = idfc_bulk_payout_fundtransfer(client_id,secretKey,kid,get_base_url,aud_url,auth_url,grant_type,scope,source,client_assertion_type,debitAcountNumber,remitterName,prepareBulkfundtransferList,bulk_transactionId=transactionId)
                        print(paymentgatewayresponseDict,"((((((paymentgatewayresponseDict in GRAAMPAY IDFC BULK))))))")
                        ####################################################################################################################################################################

                    else:
                        data_status["result"]="Invalid Request!!"
                        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())

                    bulkResponseData = []
                    if paymentgatewayresponseDict.get("responseStatus") == 1:
                        if paymentgatewayresponseDict.get("bank_reference_number"):
                            bank_reference_number = paymentgatewayresponseDict.get("bank_reference_number")
                        else:
                            bank_reference_number = ""
                        
                        transactionData = paymentgatewayresponseDict.get("transactionData")

                        latest_bulk_fund_transfer_queryset = BulkFundTransfers.objects(id=BulkTransferId).first()

                        for each_bulk_record in latest_bulk_fund_transfer_queryset.requestData:
                            balanceResult=user_payout_balance_update(str(merchant_queryset.id),float(transactionAmount),"Debit",str(payOutPaymentGatewayId))
                            if balanceResult.get('responseStatus')==0:
                                data_status["result"]="Insufficient balance!!"
                                return data_status

                            totalCapBalance = float(merchant_queryset.capBalance) - float(total_amount)
                            merchant_queryset.update(capBalance=totalCapBalance)

                            fund_transfer_table = FundTransfers(
                                userId=str(merchant_queryset.id),
                                transactionAPIId=payOutPaymentGatewayId,
                                bankId=None,
                                bankName=None,
                                merchantReferenceNumber=each_bulk_record.get("merchant_reference_number"),
                                pgOrderId=each_bulk_record.get("pgOrderId"), ### pgorderId starting with GP
                                fundTransferType="bulk",
                                accountType="bank",
                                apiType="api",
                                slabId=slabId,
                                transferType="Debit",
                                bankBranch=None,
                                accountNumber=each_bulk_record.get("beneAccNum"),
                                accountIFSCCode=each_bulk_record.get("accountIFSCCode"),
                                beneficiaryName=each_bulk_record.get("beneficiaryName"),
                                uniqueRequestNumber=None,
                                amount=round(float(req_amount),2),
                                grandTotal=round(float(transactionAmount),2),
                                previousBalance = round(float(balanceResult.get('userPreviousBalance')),2),
                                currentBalance = round(float(balanceResult.get('userCurrentBalance')),2),
                                beneficiaryMail=None,
                                beneficiaryPhone=None,
                                paymentMode=each_bulk_record.get("txnPaymode"),
                                narration="",
                                createdOn=datetime.datetime.now(),
                                userType="user",
                                status=2,
                                clientIp=client_ip,
                                transactionUniqueId = "",
                                statusCheckId=each_bulk_record.get("pgOrderId"),
                                commissionCharges=each_bulk_record.get("commissionCharges")
                                )
                            save_table = fund_transfer_table.save()
                            instantTransferId = str(save_table.id)

                            # responseDict = {
                            # "status":"Processing",
                            # "merchant_reference_number":each_bulk_record.get("merchant_reference_number"),
                            # "account_name":each_bulk_record.get('beneficiaryName'),
                            # "amount":req_amount,
                            # "account_number":each_bulk_record.get('beneAccNum'),
                            # "ifsc_code":each_bulk_record.get('beneAccNum'),
                            # "bank_reference_number":bank_reference_number,
                            # "transfer_type":each_bulk_record.get('txnPaymode')
                            # }
                            # bulkResponseData.append(responseDict)

                        data_status["responseStatus"]=1
                        data_status["result"]="Success"
                        # data_status["bulkFundtransfersResponseData"]=bulkResponseData
                        return data_status
                    else:
                        data_status["responseStatus"]=paymentgatewayresponseDict.get("responseStatus")
                        data_status["result"]=paymentgatewayresponseDict.get("result")
                        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
                        return data_status
                else:
                    data_status["result"]="Please contact to admin to enable payout option!!"
                    save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
                    return data_status

            else:
                data_status["result"]="Mis-matched api keys!!"
                save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
                return data_status
        else:
            data_status["result"]="Required fields are missing!!!!"
            save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get payout data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payout","fund_transfer","fundtransfer",exceptionData,client_ip,"api")
        return data_status


def getBenesData():
    beneficiaryCreationsList = []
    benificiaries_accounts_queryset = BenificiaryAccounts.objects(status=1).order_by("-id")
    for each_benificiary_account in benificiaries_accounts_queryset:
        benificiaries_queryset = Beneficiaries.objects(accountNumber=str(each_benificiary_account.creditorAccountNumber)).first()
        if not benificiaries_queryset:
            benicreationDict = {
                "account_number":str(each_benificiary_account.creditorAccountNumber),
                "ifsc_code":str(each_benificiary_account.ifscCode),
                "account_name":str(each_benificiary_account.creditorName),
                "bankId":str(each_benificiary_account.bankId),
            }
            beneficiaryCreationsList.append(benicreationDict)
    return beneficiaryCreationsList
 
# sample_axis_beni_crea_static_data = {
#     "api_key":"66c43d14b131cbb3c5aba543-8bf0a73fda352bcc0da5509ae4372bd7",
#     "beneficiaryCreationsList":beneficiaryCreationsList
# }

@payout_apis.route("/bulkbeneficiarycreation",methods=["POST"])
def bulkbeneficiarycreation():
    data_status = {"responseStatus":0,"result":""}
    if SERVER_STATUS == "DOWN":
        data_status["result"] = SERVER_MAINTAINCE_MESSAGE
        return data_status
    merchant_id = request.headers.get("Merchant-Id","")
    api_key =  request.headers.get("Api-Key")
    # encryption_data = request.form.get("encryptionData","")
    # iv = request.form.get("iv","")

    beneficiaryCreationsList = getBenesData()

    print("((((((((beneficiaryCreationsList))))))))",beneficiaryCreationsList)

    sample_axis_beni_crea_static_data = {
    "api_key":"66c43d14b131cbb3c5aba543-8bf0a73fda352bcc0da5509ae4372bd7",
    "beneficiaryCreationsList":beneficiaryCreationsList
    }

    secretKey = "f51085df02812201344f6f0cb6959647"
    encryption_key = bytes(secretKey, 'utf-8')
    responseEncrypt = encrypt(sample_axis_beni_crea_static_data,encryption_key)
    encryption_data = responseEncrypt.get('encryption_data')
    iv = responseEncrypt.get('iv')

    responseDict = {}
    paymentgatewayResponseStatusDict = {}

    if request.headers.getlist("X-Forwarded-For"):
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

    payOutPaymentGatewayId = ""
    userId=""
    requestData = [{"encryptionData":encryption_data,"iv":iv}]

    # Here Create client Logs Table 
    save_client_table = save_client_logs_data(userId,"payout","bulkbeneficiarycreation","bulkbeneficiarycreation",None,requestData,client_ip,"api")

    print(client_ip,"CLIENT IP")

    try:
        # if not order_id and merchant_id and not api_key:
        if not merchant_id and not api_key:
            data_status["result"] =  "required fields are missing!!"
            return data_status

        merchant_queryset = Users.objects(merchantUniqueNumber=merchant_id,status=1).first()
        if not merchant_queryset:
            data_status["result"] = "Invalid merchant id!!"
            return data_status

        check_kyc_status = merchant_kyc_status(str(merchant_queryset.id))
        if check_kyc_status.get("responseStatus") != 1:
            data_status["result"] = "Merchant KYC is not completed please contact to admin!!"
            return data_status

        kycStatus = check_kyc_status.get("merchantKycDetails", {}).get("kycStatus")
        if kycStatus ==False:
            data_status["result"] = "Merchant KYC is not completed please contact to admin!!"
            return data_status
        
        userId = str(merchant_queryset.id)
        merchantUniqueNumber = str(merchant_queryset.merchantUniqueNumber)
        
        api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payout",userId=userId,status=1).first()

        if not api_security_queryset:
            data_status["result"]="Invalid api key!!"
            return data_status

        try:
            if not merchant_queryset.patternId.payoutPaymentGatewayId:
                data_status["result"] = "Payout option is disabled please contact to admin!!"
                return data_status
        except Exception as e:
            data_status["result"] = "Payout option is disabled please contact to admin!!"
            return data_status
        

        payOutPaymentGatewayId = str(merchant_queryset.patternId.payoutPaymentGatewayId.id)

        payout_gate_way_queryset = TransactionAPI.objects(id=payOutPaymentGatewayId,status=1).first()

        if not payout_gate_way_queryset:
            data_status["result"] = "Payout option is disabled please contact to admin!!"
            return data_status

        paymentGatewayCodee = payout_gate_way_queryset.code

        try:
            secretKey = api_security_queryset.secretKey
            encryption_key = bytes(secretKey,'utf-8')

            jsonData = decrypt(encryption_data,encryption_key,iv)
            decryptResponse = json.loads(jsonData)
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] =  "Invalid encryption data!!"
            return data_status

        save_client_table.update(userId=ObjectId(userId),transactionAPIId=ObjectId(payOutPaymentGatewayId))

        
        errorList =[]
        mid_extracted = merchantUniqueNumber[1:].lstrip("0")
        # beneficiaryCode = str(mid_extracted) + str(get_epoch_milli_time())

        beneficiaryCreationsListReq=decryptResponse.get("beneficiaryCreationsList")
        if beneficiaryCreationsListReq == []:
            data_status["result"]="Invalid Request Data!!"
            return data_status
        counter = 0
        beneficiaryCreationsList=[]
        for each_bene_creation in beneficiaryCreationsListReq:
            counter=counter+1
            beneficiaryCode = str(mid_extracted) + str(get_epoch_milli_time()) + str(counter)
            req_bank_name=each_bene_creation.get("bank_name")
            req_bene_code="BENI"+str(random_digit_generate(15))
            req_account_number = each_bene_creation.get("account_number")
            req_ifsc_code = each_bene_creation.get("ifsc_code")
            req_account_name = each_bene_creation.get("account_name")
            req_customer_email = each_bene_creation.get("customer_email","")
            req_customer_phone = each_bene_creation.get("customer_phone","")
            bankId = each_bene_creation.get("bankId","")

            ############### check for required fields for each record #####################
            if not (req_account_number and req_ifsc_code and req_account_name and req_bene_code):
                data_status["result"] = "Required Fields are missing!!"
                return data_status
            
            if len(req_account_number) < 11 and len(req_account_number) > 15:
                    errorList.append("Invalid length for Account number for "+req_account_number)
                
            if len(req_ifsc_code) != 11:
                errorList.append("Invalid length for IFSC code for "+ req_account_number)
            
            if not validate_alphanumeric(req_account_name):
                errorList.append("Special characters not allowed in account name, use only alpha numeric"+ req_account_number)
            
            
            
            check_beneficiary = Beneficiaries.objects(accountNumber=req_account_number,userId=str(merchant_queryset.id),status=1).first()
            if check_beneficiary:
                for each_bene in check_beneficiary.beneCodeList:
                    if str(each_bene.get("transactionApiId")) == str(payout_gate_way_queryset.id):
                        errorList.append("Beneficiary Code already Registered for "+ req_account_number)

            beniDict = {
            "req_bene_code":req_bene_code,
            "beneficiaryCode":beneficiaryCode,
            "req_account_number":req_account_number,
            "req_ifsc_code":req_ifsc_code,
            "req_account_name":req_account_name,
            "req_customer_email":req_customer_email,
            "req_customer_phone":req_customer_phone,
            "bankId":bankId
            }
            beneficiaryCreationsList.append(beniDict)

        if len(errorList) > 0:
            data_status["result"] = "Invalid request"
            data_status["errors"] = errorList
            return data_status
            
        save_api_request_data_table = ApiRequestData(
            userId=str(merchant_queryset.id),
            userOrderId="",
            orderId="",
            requestData=[decryptResponse],
            createdOn=datetime.datetime.now(),
            status=1
            )
        save_table=save_api_request_data_table.save()

        uuid=random_alphanumeric_generate(20)
            
        if payout_gate_way_queryset:
            if payout_gate_way_queryset.code == "Axis_Payout":
                client_id = ""
                client_secret = ""
                get_api_key=""
                channelId=""
                serviceRequestId=""
                corpCode=""
                serviceRequestVersion=""
                get_base_url=""
                corp_account_number=""

                for each_key in payout_gate_way_queryset.paramsList:
                    get_key = each_key.get("key")
                    if get_key=="client_id":
                        client_id=each_key.get("value")
                    if get_key=="client_secret":
                        client_secret=each_key.get("value")
                    if get_key=="encryption_key":
                        get_api_key=each_key.get("value")
                    if get_key=="channel_id":
                        channelId=each_key.get("value")
                    if get_key=="service_request_id":
                        serviceRequestId=each_key.get("value")
                    if get_key=="service_request_version":
                        serviceRequestVersion=each_key.get("value")
                    if get_key=="corp_code":
                        corpCode=each_key.get("value")
                    if get_key=="get_base_url":
                        get_base_url=each_key.get("value")
                    if get_key=="corp_account_number":
                        corp_account_number=each_key.get("value")
                
                requestUUID = str(random_alphanumeric_generate(15))
                
                ###################### Axis Beneficiary Creation Functionality Code #####################################
                paymentgatewayResponseStatusDict = axis_bulk_beneficiary_registration(
                                    client_id=client_id,
                                    client_secret=client_secret,
                                    get_api_key=get_api_key,
                                    channelId=channelId,
                                    serviceRequestId=serviceRequestId,
                                    serviceRequestVersion=serviceRequestVersion,
                                    corpCode=corpCode,
                                    userId=userId,
                                    get_base_url=get_base_url,
                                    requestUUID=requestUUID,
                                    apiVersion="1.0",
                                    beneficiaries=beneficiaryCreationsList
                                    )
                ##########################################################################################################
            else:
                data_status["result"]="Unable to connect to the server!!"
                return data_status
            ##################  Common code for Bene Creations #####################
            if paymentgatewayResponseStatusDict.get("responseStatus") == 1:
                transactionData = paymentgatewayResponseStatusDict.get("transactionData")
                beneList = paymentgatewayResponseStatusDict.get("beneList")
                responseList = paymentgatewayResponseStatusDict.get("responseList")

                for each_req_bene in beneficiaryCreationsList:
                    bene_code = each_req_bene["req_bene_code"] ## this is req_bene_code- client sent

                    beneficiary_queryset = Beneficiaries.objects(accountNumber=each_req_bene.get("req_account_number"),userId=str(merchant_queryset.id),status=1).first()

                    new_bene_code_entry = {
                        "beneCode": each_req_bene.get("beneficiaryCode"),
                        "transactionApiId": str(payout_gate_way_queryset.id),
                        "status": "Pending",
                    }
                    if beneficiary_queryset and responseList:
                        existing_entry = None
                        for entry in beneficiary_queryset.beneCodeList:
                            if entry.get("transactionApiId") == str(payout_gate_way_queryset.id):
                                existing_entry = entry
                                break
                        
                        if existing_entry:
                            print("Entry with the same bankId already exists. Skipping append.")
                        else:
                            existingBenecodesList = beneficiary_queryset.beneCodeList
                            existingBenecodesList.append(new_bene_code_entry)
                            beneficiary_queryset.update(beneCodeList=existingBenecodesList)
                    else:
                        beneficary_creation_table =  Beneficiaries(
                            userIdsList=[ObjectId(merchant_queryset.id)],
                            accountNumber=str(each_req_bene.get("req_account_number")),
                            ifscCode=each_req_bene.get("req_ifsc_code"),
                            beneficiaryName=each_req_bene.get("req_account_name"),
                            transactionReferenceNumber="",
                            beneficiaryId=bene_code,
                            beneCodeList =[new_bene_code_entry],
                            masterBankId=each_req_bene.get('bankId'),
                            createdOn=datetime.datetime.now(),
                            status=1
                        ).save()


                responseBody = {
                "status": paymentgatewayResponseStatusDict.get("result"),
                "BeneData": beneList,
                "error_message":paymentgatewayResponseStatusDict.get("message"),
                }
                data_status["responseStatus"]=1
                data_status["result"]="Bulk benificaries created successfully!"
                data_status["beniDetails"]=responseBody
                return data_status

            elif paymentgatewayResponseStatusDict.get("responseStatus") == 0:
                data_status["result"]=paymentgatewayResponseStatusDict.get("message")
                return data_status
            else:
                data_status["result"]=paymentgatewayResponseStatusDict.get("message")
                return data_status
        else:
            data_status["result"]="Please contact to admin to enable payout option!!"
            save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
            return data_status

    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get required data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payout","beneficiary_creation","beneficiary_creation",exceptionData,client_ip,"api")
        return data_status


sample_beni_crea_static_data = {
    "bank_name":"Indusind",
    "account_number":"159502971443",
    "ifsc_code":"INDB0000226",
    "account_name":"Sai Krishna"
    }

@payout_apis.route("/beneficiary_creation",methods=["POST"])
def beneficiary_creation():
    data_status = {"responseStatus":0,"result":""}
    if SERVER_STATUS == "DOWN":
        data_status["result"] = SERVER_MAINTAINCE_MESSAGE
        return data_status
    merchant_id = request.headers.get("Merchant-Id","")
    api_key =  request.headers.get("Api-Key")
    # encryption_data = request.form.get("encryptionData","")
    # iv = request.form.get("iv","")



    secretKey = "f51085df02812201344f6f0cb6959647"
    encryption_key = bytes(secretKey, 'utf-8')
    responseEncrypt = encrypt(sample_beni_crea_static_data,encryption_key)
    encryption_data = responseEncrypt.get('encryption_data')
    iv = responseEncrypt.get('iv')

    responseDict = {}
    paymentgatewayResponseStatusDict = {}

    if request.headers.getlist("X-Forwarded-For"):
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

    payOutPaymentGatewayId = ""
    userId=""
    requestData = [{"encryptionData":encryption_data,"iv":iv}]

    # Here Create client Logs Table 
    save_client_table = save_client_logs_data(userId,"payout","beneficiary_creation","beneficiary_creation",None,requestData,client_ip,"api")

    print(client_ip,"CLIENT IP")

    try:
        # if not order_id and merchant_id and not api_key:
        if not merchant_id and not api_key:
            data_status["result"] =  "required fields are missing!!"
            return data_status
        merchant_queryset = Users.objects(merchantUniqueNumber=merchant_id,status=1).first()
        if not merchant_queryset:
            data_status["result"] = "Invalid merchant id!!"
            return data_status
        
        check_kyc_status = merchant_kyc_status(str(merchant_queryset.id))
        if check_kyc_status.get("responseStatus") != 1:
            data_status["result"] = "Merchant KYC is not completed please contact to admin!!"
            return data_status

        kycStatus = check_kyc_status.get("merchantKycDetails", {}).get("kycStatus")
        if kycStatus ==False:
            data_status["result"] = "Merchant KYC is not completed please contact to admin!!"
            return data_status
        
        userId = str(merchant_queryset.id)
        merchantUniqueNumber = str(merchant_queryset.merchantUniqueNumber)
        
        api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payout",userId=userId,status=1).first()

        if not api_security_queryset:
            data_status["result"]="Invalid api key!!"
            return data_status

        try:
            if not merchant_queryset.patternId.payoutPaymentGatewayId:
                data_status["result"] = "Payout option is disabled please contact to admin!!"
                return data_status
        except Exception as e:
            data_status["result"] = "Payout option is disabled please contact to admin!!"
            return data_status
        

        payOutPaymentGatewayId = str(merchant_queryset.patternId.payoutPaymentGatewayId.id)

        payout_gate_way_queryset = TransactionAPI.objects(id=payOutPaymentGatewayId,status=1).first()

        if not payout_gate_way_queryset:
            data_status["result"] = "Payout option is disabled please contact to admin!!"
            return data_status

        paymentGatewayCodee = payout_gate_way_queryset.code

        try:
            secretKey = api_security_queryset.secretKey
            encryption_key = bytes(secretKey,'utf-8')

            jsonData = decrypt(encryption_data,encryption_key,iv)
            decryptResponse = json.loads(jsonData)
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] =  "Invalid encryption data!!"
            return data_status

        save_client_table.update(userId=ObjectId(userId),transactionAPIId=ObjectId(payOutPaymentGatewayId))

        
        errorList =[]
        mid_extracted = merchantUniqueNumber[1:].lstrip("0")
        beneficiaryCode = str(mid_extracted) + str(get_epoch_milli_time())
        req_bank_name=decryptResponse.get("bank_name")
        req_bene_code=beneficiaryCode
        req_account_number = decryptResponse.get("account_number")
        req_ifsc_code = decryptResponse.get("ifsc_code")
        req_account_name = decryptResponse.get("account_name")
        req_customer_email = decryptResponse.get("customer_email","")
        req_customer_phone = decryptResponse.get("customer_phone","")

         ######### check for required fields for each record
        if not (req_account_number and req_ifsc_code and req_account_name and req_bene_code ):
            data_status["result"] = "Required Fields are missing!!"
            return data_status
        
        if len(req_account_number) < 11 and len(req_account_number) > 15:
                errorList.append("Invalid length for Account number for ",req_account_number)
            
        if len(req_ifsc_code) != 11:
            errorList.append("Invalid length for IFSC code for ", req_account_number)
        
        if not validate_alphanumeric(req_account_name):
            errorList.append("Special characters not allowed in account name, use only alpha numeric", req_account_number)
        
        if len(errorList) > 0:
            data_status["result"] = "Invalid request"
            data_status["errors"] = errorList
            return data_status
        
        check_beneficiary = Beneficiaries.objects(beneficiaryId=req_bene_code).first()

        if check_beneficiary:
            for each_bene in check_beneficiary.beneCodeList:
                if str(each_bene.get("transactionApiId")) == str(payout_gate_way_queryset.id):
                    data_status["result"] = "Beneficiary Code already Registered"
                    return data_status
        
        save_api_request_data_table = ApiRequestData(
            userId=str(merchant_queryset.id),
            userOrderId="",
            orderId="",
            requestData=[decryptResponse],
            createdOn=datetime.datetime.now(),
            status=1)

        save_table=save_api_request_data_table.save()

        uuid=random_alphanumeric_generate(20)
        print(payout_gate_way_queryset.code,"((((((((((((payout_gate_way_queryset.code))))))))))))")
        if payout_gate_way_queryset:
            if payout_gate_way_queryset.code == "Axis_Payout":
                client_id = ""
                client_secret = ""
                get_api_key=""
                channelId=""
                serviceRequestId=""
                corpCode=""
                serviceRequestVersion=""
                get_base_url=""
                corp_account_number=""

                for each_key in payout_gate_way_queryset.paramsList:
                    get_key = each_key.get("key")
                    if get_key=="client_id":
                        client_id=each_key.get("value")
                    if get_key=="client_secret":
                        client_secret=each_key.get("value")
                    if get_key=="encryption_key":
                        get_api_key=each_key.get("value")
                    if get_key=="channel_id":
                        channelId=each_key.get("value")
                    if get_key=="service_request_id":
                        serviceRequestId=each_key.get("value")
                    if get_key=="service_request_version":
                        serviceRequestVersion=each_key.get("value")
                    if get_key=="corp_code":
                        corpCode=each_key.get("value")
                    if get_key=="get_base_url":
                        get_base_url=each_key.get("value")
                    if get_key=="corp_account_number":
                        corp_account_number=each_key.get("value")
                
                requestUUID = str(random_alphanumeric_generate(15))
                
                ###################### Axis Beneficiary Creation Functionality Code #####################################
                paymentgatewayResponseStatusDict = axis_beneficiary_registration(
                                            client_id=client_id,
                                            client_secret=client_secret,
                                            get_api_key=get_api_key,
                                            channelId=channelId,
                                            serviceRequestId=serviceRequestId,
                                            serviceRequestVersion=serviceRequestVersion,
                                            corpCode=corpCode,
                                            userId=userId,
                                            get_base_url=get_base_url,
                                            requestUUID=requestUUID,
                                            apiVersion="1.0",
                                            beneCode=beneficiaryCode,
                                            beneName=req_account_name,
                                            beneAccNum=req_account_number,
                                            beneIfscCode=req_ifsc_code,
                                            beneBankName=req_bank_name,
                                            beneEmailAddr1=req_customer_email,
                                            beneMobileNo=req_customer_phone)
                ##########################################################################################################
                print(paymentgatewayResponseStatusDict,"((((((((((paymentgatewayResponseStatusDict))))))))))")
            else:
                data_status["result"]="Payout option is disabled please contact to admin!!"
                return data_status
            ##################  Common code for Bene Creations #####################

            if paymentgatewayResponseStatusDict.get("responseStatus") == 1:
                transactionData = paymentgatewayResponseStatusDict.get("transactionData")
                beneList = paymentgatewayResponseStatusDict.get("beneList")
                responseList = paymentgatewayResponseStatusDict.get("responseList")
                beneList[0]["beneCode"] = req_bene_code


                beneficiary_queryset = Beneficiaries.objects(beneficiaryId=req_bene_code).first()

                new_bene_code_entry = {
                    "beneCode": responseList[0].get("beneCode"),
                    "transactionApiId": str(payout_gate_way_queryset.id),
                    "status": "Pending",
                }
                if beneficiary_queryset and responseList:
                    existing_entry = None
                    for entry in beneficiary_queryset.beneCodeList:
                        if entry.get("transactionApiId") == str(payout_gate_way_queryset.id):
                            existing_entry = entry
                            break
                    
                    if existing_entry:
                        print("Entry with the same bankId already exists. Skipping append.")
                    else:
                        existingBenecodesList = beneficiary_queryset.beneCodeList
                        existingBenecodesList.append(new_bene_code_entry)
                        beneficiary_queryset.update(beneCodeList=existingBenecodesList)
                else:
                    beneficary_creation_table =  Beneficiaries(
                        userId=ObjectId(merchant_queryset.id),
                        masterBankId=None,
                        remitterId=None,
                        beneficiaryId=req_bene_code,
                        fullName=responseList[0].get("beneName"),
                        mobileNumber="",
                        verifyStatus="Pending",
                        accountNumber=str(responseList[0].get("beneAccNum")),
                        ifscCode=beneList[0].get("bene_ifsc_code"),
                        transactionAPIId=ObjectId(payout_gate_way_queryset.id),
                        createdOn=datetime.datetime.now(),
                        beneCodeList=[new_bene_code_entry],
                        status = 1
                    ).save()


                responseBody = {
                "status": paymentgatewayResponseStatusDict.get("result"),
                "BeneData": beneList[0],
                "error_message":paymentgatewayResponseStatusDict.get("message"),
                }

                data_status["responseStatus"]=1
                data_status["result"]="Benificary created successfully!"
                data_status["beniDetails"]=responseBody
                return data_status

            elif paymentgatewayResponseStatusDict.get("responseStatus") == 0:
                responseBody = {
                "status": paymentgatewayResponseStatusDict.get("result"),
                "error_message":paymentgatewayResponseStatusDict.get("message"),
                }
                data_status["result"]=paymentgatewayResponseStatusDict.get("message")
                return data_status
            else:
                data_status["result"]=paymentgatewayResponseStatusDict.get("message")
                return data_status
        else:
            data_status["result"]="Please contact to admin to enable payout option!!"
            save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get required data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payout","beneficiary_creation","beneficiary_creation",exceptionData,client_ip,"api")
        return data_status


@payout_apis.route("/bulkbeneficiarystatuscheck",methods=["POST"])
def bulkbeneficiarystatuscheck():
    data_status = {"responseStatus":0,"result":""}
    if SERVER_STATUS == "DOWN":
        data_status["result"] = SERVER_MAINTAINCE_MESSAGE
        return data_status
    merchant_id = request.headers.get("Merchant-Id","")
    api_key =  request.headers.get("Api-Key")
    encryption_data = request.form.get("encryptionData","")
    iv = request.form.get("iv","")

    # secretKey = "f51085df02812201344f6f0cb6959647"
    # encryption_key = bytes(secretKey, 'utf-8')
    # responseEncrypt = encrypt(sample_axis_beni_crea_static_data,encryption_key)
    # encryption_data = responseEncrypt.get('encryption_data')
    # iv = responseEncrypt.get('iv')

    responseDict = {}
    paymentgatewayResponseStatusDict = {}

    if request.headers.getlist("X-Forwarded-For"):
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    try:
        if not merchant_id and not api_key and not encryption_data and not iv:
            data_status["result"] =  "required fields are missing!!"
            return data_status

        merchant_queryset = Users.objects(merchantUniqueNumber=merchant_id,status=1).first()
        if not merchant_queryset:
            data_status["result"] = "Invalid merchant id!!"
            return data_status

        check_kyc_status = merchant_kyc_status(str(merchant_queryset.id))
        if check_kyc_status.get("responseStatus") != 1:
            data_status["result"] = "Merchant KYC is not completed please contact to admin!!"
            return data_status

        kycStatus = check_kyc_status.get("merchantKycDetails", {}).get("kycStatus")
        if kycStatus == False:
            data_status["result"] = "Merchant KYC is not completed please contact to admin!!"
            return data_status
        
        userId = str(merchant_queryset.id)
        merchantUniqueNumber = str(merchant_queryset.merchantUniqueNumber)

        payOutPaymentGatewayId = str(merchant_queryset.patternId.payoutPaymentGatewayId.id)

        api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payout",userId=userId,status=1).first()
        if not api_security_queryset:
            data_status["result"]="Invalid api key!!"
            return data_status

        payout_gate_way_queryset = TransactionAPI.objects(id=payOutPaymentGatewayId,status=1).first()
        if not payout_gate_way_queryset:
            data_status["result"] = "Payout option is disabled please contact to admin!!"
            return data_status

        try:
            if not merchant_queryset.patternId.payoutPaymentGatewayId:
                data_status["result"] = "Payout option is disabled please contact to admin!!"
                return data_status
        except Exception as e:
            data_status["result"] = "Payout option is disabled please contact to admin!!"
            return data_status
        
        errorList =[]
        benecodesList =[]
        mid_extracted = merchantUniqueNumber[1:].lstrip("0")
        transactionId=random_digit_generate(16)
        seen_merchant_ref_numbers = ()


        try:
            secretKey = api_security_queryset.secretKey
            encryption_key = bytes(secretKey,'utf-8')

            jsonData = decrypt(encryption_data,encryption_key,iv)
            decryptResponse = json.loads(jsonData)
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] =  "Invalid encryption data!!"
            return data_status

        if decryptResponse:
            beneCodeList = decryptResponse.get("beneCodeList")

            counter = 0 
            for each_bene_code in beneCodeList:
                print(each_bene_code,"(((((((EACH each_bene_code)))))))")
                counter=counter+1
                beneCode=each_bene_code.get("beneCode")

                if beneCode != "":
                    if not beneCode:
                        data_status["result"] = "Invalid benecodes!!"
                        return data_status
                    print(beneCode,"((((((beneCode))))))")
                    benecodesList.append(beneCode)

            print(benecodesList,"((((((((((((benecodesList))))))))))))")
            if len(benecodesList) == []:
                data_status["result"] = "Invalid request!!"
                return data_status
                
            save_api_request_data_table = ApiRequestData(
                userId=str(merchant_queryset.id),
                userOrderId="",
                orderId="",
                requestData=[decryptResponse],
                createdOn=datetime.datetime.now(),
                status=1
                )
            save_table=save_api_request_data_table.save()

            uuid=random_alphanumeric_generate(20)
                
            if payout_gate_way_queryset:
                if payout_gate_way_queryset.code == "Axis_Payout":
                    client_id = ""
                    client_secret = ""
                    get_api_key=""
                    channelId=""
                    serviceRequestId=""
                    corpCode=""
                    serviceRequestVersion=""
                    get_base_url=""
                    corp_account_number=""

                    for each_key in payout_gate_way_queryset.paramsList:
                        get_key = each_key.get("key")
                        if get_key=="client_id":
                            client_id=each_key.get("value")
                        if get_key=="client_secret":
                            client_secret=each_key.get("value")
                        if get_key=="encryption_key":
                            get_api_key=each_key.get("value")
                        if get_key=="channel_id":
                            channelId=each_key.get("value")
                        if get_key=="service_request_id":
                            serviceRequestId=each_key.get("value")
                        if get_key=="service_request_version":
                            serviceRequestVersion=each_key.get("value")
                        if get_key=="corp_code":
                            corpCode=each_key.get("value")
                        if get_key=="get_base_url":
                            get_base_url=each_key.get("value")
                        if get_key=="corp_account_number":
                            corp_account_number=each_key.get("value")
                    
                    requestUUID = str(random_alphanumeric_generate(15))
                    
                    fromDate=(datetime.datetime.now() - timedelta(days=25)).strftime("%Y-%m-%d")
                    toDate=datetime.datetime.now().strftime("%Y-%m-%d")

                    ###################### Axis Beneficiary Creation Functionality Code #####################################
                    paymentgatewayResponseStatusDict = axis_bulk_beneficiary_enquiry(
                        client_id=client_id,
                        client_secret=client_secret,
                        key=get_api_key,
                        channelId=channelId,
                        get_base_url=get_base_url,
                        apiVersion="1.0",
                        requestUUID=requestUUID,
                        serviceRequestId=serviceRequestId,
                        serviceRequestVersion=serviceRequestVersion,
                        corpCode=corpCode,
                        userId=userId,
                        fromDate=fromDate,
                        toDate=toDate,
                        emailId=admin_recieve_email,
                        status="All",
                        benecodesList=benecodesList
                        )
                    ##########################################################################################################
                else:
                    data_status["result"]="Unable to connect to the server!!"
                    return data_status
                ##################  Common code for Bene Creations #####################
                if paymentgatewayResponseStatusDict.get("responseStatus") == 1:
                    transactionData = paymentgatewayResponseStatusDict.get("transactionData")
                    beneList = paymentgatewayResponseStatusDict.get("beneList")
                    responseList = paymentgatewayResponseStatusDict.get("responseList")
                    print(beneList,"(((((((((((((Bulk beneList enq)))))))))))))")
                    for each_bene in responseList:
                        beneId = each_bene.get("beneCode")
                        bene_data_queryset = Beneficiaries.objects(beneCodeList__beneCode=beneId).first()
     
                        if bene_data_queryset:
                            if each_bene.get("status").lower() == "active":
                                # Copy the existing beneCodeList
                                existingBenecodesList = bene_data_queryset.beneCodeList
                                for each_dict in existingBenecodesList:
                                    # Check if transactionAPIId matches
                                    if each_dict.get("transactionApiId") == str(payout_gate_way_queryset.id):
                                        # Update the matched dictionary
                                        each_dict.update({
                                            "beneCode": each_dict.get("beneCode"),
                                            "transactionApiId": each_dict.get("transactionApiId"),
                                            "status": "Active"
                                        })
                                        break
     
                                # Save the updated list back to the database
                                bene_data_queryset.beneCodeList = existingBenecodesList
                                bene_data_queryset.save()

                    responseData = {
                    "status":"Success",
                    "beneList":paymentgatewayResponseStatusDict.get("beneList"),
                    "message":"Success"
                    }
                    data_status["responseStatus"]=1
                    data_status["result"]="Bulk benificaries enquiries data successfully!"
                    data_status["bulkBenificiariesEnquiriesList"]=responseData
                    return data_status

                elif paymentgatewayResponseStatusDict.get("responseStatus") == 0:
                    data_status["result"]=paymentgatewayResponseStatusDict.get("message")
                    return data_status
                else:
                    data_status["result"]=paymentgatewayResponseStatusDict.get("message")
                    return data_status
            else:
                data_status["result"]="Please contact to admin to enable payout option!!"
                return data_status

        else:
            data_status["result"]="Our banking partner server is down, please try again later."

    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get create bulk benecreation data!!"
        return data_status

def autoBenificiaryCreation(userId,accountNumber,ifscCode,beneficiaryName,bankId,bankName=""):
    data_status={"responseStatus":0,"result":""}
    try:
        merchant_queryset=Users.objects(id=str(userId)).first()
        autoBenificiaries_qry=AutoBeneficiaries.objects(status=1).order_by("-id")
        merchantUniqueNumber = str(merchant_queryset.merchantUniqueNumber)
        mid_extracted = merchantUniqueNumber[1:].lstrip("0")
        for each_benificary in autoBenificiaries_qry:
            beneficiaryCode = str(mid_extracted) + str(get_epoch_milli_time())
            transactionAPIId=str(each_benificary.transactionAPIId.id)
            savedcount=0
            beneTransactionCheck_qry=Beneficiaries.objects(accountNumber=accountNumber).first()
            benefilter_qry=beneTransactionCheck_qry.filter(Q(beneCodeList__elemMatch={"transactionApiId": str(transactionAPIId)}))
            if benefilter_qry:
                continue

            payout_gate_way_queryset=TransactionAPI.objects(id=transactionAPIId,status=1).first()
            if payout_gate_way_queryset:
                if payout_gate_way_queryset.code == "Axis_Payout":
                    client_id = ""
                    client_secret = ""
                    get_api_key=""
                    channelId=""
                    serviceRequestId=""
                    corpCode=""
                    serviceRequestVersion=""
                    get_base_url=""
                    corp_account_number=""
                    api_version="1.0"

                    for each_key in payout_gate_way_queryset.paramsList:
                        get_key = each_key.get("key")
                        if get_key=="client_id":
                            client_id=each_key.get("value")
                        if get_key=="client_secret":
                            client_secret=each_key.get("value")
                        if get_key=="encryption_key":
                            get_api_key=each_key.get("value")
                        if get_key=="channel_id":
                            channelId=each_key.get("value")
                        if get_key=="service_request_id":
                            serviceRequestId=each_key.get("value")
                        if get_key=="service_request_version":
                            serviceRequestVersion=each_key.get("value")
                        if get_key=="corp_code":
                            corpCode=each_key.get("value")
                        if get_key=="get_base_url":
                            get_base_url=each_key.get("value")
                        if get_key=="corp_account_number":
                            corp_account_number=each_key.get("value")
                        if get_key=="api_version":
                                api_version=each_key.get("value")
                        
                    requestUUID = str(random_alphanumeric_generate(15))
                    
                    ###################### Axis Beneficiary Creation Functionality Code #####################################
                    paymentgatewayResponseStatusDict = axis_beneficiary_registration(
                                                client_id=client_id,
                                                client_secret=client_secret,
                                                get_api_key=get_api_key,
                                                channelId=channelId,
                                                serviceRequestId=serviceRequestId,
                                                serviceRequestVersion=serviceRequestVersion,
                                                corpCode=corpCode,
                                                userId=userId,
                                                get_base_url=get_base_url,
                                                requestUUID=requestUUID,
                                                apiVersion=api_version,
                                                beneCode=beneficiaryCode,
                                                beneName=beneficiaryName,
                                                beneAccNum=accountNumber,
                                                beneIfscCode=ifscCode,
                                                beneBankName=bankName,
                                                beneEmailAddr1=str(merchant_queryset.email),
                                                beneMobileNo=str(merchant_queryset.phoneNumber))
                            ##########################################################################################################
                else:
                    paymentgatewayResponseStatusDict={"responseStatus":0}

                if paymentgatewayResponseStatusDict.get("responseStatus") == 1:
                    savedcount=1
                    transactionData = paymentgatewayResponseStatusDict.get("transactionData")
                    beneList = paymentgatewayResponseStatusDict.get("beneList")
                    responseList = paymentgatewayResponseStatusDict.get("responseList")
                    beneList[0]["beneCode"] = req_bene_code

                    beneficiary_queryset = Beneficiaries.objects(accountNumber=accountNumber).first()
                    new_bene_code_entry = {
                        "beneCode": responseList[0].get("beneCode"),
                        "transactionApiId": str(payout_gate_way_queryset.id),
                        "status": "Pending",
                        "transactionData":transactionData
                    }
                    if beneficiary_queryset:
                        existingBenecodesList = beneficiary_queryset.beneCodeList
                        existingBenecodesList.append(new_bene_code_entry)
                        beneficiary_queryset.update(beneCodeList=existingBenecodesList)
                    else:
                        beneficary_creation_table =  Beneficiaries(
                            userIdsList=[ObjectId(userId)],
                            accountNumber=accountNumber,
                            ifscCode=ifscCode,
                            beneficiaryName=beneficiaryName,
                            transactionReferenceNumber="",
                            beneficiaryId=req_bene_code,
                            beneCodeList =[new_bene_code_entry],
                            masterBankId=bankId,
                            createdOn=datetime.datetime.now(),
                            status=1
                        ).save()
        data_status['responseStatus']=savedcount
        return data_status
    except Exception as e:
        print(traceback.format_exc())
        return data_status


def remove_special_characters(text):
    text=" ".join(text.split())
    return re.sub(r'[^A-Za-z0-9\s]', '', text)

def getBenesData():
    beneficiaryCreationsList = []
    benny_list_qry=Beneficiaries.objects(beneCodeList=[]).order_by("-createdOn")
    for each_benificiary_account in benny_list_qry:
        benicreationDict = {
            "account_number":str(each_benificiary_account.accountNumber),
            "ifsc_code":str(each_benificiary_account.ifscCode),
            "account_name":remove_special_characters(str(each_benificiary_account.beneficiaryName)),
            "bankId":str(each_benificiary_account.masterBankId.id),
            "bank_name":str(each_benificiary_account.masterBankId.bankName),
            "beneficiaryCode":str(each_benificiary_account.beneficiaryId),
        }
        beneficiaryCreationsList.append(benicreationDict)
    return beneficiaryCreationsList
 
@payout_apis.route("/newbulkbeneficiarycreation",methods=["POST"])
def newbulkbeneficiarycreation():
    data_status = {"responseStatus":0,"result":""}
    
    try:
        beneficiaryCreationsListReq = getBenesData()
        if not beneficiaryCreationsListReq:
            data_status["result"] = "requestData is empty!!"
            return data_status
        print(beneficiaryCreationsListReq,"beneficiaryCreationsListReq")
        payOutPaymentGatewayId="672ef36da21f9a21723c31d9"
        payout_gate_way_queryset = TransactionAPI.objects(id=payOutPaymentGatewayId,status=1).first()

        if not payout_gate_way_queryset:
            data_status["result"] = "Payout option is disabled please contact to admin!!"
            return data_status
        paymentGatewayCodee = payout_gate_way_queryset.code
        errorList =[]
        counter = 0
        beneficiaryCreationsList=[]
        for each_bene_creation in beneficiaryCreationsListReq:
            counter=counter+1
            beneficiaryCode=""
            beneficiaryCode = str(get_epoch_milli_time()) + str(counter)
            req_bank_name=each_bene_creation.get("bank_name")
            req_bene_code= str(each_bene_creation.get("beneficiaryCode"))
            req_account_number = each_bene_creation.get("account_number")
            req_ifsc_code = each_bene_creation.get("ifsc_code")
            req_account_name = each_bene_creation.get("account_name")
            req_customer_email = ""
            req_customer_phone = ""
            bankId = each_bene_creation.get("bankId","")

            ############### check for required fields for each record #####################
            if not (req_account_number and req_ifsc_code and req_account_name and req_bene_code):
                continue
            
            if len(req_account_number) < 11 and len(req_account_number) > 15:
                    continue
                
            if len(req_ifsc_code) != 11:
                continue

            beniDict = {
            "req_bene_code":req_bene_code,
            "beneficiaryCode":beneficiaryCode,
            "req_account_number":req_account_number,
            "req_ifsc_code":req_ifsc_code,
            "req_account_name":req_account_name,
            "req_customer_email":req_customer_email,
            "req_customer_phone":req_customer_phone,
            "bankId":bankId
            }
            beneficiaryCreationsList.append(beniDict)
        print(len(beneficiaryCreationsList),"len(beneficiaryCreationsList)")
        if len(beneficiaryCreationsList)==0:
            data_status["result"] = "records length 0!!"
            return data_status
        print(beneficiaryCreationsList,"beneficiaryCreationsList")
        return data_status
        
        if payout_gate_way_queryset:
            if payout_gate_way_queryset.code == "Axis_Payout":
                client_id = ""
                client_secret = ""
                get_api_key=""
                channelId=""
                serviceRequestId=""
                corpCode=""
                serviceRequestVersion=""
                get_base_url=""
                corp_account_number=""

                for each_key in payout_gate_way_queryset.paramsList:
                    get_key = each_key.get("key")
                    if get_key=="client_id":
                        client_id=each_key.get("value")
                    if get_key=="client_secret":
                        client_secret=each_key.get("value")
                    if get_key=="encryption_key":
                        get_api_key=each_key.get("value")
                    if get_key=="channel_id":
                        channelId=each_key.get("value")
                    if get_key=="service_request_id":
                        serviceRequestId=each_key.get("value")
                    if get_key=="service_request_version":
                        serviceRequestVersion=each_key.get("value")
                    if get_key=="corp_code":
                        corpCode=each_key.get("value")
                    if get_key=="get_base_url":
                        get_base_url=each_key.get("value")
                    if get_key=="corp_account_number":
                        corp_account_number=each_key.get("value")
                
                requestUUID = str(random_alphanumeric_generate(15))
                
                ###################### Axis Beneficiary Creation Functionality Code #####################################
                paymentgatewayResponseStatusDict = axis_bulk_beneficiary_registration(
                                    client_id=client_id,
                                    client_secret=client_secret,
                                    get_api_key=get_api_key,
                                    channelId=channelId,
                                    serviceRequestId=serviceRequestId,
                                    serviceRequestVersion=serviceRequestVersion,
                                    corpCode=corpCode,
                                    userId=userId,
                                    get_base_url=get_base_url,
                                    requestUUID=requestUUID,
                                    apiVersion="1.0",
                                    beneficiaries=beneficiaryCreationsList
                                    )
                ##########################################################################################################
            else:
                data_status["result"]="Unable to connect to the server!!"
                return data_status
            ##################  Common code for Bene Creations #####################
            print(paymentgatewayResponseStatusDict,"paymentgatewayResponseStatusDict")
            if paymentgatewayResponseStatusDict.get("responseStatus") == 1:
                transactionData = paymentgatewayResponseStatusDict.get("transactionData")
                beneList = paymentgatewayResponseStatusDict.get("beneList")
                responseList = paymentgatewayResponseStatusDict.get("responseList")

                for each_req_bene in beneficiaryCreationsList:
                    bene_code = each_req_bene["req_bene_code"] ## this is req_bene_code- client sent

                    beneficiary_queryset = Beneficiaries.objects(accountNumber=each_req_bene.get("req_account_number")).first()

                    new_bene_code_entry = {
                        "beneCode": each_req_bene.get("beneficiaryCode"),
                        "transactionApiId": str(payout_gate_way_queryset.id),
                        "status": "Pending",
                        "transactionData":[each_req_bene]
                    }
                    if beneficiary_queryset:
                        existingBenecodesList = beneficiary_queryset.beneCodeList
                        existingBenecodesList.append(new_bene_code_entry)
                        beneficiary_queryset.update(beneCodeList=existingBenecodesList)
                    else:
                        beneficary_creation_table =  Beneficiaries(
                            userIdsList=[ObjectId(merchant_queryset.id)],
                            accountNumber=str(each_req_bene.get("req_account_number")),
                            ifscCode=each_req_bene.get("req_ifsc_code"),
                            beneficiaryName=each_req_bene.get("req_account_name"),
                            transactionReferenceNumber="",
                            beneficiaryId=bene_code,
                            beneCodeList =[new_bene_code_entry],
                            masterBankId=each_req_bene.get('bankId'),
                            createdOn=datetime.datetime.now(),
                            status=1
                        ).save()


                responseBody = {
                "status": paymentgatewayResponseStatusDict.get("result"),
                "BeneData": beneList,
                "error_message":paymentgatewayResponseStatusDict.get("message"),
                }
                data_status["responseStatus"]=1
                data_status["result"]="Bulk benificaries created successfully!"
                data_status["beniDetails"]=responseBody
                return data_status

            elif paymentgatewayResponseStatusDict.get("responseStatus") == 0:
                data_status["result"]=paymentgatewayResponseStatusDict.get("message")
                return data_status
            else:
                data_status["result"]=paymentgatewayResponseStatusDict.get("message")
                return data_status
        else:
            data_status["result"]="Please contact to admin to enable payout option!!"
            save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
            return data_status

    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get required data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payout","beneficiary_creation","beneficiary_creation",exceptionData,client_ip,"api")
        return data_status


@payout_apis.route("/verify_account_number", methods=["POST"])
def verifyAccountNumber():
    data_status = {"responseStatus":0,"result":""}
    if SERVER_STATUS == "DOWN":
        data_status["result"] = SERVER_MAINTAINCE_MESSAGE
        return data_status
    merchant_id = request.headers.get("Merchant-Id","")
    api_key =  request.headers.get("Api-Key")
    encryption_data = request.form.get("encryptionData","")
    iv = request.form.get("iv","")

    if request.headers.getlist("X-Forwarded-For"):
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    try:
        if not merchant_id and not api_key and not encryption_data and not iv:
            data_status["result"] =  "required fields are missing!!"
            return data_status

        merchant_queryset = Users.objects(merchantUniqueNumber=merchant_id,status=1).first()
        if not merchant_queryset:
            data_status["result"] = "Invalid merchant id!!"
            return data_status

        check_kyc_status = merchant_kyc_status(str(merchant_queryset.id))
        if check_kyc_status.get("responseStatus") != 1:
            data_status["result"] = "Merchant KYC is not completed please contact to admin!!"
            return data_status

        kycStatus = check_kyc_status.get("merchantKycDetails", {}).get("kycStatus")
        if kycStatus == False:
            data_status["result"] = "Merchant KYC is not completed please contact to admin!!"
            return data_status
        
        userId = str(merchant_queryset.id)
        payoutPaymentGatewayId = str(merchant_queryset.patternId.payoutPaymentGatewayId.id)

        api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payout",userId=userId,status=1).first()
        if not api_security_queryset:
            data_status["result"]="Invalid api key!!"
            return data_status
        
        if client_ip not in api_security_queryset.ipAddressList:
              data_status["result"]="Your ip adress is not whitelisted please contact admin!!"
              return data_status

        try:
            secretKey = api_security_queryset.secretKey
            encryption_key = bytes(secretKey,'utf-8')

            jsonData = decrypt(encryption_data,encryption_key,iv)
            decryptResponse = json.loads(jsonData)
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] =  "Invalid encryption data!!"
            return data_status
        
        accountNumber = decryptResponse.get("accountNumber")
        ifscCode = decryptResponse.get("ifscCode")
        # bankId = decryptResponse.get("bankId","")

        if accountNumber and ifscCode:
            # accountHolderName=str(merchant_queryset.fullName)
            # mobileNumber=str(merchant_queryset.phoneNumber)
            accountHolderName=""
            mobileNumber=""

            payout_gate_way_queryset = TransactionAPI.objects(id=payoutPaymentGatewayId,status=1).first()
            if not payout_gate_way_queryset:
                data_status["result"]="Invalid payment gateway id!!"
                return data_status

            save_api_request_data_table = ApiRequestData(
            userId=str(merchant_queryset.id),
            userOrderId="",
            orderId="",
            requestData=[decryptResponse],
            createdOn=datetime.datetime.now(),
            status=1
            )
            save_table=save_api_request_data_table.save()

            exisit_beneficiary_check = BenificiaryAccounts.objects(creditorAccountNumber=accountNumber,userId=userId).first()
            if exisit_beneficiary_check:
                data_status["result"]="Beneficiary already added!!"
                return data_status

            gstInclude = ""
            gstValue = 0
            tdsInclude = ""
            tdsValue = 0
            amount = 0
            merchantCharges = 0
            beneficiaryCharges = 0
            previousBalance = 0
            currentBalance = 0
            commissionCharges = {}
            benivalidationCheck = {}
            beneficiary_service_charges = ServiceCharges.objects(chargeType="benificiaryValidation",status=1).first()
            if beneficiary_service_charges:
                amount = float(beneficiary_service_charges.amount)
                gstInclude = beneficiary_service_charges.gstInclude
                gstValue = float(beneficiary_service_charges.gstValue)
                tdsInclude = beneficiary_service_charges.tdsInclude
                tdsValue = float(beneficiary_service_charges.tdsValue)

                gstAmount  = float(amount*gstValue)/100
                tdsAmount  = float(amount*tdsValue)/100

                if gstInclude == "Yes":
                    merchantCharges = float(amount) - float(gstAmount)
                else:
                    merchantCharges = float(amount)

                if tdsInclude == "Yes":
                    merchantCharges = float(merchantCharges) - float(tdsAmount)
                else:
                    merchantCharges = float(merchantCharges)

                beneficiaryCharges = float(merchantCharges) + float(gstAmount) + float(tdsAmount)

                if float(merchant_queryset.payoutBalance) < float(beneficiaryCharges):
                    data_status["result"]="Insufficient balance!!"
                    return data_status

                previousBalance = float(merchant_queryset.payoutBalance)
                currentBalance = float(previousBalance)-float(beneficiaryCharges)

                commissionCharges = {
                "aggregatorType":"",
                "aggregatorAmount":0,
                "commissionType":"",
                "commissionAmount":"",
                "chargeType":"FLAT",
                "chargeValue":amount,
                "gstValue":gstValue,
                "tdsValue":tdsValue,
                "aggregatorValue":0,
                "commissionValue":0,
                "chargeAmount":round(float(merchantCharges),2),
                "transactionAmount":round(float(amount),2),
                "gstInclude":gstInclude,
                "gstAmount":round(float(gstAmount),2),
                "tdsInclude":tdsInclude,
                "tdsAmount":round(float(tdsAmount),2),
                "priceType":"Fixed",
                "slabId":""
                }
            bankStatusDict=verify_bank_account(accountNumber, ifscCode, "Bank", accountHolderName="", mobileNumber="", userId=userId)
            print(bankStatusDict,"bankStatusDict")
            creditorName=str(bankStatusDict.get("beneficiaryName"))
            bankrrn=str(bankStatusDict.get("bankRRN"))

            if bankStatusDict.get("responseStatus") == 1:
                if beneficiaryCharges > 0:
                    merchant_queryset.update(payoutBalance=currentBalance)
                    merchantReferenceNumber=str(random_digit_generate(15))
                    transactionReferenceNumber=str(random_digit_generate(15))
                    bankName = ""
                    # if bankId:
                    #     master_bank_queryset = MasterIFSCBank.objects(id=bankId).first()
                    #     if master_bank_queryset:
                    #         bankName = master_bank_queryset.bankName
                    #     else:
                    #         bankName = ""

                    fund_transfer_table = FundTransfers(
                        createdBy=None,
                        userId = str(merchant_queryset.id),
                        amount = amount,
                        grandTotal = beneficiaryCharges,
                        transactionAPIId = payoutPaymentGatewayId,
                        transferType = "Debit",
                        userType = "user",
                        narration = "Beneficiary validation charges for the account holder "+str(creditorName) +" | account number "+str(accountNumber),
                        transactionUniqueId = transactionReferenceNumber,
                        createdOn = datetime.datetime.now(),
                        previousBalance=previousBalance,
                        currentBalance=currentBalance,
                        uniqueRequestNumber = "",
                        beneficiaryName = creditorName,
                        beneficiaryMail = "",
                        beneficiaryPhone = "",
                        bankReferenceNumber=bankrrn,
                        accountIFSCCode = ifscCode,
                        fundTransferType = "user",
                        accountType = "",
                        accountNumber = accountNumber,
                        paymentMode = "wallet",
                        bankBranch = "",
                        bankName = bankName,
                        errorMessage = "Beneficiary validation charges for the account holder "+str(creditorName) +" | account number "+str(accountNumber),
                        internalId = "",
                        pgOrderId = "",
                        apiType = "api",
                        merchantReferenceNumber = merchantReferenceNumber,
                        commissionCharges = commissionCharges,
                        status = 1
                        )
                    save_table = fund_transfer_table.save()
                
                DeclinedList=["card","cards","credit card","credit cards","creditcard","creditcards","credit","credits","cc","","creditcardsystem"]
                if creditorName.lower() in DeclinedList or "card" in creditorName.lower() or "credit" in creditorName.lower():
                    invalidbenny_table=InvalidBenificiaryLogs(
                        userId=str(merchant_queryset.id),
                        accountNumber=accountNumber,
                        beneficiaryName=str(bankStatusDict.get("beneficiaryName")),
                        ifscCode=ifscCode,
                        status=1
                        ).save()
                    data_status["result"] = "Invalid Account Number."
                else:
                    data_status["responseStatus"] = 1
                    data_status["OriginalBankHolderName"] = str(bankStatusDict.get("beneficiaryName"))
                    data_status["bankRRN"] = str(bankStatusDict.get("bankRRN"))
                    # data_status["bankResponseData"] = str(bankStatusDict.get("apiResponse"))
                    data_status["result"] ="success"
            else:
                data_status["result"] = bankStatusDict.get('result')
            return data_status
        else:
            data_status["result"]="Required field is missing!!"
            return data_status
    except:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get required data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
