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.setu_payment_gateways import *
from appservices.common.payment_gateways.campuslinkpro_payment_gateway import *
from appservices.common.payment_gateways.payu_payment_gateways import *
from appservices.common.payment_gateways.getepay_payment_gateway import *

payin_apis = Blueprint("payin_apis",__name__)

csrf.exempt(payin_apis)

# sample_static_wowpe_payin_data = {
#     "api_key":"66a0a4a248eb9192aa9a6794-1da22030ba0ec3d21f69e7afa0a5e032",
#     "order_id":"FSFSfsdfsdfsdfds",
#     "mode":"LIVE",
#     "amount":"101.00",
#     "currency":"INR",
#     "description":"Testing purpose",
#     "name":"sai krishna",
#     "email":"sai.kerla@apptrinity.com",
#     "phone":"9988776655",
#     "address_line_1":"Hyderabad",
#     "address_line_2":"Hyderabad",
#     "city":"Hyderabad",
#     "state":"Telangana",
#     "country":"India",
#     "zip_code":"500081",
#     "udf1":"",
#     "udf2":"",
#     "udf3":"",
#     "udf4":"",
#     "udf5":"",
#     "return_url":"http://3.128.23.101/api/mobile/payin_call_back_url",
# }
# salt = "701853520a2565f50146532b64aaeaac6127a829"
# hashvalue = Sha512Hash(sample_static_wowpe_payin_data,salt)
# print(hashvalue,"*************")
# sample_static_wowpe_payin_data.update({"hash": hashvalue})

# sample_static_accurepay_payin_data = {
# "api_key": "66c43d14b131cbb3c5aba543-8bf0a73fda352bcc0da5509ae4372bd7",
# "address_line_1": "Test Address Line 1",
# "address_line_2": "Test Address Line 2",
# "amount": 101,
# "city": "Bangalore",
# "country": "IND",
# "currency": "INR",
# "description": "Payment Short Description",
# "email": "testing@example.com",
# "mode": "TEST",
# "name": "Test",
# "order_id": "12436rrwed558",
# "phone": "9988776655",
# "return_url":"http://3.128.23.101/api/mobile/payin_call_back_url",
# "state": "Karnataka",
# "udf1": "66c43d14b131cbb3c5aba543",
# "udf2": "",
# "udf3": "",
# "udf4": "",
# "udf5": "",
# "zip_code": "560001"
# }
# salt = "701853520a2565f50146532b64aaeaac6127a829"
# hashvalue = Sha512Hash(sample_static_accurepay_payin_data,salt)
# print(hashvalue,"*************")
# sample_static_accurepay_payin_data.update({"hash": hashvalue}).

sample_static_campus_payin_data = {
    "api_key": "677d26b6b18d235e8b11b575-8bf0a73fda352bcc0da5509ae4372bd7",
    "order_id" : str(random_digit_generate(15)),
    "description" : "Full stack Developer",
    "amount" : 1.00,
    "currency" : "INR",
    "name" : "Sai Krishna",
    "phone" : "9502971443",
    "email" : "saikerla@viyonafintech.com",
    "graampay_check":"Campuslinkpro_Payin"
}

@payin_apis.route("/getintentpaymenturl",methods=["POST"])
# @check_mid_apikey
def getintentpaymenturl():
    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","")

    location = ""
    agent = ""
    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

    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]

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

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

    # Here Create Client Logs Table
    save_client_table = save_client_logs_data(userId,"payin","intent","getintentpaymenturl",None,requestData,client_ip,"api")

    try:
        if encryption_data and iv and merchant_id and api_key:
            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

            if not (merchant_queryset.patternId.payinPaymentGatewaysList == []) or (merchant_queryset.enablePayin == False):
                data_status["result"]="Payin option is disabled please contact to admin!!"
                return data_status

            print("(((((((apikey)))))))",api_key)
            print("(((((((userId)))))))",merchant_queryset.id)

            api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payment_gateway",userId=str(merchant_queryset.id),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)
                print(jsonData,"JSON DATA")
                decryptResponse = json.loads(jsonData)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                data_status["result"]="Invalid encryption data!!"
                return data_status
            
            graampay_check = decryptResponse.get("graampay_check")
            payinPaymentGatewaysList = [str(each_payin_pg.id) for each_payin_pg in merchant_queryset.patternId.payinPaymentGatewaysList]

            print("(((((((payinPaymentGatewaysList)))))))",payinPaymentGatewaysList)
            print("(((((((graampay_check)))))))",graampay_check)

            payin_gate_way_queryset = TransactionAPI.objects(id__in=payinPaymentGatewaysList,code=graampay_check,status=1).first()
            if not payin_gate_way_queryset:
                data_status["result"]="Payin option is disabled please contact to admin!!"
                return data_status

            transactionAPIId = str(payin_gate_way_queryset.id)

            # requestData=[decryptResponse]
            userId = str(merchant_queryset.id)

            # Here Update some data in Client Logs Table
            save_client_table.update(userId=ObjectId(userId),transactionAPIId=ObjectId(transactionAPIId))
        
            payInPaymentGatewayId = str(payin_gate_way_queryset.id)
            
            paymentGateWayCode = payin_gate_way_queryset.code

            api_key = decryptResponse.get("api_key")
            name = decryptResponse.get("name")
            phone = decryptResponse.get("phone")
            email = decryptResponse.get("email")
            amount = decryptResponse.get("amount")
            note = decryptResponse.get("description")
            currency=decryptResponse.get("currency")
            orderId = decryptResponse.get("order_id")

            # Accurepay extra request data
            mode = decryptResponse.get("mode")
            address_line_1 = decryptResponse.get("address_line_1")
            address_line_2 = decryptResponse.get("address_line_2")
            city = decryptResponse.get("city")
            state = decryptResponse.get("state")
            country = decryptResponse.get("country")
            zip_code = decryptResponse.get("zip_code")
            udf1 = decryptResponse.get("udf1","")
            udf2 = decryptResponse.get("udf2","")
            udf3 = decryptResponse.get("udf3","")
            udf4 = decryptResponse.get("udf4","")
            udf5 = decryptResponse.get("udf5","")
            return_url = domain+"/api/mobile/payin_call_back_url"

            if not api_key and not orderId and not name and not phone and not email and not amount and not currency and not city and not state and not zip_code:
                data_status['result']="Required Fields are missing!!"
                return data_status

            # if float(amount)<100:
            #     data_status['result']="Amount should be greater than or equals to 100.00"
            #     return data_status

            check_transaction_limits = merchant_transaction_limit_settings("Payin",payInPaymentGatewayId,userId,amount)
            if check_transaction_limits.get("responseStatus") == 0:
                data_status['result']=check_transaction_limits.get("result")
                return data_status

            merchantUniqueNumber=str(merchant_queryset.merchantUniqueNumber)
            mid_extracted = merchantUniqueNumber[1:].lstrip("0")
            pgOrderId=transaction_id_prefix+str(mid_extracted)+str(orderId)
            # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+decryptResponse.get("order_id")
            if api_key == api_security_queryset.apiKey:

                check_order = WalletTransactions.objects(orderId=orderId,userId=str(userId)).first()
                if check_order:
                    data_status["result"]="This order id is already exisit!!"
                    return data_status

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

                currentDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
                routing_switch_counts_queryset = RoutingSwitchCounts.objects(userId=userId,transactionAPIId=payInPaymentGatewayId,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,"payin",transactionAPIId)

                apiType="api"
                if paymentGateWayCode == "AccurePay_PayIn":
                    get_api_key = ""
                    get_salt = ""
                    get_base_url = ""
                    for each_key in payin_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 Payin Code #########################################################################
                    paymentgatewayresponseDict = accure_payin_payment_intent(get_api_key,get_salt,get_base_url,name,phone,email,amount,pgOrderId,userId,currency,orderId,mode,address_line_1,address_line_2,city,state,country,zip_code,udf1,udf2,udf3,udf4,udf5,return_url,transactionAPIId,client_ip,note,apiType)
                    #################################################################################################################################################
                elif paymentGateWayCode == "WowPe_Payin":
                    get_client = ""
                    get_secret = ""
                    get_base_url = ""
                    for each_key in payin_gate_way_queryset.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "api_key":
                            get_client = each_key.get("value")
                        if get_key == "secret_key":
                            get_secret = each_key.get("value")
                        if get_key == "base_url":
                            get_base_url = each_key.get("value")
                    

                    ###################################################### Wowpe Payin Code #########################################################################
                    paymentgatewayresponseDict = wowpe_payin_payment_intent(get_client,get_secret,get_base_url,name,phone,email,amount,pgOrderId,userId,payInPaymentGatewayId,client_ip,note,apiType)
                    ################################################################################################################################################
                elif paymentGateWayCode == "Campuslinkpro_Payin":
                    print("((((((((((((((((((Campuslinkpro_Payin))))))))))))))))))")
                    get_base_url = ""
                    api_key = ""
                    secret_key = ""
                    graampay_check = ""
                    for each_key in payin_gate_way_queryset.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "get_base_url":
                            get_base_url = each_key.get("value")
                        if get_key == "api_key":
                            api_key = each_key.get("value")
                        if get_key == "secret_key":
                            secret_key = each_key.get("value")
                        if get_key == "graampay_check":
                            graampay_check = each_key.get("value")
                   
                    transactionType="SALE"
                    # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+"TPSL"+str(orderId)
                    # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+str(orderId)
                    ###################################################### Wowpe Payin Code #########################################################################
                    paymentgatewayresponseDict = create_campuslinkpro_payment_link(get_base_url,api_key,secret_key,graampay_check,pgOrderId,note,amount,currency,name,phone,email,payInPaymentGatewayId,client_ip,apiType,userId)
                    ###############################################################################################################################################

                elif paymentGateWayCode == "Fstac_Payin":
                    get_client = ""
                    get_secret = ""
                    get_base_url = ""
                    for each_key in payin_gate_way_queryset.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "api_key":
                            get_client = each_key.get("value")
                        if get_key == "secret_key":
                            get_secret = each_key.get("value")
                        if get_key == "base_url":
                            get_base_url = each_key.get("value")
                    

                    ###################################################### Fstac Payin Code ##################################################################################################
                    paymentgatewayresponseDict = fstac_payin_payment_intent(get_client,get_secret,get_base_url,name,phone,email,amount,pgOrderId,userId,payInPaymentGatewayId,client_ip,note,apiType)
                    ##########################################################################################################################################################################

                elif paymentGateWayCode == "Setu_Payin":
                    get_client = ""
                    get_secret = ""
                    get_base_url = ""
                    grant_type = ""
                    merchant_id = ""
                    get_auth_url = ""
                    merchantVpa = "jiocinema-uat@setuaxis"
                    for each_key in payin_gate_way_queryset.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "api_key":
                            get_client = each_key.get("value")
                        if get_key == "secret_key":
                            get_secret = each_key.get("value")
                        if get_key == "base_url":
                            get_base_url = each_key.get("value")
                        if get_key == "grant_type":
                            grant_type = each_key.get("value")
                        if get_key == "merchant_id":
                            merchant_id = each_key.get("value")
                        if get_key == "auth_url":
                            get_auth_url = each_key.get("value")

                    ###################################################### Setu Payin Code ##################################################################################################
                    paymentgatewayresponseDict = setu_payin_payment_sqr(get_client,get_secret,get_base_url,get_auth_url,grant_type,merchant_id,merchantVpa,note,orderId,amount,userId,payInPaymentGatewayId,client_ip,apiType)
                    ##########################################################################################################################################################################
                
                elif paymentGateWayCode == "Getepay_Payin":
                    mid = ""
                    get_base_url = ""
                    callback_url = ""
                    return_url=""
                    encryption_key = ""
                    encryption_iv = ""
                    terminalId = ""
                    vpa = ""
                    for each_key in payin_gate_way_queryset.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "mid":
                            mid = each_key.get("value")
                        if get_key == "get_base_url":
                            get_base_url = each_key.get("value")
                        if get_key == "callback_url":
                            callback_url = each_key.get("value")
                        if get_key == "return_url":
                            return_url = each_key.get("value")
                        if get_key == "encryption_key":
                            encryption_key = each_key.get("value")
                        if get_key == "encryption_iv":
                            encryption_iv = each_key.get("value")
                        if get_key == "terminalId":
                            terminalId = each_key.get("value")
                        if get_key == "vpa":
                            vpa = each_key.get("value")
                   
                    
                    # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+"TPSL"+str(orderId)
                    # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+str(orderId)
                    transactionType="single"
                    ###################################################### Wowpe Payin Code #########################################################################
                    paymentgatewayresponseDict = getepayintent(get_base_url,encryption_key,encryption_iv,mid, return_url, callback_url, terminalId,amount,email,name,phone,currency,pgOrderId,transactionType,payInPaymentGatewayId,client_ip,note,apiType,userId,vpa)

                else:
                    data_status["result"]="Please contact to admin to enable payin 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

                print("((((((((((paymentgatewayresponseDict))))))))))",paymentgatewayresponseDict)

                if paymentgatewayresponseDict.get("responseStatus") == 1:
                    wallet_transaction_table = WalletTransactions(
                        userId = userId,
                        amount = round(float(amount),2),
                        grandTotal=round(float(amount),2),
                        paymentGatewayId = payInPaymentGatewayId,
                        currency=currency,
                        paymentType = "UPI",
                        creditType = "Credit",
                        transactionId = "",
                        transactionData = paymentgatewayresponseDict.get("transactionData"),
                        orderId = orderId,
                        walletLog="",
                        userType="user",
                        createdBy = None,
                        createdOn = datetime.datetime.now(),
                        location = location,
                        platform = "api",
                        agent = agent,
                        customerEmail = email,
                        customerName = name,
                        customerPhonenumber = phone,
                        previousBalance=0,
                        currentBalance=0,
                        paymentLinkId = None,
                        PaymentButtonId = None,
                        paymentPageId = None,
                        errorMessage = "",
                        paymentChannel = paymentgatewayresponseDict.get("paymentChannel"),
                        bankRefId="",
                        cardmasked="",
                        pgOrderId=paymentgatewayresponseDict.get("pgOrderId"),
                        customerVpa="",
                        udf1=udf1,
                        udf2=udf2,
                        udf3=udf3,
                        udf4=udf4,
                        udf5=udf5,
                        clientIp=client_ip,
                        commissionCharges={},
                        qrPath=paymentgatewayresponseDict.get("qrPath",""),
                        qrIntent=paymentgatewayresponseDict.get("qrIntent",""),
                        statusCheckId=paymentgatewayresponseDict.get("payment_request_id"),
                        paymentLinkUrl=paymentgatewayresponseDict.get("upi_intent_url",""),
                        paymentAccessType="Intent",
                        status = 3
                        ).save()
                    save_table.update(reponseData=paymentgatewayresponseDict.get("transactionData"))
                    qrintent=paymentgatewayresponseDict.get("upi_intent_url")
                    if paymentgatewayresponseDict.get("qrIntent"):
                        qrintent=paymentgatewayresponseDict.get("qrIntent")
                    responseDict={
                    "order_id":orderId,
                    "payment_request_id":paymentgatewayresponseDict.get("payment_request_id"),
                    "upi_intent_url":qrintent.replace(" ", "%20")
                    }
                    # Old Code Below
                    # responseDict={
                    # "order_id":orderId,
                    # "payment_request_id":paymentgatewayresponseDict.get("payment_request_id"),
                    # "upi_intent_url":paymentgatewayresponseDict.get("upi_intent_url")
                    # }
                    data_status["responseStatus"]=1
                    data_status["result"]="Success"
                    data_status["responseBody"]=responseDict
                    save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())

                    # 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(amount)

                    #     routing_switch_counts_queryset.update(numberOfSuccess=updateSuccessCount,maxVolume=updateSuccessAmount)
                    # else:
                    #     save_routing_switch_table.update(numberOfSuccess=1,maxVolume=float(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"]="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 intent data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payin","intent","getintentpaymenturl",exceptionData,client_ip,"api")
        return data_status


@payin_apis.route("/getpayinpaymentstatus", methods=["POST"])
def getpayinpaymentstatus():
    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

    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]
        
    responseDict = {}
    payinPaymentstatusResponseDict = {}
    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

        api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payment_gateway",userId=str(merchant_queryset.id),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
        
        wallet_transactions_queryset = WalletTransactions.objects(orderId=order_id,userId=str(merchant_queryset.id)).first()
        if not wallet_transactions_queryset:
            data_status["result"]="Invalid Order Id"
            return data_status

        pgOrderId = str(wallet_transactions_queryset.pgOrderId)
        paymentMode = str(wallet_transactions_queryset.paymentType)
        payInPaymentGatewayId = str(wallet_transactions_queryset.paymentGatewayId.id)
        payin_gate_way_queryset = TransactionAPI.objects(id=str(payInPaymentGatewayId)).first()
        if not payin_gate_way_queryset:
            data_status["result"]="Invalid request found"
            return data_status
        paymentGateWayCode = payin_gate_way_queryset.code
        paramsList = payin_gate_way_queryset.paramsList

        ############################################## Slab Calculation for Payin #########################################################################
        payment_mode_queryset = PaymentMode.objects(paymentMode=paymentMode).first()
        paymentModeId = str(payment_mode_queryset.id)
        sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=paymentMode).first()
        subPaymentModeId = str(sub_payment_mode_queryset.id)
        patternId = str(merchant_queryset.patternId.id)

        ###################################################################################################################################################
        
        if paymentGateWayCode == "AccurePay_PayIn":
            get_api_key = ""
            get_salt = ""
            get_base_url=''
            for each_key in 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")
            
            ######################################################### Check Accurepay Payin Payment Status #############################################################
            payinPaymentstatusResponseDict = check_accurepay_payin_paymentstatus(get_api_key,get_salt,get_base_url,pgOrderId)
            ########################################################################################################################################################

        elif paymentGateWayCode == "WowPe_Payin":
            get_api_key = ""
            get_secret_key = ""
            get_base_url=''
            for each_key in paramsList:
                
                get_key = each_key.get("key")
                
                if get_key == "api_key":
                    get_api_key = each_key.get("value")
                    
                if get_key == "secret_key":
                    get_secret_key = each_key.get("value")

                if get_key == "base_url":
                    get_base_url = each_key.get("value")


            ######################################################### Check Wowpe Payin Payment Status #############################################################
            payinPaymentstatusResponseDict = check_wowpe_payin_paymentstatus(get_api_key,get_secret_key,get_base_url,pgOrderId)
            ########################################################################################################################################################

        elif paymentGateWayCode == "Fstac_Payin":
            get_api_key = ""
            get_secret_key = ""
            get_base_url=''
            for each_key in paramsList:
                
                get_key = each_key.get("key")
                
                if get_key == "api_key":
                    get_api_key = each_key.get("value")
                    
                if get_key == "secret_key":
                    get_secret_key = each_key.get("value")

                if get_key == "base_url":
                    get_base_url = each_key.get("value")


            ######################################################### Check Fstac Payin Payment Status #############################################################
            payinPaymentstatusResponseDict = check_fstac_payin_paymentstatus(get_api_key,get_secret_key,get_base_url,pgOrderId)
            ########################################################################################################################################################

        elif paymentGateWayCode == "Setu_Payin":
            get_client = ""
            get_secret = ""
            get_base_url = ""
            grant_type = ""
            merchant_id = ""
            get_auth_url = ""
            for each_key in payin_gate_way_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "api_key":
                    get_client = each_key.get("value")
                if get_key == "secret_key":
                    get_secret = each_key.get("value")
                if get_key == "base_url":
                    get_base_url = each_key.get("value")
                if get_key == "grant_type":
                    grant_type = each_key.get("value")
                if get_key == "merchant_id":
                    merchant_id = each_key.get("value")
                if get_key == "auth_url":
                    get_auth_url = each_key.get("value")

            ###################################################### Setu Payin Payment Status ##################################################################################################
            payinPaymentstatusResponseDict = check_setu_payin_paymentstatus(get_client,get_secret,get_base_url,get_auth_url,grant_type,merchant_id,payInPaymentGatewayId,client_ip,apiType,userId,pgOrderId)
            ##########################################################################################################################################################################
            
        elif paymentGateWayCode == "Campuslinkpro_Payin":
            print("((((((((((((((((((Campuslinkpro_Payin status CHECK))))))))))))))))))")
            get_base_url = ""
            api_key = ""
            secret_key = ""
            graampay_check = ""
            for each_key in payin_gate_way_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                if get_key == "api_key":
                    api_key = each_key.get("value")
                if get_key == "secret_key":
                    secret_key = each_key.get("value")
                if get_key == "graampay_check":
                    graampay_check = each_key.get("value")
           
            # transactionType="SALE"
            # # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+"TPSL"+str(orderId)
            # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+str(orderId)
            transactionDate = wallet_transactions_queryset.createdOn.strftime("%d-%m-%Y")
            ###################################################### Wowpe Payin Code #########################################################################
            payinPaymentstatusResponseDict = campuslinkpro_status(get_base_url,api_key,secret_key,pgOrderId,transactionDate,graampay_check)
            print(payinPaymentstatusResponseDict,"(((((((((((((payinPaymentstatusResponseDict)))))))))))))")
            ###############################################################################################################################################

        elif paymentGateWayCode == "Payu_Payin":
            get_api_key = ""
            get_secret_key = ""
            get_base_url = ""
            get_client = ""
            get_salt = ""

            for each_key in paramsList:
                
                get_key = each_key.get("key")
                
                if get_key == "api_key":
                    get_api_key = each_key.get("value")
                    
                if get_key == "secret_key":
                    get_secret_key = each_key.get("value")

                if get_key == "base_url":
                    get_base_url = each_key.get("value")

                if get_key == "client_id":
                    get_client = each_key.get("value")

                if get_key == "salt":
                    get_salt = each_key.get("value")


            print(get_api_key,"get_api_key1")
            print(get_secret_key,"get_secret_key1")
            print(get_base_url,"get_base_url1")
            print(get_client,"get_client1")
            print(get_salt,"get_salt1")
            ######################################################### Check PayU Payin Payment Status #############################################################
            payinPaymentstatusResponseDict = check_payu_payin_paymentstatus(get_api_key,get_salt,get_base_url,pgOrderId)
            ########################################################################################################################################################

        elif paymentGateWayCode == "Lyra_Payin":
            user_name = ""
            get_base_url = ""
            password = ""

            for each_key in paramsList:
                
                get_key = each_key.get("key")
                
                get_key = each_key.get("key")
                if get_key == "base_url":
                    get_base_url = each_key.get("value")
                if get_key == "user_name":
                    user_name = each_key.get("value")
                if get_key == "password":
                    password = each_key.get("value")
            ######################################################### Check Lyra Payin Payment Status #############################################################
            payinPaymentstatusResponseDict = check_lyra_payin_paymentstatus(get_base_url,str(wallet_transactions_queryset.transactionId),user_name,password)
            print(payinPaymentstatusResponseDict,"(((((((((payinPaymentstatusResponseDict)))))))))")
            ########################################################################################################################################################

        elif paymentGateWayCode == "Getepay_Payin":
            mid = ""
            get_base_url = ""
            callback_url = ""
            return_url=""
            encryption_key = ""
            encryption_iv = ""
            terminalId = ""
            vpa = ""
            for each_key in paramsList:
                get_key = each_key.get("key")
                if get_key == "mid":
                    mid = each_key.get("value")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                if get_key == "callback_url":
                    callback_url = each_key.get("value")
                if get_key == "return_url":
                    return_url = each_key.get("value")
                if get_key == "encryption_key":
                    encryption_key = each_key.get("value")
                if get_key == "encryption_iv":
                    encryption_iv = each_key.get("value")
                if get_key == "terminalId":
                    terminalId = each_key.get("value")
                if get_key == "vpa":
                    vpa = each_key.get("value")
           
            print(mid, str(wallet_transactions_queryset.transactionId), terminalId,"((((((((((((((((((((((KEYS FOR GETEPAY))))))))))))))))))))))")
            # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+"TPSL"+str(orderId)
            # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+str(orderId)
            transactionType="single"
            ###################################################################### Get Payin Code ############################################################################
            payinPaymentstatusResponseDict = getepay_status_check(mid, str(wallet_transactions_queryset.statusCheckId), terminalId, encryption_key, encryption_iv, get_base_url)
            ##################################################################################################################################################################
            print(payinPaymentstatusResponseDict,"((((((((((((((((((payinPaymentstatusResponseDict in get epayin))))))))))))))))))")

        elif paymentGateWayCode == "Worldline_Payin":
            get_base_url = ""
            callback_url = ""
            api_key = ""
            secret_key = ""
            merchantIdentifier = ""
            api_encryption_key = ""
            requestType = ""
            transactionType = ""
            encryption_iv = ""
            graampay_check = ""
            for each_key in paramsList:
                get_key = each_key.get("key")
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                if get_key == "merchantIdentifier":
                    merchantIdentifier = each_key.get("value")
                if get_key == "callback_url":
                    callback_url = each_key.get("value")
                if get_key == "encryption_key":
                    api_encryption_key = each_key.get("value")
                if get_key == "encryption_iv":
                    encryption_iv = each_key.get("value")
                if get_key == "transactionType":
                    transactionType = each_key.get("value")
                if get_key == "requestType":
                    requestType = each_key.get("value")
        
            print(mid, str(wallet_transactions_queryset.transactionId),"((((((((((((((((((((((KEYS FOR world))))))))))))))))))))))")
            # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+"TPSL"+str(orderId)
            # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+str(orderId)
            ###################################################################### Get Payin Code ############################################################################
            payinPaymentstatusResponseDict = worldline_status_check(wallet_transactions_queryset.statusCheckId, txnDate, merchantIdentifier, api_encryption_key, encryption_iv, get_base_url)
            ##################################################################################################################################################################
            print(payinPaymentstatusResponseDict,"((((((((((((((((((payinPaymentstatusResponseDict in get epayin))))))))))))))))))")

        else:
            data_status["result"]="Please contact to admin to enable payin option!!"
            return data_status

        if payinPaymentstatusResponseDict.get("responseStatus") == 1:
            if payinPaymentstatusResponseDict.get("bankRefNo"):
                bank_reference_number = payinPaymentstatusResponseDict.get("bankRefNo")
            else:
                bank_reference_number = wallet_transactions_queryset.bankRefId

            if payinPaymentstatusResponseDict.get("paymentStatus") == 1:
                order_queryset = WalletTransactions.objects(orderId=order_id).first()
                amount=float(order_queryset.amount)
                transactionAmount = float(order_queryset.amount)
                errorMessage=""
                if (float(payinPaymentstatusResponseDict.get("orderAmount")) >= float(amount)) and order_queryset.status!=6:
                    amountstatus = 1
                    errorMessage = "Success"
                else:
                    amountstatus = 6
                    errorMessage = "Insufficient amount credited!!"
                
                if order_queryset.status!=1 and amountstatus==1:
                    commissionCharges = slab_calculation_for_payin(amount,paymentModeId,subPaymentModeId,patternId,payInPaymentGatewayId)
                    if commissionCharges.get("transactionAmount"):
                        transactionAmount=commissionCharges.get("transactionAmount")
                    else:
                        transactionAmount=transactionAmount

                    pgOrderId = str(order_queryset.pgOrderId)
                    payInPaymentGatewayId = str(order_queryset.paymentGatewayId.id)
                    
                    transaction_id=str(order_queryset.transactionId)

                    balanceResult=user_payin_balance_update(str(order_queryset.userId.id),float(transactionAmount),"Credit",str(payInPaymentGatewayId))
                    if balanceResult.get('responseStatus')==0:
                        data_status["result"]="Unable to connect with server. Please Try again."
                        return data_status
                        
                    payinbalancelogs_queryset=PayinBalanceLogs(
                        transactionAPIId=str(payInPaymentGatewayId),
                        userId=str(order_queryset.userId.id),
                        previousBalance=round(float(balanceResult.get('transactionPreviousBalance')),2),
                        currentBalance=round(float(balanceResult.get('transactionCurrentBalance')),2),
                        orderId=order_queryset.orderId,
                        amount=round(float(amount),2),
                        grandTotal=round(float(transactionAmount),2),
                        transferType="Credit",
                        userType="user",
                        transactionId=transaction_id,
                        createdOn=datetime.datetime.now(),
                        status=1
                        ).save()

                    order_queryset.update(
                        status=1,payInResponseCallBackData=payinPaymentstatusResponseDict.get("transactionData"),
                        responseCallBackTime=datetime.datetime.now(),
                        transactionId=transaction_id,bankRefId=bank_reference_number,errorMessage=payinPaymentstatusResponseDict.get("message"),grandTotal=round_last_digits(float(transactionAmount)),walletLog="Wallet Balance is added with the amount of " + str(amount) + ".",previousBalance=round_last_digits(float(balanceResult.get('userPreviousBalance'))),currentBalance=round_last_digits(float(balanceResult.get('userCurrentBalance'))),commissionCharges=commissionCharges,pgOrderId=str(payinPaymentstatusResponseDict.get('pgOrderId')),customerVpa=str(payinPaymentstatusResponseDict.get('customerVpa')),currency=str(payinPaymentstatusResponseDict.get('currency')),cardmasked=str(payinPaymentstatusResponseDict.get('cardmasked')),paymentType=paymentMode)
                else:
                    order_queryset.update(status=amountstatus,payInResponseCallBackData=payinPaymentstatusResponseDict.get("transactionData"),responseCallBackTime=datetime.datetime.now(),transactionId=order_queryset.transactionId,bankRefId=bank_reference_number,currency=payinPaymentstatusResponseDict.get("currency"),grandTotal=round_last_digits(float(transactionAmount)),walletLog="Wallet Balance is added with the amount of " + str(amount) + ".",pgOrderId=str(payinPaymentstatusResponseDict.get('pgOrderId')),customerVpa=str(payinPaymentstatusResponseDict.get('customerVpa')),errorMessage=errorMessage,cardmasked=str(payinPaymentstatusResponseDict.get('cardmasked')))

            elif payinPaymentstatusResponseDict.get("paymentStatus")==0 or payinPaymentstatusResponseDict.get("paymentStatus")==4:
                order_queryset = WalletTransactions.objects(orderId=order_id).first()
                amount=float(order_queryset.amount)
                if order_queryset.status==1:
                    amount=float(order_queryset.amount)
                    transactionAmount = float(order_queryset.grandTotal)
                    transaction_id=order_queryset.transactionId
                    
                    balanceResult=user_payin_balance_update(str(order_queryset.userId.id),float(order_queryset.grandTotal),"Debit",str(payInPaymentGatewayId))
                    if balanceResult.get('responseStatus')==0:
                        data_status["result"]="Unable to connect with server. Please Try again."
                        return data_status
                        
                    payinbalancelogs_queryset=PayinBalanceLogs(
                        transactionAPIId=str(payInPaymentGatewayId),
                        userId=str(order_queryset.userId.id),
                        previousBalance=float(balanceResult.get('transactionPreviousBalance')),
                        currentBalance=float(balanceResult.get('transactionCurrentBalance')),
                        orderId=order_queryset.orderId,
                        amount=round_last_digits(float(amount)),
                        grandTotal=round_last_digits(float(order_queryset.grandTotal)),
                        transferType="Debit",
                        userType="user",
                        transactionId=transaction_id,
                        createdOn=datetime.datetime.now(),
                        status=1
                        ).save()

                    rorderId = random_digit_generate(16)
                    wallet_transaction_table = WalletTransactions(
                        userId = str(order_queryset.userId.id),
                        amount = round_last_digits(float(order_queryset.amount)),
                        grandTotal=round_last_digits(float(order_queryset.grandTotal)),
                        paymentGatewayId = str(payInPaymentGatewayId),
                        currency=order_queryset.currency,
                        paymentType = order_queryset.paymentType,
                        creditType = "Debit",
                        transactionId = transaction_id,
                        transactionData = payinPaymentstatusResponseDict.get("transactionData"),
                        orderId = str(rorderId),
                        walletLog="Wallet Balance is refunded with the amount of " + str(order_queryset.amount) + ".",
                        userType="user",
                        createdBy = None,
                        createdOn = datetime.datetime.now(),
                        location = "",
                        platform = "api",
                        agent = "",
                        customerEmail = order_queryset.customerEmail,
                        customerName = order_queryset.customerName,
                        customerPhonenumber = order_queryset.customerPhonenumber,
                        previousBalance=round_last_digits(float(balanceResult.get('userPreviousBalance'))),
                        currentBalance=round_last_digits(float(balanceResult.get('userCurrentBalance'))),
                        paymentLinkId = None,
                        PaymentButtonId = None,
                        paymentPageId = None,
                        errorMessage = "Refunded",
                        paymentChannel = "Wowpe",
                        bankRefId=order_queryset.bankRefId,
                        cardmasked="",
                        pgOrderId=order_queryset.orderId,
                        slabId=str(order_queryset.slabId.id),
                        walletTransactionId=str(order_queryset.id),
                        commissionCharges=order_queryset.commissionCharges,
                        customerVpa="",
                        clientIp=client_ip,
                        status = 5
                        ).save()

                    order_queryset.update(status=payinPaymentstatusResponseDict.get("paymentStatus"),payInResponseCallBackData=payinPaymentstatusResponseDict.get("transactionData"),responseCallBackTime=datetime.datetime.now(),transactionId=wallet_transactions_queryset.transactionId,bankRefId=bank_reference_number,currency=payinPaymentstatusResponseDict.get("currency"),errorMessage=payinPaymentstatusResponseDict.get("message"),walletLog="Wallet Balance is added with the amount of " + str(amount) + ".")
                else:
                    order_queryset.update(status=payinPaymentstatusResponseDict.get("paymentStatus"),payInResponseCallBackData=payinPaymentstatusResponseDict.get("transactionData"),responseCallBackTime=datetime.datetime.now(),transactionId=order_queryset.transactionId,bankRefId=bank_reference_number,currency=payinPaymentstatusResponseDict.get("currency"),errorMessage=payinPaymentstatusResponseDict.get("message"),walletLog="Wallet Balance is added with the amount of " + str(amount) + ".")

            responseDict={
            'order_id':order_id,
            'amount':float(wallet_transactions_queryset.amount),
            'message':payinPaymentstatusResponseDict.get("message"),
            'payment_mode':payinPaymentstatusResponseDict.get("payment_mode"),
            'response_code':payinPaymentstatusResponseDict.get("response_code"),
            'transaction_id':wallet_transactions_queryset.transactionId,
            "bank_reference_number":bank_reference_number,
            "status":payinPaymentstatusResponseDict.get("status")
            }
            data_status["responseStatus"]=1
            data_status['result']=responseDict
            return data_status
        else:
            responseDict={
            "order_id":order_id,
            "status":"failed",
            "message":payinPaymentstatusResponseDict.get("message")
            }
            data_status["result"]=responseDict
            return data_status

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



sample_nonseamless_payment_data = {
    "api_key": "66c43d14b131cbb3c5aba543-8bf0a73fda352bcc0da5509ae4372bd7",
    "paymentChannel": "Online",
    "agent": "Payments",
    "location": "Hyderabad",
    "amount": "1",
    "productName": "Bill Payment",
    "paymentMode": "DEBIT CARD",
    # "transactionApiId": "679ca51f6bb5f25c20573b39",
    "subPaymentMode": "Visa",
    "issuingBank": "icici bank",
    "email": "saikerla@viyonafintech.com",
    "firstname": "sai",
    "mobileNumber": "8459569890",
    "ccnum": "4017042027025480",
    "ccname": "Mishra",
    "ccvv": "846",
    "ccexpmon": "02",
    "ccexpyr": "31",
    "vpa": "user@upi",
    "bankId": "67a0b814065706eba64ce569",
    "cardType": "VISA"
    }

@payin_apis.route("/nonseamlesspaymentintentlink",methods=["POST"])
def nonseamlesspaymentintentlink():
    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","")

    location = ""
    agent = "api"
    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

    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]

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

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

    # Here Create Client Logs Table
    save_client_table = save_client_logs_data(userId,"payin","intent","paymentintentlink",None,requestData,client_ip,"api")

    try:
        if encryption_data and iv and merchant_id and api_key:
            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

            # try:
            #   if not (merchant_queryset.patternId.payinPaymentGatewaysList != []) or not (merchant_queryset.patternId.payinEnable == False):
            #       data_status["result"]="Payin option is disabled please contact to admin!!"
            #       return data_status
            # except Exception as e:
            #   app.logger.error(traceback.format_exc())
            #   data_status["result"]="Payin option is disabled please contact to admin!!"
            #   return data_status

            api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payment_gateway",userId=str(merchant_queryset.id),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)
                print(jsonData,"JSON DATA")
                decryptResponse = json.loads(jsonData)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                data_status["result"]="Invalid encryption data!!"
                return data_status
            
            graampay_check = decryptResponse.get("graampay_check")
            payinPaymentGatewaysList = [str(each_payout_pg.id) for each_payout_pg in merchant_queryset.patternId.payinPaymentGatewaysList]

            print("(((((((payinPaymentGatewaysList)))))))",payinPaymentGatewaysList)
            print("(((((((graampay_check)))))))",graampay_check)

            payin_gate_way_queryset = TransactionAPI.objects(id__in=payinPaymentGatewaysList,status=1).first()
            if not payin_gate_way_queryset:
                data_status["result"]="Payin option is disabled please contact to admin!!!!!!!!!"
                return data_status

            payinPaymentGatewayId = str(payin_gate_way_queryset.id)

            # requestData=[decryptResponse]
            userId = str(merchant_queryset.id)

            # Here Update some data in Client Logs Table
            save_client_table.update(userId=ObjectId(userId),transactionAPIId=ObjectId(payinPaymentGatewayId))
            
            paymentGateWayCode = payin_gate_way_queryset.code

            setlementId =""
            paymentChannel =""

            api_key = decryptResponse.get("api_key","")
            location = decryptResponse.get("location","")
            
            amount = decryptResponse.get("amount","")
            paymentMode = decryptResponse.get("paymentMode","")
            subPaymentMode = decryptResponse.get("subPaymentMode","")
            issuingBank = decryptResponse.get("issuingBank","")
            # productinfo = productName
            ccnum = decryptResponse.get("ccnum","")
            ccname = decryptResponse.get("ccname","")
            ccvv = decryptResponse.get("ccvv","")
            ccexpmon = decryptResponse.get("ccexpmon","")
            ccexpyr = decryptResponse.get("ccexpyr","")
            vpa = decryptResponse.get("vpa","")
            bankId = decryptResponse.get("bankId","")
            cardType=decryptResponse.get("cardType","")
            bankCode=""
            bankName=""

            if api_key == api_security_queryset.apiKey:
                if not userId and not amount and not paymentMode and not api_key: # and not firstname and not email and not phone
                    data_status["result"]="Required fields are missing!!"
                    return data_status
                
                if amount is None:
                    amount = 0
                else:
                    amount = float(amount)

                if amount < 0:
                    data_status["result"]="Insufficient amount!!"
                    return data_status

                # if not api_key and not orderId and not name and not phone and not email and not amount and not currency:
                #     data_status['result']="Required Fields are missing!!"
                #     return data_status

                # if float(amount)<100:
                #     data_status['result']="Amount should be greater than or equals to 100.00"
                #     return data_status

                # check_transaction_limits = merchant_transaction_limit_settings("Payin",payinPaymentGatewayId,userId,amount)
                # if check_transaction_limits.get("responseStatus") == 0:
                #   data_status['result']=check_transaction_limits.get("result")
                #   return data_status

                if paymentMode == "NET BANKING":
                    if not bankId:
                        data_status["result"] = "Required fields are missing!!"
                        return data_status
                    master_bank_queryset = BankCodes.objects(bankId=str(bankId),transactionApiIdsList__in=[str(payinPaymentGatewayId)]).first()
                    if not master_bank_queryset:
                        data_status["result"] = "Required fields are missing!!"
                        return data_status
                    if master_bank_queryset:
                        bankCode=master_bank_queryset.bankCode
                        bankName=master_bank_queryset.bankId.bankName
                elif paymentMode == "UPI":
                    if not vpa:
                        data_status["result"] = "Required fields are missing!!"
                        return data_status
                else:
                    bankName=issuingBank
                    if not ccnum and not ccname and not ccvv and not ccexpmon and not ccexpyr:
                        data_status["result"]="Required fields are missing!!"
                        return data_status

                merchant_queryset = Users.objects(id=str(userId),status=1).first()
                if not merchant_queryset:
                    data_status["result"]="Invalid Request."
                    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

                random_customer_qry = RandomCcCustomers.objects.aggregate([{ "$sample": { "size": 1 } }])  # Get a random record
                random_doc=list(random_customer_qry)
                if random_doc: 
                    random_customer=random_doc[0]
                    firstname=random_customer.get("customerName")
                    email=random_customer.get("customerEmail")
                    phone=random_customer.get("customerPhoneNumber")
                else:
                    firstname=str(merchant_queryset.fullName)
                    email=str(merchant_queryset.email)
                    phone=str(merchant_queryset.phoneNumber)

                product_queryset=Products.objects(payinPaymentGatewayId=str(payinPaymentGatewayId),startingPrice__lte=amount,endingPrice__gte=amount).first()
                if product_queryset:
                    productName=product_queryset.productName
                else:
                    productName="Bill Payment"

                errorMessage="Initiated"
                # paymentMode=""
                customerVpa=""
                # cardType=""
                cardmasked=""
                patternId = str(merchant_queryset.patternId.id)
                slabId = None
                transactionAmount = amount
                commissionCharges={}
                orderId = str(get_epoch_milli_time())+random_digit_generate(2)
                transactionId = random_digit_generate(15)
                walletId=""
                productDetails={}
                paymentDetailsEncrypted=''
                if paymentMode=="CREDIT CARD" or paymentMode=="DEBIT CARD":
                    productDetails={
                    "cardNum":ccnum,
                    "cardCvv" :ccvv,
                    "cardExpMonth":ccexpmon,
                    "cardExpYear":ccexpyr
                    }
                    paymentDetailsEncrypted=combined_encrypt(json.dumps(productDetails),encSecretKey)

                    paymentDetailsDecrypted = combined_decrypt(paymentDetailsEncrypted, encSecretKey)

                    print(paymentDetailsDecrypted,"(((((((((((((((((paymentDetailsDecrypted in payu response)))))))))))))))))")

                transactionData={
                "userId":userId,
                "paymentChannel":paymentChannel,
                "agent":agent,
                "location":location,
                "amount":amount,
                "productName":productName,
                "setlementId":setlementId,
                "paymentMode":paymentMode,
                "transactionApiId":payinPaymentGatewayId,
                "subPaymentMode":subPaymentMode,
                "issuingBank":issuingBank,
                "email":email,
                "firstname":firstname,
                "phone":phone,
                "vpa":vpa,
                "bankId":bankId,
                "cardType":cardType,
                "paymentDetailsEncrypted":paymentDetailsEncrypted
                }

                merchantUniqueNumber=str(merchant_queryset.merchantUniqueNumber)
                mid_extracted = merchantUniqueNumber[1:].lstrip("0")
                pgOrderId=transaction_id_prefix+str(mid_extracted)+str(orderId)
                # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+decryptResponse.get("order_id")
            
                check_order = WalletTransactions.objects(orderId=orderId,userId=str(userId)).first()
                if check_order:
                    data_status["result"]="This order id is already exisit!!"
                    return data_status

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

                currentDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
                routing_switch_counts_queryset = RoutingSwitchCounts.objects(userId=userId,transactionAPIId=payinPaymentGatewayId,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,"payin",transactionAPIId)


                product_queryset=Products.objects(payinPaymentGatewayId=str(payinPaymentGatewayId),startingPrice__lte=amount,endingPrice__gte=amount).first()
                if product_queryset:
                    productName=product_queryset.productName
                else:
                    productName="Bill Payment"

                wallet_transaction_table = WalletTransactions(
                    userId = userId,
                    amount = round_last_digits(float(amount)),
                    grandTotal=round_last_digits(float(transactionAmount)),
                    paymentGatewayId = payinPaymentGatewayId,
                    currency="INR",
                    paymentType = paymentMode,
                    subPaymentMode = subPaymentMode,
                    creditType = "Credit",
                    patternId=patternId,
                    transactionId = transactionId,
                    transactionData = [transactionData],
                    orderId = orderId,
                    walletLog="",
                    userType="user",
                    createdBy = None,
                    createdOn = datetime.datetime.now(),
                    location = location,
                    platform = "app",
                    agent = agent,
                    customerEmail = email,
                    customerName = firstname,
                    customerPhonenumber = phone,
                    previousBalance=0,
                    currentBalance=0,
                    paymentLinkId = None,
                    PaymentButtonId = None,
                    paymentPageId = None,
                    errorMessage = errorMessage,
                    paymentChannel = paymentChannel,
                    bankRefId="",
                    cardmasked=cardmasked,
                    productName=productName,
                    setlementId=setlementId,
                    pgOrderId=pgOrderId,
                    statusCheckId=pgOrderId,
                    customerVpa=vpa,
                    commissionCharges=commissionCharges,
                    settlementStatus = 1,
                    status = 3,
                    paymentDetails=paymentDetailsEncrypted,
                    comment = productName,
                    bankCode=bankCode,
                    bankName=bankName,
                    cardType=cardType
                    )
                wallet_save=wallet_transaction_table.save()
                walletId=str(wallet_save.id)
                upi_intent_url=""
                currency="INR"
                client_ip="125.40.25.126"
                print("(((paymentGateWayCode)))",paymentGateWayCode )
                if walletId:
                    apiType="api"
                    if paymentGateWayCode == "Payu_Payin":
                        upi_intent_url=domain+"api/v1/dynamic_payment/"+str(walletId)
                        data_status["responseStatus"]=1
                        data_status["transactionId"]=orderId
                        data_status["walletId"]=walletId
                        data_status["paymentLink"]=upi_intent_url
                        data_status["gatewayType"]=paymentGateWayCode
                        data_status["result"]="Payin response data saved successfully!"
                        return data_status

                    else:
                        data_status["result"]="Please contact to admin to enable payin 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["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"]="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 intent data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payin","intent","getintentpaymenturl",exceptionData,client_ip,"api")
        return data_status


@payin_apis.route("/dynamic_payment/<walletId>",methods=["GET"])
def dynamic_payment(walletId):
    data_status = {"responseStatus": 0, "result": ""}
    
    # walletId = request.json.get("walletId")
    if not walletId:
        data_status["result"] = "Required fields are missing!!"
    
    try:
        wallet_query_set = WalletTransactions.objects(id=walletId,status__in=[3]).first()
        if wallet_query_set:
            paymentGatewayId = wallet_query_set.paymentGatewayId
            if paymentGatewayId.code == "Payu_Payin":
                key = ""
                salt = ""
                get_base_url = ""
                surl = ""
                furl = ""
                for each_key in paymentGatewayId.paramsList:
                    get_key = each_key.get("key")
                    if get_key == "api_key":
                        key = each_key.get("value")
                    if get_key == "salt":
                        salt = each_key.get("value")
                    if get_key == "dynamic_base_url":
                        get_base_url = each_key.get("value")
                    if get_key == "surl":
                        surl = each_key.get("value")
                    if get_key == "furl":
                        furl = each_key.get("value")

            txnid = wallet_query_set.pgOrderId
            paymentMode = wallet_query_set.paymentType
            productinfo =  wallet_query_set.productName
            amount = wallet_query_set.amount
            email = wallet_query_set.customerEmail
            firstname = wallet_query_set.customerName
            phone = wallet_query_set.customerPhonenumber

            
            vpa=""
            ccnum=""
            ccname=""
            ccvv=""
            ccexpmon=""
            ccexpyr=""
            bankCode=""
            cardType=""
            if paymentMode=="UPI":
                vpa =  wallet_query_set.customerVpa
            elif paymentMode=="NET BANKING":
                bankCode = wallet_query_set.bankCode
            else:
                paymentDetailsEncrypted = wallet_query_set.paymentDetails
                if paymentDetailsEncrypted!="":
                    paymentDetails=combined_decrypt(paymentDetailsEncrypted,encSecretKey)
                    paymentDetails=json.loads(paymentDetails)
                    ccnum = paymentDetails.get("cardNum")
                    ccname = paymentDetails.get("customerName")
                    ccvv = paymentDetails.get("cardCvv")
                    ccexpmon = paymentDetails.get("cardExpMonth")
                    ccexpyr = paymentDetails.get("cardExpYear")
                    cardType = paymentDetails.get("cardType")

            testresponse =dynamic_payment_link(paymentMode=paymentMode, get_salt=salt,get_base_url=get_base_url, key= key, txnid=txnid, productinfo=productinfo,amount=amount,email=email,firstname=firstname,surl=surl,furl=furl, phone=phone,ccnum=ccnum,ccname=ccname, ccvv=ccvv, ccexpmon=ccexpmon, ccexpyr=ccexpyr, vpa=vpa, bankCode=bankCode, card_type=cardType)
            return testresponse
        else:
            data_status["result"] = "Invalid transaction Id"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "unable to test payu payment"
        return data_status

def dynamic_payment_link(paymentMode ,get_salt,get_base_url, key,txnid,productinfo,amount,email,firstname, surl, furl, phone,ccnum="",ccname="", ccvv="", ccexpmon="", ccexpyr="", vpa="",bankCode="",card_type="",lastname=""):
    data_status = {"responseStatus": 0, "result": ""}
    bankKycResponseStatusDict={}
    
    if not key and not txnid and not productinfo and not amount and not email and not firstname  and not surl and not furl and not phone :
        data_status["result"] = "Required fields are missing!!"
        return data_status
    requestDataDict = {
        "paymentMode": paymentMode,
        "get_base_url": get_base_url,
        "key": key,
        "txnid": txnid,
        "productinfo": productinfo,
        "amount": amount,
        "email": email,
        "firstname": firstname,
        "lastname": "",
        "surl": surl,
        "furl": furl,
        "phone": phone,
        }               
    hash_value = PayuSha512HashParams(requestDataDict, get_salt)

    requestDataDict.update({"hash_value": hash_value})
    try:
        print("(((((paymentmode)))))",paymentMode.lower(),paymentMode.lower() == "credit card")
        print({"paymentMode": paymentMode,"get_salt": get_salt,"get_base_url": get_base_url,"key": key,"txnid": txnid,"productinfo": productinfo,"amount": amount,"email": email,"firstname": firstname,"lastname": lastname,"surl": surl,"furl": furl,"phone": phone,"ccnum": ccnum,"ccname": ccname,"ccvv": ccvv,"ccexpmon": ccexpmon,"ccexpyr": ccexpyr,"vpa": vpa,"bankcode": bankCode})
        if paymentMode.lower() == "credit card":
            print("(((((paymentmodssssssssssssssssssssssssse)))))",paymentMode.lower())
            if not ccnum and not ccname and not ccvv and not ccexpmon and not ccexpyr :
                data_status["result"] = "Required fields are missing for card!!"
                return data_status
            
            enforce_paymethod="creditcard"
            requestDataDict.update({
                "ccnum": ccnum,
                "ccname": ccname,
                "ccvv": ccvv,
                "ccexpmon": ccexpmon,
                "ccexpyr": ccexpyr,
                "pg": "CC",
                "bankcode": card_type
            })
        elif paymentMode.lower() == "debit card":
            if not ccnum and not ccname and not ccvv and not ccexpmon and not ccexpyr :
                data_status["result"] = "Required fields are missing for card!!"
                return data_status

            enforce_paymethod="debitcard"
            requestDataDict.update({
                "ccnum": ccnum,
                "ccname": ccname,
                "ccvv": ccvv,
                "ccexpmon": ccexpmon,
                "ccexpyr": ccexpyr,
                "pg": "DC",
                "bankcode": card_type
            })

        elif paymentMode.lower() == "upi":
            if not vpa:
                data_status["result"] = "Required fields are missing for UPI!!"
                return data_status
            enforce_paymethod="UPI"
            requestDataDict.update({"pg": "UPI","bankcode": "UPI"})

        elif paymentMode.lower() == "net banking":
            if not bankCode:
                data_status["result"] = "Required fields are missing for Net Banking!!"
                return data_status
            enforce_paymethod="netbanking"
            requestDataDict.update({"pg": "NB","bankcode": bankCode})
        else:
            app.logger.error("Invalid Payment Mode Type ")
            data_status["result"] = "Invalid Payment Mode Type !!"
            return data_status
        
        requestDataDict.update({"enforce_paymethod": enforce_paymethod})

        return render_template("frontend/payupaymenttemplate.html",
        requestDataDict=requestDataDict)
        
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to verify bank detailss!!"
        return data_status


sample_static_cardbin_check_data = {
    "api_key":"66c43d14b131cbb3c5aba543-8bf0a73fda352bcc0da5509ae4372bd7",
    "cardNumber":"414752",
}


@payin_apis.route("/cardbincheck",methods=["POST"])
def cardbincheck():
    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","")

    location = ""
    agent = "api"
    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

    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]

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

    print(encryption_data,"encryption_data")
    print(iv,"iv")

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

    # Here Create Client Logs Table
    save_client_table = save_client_logs_data(userId,"payin","intent","cardbincheck",None,requestData,client_ip,"api")

    try:
        if encryption_data and iv and merchant_id and api_key:
            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

            try:
                if not (merchant_queryset.patternId.payinPaymentGatewaysList != []) or (merchant_queryset.patternId.payinEnable == False):
                    data_status["result"]="Payin option is disabled please contact to admin!!"
                    return data_status
            except Exception as e:
                app.logger.error(traceback.format_exc())
                data_status["result"]="Payin option is disabled please contact to admin!!"
                return data_status

            api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payment_gateway",userId=str(merchant_queryset.id),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)
                print(jsonData,"JSON DATA")
                decryptResponse = json.loads(jsonData)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                data_status["result"]="Invalid encryption data!!"
                return data_status
            
            # graampay_check = decryptResponse.get("graampay_check")
            payinPaymentGatewaysList = [str(each_payout_pg.id) for each_payout_pg in merchant_queryset.patternId.payinPaymentGatewaysList]

            print("(((((((payinPaymentGatewaysList)))))))",payinPaymentGatewaysList)
            # print("(((((((graampay_check)))))))",graampay_check)

            payin_gate_way_queryset = TransactionAPI.objects(id__in=payinPaymentGatewaysList,status=1).first()
            if not payin_gate_way_queryset:
                data_status["result"]="Payin option is disabled please contact to admin!!"
                return data_status

            transactionAPIId = str(payin_gate_way_queryset.id)

            # requestData=[decryptResponse]
            userId = str(merchant_queryset.id)

            # Here Update some data in Client Logs Table
            save_client_table.update(userId=ObjectId(userId),transactionAPIId=ObjectId(transactionAPIId))
        
            payInPaymentGatewayId = str(payin_gate_way_queryset.id)
            
            paymentGateWayCode = payin_gate_way_queryset.code

            api_key = decryptResponse.get("api_key")
            cardNumber = decryptResponse.get("cardNumber")

            if not api_key and not cardNumber:
                data_status['result']="Required Fields are missing!!"
                return data_status

            if len(cardNumber) < 6:
                data_status["result"] = "Please enter minimum 6 digits for the card number!"
                return data_status

            if api_key == api_security_queryset.apiKey:

                cardBinCheckResponse = card_bin_check(cardNumber)

                if cardBinCheckResponse.get("responseStatus") == 1:
                    responseDict  = {}
                    responseDict = {
                    "isDomestic":cardBinCheckResponse.get("data").get("isDomestic"),
                    "additonalCardType":cardBinCheckResponse.get("data").get("additonalCardType"),
                    "cardCategory":cardBinCheckResponse.get("data").get("cardCategory"),
                    "issuingBank":cardBinCheckResponse.get("data").get("issuingBank"),
                    "cardType":cardBinCheckResponse.get("data").get("cardType")
                    }
                    data_status["responseStatus"]=1
                    data_status["result"]="Success"
                    data_status["responseBody"]=responseDict
                    save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
                    return data_status
                else:
                    data_status["result"]=cardBinCheckResponse.get("result")
                    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 verify card bin check data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payin","intent","cardbincheck",exceptionData,client_ip,"api")
        return data_status


sample_static_get_banks_data = {
    "api_key":"66c43d14b131cbb3c5aba543-8bf0a73fda352bcc0da5509ae4372bd7",
    "merchant_id": "M000000001"
}

@payin_apis.route("/getBanksList",methods=["POST"])
def getBanksList():
    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","")

    bankCodesList = []

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

    # print(encryption_data,"(((((((((encryption_data)))))))))")
    # print(iv,"(((((((((encryption_data)))))))))")

    # 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

    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]

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

    # Here Create Client Logs Table
    save_client_table = save_client_logs_data(userId,"ekyc","bankcodeslist","bankcodeslist",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
            print("(((( before tryyyy kyc chgck)))))")

            userId = str(merchant_queryset.id)
            api_security_queryset = ApiSecurities.objects(apiKey=api_key,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)
                print("decryptResponse",decryptResponse)
            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))
          

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

            api_key = decryptResponse.get("api_key")
            req_merchant_id=decryptResponse.get("merchant_id")

            if not api_key or not req_merchant_id :
                data_status['result']="Required Fields are missing!!"
                return data_status

            if api_key == api_security_queryset.apiKey:

                master_ifsc_queryset = MasterIFSCBank.objects(status=1).order_by("bankName")

                for each_bank in master_ifsc_queryset:
                    banksDict = {
                        "bankName": each_bank.bankName,
                        "bankCode": each_bank.bankCode,
                        # "ifscCode": each_bank.ifscCode
                    }
                    bankCodesList.append(banksDict)
                

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

                data_status["responseStatus"]=1
                data_status["result"]="Success"
                data_status["data"]=bankCodesList
                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 Banks List data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payin","bankcodeslist","bankcodeslist",exceptionData,client_ip,"api")
        return data_status


sample_seamless_payment_data = {
    "api_key": "66c43d14b131cbb3c5aba543-8bf0a73fda352bcc0da5509ae4372bd7",
    "paymentChannel": "Online",
    "agent": "Payments",
    "location": "Hyderabad",
    "amount": "1",
    "productName": "Bill Payment",
    "paymentMode": "DEBIT CARD",
    # "transactionApiId": "679ca51f6bb5f25c20573b39",
    "subPaymentMode": "Visa",
    "issuingBank": "icici bank",
    "email": "saikerla@viyonafintech.com",
    "firstname": "sai",
    "mobileNumber": "8459569890",
    "bankId": "67a0b814065706eba64ce569",
    "cardType": "VISA"
    }

@payin_apis.route("/seamlesspaymentintentlink",methods=["POST"])
def seamlesspaymentintentlink():
    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","")

    location = ""
    agent = "api"
    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

    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]

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

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

    # Here Create Client Logs Table
    save_client_table = save_client_logs_data(userId,"payin","intent","seamlesspaymentintentlink",None,requestData,client_ip,"api")

    try:
        if encryption_data and iv and merchant_id and api_key:
            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

            # try:
            #   if not (merchant_queryset.patternId.payinPaymentGatewaysList != []) or not (merchant_queryset.patternId.payinEnable == False):
            #       data_status["result"]="Payin option is disabled please contact to admin!!"
            #       return data_status
            # except Exception as e:
            #   app.logger.error(traceback.format_exc())
            #   data_status["result"]="Payin option is disabled please contact to admin!!"
            #   return data_status

            api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payment_gateway",userId=str(merchant_queryset.id),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)
                print(jsonData,"JSON DATA")
                decryptResponse = json.loads(jsonData)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                data_status["result"]="Invalid encryption data!!"
                return data_status
            
            graampay_check = decryptResponse.get("graampay_check")
            payinPaymentGatewaysList = [str(each_payout_pg.id) for each_payout_pg in merchant_queryset.patternId.payinPaymentGatewaysList]

            print("(((((((payinPaymentGatewaysList)))))))",payinPaymentGatewaysList)
            print("(((((((graampay_check)))))))",graampay_check)

            payin_gate_way_queryset = TransactionAPI.objects(id__in=payinPaymentGatewaysList,status=1).first()
            if not payin_gate_way_queryset:
                data_status["result"]="Payin option is disabled please contact to admin!!!!!!!!!"
                return data_status

            payinPaymentGatewayId = str(payin_gate_way_queryset.id)

            # requestData=[decryptResponse]
            userId = str(merchant_queryset.id)

            # Here Update some data in Client Logs Table
            save_client_table.update(userId=ObjectId(userId),transactionAPIId=ObjectId(payinPaymentGatewayId))
            
            paymentGateWayCode = payin_gate_way_queryset.code

            setlementId =""
            paymentChannel =""

            api_key = decryptResponse.get("api_key","")
            location = decryptResponse.get("location","")
            amount = decryptResponse.get("amount","")
            # paymentMode = decryptResponse.get("paymentMode","")
            # subPaymentMode = decryptResponse.get("subPaymentMode","")
            issuingBank = decryptResponse.get("issuingBank","")
            vpa = decryptResponse.get("vpa","")
            bankId = decryptResponse.get("bankId","")
            cardType=decryptResponse.get("cardType","")
            bankCode=""
            bankName=""

            if api_key == api_security_queryset.apiKey:
                if not userId and not amount and not api_key: # and not firstname and not email and not phone
                    data_status["result"]="Required fields are missing!!"
                    return data_status
                
                if amount is None:
                    amount = 0
                else:
                    amount = float(amount)

                if amount < 0:
                    data_status["result"]="Insufficient amount!!"
                    return data_status

                # master_bank_queryset = BankCodes.objects(bankId=str(bankId),transactionApiIdsList__in=[str(payinPaymentGatewayId)]).first()
                # if not master_bank_queryset:
                #   data_status["result"] = "Required fields are missing!!"
                #   return data_status

                # if master_bank_queryset:
                #   bankCode=master_bank_queryset.bankCode
                #   bankName=master_bank_queryset.bankId.bankName

                # if not api_key and not orderId and not name and not phone and not email and not amount and not currency:
                #     data_status['result']="Required Fields are missing!!"
                #     return data_status

                # if float(amount)<100:
                #     data_status['result']="Amount should be greater than or equals to 100.00"
                #     return data_status

                # check_transaction_limits = merchant_transaction_limit_settings("Payin",payinPaymentGatewayId,userId,amount)
                # if check_transaction_limits.get("responseStatus") == 0:
                #   data_status['result']=check_transaction_limits.get("result")
                #   return data_status

                merchant_queryset = Users.objects(id=str(userId),status=1).first()
                if not merchant_queryset:
                    data_status["result"]="Invalid user 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

                random_customer_qry = RandomCcCustomers.objects.aggregate([{ "$sample": { "size": 1 } }])  # Get a random record
                random_doc=list(random_customer_qry)
                if random_doc: 
                    random_customer=random_doc[0]
                    firstname=random_customer.get("customerName")
                    email=random_customer.get("customerEmail")
                    phone=random_customer.get("customerPhoneNumber")
                else:
                    firstname=str(merchant_queryset.fullName)
                    email=str(merchant_queryset.email)
                    phone=str(merchant_queryset.phoneNumber)

                product_queryset=Products.objects(payinPaymentGatewayId=str(payinPaymentGatewayId),startingPrice__lte=amount,endingPrice__gte=amount).first()
                if product_queryset:
                    productName=product_queryset.productName
                else:
                    productName="Bill Payment"

                errorMessage="Initiated"
                paymentMode=""
                subPaymentMode=""
                customerVpa=""
                # cardType=""
                cardmasked=""
                patternId = str(merchant_queryset.patternId.id)
                slabId = None
                transactionAmount = amount
                commissionCharges={}
                orderId = str(get_epoch_milli_time())+random_digit_generate(2)
                transactionId = random_digit_generate(15)
                walletId=""
                productDetails={}
                paymentDetailsEncrypted=''
                # if paymentMode=="CREDIT CARD" or paymentMode=="DEBIT CARD":
                #   productDetails={
                #   "cardNum":ccnum,
                #   "cardCvv" :ccvv,
                #   "cardExpMonth":ccexpmon,
                #   "cardExpYear":ccexpyr
                #   }
                #   paymentDetailsEncrypted=combined_encrypt(json.dumps(productDetails),encSecretKey)

                #   paymentDetailsDecrypted = combined_decrypt(paymentDetailsEncrypted, encSecretKey)

                #   print(paymentDetailsDecrypted,"(((((((((((((((((paymentDetailsDecrypted in payu response)))))))))))))))))")

                transactionData={
                "userId":userId,
                "paymentChannel":paymentChannel,
                "agent":agent,
                "location":location,
                "amount":amount,
                "productName":productName,
                "setlementId":setlementId,
                "paymentMode":None,
                "transactionApiId":payinPaymentGatewayId,
                "subPaymentMode":None,
                "issuingBank":issuingBank,
                "email":"",
                "firstname":firstname,
                "phone":phone,
                "vpa":vpa,
                "bankId":bankId,
                "cardType":cardType,
                "paymentDetailsEncrypted":paymentDetailsEncrypted
                }

                merchantUniqueNumber=str(merchant_queryset.merchantUniqueNumber)
                mid_extracted = merchantUniqueNumber[1:].lstrip("0")
                pgOrderId=transaction_id_prefix+str(mid_extracted)+str(orderId)
                # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+decryptResponse.get("order_id")
            
                check_order = WalletTransactions.objects(orderId=orderId,userId=str(userId)).first()
                if check_order:
                    data_status["result"]="This order id is already exisit!!"
                    return data_status

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

                currentDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
                routing_switch_counts_queryset = RoutingSwitchCounts.objects(userId=userId,transactionAPIId=payinPaymentGatewayId,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,"payin",transactionAPIId)


                product_queryset=Products.objects(payinPaymentGatewayId=str(payinPaymentGatewayId),startingPrice__lte=amount,endingPrice__gte=amount).first()
                if product_queryset:
                    productName=product_queryset.productName
                else:
                    productName="Bill Payment"

                wallet_transaction_table = WalletTransactions(
                    userId = userId,
                    amount = round_last_digits(float(amount)),
                    grandTotal=round_last_digits(float(transactionAmount)),
                    paymentGatewayId = payinPaymentGatewayId,
                    currency="INR",
                    paymentType = paymentMode,
                    subPaymentMode = subPaymentMode,
                    creditType = "Credit",
                    patternId=patternId,
                    transactionId = transactionId,
                    transactionData = [transactionData],
                    orderId = orderId,
                    walletLog="",
                    userType="user",
                    createdBy = None,
                    createdOn = datetime.datetime.now(),
                    location = location,
                    platform = "app",
                    agent = agent,
                    customerEmail = email,
                    customerName = firstname,
                    customerPhonenumber = phone,
                    previousBalance=0,
                    currentBalance=0,
                    paymentLinkId = None,
                    PaymentButtonId = None,
                    paymentPageId = None,
                    errorMessage = errorMessage,
                    paymentChannel = paymentChannel,
                    bankRefId="",
                    cardmasked=cardmasked,
                    productName=productName,
                    setlementId=setlementId,
                    pgOrderId=pgOrderId,
                    statusCheckId=pgOrderId,
                    customerVpa=vpa,
                    commissionCharges=commissionCharges,
                    settlementStatus = 1,
                    status = 3,
                    paymentDetails=paymentDetailsEncrypted,
                    comment = productName,
                    bankCode=bankCode,
                    bankName=bankName,
                    cardType=cardType
                    )
                wallet_save=wallet_transaction_table.save()
                walletId=str(wallet_save.id)
                upi_intent_url=""
                currency="INR"
                client_ip="125.40.25.126"
                print("(((paymentGateWayCode)))",paymentGateWayCode )
                if walletId:
                    apiType="api"
                    if paymentGateWayCode == "Payu_Payin":
                        upi_intent_url=domain+"api/v1/dynamic_payment/"+str(walletId)
                        data_status["responseStatus"]=1
                        data_status["transactionId"]=orderId
                        data_status["walletId"]=walletId
                        data_status["paymentLink"]=upi_intent_url
                        data_status["gatewayType"]=paymentGateWayCode
                        data_status["result"]="Payin response data saved successfully!"
                        return data_status

                    else:
                        data_status["result"]="Please contact to admin to enable payin 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["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"]="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 intent data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payin","intent","getintentpaymenturl",exceptionData,client_ip,"api")
        return data_status


sample_static_getbankslist_data = {
    "action":"bankslist"
}

@payin_apis.route("/getbankslist",methods=["POST"])
def getbankslist():
    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","")

    location = ""
    agent = ""
    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

    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]

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

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

    # Here Create Client Logs Table
    save_client_table = save_client_logs_data(userId,"payin","bankcodes","getbankcodeslist",None,requestData,client_ip,"api")

    try:
        if encryption_data and iv and merchant_id and api_key:
            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

            
            api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payment_gateway",userId=str(merchant_queryset.id),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)
                print(jsonData,"JSON DATA")
                decryptResponse = json.loads(jsonData)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                data_status["result"]="Invalid encryption data!!"
                return data_status
            

            # requestData=[decryptResponse]
            userId = str(merchant_queryset.id)

            # Here Update some data in Client Logs Table
            save_client_table.update(userId=ObjectId(userId),transactionAPIId=None)

            action = decryptResponse.get("action") # "bankslist"

            if (not api_key) or (not action):
                data_status['result']="Required Fields are missing@!!"
                return data_status

            if action != "bankslist":
                data_status["result"]="Please give proper action!!"
                return data_status

            if api_key == api_security_queryset.apiKey:
                bankCodesList = []
                bank_codes_queryset = MasterIFSCBank.objects(status=1).order_by("-id")
                for each_bank_code in bank_codes_queryset:
                    bankCodeDict = {
                    "bankName":each_bank_code.bankName,
                    "bankCode":each_bank_code.bankCode,
                    "ifscCode":each_bank_code.ifscCode
                    }
                    bankCodesList.append(bankCodeDict)
                data_status["responseStatus"]=1
                data_status["result"]="Success"
                data_status["responseBody"]=bankCodesList
                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 intent data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payin","bankcodes","getbankcodeslist",exceptionData,client_ip,"api")
        return data_status

sample_getprices_ranges_payin_data ={
    "orderId":"1122336655447788",
    "amount":"100",
    "paymentMode":"card",
    "ccnum" : "4712270085176092",
    "ccname" : "Mishra",
    "ccvv" : "064",
    "ccexpmon": "06",
    "ccexpyr" : "31",
    "vpa" : "",
    "bankCode":"GP1102"
}

@payin_apis.route("/getpricerangeslist",methods=["POST"])
def getpricerangeslist():
    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","")

    location = ""
    agent = ""
    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

    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]

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

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

    # Here Create Client Logs Table
    save_client_table = save_client_logs_data(userId,"payin","bankcodes","getpricerangeslist",None,requestData,client_ip,"api")

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

            startDate = datetime.datetime.now()
            availability_check = check_transaction_availability(startDate, "paymentgateway")
            if availability_check.get('responseStatus')==0:
                data_status["result"]="Service Provider is not available. Please try after sometime."
                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

            
            api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payment_gateway",userId=str(merchant_queryset.id),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)
                print(jsonData,"JSON DATA")
                decryptResponse = json.loads(jsonData)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                data_status["result"]="Invalid encryption data!!"
                return data_status
            
            # graampay_check = decryptResponse.get("graampay_check")
            # payinPaymentGatewaysList = [str(each_payout_pg.id) for each_payout_pg in merchant_queryset.patternId.payinPaymentGatewaysList]

            # print("(((((((payinPaymentGatewaysList)))))))",payinPaymentGatewaysList)
            # print("(((((((graampay_check)))))))",graampay_check)

            # payin_gate_way_queryset = TransactionAPI.objects(id__in=payinPaymentGatewaysList,code=graampay_check,status=1).first()
            # if not payin_gate_way_queryset:
            #   data_status["result"]="Payin option is disabled please contact to admin!!"
            #   return data_status

            # transactionAPIId = str(payin_gate_way_queryset.id)

            # requestData=[decryptResponse]
            userId = str(merchant_queryset.id)
            orderId = decryptResponse.get("orderId","")
            amount = decryptResponse.get("amount","")
            paymentMode = decryptResponse.get("paymentMode","")
            ccnum = decryptResponse.get("ccnum","")
            ccname = decryptResponse.get("ccname","")
            ccvv = decryptResponse.get("ccvv","")
            ccexpmon = decryptResponse.get("ccexpmon","")
            ccexpyr = decryptResponse.get("ccexpyr","")
            vpa = decryptResponse.get("vpa","")
            bankCode = decryptResponse.get("bankCode","")
            cardCategory=""
            cardType=""
            bankId=""
            # bankCode=""

            print(userId,"((((((((((????????))))))))))")
            print(decryptResponse,"((((((((((????????))))))))))")
            if (not userId) or (not amount) or (not orderId) or (not paymentMode):
                data_status["result"]="Required fields are missing!!@"
                return data_status

            if amount is None:
                amount = 0
            else:
                amount = float(amount)

            if amount < 0:
                data_status["result"]="Insufficient amount!!"
                return data_status

            order_check = WalletTransactions.objects(orderId=orderId,userId=userId).first()
            if order_check:
                data_status["result"]="This orderid in already in use!!"
                return data_status

            # api_key = decryptResponse.get("api_key")

            # if not api_key:
            #     data_status['result']="Required Fields are missing!!"
            #     return data_status

            if api_key == api_security_queryset.apiKey:
                if paymentMode == "NET BANKING":
                    if not bankCode:
                        data_status["result"] = "Required fields are missing!!"
                        return data_status
                    bank_queryset = MasterIFSCBank.objects(bankCode=bankCode,status=1).first()
                    if not bank_queryset:
                        data_status["result"]="Invalid bankcode!!"
                        return data_status

                    bankId = str(bank_queryset.id)

                elif paymentMode == "UPI":
                    if not vpa:
                        data_status["result"] = "Required fields are missing!!"
                        return data_status
                else:
                    if (not ccnum) or (not ccname) or (not ccvv) or (not ccexpmon) or (not ccexpyr):
                        data_status["result"]="Required fields are missing!!"
                        return data_status
                
                ccnum=ccnum.replace(" ", "")

                defaultPayinPaymentGatewayId=""
                if merchant_queryset.patternId.payinEnable==True:
                    try:
                        defaultPayinPaymentGatewayId=str(merchant_queryset.patternId.defaultPayinPaymentGatewayId.id)
                    except Exception as e:
                        app.logger.error(traceback.format_exc())
                        defaultPayinPaymentGatewayId = ""

                siteCode = merchant_queryset.siteTitle
                if siteCode:
                    site_queryset = MultipleAppSites.objects(siteCode=siteCode,status=1).first()
                    if not site_queryset:
                        data_status["result"] = "Invalid App Request.Contact to admin support!!"
                        return data_status

                    siteId=str(site_queryset.id)

                dynamic_payment_gateway_id_response = get_dynamic_payment_gateway_id(amount=amount,payment_mode=paymentMode,card_number=ccnum,transactionApiId=defaultPayinPaymentGatewayId,siteId=siteId)

                transactionApiId=""
                if dynamic_payment_gateway_id_response.get("responseStatus") == 1:
                    transactionApiId = dynamic_payment_gateway_id_response.get("transactionApiId")
                    if transactionApiId=="":
                        data_status["result"]="Collection Payment Provider Not available!!"
                        return data_status

                    transaction_data=TransactionAPI.objects(id=str(transactionApiId)).first()
                    if not transaction_data:
                        data_status["result"]="Error while getting paymentgateway!!"
                        return data_status

                    paymentModeId=dynamic_payment_gateway_id_response.get('paymentmodeId')   
                    subPaymentModeId=dynamic_payment_gateway_id_response.get('subPaymentModeId')   
                    subPaymentMode=dynamic_payment_gateway_id_response.get('subPaymentMode')   
                    paymentMode=dynamic_payment_gateway_id_response.get('paymentMode')   
                    commissionCharges = slab_calculation_for_payin_merchant(amount,paymentModeId,subPaymentModeId,str(merchant_queryset.patternId.id))
                    if commissionCharges.get("slabId") == None:
                        data_status["result"]="Collection Payment Provider Not available!!"
                        return data_status
                    else:
                        chargeAmount = float(commissionCharges.get("chargeAmount"))
                        if chargeAmount<=0:
                            data_status["result"]="Collection Payment Provider Not available!!"
                            return data_status

                    randomPrices=[]
                    productName="Bill Payment"
                    print(transactionApiId,"transactionApiId")
                    print(amount,"amount")
                    amount=float(amount)
                    print(type(amount),"amount type")
                    singleTxnLowerLimit=1
                    singleTxnUpperLimit=99995
                    check_transaction_limits = merchant_transaction_limit_settings("Payin",transactionApiId,userId,amount)
                    if check_transaction_limits.get("responseStatus") == 0:
                        data_status['result']=check_transaction_limits.get("result")
                        return data_status
                    singleTxnLowerLimit=check_transaction_limits.get('singleTxnLowerLimit')
                    singleTxnUpperLimit=check_transaction_limits.get('singleTxnUpperLimit')
                    productData=Products.objects(payinPaymentGatewayId=str(transactionApiId),startingPrice__lte=amount,endingPrice__gte=amount).first()
                    if productData:
                        productName=productData.productName
                    
                    print(transaction_data.apiName,"apiName")
                    print(transaction_data.priceType,"priceType")
                    
                    # print(generate_random_prices(amount),"(((((((((((CHECK RANDOM )))))))))))")
                    if transaction_data.priceType=="variable":
                        print("hiiiiii")
                        randomPrices=generate_random_prices(int(amount),singleTxnLowerLimit,singleTxnUpperLimit)
                        randomPrices.sort()
                    else:
                        print(productData,"productData")
                        if productData:
                            randomPrices.append(int(productData.price))
                        else:
                            randomPrices.append(int(amount))
                    print(randomPrices,"randomPrices")
            
                    save_api_randomprices = ApiRandomPrices(
                        userId=userId,
                        orderId=orderId,
                        bankId=bankId,
                        issuingBank=dynamic_payment_gateway_id_response.get('issuingBank'),
                        paymentModeId=paymentModeId,
                        subPaymentModeId=subPaymentModeId,
                        paymentMode=paymentMode,
                        subPaymentMode=subPaymentMode,
                        priceRangeList=randomPrices,
                        transactionApiId=transactionApiId,
                        cardLast4Digits=ccnum[-4:],
                        cvv=ccvv,
                        actualPrice=amount,
                        productName=productName,
                        createdOn=datetime.datetime.now(),
                        status=1
                        ).save()

                    data_status["responseStatus"]=1
                    data_status["randomPrices"]=randomPrices
                    # data_status["productName"]=productName
                    data_status["issuingBank"]=dynamic_payment_gateway_id_response.get('issuingBank')
                    data_status["paymentmode"]=dynamic_payment_gateway_id_response.get('paymentMode')
                    # data_status["subPaymentMode"]=dynamic_payment_gateway_id_response.get('subPaymentMode')
                    data_status["cardType"]=dynamic_payment_gateway_id_response.get('cardType')
                    data_status["result"]="Success"
                    save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
                    return data_status
                else:
                    data_status["result"]=dynamic_payment_gateway_id_response.get('result')
                    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 prices ranges data!!"
        save_client_table.update(responseData=[data_status],responseDate=datetime.datetime.now())
        exceptionData = [traceback.format_exc()]
        exception_log_table = save_exception_logs_data(None,"payin","bankcodes","price",exceptionData,client_ip,"api")
        return data_status


sample_generatepaymentseamlesslink_payin_data ={
    "orderId":"1122336655447788",
    "amount":"103",
    "paymentMode":"card",
    "ccnum" : "4712270085176092",
    "ccname" : "Mishra",
    "ccvv" : "064",
    "ccexpmon": "06",
    "ccexpyr" : "31",
    "vpa" : "",
    "bankCode":"GP1102"
}
@payin_apis.route("/generatepaymentseamlesslink", methods=["POST"])
def generatepaymentseamlesslink():
    data_status = {"responseStatus":0,"result":""}
    try:
        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","")

        location = ""
        agent = ""
        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

        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]

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

        transactionAPIId = ""
        userId = ""
        paymentChannel = ""
        bankId = None
        requestData = [{"encryption_data":encryption_data,"iv":iv}]

        # Here Create Client Logs Table
        save_client_table = save_client_logs_data(userId,"payin","paymentlinkseamless","generatepaymentseamlesslink",None,requestData,client_ip,"api")

        if encryption_data and iv and merchant_id and api_key:

            startDate = datetime.datetime.now()
            availability_check = check_transaction_availability(startDate, "paymentgateway")
            if availability_check.get('responseStatus')==0:
                data_status["result"]="Service Provider is not available. Please try after sometime."
                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

            
            api_security_queryset = ApiSecurities.objects(apiKey=api_key,apiType="payment_gateway",userId=str(merchant_queryset.id),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

            userId = str(merchant_queryset.id)

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

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

            orderId = decryptResponse.get("orderId","")
            agent = decryptResponse.get("agent","api")
            amount = decryptResponse.get("amount","")
            ccnum = decryptResponse.get("ccnum","")
            ccname = decryptResponse.get("ccname","")
            ccvv = decryptResponse.get("ccvv","")
            ccexpmon = decryptResponse.get("ccexpmon","")
            ccexpyr = decryptResponse.get("ccexpyr","")
            vpa = decryptResponse.get("vpa","")
            cardType=decryptResponse.get("cardType","")
            bankCode=""
            bankName=""
            productName=""
            siteId = None

            if (not userId) or (not amount) or (not orderId): # and not firstname and not email and not phone
                data_status["result"]="Required fields are missing!!"
                return data_status
            
            if amount is None:
                amount = 0
            else:
                amount = float(amount)

            if amount < 0:
                data_status["result"]="Invalid amount!!"
                return data_status

            api_random_prices_queryset = ApiRandomPrices.objects(userId=userId,orderId=orderId,priceRangeList__in=[amount],cardLast4Digits=ccnum[-4:],cvv=ccvv).first()
            if not api_random_prices_queryset:
                data_status["result"]="Invalid payment request!!"
                return data_status

            transactionApiId = str(api_random_prices_queryset.transactionApiId.id)
            paymentMode = str(api_random_prices_queryset.paymentMode)
            productName = str(api_random_prices_queryset.productName)
            subPaymentMode = str(api_random_prices_queryset.subPaymentMode)
            if paymentMode == "NET BANKING":
                bankId = str(api_random_prices_queryset.bankId.id)
                if not bankId:
                    data_status["result"] = "Required fields are missing!!"
                    return data_status
                master_bank_queryset = BankCodes.objects(bankId=str(bankId),transactionApiIdsList__in=[str(transactionApiId)]).first()
                if not master_bank_queryset:
                    data_status["result"] = "Required fields are missing!!"
                    return data_status
                if master_bank_queryset:
                    bankCode=master_bank_queryset.bankCode
                    bankName=master_bank_queryset.bankId.bankName
            elif paymentMode == "UPI":
                vpa = str(api_random_prices_queryset.vpa)
                if not vpa:
                    data_status["result"] = "Required fields are missing!!"
                    return data_status
            else:
                bankName=api_random_prices_queryset.issuingBank
                if (not ccnum) or (not ccname) or (not ccvv) or (not ccexpmon) or (not ccexpyr):
                    data_status["result"]="Required fields are missing!!"
                    return data_status

            siteTitle = merchant_queryset.siteTitle
            if siteTitle:
                site_queryset = MultipleAppSites.objects(siteCode=siteTitle,status=1).first()
                if not site_queryset:
                    data_status["result"] = "Invalid App Request.Contact to admin support!!"
                    return data_status

                siteId=str(site_queryset.id)

            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

            payin_gate_way_queryset = TransactionAPI.objects(id=str(transactionApiId),status=1).first()
            if not payin_gate_way_queryset:
                data_status["result"]="Service Provider is not available!!"
                return data_status

            # check_transaction_limits = merchant_transaction_limit_settings("Payin",payInPaymentGatewayId,userId,amount)
            check_transaction_limits = merchant_transaction_limit_settings("Payin",transactionApiId,userId,amount)
            if check_transaction_limits.get("responseStatus") == 0:
                data_status['result']=check_transaction_limits.get("result")
                return data_status

            paymentGateWayCode = payin_gate_way_queryset.code

            random_customer_qry = RandomCcCustomers.objects.aggregate([{ "$sample": { "size": 1 } }])  # Get a random record
            random_doc=list(random_customer_qry)
            if random_doc: 
                random_customer=random_doc[0]
                firstname=random_customer.get("customerName")
                email=random_customer.get("customerEmail")
                phone=random_customer.get("customerPhoneNumber")
            else:
                firstname=str(merchant_queryset.fullName)
                email=str(merchant_queryset.email)
                phone=str(merchant_queryset.phoneNumber)

            errorMessage="Initiated"
            customerVpa=""
            cardmasked=""
            patternId = str(merchant_queryset.patternId.id)
            slabId = None
            transactionAmount = amount
            commissionCharges={}
            # orderId = str(get_epoch_milli_time())+random_digit_generate(2)
            transactionId = random_digit_generate(15)
            walletId=""
            productDetails={}
            paymentDetailsEncrypted=''
            if paymentMode=="CREDIT CARD" or paymentMode=="DEBIT CARD":
                productDetails={
                "cardNum":ccnum,
                "cardCvv" :ccvv,
                "cardExpMonth":ccexpmon,
                "cardExpYear":ccexpyr
                }
                cardmasked=mask_account_number(ccnum)
                paymentDetailsEncrypted=combined_encrypt(json.dumps(productDetails),encSecretKey)

                # paymentDetailsDecrypted = combined_decrypt(paymentDetailsEncrypted, encSecretKey)

                # print(paymentDetailsDecrypted,"(((((((((((((((((paymentDetailsDecrypted in payu response)))))))))))))))))")
            transactionData={
            "userId":userId,
            "paymentChannel":paymentChannel,
            "agent":agent,
            "location":location,
            "amount":amount,
            "paymentMode":paymentMode,
            "transactionApiId":transactionApiId,
            "subPaymentMode":subPaymentMode,
            "issuingBank":api_random_prices_queryset.issuingBank,
            "email":email,
            "firstname":firstname,
            "phone":phone,
            "vpa":vpa,
            "bankId":bankId,
            "cardType":cardType,
            "paymentDetailsEncrypted":paymentDetailsEncrypted
            }

            merchantUniqueNumber=str(merchant_queryset.merchantUniqueNumber)
            mid_extracted = merchantUniqueNumber[1:].lstrip("0")
            pgOrderId=str(transaction_id_prefix)+str(mid_extracted)+str(orderId)
            wallet_transaction_table = WalletTransactions(
                userId = userId,
                amount = round_last_digits(float(amount)),
                grandTotal=round_last_digits(float(transactionAmount)),
                paymentGatewayId = transactionApiId,
                currency="INR",
                paymentType = paymentMode,
                subPaymentMode = subPaymentMode,
                creditType = "Credit",
                patternId=patternId,
                transactionId = transactionId,
                transactionData = [transactionData],
                orderId = orderId,
                walletLog="",
                userType="user",
                createdBy = None,
                createdOn = datetime.datetime.now(),
                location = location,
                platform = "app",
                agent = agent,
                customerEmail = email,
                customerName = firstname,
                customerPhonenumber = phone,
                previousBalance=0,
                currentBalance=0,
                paymentLinkId = None,
                PaymentButtonId = None,
                paymentPageId = None,
                errorMessage = errorMessage,
                paymentChannel = paymentChannel,
                bankRefId="",
                cardmasked=cardmasked,
                productName=productName,
                setlementId=None,
                pgOrderId=pgOrderId,
                statusCheckId=pgOrderId,
                customerVpa=vpa,
                commissionCharges=commissionCharges,
                settlementStatus = 1,
                status = 3,
                paymentDetails=paymentDetailsEncrypted,
                comment = productName,
                bankCode=bankCode,
                bankName=bankName,
                siteTitle=siteTitle,
                cardType=cardType
                )
            wallet_save=wallet_transaction_table.save()
            walletId=str(wallet_save.id)
            upi_intent_url=""
            currency="INR"
            client_ip="125.40.25.126"
            print("(((paymentGateWayCode)))",paymentGateWayCode )
            if walletId:
                if paymentGateWayCode == "Lyra_Payin":
                    get_client = ""
                    get_secret = ""
                    get_base_url = ""
                    user_name = ""
                    get_base_url = ""
                    password = ""
                    webhook_url = ""
                    return_url = ""
                    for each_key in payin_gate_way_queryset.paramsList:
                        
                        
                        get_key = each_key.get("key")
                        if get_key == "api_key":
                            get_client = each_key.get("value")
                        if get_key == "secret_key":
                            get_secret = each_key.get("value")
                        if get_key == "base_url":
                            get_base_url = each_key.get("value")
                        if get_key == "webhook_url":
                            webhook_url = each_key.get("value")
                        if get_key == "return_url":
                            return_url = each_key.get("value")
                        if get_key == "user_name":
                            user_name = each_key.get("value")
                        if get_key == "password":
                            password = each_key.get("value")
                    ###################################################### Lyra Payin Code #########################################################################
                    # paymentgatewayresponseDict = lyra_payin_payment_intent(get_base_url,pgOrderId,note,amount,currency,merchant_queryset.fullName,merchant_queryset.phoneNumber,merchant_queryset.email,webhook_url,return_url,userId,payInPaymentGatewayId,client_ip,"api",user_name,password)
                    paymentgatewayresponseDict = lyra_payin_payment_intent(get_base_url,pgOrderId,productName,amount,currency,firstname,phone,email,webhook_url,return_url,userId,transactionApiId,client_ip,agent,user_name,password)
                    ################################################################################################################################################
                
                    if paymentgatewayresponseDict.get("responseStatus") == 1:
                        transactionId = paymentgatewayresponseDict.get("payment_request_id")
                        transactionData = paymentgatewayresponseDict.get("transactionData")
                        paymentChannel = paymentgatewayresponseDict.get("paymentChannel")
                        pgOrderId=paymentgatewayresponseDict.get("pgOrderId")
                        upi_intent_url=paymentgatewayresponseDict.get("upi_intent_url")
                        wallet_save.update(transactionId=transactionId,transactionData=transactionData,paymentChannel=paymentChannel,paymentLink=upi_intent_url)
                        data_status["responseStatus"]=1
                        data_status["orderId"]=orderId
                        # data_status["walletId"]=walletId
                        data_status["PaymentLink"]=upi_intent_url
                        # data_status["gatewayType"]=paymentGateWayCode
                        data_status["result"]="Payin response data saved successfully!"
                        return data_status
                    else:
                        errorresult=paymentgatewayresponseDict.get("result")
                        wallet_save.update(errorMessage=errorresult,status=0)
                        data_status["result"]=errorresult
                        return data_status
                    ################## PAYU Gateway ##################
                elif paymentGateWayCode == "Payu_Payin":
                    upi_intent_url=domain+"api/frontend/payupayment_dynamic_link/"+str(walletId)
                    data_status["responseStatus"]=1
                    data_status["orderId"]=orderId
                    # data_status["walletId"]=walletId
                    data_status["PaymentLink"]=upi_intent_url
                    # data_status["gatewayType"]=paymentGateWayCode
                    data_status["result"]="Payin response data saved successfully!"
                    return data_status

                elif paymentGateWayCode == "Getepay_Payin":
                    mid = ""
                    get_base_url = ""
                    callback_url = ""
                    return_url=""
                    encryption_key = ""
                    encryption_iv = ""
                    terminalId = ""
                    vpa = ""
                    for each_key in payin_gate_way_queryset.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "mid":
                            mid = each_key.get("value")
                        if get_key == "get_base_url":
                            get_base_url = each_key.get("value")
                        if get_key == "callback_url":
                            callback_url = each_key.get("value")
                        if get_key == "return_url":
                            return_url = each_key.get("value")
                        if get_key == "encryption_key":
                            encryption_key = each_key.get("value")
                        if get_key == "encryption_iv":
                            encryption_iv = each_key.get("value")
                        if get_key == "terminalId":
                            terminalId = each_key.get("value")
                        if get_key == "vpa":
                            vpa = each_key.get("value")
                   
                    
                    # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+"TPSL"+str(orderId)
                    # pgOrderId = merchant_queryset.merchantUniqueNumber+"-"+str(orderId)
                    transactionType="single"
                    ###################################################### Wowpe Payin Code #########################################################################
                    paymentgatewayresponseDict = getepayintent(get_base_url,encryption_key,encryption_iv,mid, return_url, callback_url, terminalId,amount,email,firstname,phone,currency,pgOrderId,transactionType,transactionApiId,client_ip,productName,agent,userId,vpa)

                    if paymentgatewayresponseDict.get("responseStatus") == 1:
                        transactionId = paymentgatewayresponseDict.get("payment_request_id")
                        transactionData = paymentgatewayresponseDict.get("transactionData")
                        paymentChannel = paymentgatewayresponseDict.get("paymentChannel")
                        pgOrderId=paymentgatewayresponseDict.get("pgOrderId")
                        upi_intent_url=paymentgatewayresponseDict.get("upi_intent_url")
                        wallet_save.update(transactionId=transactionId,statusCheckId=str(transactionId),transactionData=transactionData,paymentChannel=paymentChannel,paymentLink=upi_intent_url)
                        data_status["responseStatus"]=1
                        PaymentLink=domain+"api/frontend/payupayment_dynamic_link/"+str(walletId)
                        data_status["orderId"]=orderId
                        # data_status["walletId"]=walletId
                        data_status["PaymentLink"]=PaymentLink
                        # data_status["gatewayType"]=paymentGateWayCode
                        data_status["result"]="Payin response data saved successfully!"
                        return data_status
                    else:
                        errorresult=paymentgatewayresponseDict.get("result")
                        wallet_save.update(errorMessage=errorresult,status=0)
                        data_status["result"]=errorresult
                        return data_status

                elif paymentGateWayCode == "Worldline_Payin":
                    print("((((((((((((((((((Worldline_Payin))))))))))))))))))")
                    get_base_url = ""
                    callback_url = ""
                    api_key = ""
                    secret_key = ""
                    merchantIdentifier = ""
                    api_encryption_key = ""
                    requestType = ""
                    transactionType = ""
                    encryption_iv = ""
                    graampay_check = ""
                    for each_key in payin_gate_way_queryset.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "get_base_url":
                            get_base_url = each_key.get("value")
                        if get_key == "merchantIdentifier":
                            merchantIdentifier = each_key.get("value")
                        if get_key == "callback_url":
                            callback_url = each_key.get("value")
                        if get_key == "encryption_key":
                            api_encryption_key = each_key.get("value")
                        if get_key == "encryption_iv":
                            encryption_iv = each_key.get("value")
                        if get_key == "transactionType":
                            transactionType = each_key.get("value")
                        if get_key == "requestType":
                            requestType = each_key.get("value")
                        # if get_key == "api_key":
                        #     api_key = each_key.get("value")
                        # if get_key == "secret_key":
                        #     secret_key = each_key.get("value")
                        # if get_key == "graampay_check":
                        #     graampay_check = each_key.get("value")
                    cartIdentifier="FIRST"
                    note=""
                    ###################################################### Wowpe Payin Code #########################################################################
                    # paymentgatewayresponseDict = create_campuslinkpro_payment_link_seamless(get_base_url,api_key,secret_key,graampay_check,pgOrderId,productName,amount,currency,firstname,phone,email,transactionApiId,client_ip,agent,userId)
                    paymentgatewayresponseDict = worldline_create_seamless_payment_link(merchantIdentifier,get_base_url,callback_url,api_encryption_key,encryption_iv,pgOrderId,amount,cartIdentifier,ccnum,cardType,ccexpyr,ccexpmon,note,transactionType,requestType,ccvv)
                    ###############################################################################################################################################

                    if paymentgatewayresponseDict.get("responseStatus") == 1:
                        transactionId = paymentgatewayresponseDict.get("payment_request_id")
                        transactionData = paymentgatewayresponseDict.get("transactionData")
                        paymentChannel = paymentgatewayresponseDict.get("paymentChannel")
                        pgOrderId=paymentgatewayresponseDict.get("pgOrderId")
                        upi_intent_url=paymentgatewayresponseDict.get("upi_intent_url")
                        wallet_save.update(transactionId=transactionId,transactionData=transactionData,paymentChannel=paymentChannel,paymentLink=upi_intent_url)
                        data_status["responseStatus"]=1
                        data_status["orderId"]=orderId
                        # data_status["walletId"]=walletId
                        data_status["PaymentLink"]=upi_intent_url
                        # data_status["gatewayType"]=paymentGateWayCode
                        data_status["result"]="Payin response data saved successfully!"
                        return data_status
                    else:
                        errorresult=paymentgatewayresponseDict.get("result")
                        wallet_save.update(errorMessage=errorresult,status=0)
                        data_status["result"]=errorresult
                        return data_status
                else:
                    data_status["responseStatus"]=1
                    data_status["orderId"]=orderId
                    # data_status["walletId"]=walletId
                    data_status["PaymentLink"]=upi_intent_url
                    # data_status["gatewayType"]=paymentGateWayCode
                    data_status["result"]="Payin response data saved successfully!"
                    return data_status
            else:
                data_status["result"]="Unable to save payin response data!!"
                return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        print(traceback.format_exc(),"traceback_error")
        data_status["result"]="Unable to save payin response data!!"
        return data_status