from appservices.common.util import *
from appservices.common.payment_gateways.idfc_payment_gateways import *
webhooks = Blueprint("webhooks",__name__)

################################## Axis Payout Call Back URL API ######################################

FIXED_IV = bytes([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
                  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f])


def axis_webhook_encrypt(plain_text, secret_key):
    encrypted_text = ''
    try:
        print(plain_text,"plain_text")
        secret_key_hex_bytes = get_md5(secret_key)
        cipher = AES.new(secret_key_hex_bytes, AES.MODE_CBC, iv=FIXED_IV)
        padded_bytes = pad(plain_text.encode('utf-8'), AES.block_size)
        encrypted_bytes = cipher.encrypt(padded_bytes)
        encrypted_text = byte_to_hex(encrypted_bytes)
        return encrypted_text
    except Exception as e:
        print(traceback.format_exc())
        return encrypted_text

def byte_to_hex(byte_data):
    return byte_data.hex()

def axis_webhook_decrypt(encrypted, secret_key):
    decrypted_text = ''
    try:
        secret_key_hex_bytes = get_md5(secret_key)
        encrypted_combined_bytes = hex_to_byte(encrypted)
        cipher = AES.new(secret_key_hex_bytes, AES.MODE_CBC, iv=FIXED_IV)
        decrypted_bytes = unpad(cipher.decrypt(encrypted_combined_bytes), AES.block_size)
        decrypted_text = decrypted_bytes.decode()
        return decrypted_text
    except Exception as e:
        print(traceback.format_exc())
        return decrypted_text

def get_md5(input_string):
    md5 = hashlib.md5()
    md5.update(input_string.encode('utf-8'))
    return md5.digest()


def hex_to_byte(hex_string):
    return bytes.fromhex(hex_string)

@webhooks.route("/axispayoutcallbackurl",methods=["POST"])
def axispayoutcallbackurl():
    data_status={"responseStatus":0,"result":""}
    print(request.json,"request.json")

    encryption_data = request.json.get("GetStatusResponseBodyEncrypted","")

    key="aecbbe276b1411d057f08d752241aa3c"

    try:
        decrypted_json_response = axis_webhook_decrypt(encryption_data, key)

        print(decrypted_json_response, "Axis Decrypted Call back Data JSON Response Body")
        decrypted_json_response = json.loads(decrypted_json_response)

        transaction_id = ""
        batchNo = ""
        orderId=""
        pgOrderId=""
        paymentMode=""
        data = decrypted_json_response.get("data",{})
        transactionsList = data.get("CUR_TXN_ENQ")

        # print(transactionsList,"((((((((((((Axis call back transactionsList))))))))))))")
        for each_transaction in transactionsList:
            UTR = each_transaction.get("utrNo")
            amount = each_transaction.get("amount")
            transactionUniqueId = each_transaction.get("crn","")
            Date = each_transaction.get("processingDate","")
            PaymentMode = each_transaction.get("paymentMode","")
            Status = each_transaction.get("transactionStatus","")
            Message = each_transaction.get("statusDescription","")
            batchNo = each_transaction.get("batchNo","")
            transaction_id = each_transaction.get("transaction_id","")
            print(batchNo,"((((((((((((((batchNo))))))))))))))")
            print(each_transaction,"((((((((((((((Axis call back each_transaction))))))))))))))")
        
            requestData = [request.json]
            save_api_webhook_logs_table = save_webhook_logs_data(None,"payout","call_back","axispayoutcallbackurl",None,requestData,"api","")

            if PaymentMode.lower() == "NT":
                txnPaymode = "NEFT"
            elif PaymentMode.lower() == "RT":
                txnPaymode = "RTGS"
            elif PaymentMode.lower() == "PA" or PaymentMode.lower() == "A":
                txnPaymode = "IMPS"
            else:
                txnPaymode = ""

            statusText = "PROCESSING"
            transactionstatus=2
            if Status == "PROCESSED":
                transactionstatus=1
                statusText="SUCCESS"
            elif Status == "REJECTED":
                transactionstatus=0
                statusText="FAILED"
            else:
                transactionstatus=2
                statusText="PROCESSING"

            tablerecord="fundtransfer"
            
            fundtran_record=FundTransfers.objects(pgOrderId=transactionUniqueId,status__ne=5).first()
            if fundtran_record:
                pgOrderId=fundtran_record.pgOrderId
                paymentMode=fundtran_record.paymentMode
            else:
                third_fundtran_record=ThirdPartyFundTransfers.objects(pgOrderId=transactionUniqueId,status__ne=5).first()
                if third_fundtran_record:
                    pgOrderId=third_fundtran_record.pgOrderId
                    paymentMode=third_fundtran_record.paymentMode
                    tablerecord="thirdparty"
                else:
                    data_status["result"] = "payout status no update"
                    return data_status

        print(tablerecord,"(((((((((((tablerecord)))))))))))")
        print(pgOrderId,"(((((((((((pgOrderId)))))))))))")
        axis_payout_callback_request_data={
        "statusCode":"",
        "message":Message,
        "orderId":transactionUniqueId,
        "pgOrderId":pgOrderId,
        "paymentMode":txnPaymode,
        "amount":round(float(amount),2),
        "transaction_date":Date,
        "bank_reference_number":UTR,
        "transactionstatus":transactionstatus,
        "statusText":statusText,
        "hash":"",
        "batchNo":batchNo,
        "transaction_id":transaction_id,
        "tablerecord":tablerecord,
        "paymentChannel":"Axis"
        }
        print(axis_payout_callback_request_data,"axis_payout_callback_request_data")
        callbackResponseData = payout_webhook_call_back_update(axis_payout_callback_request_data,save_api_webhook_logs_table)

        data_status["responseStatus"] = callbackResponseData.get("responseStatus")
        data_status["result"] = callbackResponseData.get("result")
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get axis payout call back url data!!"
        return data_status

# @webhooks.route("/axisecollectvalidatecallbackurl",methods=["POST"])
# def axisecollectvalidatecallbackurl():
#     data_status={"stts_flg":"F","err_cd":"102","message":"Invalid details."}
#     print(request.json,"request.json axisecollectvalidatecallbackurl")
#     print(request.form,"request.form axisecollectvalidatecallbackurl")
#     print(request.data,"request.data axisecollectvalidatecallbackurl")
#     # json_data = request.json.get('requestData')
#     secretKey = "f51085df02812201344f6f0cb6959647"
#     # encryption_data=axis_webhook_encrypt(json.dumps(json_data),secretKey)
#     decryptResponse=request.json
#     # print(encryption_data,"encryption axisecollectvalidatecallbackurl")
#     try:
#         # try:
#         #     jsonData = axis_webhook_decrypt(encryption_data.decode('utf-8'),secretKey)
#         #     print(jsonData,"decrypted axisecollectvalidatecallbackurl")
#         #     decryptResponse = json.loads(jsonData)
#         # except Exception as e:
#         #     app.logger.error(traceback.format_exc())
#         #     data_status["message"]="Invalid encryption data!!"
#         #     return data_status

#         clientRefNumber=decryptResponse.get('UTR',"")
#         Bene_acc_no=decryptResponse.get('Bene_acc_no',"")
#         Req_type=decryptResponse.get('Req_type',"")
#         Req_dt_time=decryptResponse.get('Req_dt_time',"")
#         Txn_amnt=decryptResponse.get('Txn_amnt',"")
#         Corp_code=decryptResponse.get('Corp_code',"")
#         Pmode=decryptResponse.get('Pmode',"")
#         Sndr_acnt=decryptResponse.get('Sndr_acnt',"")
#         Sndr_nm=decryptResponse.get('Sndr_nm',"")
#         Sndr_ifsc=decryptResponse.get('Sndr_ifsc',"")
#         Sndr_acnt1=decryptResponse.get('Sndr_acnt1',"")
#         Sndr_nm1=decryptResponse.get('Sndr_nm1',"")
#         print(clientRefNumber,"clientRefNumber")
#         print(Bene_acc_no,"Bene_acc_no")
#         print(Req_type,"Req_type")
#         print(Txn_amnt,"Txn_amnt")
#         print(Corp_code,"Corp_code")
#         print(Pmode,"Pmode")
#         print(Sndr_acnt,"Sndr_acnt")
#         vaaccounts=['VYNF9561352874','VYNF9561351043','VYNF9561351432','VYNF95613511765','VYNF9561351437']

#         senderaccounts=['100118259229','634634646664','454354543345','34325454554543','5675475475474']

#         if clientRefNumber!="" and Bene_acc_no!="" and Req_type!="" and Req_dt_time!="" and Txn_amnt!="" and Corp_code!="" and Pmode!="" and Sndr_acnt!="":

#             checkutr_qry=AxisEcollect.objects(clientRefNumber=clientRefNumber).first()
#             if checkutr_qry:
#                 data_status['stts_flg']='F'
#                 data_status['err_cd']='102'
#                 data_status['message']='Duplicate UTR'
            
#             elif Bene_acc_no not in vaaccounts:
#                 data_status['stts_flg']='F'
#                 data_status['err_cd']='103'
#                 data_status['message']='Invalid Beneficiary Account Number'

#             # elif Corp_code!="VYNF":
#             #     data_status['stts_flg']='F'
#             #     data_status['err_cd']='105'
#             #     data_status['message']='Invalid Corp Code'
#             elif Sndr_acnt not in senderaccounts:
#                 data_status['stts_flg']='F'
#                 data_status['err_cd']='104'
#                 data_status['message']='Invalid Sender Account Number'
#             else:

#                 data_status['stts_flg']='S'
#                 data_status['err_cd']='000'
#                 data_status['message']='Success'
#             print(data_status,"validation response")
#             return data_status
#         else:
#             data_status['stts_flg']='F'
#             data_status['err_cd']='101'
#             data_status['message']='Requested details are invalid.'
#             print(data_status,"validation response")
#             return data_status
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         print("error exeption")
#         print(data_status,"validation response")
#         return data_status

# @webhooks.route("/axisecollectnotificationcallbackurl",methods=["POST"])
# def axisecollectnotificationcallbackurl():
#     data_status={"stts_flg":"F","err_cd":"102","message":"Invalid details."}
#     print(request.json,"request.json axisecollectnotificationcallbackurl")
#     print(request.form,"request.form axisecollectnotificationcallbackurl")
#     print(request.data,"request.data axisecollectnotificationcallbackurl")
#     # json_data = request.json.get('requestData')
#     secretKey = "f51085df02812201344f6f0cb6959647"
#     # encryption_data=axis_webhook_encrypt(json.dumps(json_data),secretKey)
#     decryptResponse=request.json
#     # print(encryption_data,"encryption axisecollectnotificationcallbackurl")
#     try:
#         # try:
#         #     jsonData = axis_webhook_decrypt(encryption_data.decode('utf-8'),secretKey)
#         #     print(jsonData,"decrypted axisecollectnotificationcallbackurl")
#         #     decryptResponse = json.loads(jsonData)
#         # except Exception as e:
#         #     app.logger.error(traceback.format_exc())
#         #     data_status["message"]="Invalid encryption data!!"
#         #     return data_status

#         clientRefNumber=decryptResponse.get('UTR',"")
#         Bene_acc_no=decryptResponse.get('Bene_acc_no',"")
#         Req_type=decryptResponse.get('Req_type',"")
#         Req_dt_time=decryptResponse.get('Req_dt_time',"")
#         Txn_amnt=decryptResponse.get('Txn_amnt',"")
#         Corp_code=decryptResponse.get('Corp_code',"")
#         Pmode=decryptResponse.get('Pmode',"")
#         Sndr_acnt=decryptResponse.get('Sndr_acnt',"")
#         Sndr_nm=decryptResponse.get('Sndr_nm',"")
#         Sndr_ifsc=decryptResponse.get('Sndr_ifsc',"")
#         Sndr_acnt1=decryptResponse.get('Sndr_acnt1',"")
#         Sndr_nm1=decryptResponse.get('Sndr_nm1',"")
#         vaaccounts=['VYNF9561352874','VYNF9561351043','VYNF9561351432','VYNF95613511765','VYNF9561351437']

#         senderaccounts=['100118259229','634634646664','454354543345','34325454554543','5675475475474']
#         if clientRefNumber!="" and Bene_acc_no!="" and Req_type!="" and Req_dt_time!="" and Txn_amnt!="" and Corp_code!="" and Pmode!="" and Sndr_acnt!="" and Sndr_nm!="" and Sndr_ifsc!="":
#             checkutr_qry=AxisEcollect.objects(clientRefNumber=clientRefNumber).first()
#             if checkutr_qry:
#                 data_status['stts_flg']='F'
#                 data_status['err_cd']='102'
#                 data_status['message']='Duplicate UTR'

#             elif Bene_acc_no not in vaaccounts:
#                 data_status['stts_flg']='F'
#                 data_status['err_cd']='103'
#                 data_status['message']='Invalid Beneficiary Account Number'

#             # elif Corp_code!="VYNF":
#             #     data_status['stts_flg']='F'
#             #     data_status['err_cd']='105'
#             #     data_status['message']='Invalid Corp Code'

#             elif Sndr_acnt not in senderaccounts:
#                 data_status['stts_flg']='F'
#                 data_status['err_cd']='104'
#                 data_status['message']='Invalid Sender Account Number'
#             else:
#                 savetable=AxisEcollect(
#                     clientRefNumber = clientRefNumber,
#                     Bene_acc_no=Bene_acc_no,
#                     Req_type=Req_type,
#                     Req_dt_time=Req_dt_time,
#                     Txn_amnt=Txn_amnt,
#                     Corp_code=Corp_code,
#                     Pmode=Pmode,
#                     Sndr_acnt = Sndr_acnt,
#                     Sndr_nm=Sndr_nm,
#                     Sndr_ifsc=Sndr_ifsc,
#                     Sndr_acnt1=Sndr_acnt1,
#                     Sndr_nm1=Sndr_nm1
#                     ).save()
#                 data_status['stts_flg']='S'
#                 data_status['err_cd']='000'
#                 data_status['message']='Success'
#             print(data_status,"notification response")
#             return data_status
#         else:
            
#             data_status['stts_flg']='F'
#             data_status['err_cd']='101'
#             data_status['message']='Requested details are invalid.'
#             print(data_status,"notification response")
#             return data_status
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         print("error exeption")
#         print(data_status,"notification response")
#         return data_status


@webhooks.route("/idfcpayoutcallbackurl",methods=["POST"])
def idfcpayoutcallbackurl():
    data_status={"statusCode":"0","message":"SUCCESS"}
    try:
        secretKey="77616d706c65496467134145536b659123616d706c65496468634145536b6614"
        encryptedData=request.data
        if encryptedData!="":
            decrypted_text = idfc_decrypt(encryptedData, secretKey)
            jsondecryptResponse = json.loads(decrypted_text)
            print(jsondecryptResponse,"idfcpayoutcallbackurl jsondecryptResponse")
            StatusCode = jsondecryptResponse.get("RESPONSE_CODE")
            Message = jsondecryptResponse.get("RESPONSE_REASON","")
            OrderId = ""
            transactionUniqueId = jsondecryptResponse.get("ORIGINATION_CUSTOMER_REF","")
            ClientOrderId = ""
            PaymentMode = ""
            amount = jsondecryptResponse.get("TRAN_AMOUNT","")
            Date = jsondecryptResponse.get("TRAN_DATE","")
            UTR = jsondecryptResponse.get("UTR","")
            Checksum = ""

            requestData = [jsondecryptResponse]
            save_api_webhook_logs_table = save_webhook_logs_data(None,"payout","call_back","idfcpayoutcallbackurl",None,requestData,"api","")

            statusText = "PROCESSING"
            if StatusCode=="":
                data_status["message"] = "PROCESSING"
                return data_status
            else:
                transactionstatus=2
                if StatusCode=="APPROVED" or StatusCode=="SUCCESS" or StatusCode=="ACCEPTED" or StatusCode=="PROS" or StatusCode=="SETT":
                    transactionstatus=1
                    statusText="SUCCESS"
                elif StatusCode=="FAILED":
                    transactionstatus=0
                    statusText="FAILED"
                elif StatusCode=="REFUNDED" or StatusCode=="REVERSAL" or StatusCode=="RETU" or StatusCode=="RVRS" or StatusCode=="N04R" or StatusCode=="RJCT":
                    transactionstatus=4
                    statusText="REVERSAL"
                # elif StatusCode=="PENDING":
                #     transactionstatus=2
                #     statusText="PROCESSING"
                else:
                    data_status["message"] = "payout status no update"
                    return data_status
            tablerecord="fundtransfer"
            orderId=""
            pgOrderId=""
            paymentMode=""
            fundtran_record=FundTransfers.objects(transactionUniqueId=transactionUniqueId,status__ne=5).first()
            if fundtran_record:
                pgOrderId=fundtran_record.pgOrderId
                paymentMode=fundtran_record.paymentMode
            else:
                third_fundtran_record=ThirdPartyFundTransfers.objects(transactionUniqueId=transactionUniqueId,status__ne=5).first()
                if third_fundtran_record:
                    pgOrderId=third_fundtran_record.pgOrderId
                    paymentMode=third_fundtran_record.paymentMode
                    tablerecord="thirdparty"
                else:
                    pgOrderId=str(transactionUniqueId)
                    tablerecord="thirdparty_without_save"

            payout_callback_request_data={
            "statusCode":StatusCode,
            "message":Message,
            "orderId":str(transactionUniqueId),
            "pgOrderId":pgOrderId,
            "paymentMode":paymentMode,
            "amount":round(float(amount),2),
            "transaction_date":Date,
            "bank_reference_number":UTR,
            "transactionstatus":transactionstatus,
            "statusText":statusText,
            "hash":Checksum,
            "tablerecord":tablerecord,
            "paymentChannel":"Idfc"
            }
            callbackResponseData = payout_webhook_call_back_update(payout_callback_request_data,save_api_webhook_logs_table)
        data_status['message']="SUCCESS"
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return data_status
# @webhooks.route("/idfcpayoutecollectverificationurl",methods=["POST"])
# def idfcpayoutecollectverificationurl():
#     print("idfcpayoutecollectverificationurl verified")
#     print(request.headers,"idfcpayoutecollectverificationurl headers")
#     responseDict = {"vANum":"","bankRef":"","status":"F","statusDesc":"Failed","errorCode":"111","errorDesc":"VA_Number_invalid_request"}
#     secretKey="72616d706c65496411634145536b658573616d706c65492568634256536ba876"
    
#     try:
#         encryptedData=request.data
#         virtual_queryset_table = VirtualAccountVerificationLogs(
#             encryptedData=encryptedData,
#             createdOn = datetime.datetime.now(),
#             errorMessage="encryptedData",
#             status = 1,
#             )
#         save_table = virtual_queryset_table.save()
        
#         print("idfcpayoutecollectverificationurl encryptedData = ",encryptedData)
#         if encryptedData!="":
#             decrypted_text = idfc_decrypt(encryptedData, secretKey)
#             print(decrypted_text,"decrypted_text")
#             jsondecryptResponse = json.loads(decrypted_text)
#             VANUm=jsondecryptResponse.get('VANum')
#             bankRef=jsondecryptResponse.get('bankRef')
#             txnAmt=jsondecryptResponse.get('txnAmt')
#             remitterAc=jsondecryptResponse.get('remitterAc',"")
#             remiterName=jsondecryptResponse.get('remiterName',"")
#             remitterAcType=jsondecryptResponse.get('remitterAcType',"")
#             remitterBank=jsondecryptResponse.get('remitterBank',"")
#             remitterBranch=jsondecryptResponse.get('remitterBranch',"")
#             remitterBankifsc=jsondecryptResponse.get('remitterBankifsc',"")
#             save_table.update(
#                 decryptedDict=jsondecryptResponse,
#                 VANUm=VANUm,
#                 bankRef=bankRef,
#                 remitterAc=remitterAc,
#                 remiterName=remiterName,
#                 remitterAcType=remitterAcType,
#                 remitterBank=remitterBank,
#                 remitterBranch=remitterBranch,
#                 remitterBankifsc=remitterBankifsc,
#                 txnAmt=float(txnAmt)
#                 )
#             if not txnAmt and not VANUm and not bankRef:
#                 responseDict={
#                 "vANum":jsondecryptResponse.get('VANum'),
#                 "bankRef":jsondecryptResponse.get('bankRef'),
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"111",
#                 "errorDesc":"VA_Number_invalid_request"
#                 }
#                 save_table.update(errorMessage="Invalid request details.")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt
#             if float(txnAmt)<1:
#                 responseDict={
#                 "vANum":jsondecryptResponse.get('VANum'),
#                 "bankRef":jsondecryptResponse.get('bankRef'),
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"02",
#                 "errorDesc":"VA_Number_does_not_exist_or_amount_invalid"
#                 }
#                 save_table.update(errorMessage="Invalid Amount requested.")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt
#             print(VANUm,"VANUm")
#             virtual_accounts_queryset = VirtualAccounts.objects(status=1,virtualAccountNumber=str(VANUm)).first()
#             print(virtual_accounts_queryset,"virtual_accounts_queryset")
#             if not virtual_accounts_queryset:
#                 responseDict={
#                 "vANum":jsondecryptResponse.get('VANum'),
#                 "bankRef":jsondecryptResponse.get('bankRef'),
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"02",
#                 "errorDesc":"VA_Number_does_not_exist_or_amount_invalid"
#                 }
#                 save_table.update(errorMessage="Invalid Virtual Account.")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt
#             if virtual_accounts_queryset.gatewayId.status!=1:
#                 responseDict={
#                 "vANum":jsondecryptResponse.get('VANum'),
#                 "bankRef":jsondecryptResponse.get('bankRef'),
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"02",
#                 "errorDesc":"VA_Number_does_not_exist_or_amount_invalid"
#                 }
#                 save_table.update(errorMessage="Payment ateway INactivated.")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt

#             assigned_va_querryset=AssignedVirtualAccounts.objects(virtualAccountId=str(virtual_accounts_queryset.id))
#             if not assigned_va_querryset:
#                 save_table.update(errorMessage="Virtual Account Number not assigned to anyone.")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt
#             print(assigned_va_querryset.isThirdParty,"assigned_va_querryset.isThirdParty")
#             if assigned_va_querryset.isThirdParty==True:
#                 if assigned_va_querryset.thirdpartyUserId.status==1:
#                     credit_notification_queryset = ThirdPartyCreditNotifications.objects(bankReferenceNumber=str(bankRef)).first()
#                     if credit_notification_queryset:
#                         responseDict={
#                         "vANum":jsondecryptResponse.get('VANum'),
#                         "bankRef":jsondecryptResponse.get('bankRef'),
#                         "status":"F",
#                         "statusDesc":"Failed",
#                         "errorCode":"06",
#                         "errorDesc":"VA_Number_Already_Updated"
#                         }
#                         save_table.update(errorMessage="Requested duplicate bank reference number.")
#                         responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                         return responseEncrypt
#                     api_key=str(assigned_va_querryset.thirdpartyUserId.apiKey)
#                     webhookURL = str(assigned_va_querryset.thirdpartyUserId.payoutValidationWebhook)
#                     if webhookURL:
#                         headers = {'Content-Type': 'application/json'}
#                         webhookrequestBody = {
#                         "responseStatus":1,
#                         "api_key":api_key,
#                         "responseBody":jsondecryptResponse
#                         }
#                         print(webhookURL,"*****webhookURL****")
#                         print(webhookrequestBody,"*****payload****")
#                         responseData = requests.post(webhookURL, json=webhookrequestBody, headers=headers)
#                         respnseData=json.loads(responseData.text)

#                         if respnseData.get('responseStatus')==1:
#                             responseDict={
#                             "vANum":jsondecryptResponse.get('VANum'),
#                             "bankRef":jsondecryptResponse.get('bankRef'),
#                             "status":"000",
#                             "statusDesc":"Success",
#                             "errorCode":"000",
#                             "errorDesc":"Success"
#                             }
#                             save_table.update(errorMessage="Verified Successfully.")
#                             responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                             return responseEncrypt
#                         else:
#                             responseDict={
#                             "vANum":jsondecryptResponse.get('VANum'),
#                             "bankRef":jsondecryptResponse.get('bankRef'),
#                             "status":"F",
#                             "statusDesc":"Failed",
#                             "errorCode":"06",
#                             "errorDesc":"VA_Number_does_not_exist_or_amount_invalid"
#                             }
#                             save_table.update(errorMessage=respnseData.get('result'))
#                             responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                             return responseEncrypt
#                     else:
#                         responseDict={
#                         "vANum":jsondecryptResponse.get('VANum'),
#                         "bankRef":jsondecryptResponse.get('bankRef'),
#                         "status":"000",
#                         "statusDesc":"Success",
#                         "errorCode":"000",
#                         "errorDesc":"Success"
#                         }
#                         save_table.update(errorMessage="Verified Successfully.")
#                         responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                         return responseEncrypt
#                 else:
#                     responseDict={
#                     "vANum":jsondecryptResponse.get('VANum'),
#                     "bankRef":jsondecryptResponse.get('bankRef'),
#                     "status":"F",
#                     "statusDesc":"Failed",
#                     "errorCode":"06",
#                     "errorDesc":"VA_Number_does_not_exist_or_amount_invalid"
#                     }
#                     save_table.update(errorMessage="Assigned Third Party Merchant Inactivated.")
#                     responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                     return responseEncrypt

#             credit_notification_queryset = CreditNotifications.objects(bankReferenceNumber=str(bankRef)).first()
#             if credit_notification_queryset:
#                 responseDict={
#                 "vANum":jsondecryptResponse.get('VANum'),
#                 "bankRef":jsondecryptResponse.get('bankRef'),
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"06",
#                 "errorDesc":"VA_Number_Already_Updated"
#                 }
#                 save_table.update(errorMessage="Requested duplicate bank reference number.")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt

#             if remitterAc!="":
#                 usersList=[str(each_user.userId.id) for each_user in assigned_va_querryset]
#                 user_kyc_queryset = UserKYC.objects(userId__in=usersList,bankAccountNumber=str(remitterAc),bankStatus="Approved").first()
#                 if not user_kyc_queryset:
#                     save_table.update(errorMessage="Request from invalid Account Number.")
#                     responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                     return responseEncrypt
#                 else:
#                     responseDict={
#                     "vANum":jsondecryptResponse.get('VANum'),
#                     "bankRef":jsondecryptResponse.get('bankRef'),
#                     "status":"000",
#                     "statusDesc":"Success",
#                     "errorCode":"000",
#                     "errorDesc":"Success"
#                     }
#                     save_table.update(errorMessage="Verified Successfully.")
#                     responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                     return responseEncrypt
#             else:
#                 responseDict={
#                 "vANum":jsondecryptResponse.get('VANum'),
#                 "bankRef":jsondecryptResponse.get('bankRef'),
#                 "status":"000",
#                 "statusDesc":"Success",
#                 "errorCode":"000",
#                 "errorDesc":"Success"
#                 }
#                 save_table.update(errorMessage="Verified Successfully.")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt
#         else:
#             save_table.update(errorMessage="Invalid encryption format requested.")
#             responseEncrypt = idfc_encrypt(responseDict,secretKey)
#             return responseEncrypt
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         save_table.update(errorMessage="Invalid format.")
#         responseEncrypt = idfc_encrypt(responseDict,secretKey)
#         return responseEncrypt

# @webhooks.route("/idfcpayoutecollectinstaalertsurl",methods=["POST"])
# def idfcpayoutecollectinstaalertsurl():
#     print(request.headers,"idfcpayoutecollectinstaalertsurl headers")
#     responseDict = {"corRefNo":"","ReqrefNo":"","status":"F","statusDesc":"Failed","errorCode":"1001","errorDesc":"VA_invalid_request"}
#     secretKey="72616d706c65496411634145536b658573616d706c65492568634256536ba876"
    
#     try:
#         encryptedData=request.data
#         virtual_queryset_table = VirtualAccountAlertLogs(
#             encryptedData=encryptedData,
#             createdOn = datetime.datetime.now(),
#             errorMessage="encryptedData",
#             status = 1,
#             )
#         save_table = virtual_queryset_table.save()
        
#         print("idfcpayoutecollectinstaalertsurl encryptedData = ",encryptedData)
#         if encryptedData!="":
#             decrypted_text = idfc_decrypt(encryptedData, secretKey)
#             jsondecryptResponse = json.loads(decrypted_text)

#             customerCode=jsondecryptResponse.get('customerCode')
#             customerName=jsondecryptResponse.get('customerName')
#             productCode=jsondecryptResponse.get('productCode')
#             poolingAccountNumber=jsondecryptResponse.get('poolingAccountNumber')
#             transactionType=jsondecryptResponse.get('transactionType',"")
#             dataKey=jsondecryptResponse.get('dataKey',"")
#             batchAmt=jsondecryptResponse.get('batchAmt')
#             batchAmtCcd=jsondecryptResponse.get('batchAmtCcd',"INR")
#             creditDate=jsondecryptResponse.get('creditDate',"")
#             vaNumber=jsondecryptResponse.get('vaNumber')
#             utrNo=jsondecryptResponse.get('utrNo')
#             creditGenerationTime=jsondecryptResponse.get('creditGenerationTime',"")
#             remitterName=jsondecryptResponse.get('remitterName',"")
#             remitterAccountNumber=jsondecryptResponse.get('remitterAccountNumber',"")
#             productDescription=jsondecryptResponse.get('productDescription',"")
#             remittingBankName=jsondecryptResponse.get('remittingBankName',"")
#             ifscCode=jsondecryptResponse.get('ifscCode',"")
#             save_table.update(
#                 decryptedDict=jsondecryptResponse,
#                 customerCode=customerCode,
#                 customerName=customerName,
#                 paymentType=productCode[:1],
#                 poolingAccountNumber=poolingAccountNumber,
#                 dataKey=dataKey,
#                 currency=batchAmtCcd,
#                 creditDate=creditDate,
#                 creditGenerationTime=creditGenerationTime,
#                 vaNumber=vaNumber,
#                 utrNo=utrNo,
#                 remitterName=remitterName,
#                 remitterAccountNumber=remitterAccountNumber,
#                 productDescription=productDescription,
#                 remittingBankName=remittingBankName,
#                 ifscCode=ifscCode,
#                 amount=float(batchAmt)
#                 )

#             if not customerCode and not customerName and not productCode and not poolingAccountNumber and not batchAmt and not vaNumber and not utrNo and not creditGenerationTime:
#                 responseDict={
#                 "corRefNo":vaNumber,
#                 "ReqrefNo":utrNo,
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"1001",
#                 "errorDesc":"Invalid request"
#                 }
#                 save_table.update(errorMessage="Invalid request .")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt
            
#             if vaNumber=="":
#                 responseDict={
#                 "corRefNo":vaNumber,
#                 "ReqrefNo":utrNo,
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"1001",
#                 "errorDesc":"Invalid request"
#                 }
#                 save_table.update(errorMessage="Invalid request .")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt

#             if customerCode=="" or customerCode!="VIYFPL":
#                 responseDict={
#                 "corRefNo":vaNumber,
#                 "ReqrefNo":utrNo,
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"1001",
#                 "errorDesc":"Invalid request"
#                 }
#                 save_table.update(errorMessage="Invalid Customer Code .")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt
#             if float(batchAmt)<1:
#                 responseDict={
#                 "corRefNo":vaNumber,
#                 "ReqrefNo":utrNo,
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"1002",
#                 "errorDesc":"Invalid Amount."
#                 }
#                 save_table.update(errorMessage="Invalid Amount.")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt

#             virtual_accounts_queryset = VirtualAccounts.objects(status=1,virtualAccountNumber=str(vaNumber)).first()
#             if not virtual_accounts_queryset:
#                 responseDict={
#                 "corRefNo":vaNumber,
#                 "ReqrefNo":utrNo,
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"1001",
#                 "errorDesc":"Invalid Virtual Account Number."
#                 }
#                 save_table.update(errorMessage="Invalid Virtual Account.")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt

#             vacode=vaNumber[5:]
#             escrovacode=vaNumber[5:11]
#             transactionAPIId=''
#             escroaccount=''
#             if virtual_accounts_queryset.gatewayId.status!=1:
#                 responseDict={
#                 "corRefNo":vaNumber,
#                 "ReqrefNo":utrNo,
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"1001",
#                 "errorDesc":"Invalid Virtual Account"
#                 }
#                 save_table.update(errorMessage="Invalid Virtual Account .")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt

#             if not virtual_accounts_queryset.gatewayId.virtualCode==vacode and not escrovacode==virtual_accounts_queryset.gatewayId.lastSixDigits[-6:]:
#                 responseDict={
#                 "corRefNo":vaNumber,
#                 "ReqrefNo":utrNo,
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"1001",
#                 "errorDesc":"Invalid Virtual Account"
#                 }
#                 save_table.update(errorMessage="Invalid Customer Code .")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt

#             transactionAPIId=str(virtual_accounts_queryset.gatewayId.id)
#             benifscCode=str(virtual_accounts_queryset.gatewayId.ifscCode)
#             transactionUniqueId = random_digit_generate(15)
#             orderId = random_digit_generate(15)
#             assigned_va_querryset=AssignedVirtualAccounts.objects(virtualAccountId=str(virtual_accounts_queryset.id))
#             if not assigned_va_querryset:
#                 save_table.update(errorMessage="Virtual Account Number not assigned to any merchant.")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt

#             if assigned_va_querryset.isThirdParty==True:
#                 if assigned_va_querryset.thirdpartyUserId.status==1:
#                     credit_notification_queryset = ThirdPartyCreditNotifications.objects(bankReferenceNumber=str(bankRef)).first()
#                     if credit_notification_queryset:
#                         responseDict={
#                         "corRefNo":vaNumber,
#                         "ReqrefNo":utrNo,
#                         "status":"F",
#                         "statusDesc":"Failed",
#                         "errorCode":"1005",
#                         "errorDesc":"UTR Number already Exists"
#                         }
#                         save_table.update(errorMessage="Requested duplicate bank reference number.")
#                         responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                         return responseEncrypt

#                     api_key=str(assigned_va_querryset.thirdpartyUserId.apiKey)
#                     webhookURL = str(assigned_va_querryset.thirdpartyUserId.payoutAlertsWebhook)
#                     if webhookURL:
#                         headers = {'Content-Type': 'application/json'}
#                         webhookrequestBody = {
#                         "responseStatus":1,
#                         "api_key":api_key,
#                         "responseBody":jsondecryptResponse
#                         }
#                         print(webhookURL,"*****webhookURL****")
#                         print(webhookrequestBody,"*****payload****")
#                         responseData = requests.post(webhookURL, json=webhookrequestBody, headers=headers)
#                         respnseData=json.loads(responseData.text)
#                         if respnseData.get('responseStatus')==1:
#                             userId=str(assigned_va_querryset.thirdpartyUserId.id)
#                             callbacktime=None
#                             if creditGenerationTime:
#                                 callbacktime=datetime.datetime.strptime(creditGenerationTime,"%d-%m-%Y %H:%M:%S")
#                             merchant_queryset = ThirdPartyMerchants.objects(id=userId,status=1).first()
#                             if merchant_queryset:
#                                 payoutBalance=0
#                                 currentBalance=0
#                                 transaction_amount=float(batchAmt)
#                                 merchantPayoutBalance=merchant_queryset.payoutBalance
#                                 merchantCurrentBalance=float(merchantPayoutBalance)+float(transaction_amount)
#                                 merchant_queryset.update(payoutBalance = merchantCurrentBalance)
#                                 payout_table = ThirdPartyFundTransfers(
#                                     userId=userId,
#                                     amount=float(transaction_amount),
#                                     accountType=transactionType,
#                                     remitterAccountNumber=vaNumber,
#                                     remitterAccountIFSCCode=benifscCode,
#                                     remitterName=customerName,
#                                     accountNumber=remitterAccountNumber,
#                                     accountIFSCCode=ifscCode,
#                                     beneficiaryName=remitterName,
#                                     transferType="Credit",
#                                     transactionAPIId=transactionAPIId,
#                                     merchantReferenceNumber=orderId,
#                                     userType = "api",
#                                     apiType = "api",
#                                     transactionData = [jsondecryptResponse],
#                                     payoutResponseCallBackData = [jsondecryptResponse],
#                                     narration=productDescription,
#                                     responseCallBackTime=callbacktime,
#                                     transactionUniqueId = transactionUniqueId,
#                                     createdOn = datetime.datetime.now(),
#                                     previousBalance=merchantPayoutBalance,
#                                     currentBalance=merchantCurrentBalance,
#                                     errorMessage="Success",
#                                     pgOrderId=str(merchant_queryset.merchantUniqueNumber)+'-'+str(orderId),
#                                     status = 1
#                                     )
#                                 save_payout_table = payout_table.save()
#                                 resd=ThirdPartyCreditNotifications(
#                                     ecollectAccoutNo=poolingAccountNumber,
#                                     vaAccoutNo=vaNumber,
#                                     bankReferenceNumber=utrNo,
#                                     transferType=transactionType,
#                                     transactionDate=callbacktime,
#                                     transactionAmount=float(transaction_amount),
#                                     remitterName=remitterName,
#                                     remitterAccountNumber=remitterAccountNumber,
#                                     remitterIfscCode=ifscCode,
#                                     remitterNote=productDescription,
#                                     apiKey="",
#                                     hashValue="",
#                                     transactionUniqueId=transactionUniqueId,
#                                     responseStatus="success",
#                                     transactionAPIId=transactionAPIId,
#                                     createdOn=datetime.datetime.now(),
#                                     requestData=[jsondecryptResponse],
#                                     status=1
#                                     )
#                                 save_credit_table=resd.save()
#                                 save_credit_table.update(userId=ObjectId(userId))
#                             else:
#                                 resd=ThirdPartyCreditNotifications(
#                                     ecollectAccoutNo=poolingAccountNumber,
#                                     vaAccoutNo=vaNumber,
#                                     bankReferenceNumber=utrNo,
#                                     transferType=transactionType,
#                                     transactionDate=callbacktime,
#                                     transactionAmount=float(transaction_amount),
#                                     remitterName=remitterName,
#                                     remitterAccountNumber=remitterAccountNumber,
#                                     remitterIfscCode=ifscCode,
#                                     remitterNote=productDescription,
#                                     apiKey="",
#                                     hashValue="",
#                                     transactionUniqueId=transactionUniqueId,
#                                     responseStatus="success",
#                                     transactionAPIId=transactionAPIId,
#                                     createdOn=datetime.datetime.now(),
#                                     requestData=[jsondecryptResponse],
#                                     status=1
#                                     )
#                                 save_credit_table=resd.save()
#                                 save_credit_table.update(userId=None)
#                             responseDict={
#                             "corRefNo":vaNumber,
#                             "ReqrefNo":utrNo,
#                             "status":"000",
#                             "statusDesc":"Success",
#                             "errorCode":"000",
#                             "errorDesc":"Success"
#                             }
#                             save_table.update(errorMessage="Success")
#                             responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                             return responseEncrypt
#                         else:
#                             responseDict={
#                             "corRefNo":vaNumber,
#                             "ReqrefNo":utrNo,
#                             "status":"F",
#                             "statusDesc":"Failed",
#                             "errorCode":"1005",
#                             "errorDesc":"Invalid Request."
#                             }
#                             save_table.update(errorMessage=respnseData.get('result'))
#                             responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                             return responseEncrypt
#                     else:
#                         responseDict={
#                         "corRefNo":vaNumber,
#                         "ReqrefNo":utrNo,
#                         "status":"F",
#                         "statusDesc":"Failed",
#                         "errorCode":"1005",
#                         "errorDesc":"Invalid Request."
#                         }
#                         save_table.update(errorMessage="Third Party Merchant Webhook Not Available.")
#                         responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                         return responseEncrypt
#                 else:
#                     responseDict={
#                     "corRefNo":vaNumber,
#                     "ReqrefNo":utrNo,
#                     "status":"F",
#                     "statusDesc":"Failed",
#                     "errorCode":"1005",
#                     "errorDesc":"Invalid Request."
#                     }
#                     save_table.update(errorMessage="Third Party Merchant Not Activated.")
#                     responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                     return responseEncrypt

#             credit_notification_queryset = CreditNotifications.objects(bankReferenceNumber=str(bankRef)).first()
#             if credit_notification_queryset:
#                 responseDict={
#                 "corRefNo":vaNumber,
#                 "ReqrefNo":utrNo,
#                 "status":"F",
#                 "statusDesc":"Failed",
#                 "errorCode":"1005",
#                 "errorDesc":"UTR Number already Exists"
#                 }
#                 save_table.update(errorMessage="Requested duplicate bank reference number.")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt

#             if remitterAc!="":
#                 usersList=[str(each_user.userId.id) for each_user in assigned_va_querryset]
#                 user_kyc_queryset = UserKYC.objects(userId__in=usersList,bankAccountNumber=str(remitterAc),bankStatus="Approved").first()
#                 if not user_kyc_queryset:
#                     save_table.update(errorMessage="Request from invalid Account Number.")
#                     responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                     return responseEncrypt
                
#                 userId=str(user_kyc_queryset.userId.id)
#                 callbacktime=None
#                 if creditGenerationTime:
#                     callbacktime=datetime.datetime.strptime(creditGenerationTime,"%d-%m-%Y %H:%M:%S")
#                 merchant_queryset = Users.objects(id=userId,status=1).first()
#                 if merchant_queryset:
#                     payoutBalance=0
#                     currentBalance=0
#                     transaction_amount=float(batchAmt)
#                     merchantPayoutBalance=merchant_queryset.payoutBalance
#                     merchantCurrentBalance=float(merchantPayoutBalance)+float(transaction_amount)
#                     merchant_queryset.update(payoutBalance = merchantCurrentBalance)
#                     payout_table = FundTransfers(
#                         userId=userId,
#                         amount=float(transaction_amount),
#                         accountType=transactionType,
#                         remitterAccountNumber=vaNumber,
#                         remitterAccountIFSCCode=benifscCode,
#                         remitterName=customerName,
#                         accountNumber=remitterAccountNumber,
#                         accountIFSCCode=ifscCode,
#                         beneficiaryName=remitterName,
#                         transferType="Credit",
#                         transactionAPIId=transactionAPIId,
#                         merchantReferenceNumber=orderId,
#                         userType = "api",
#                         apiType = "api",
#                         transactionData = [jsondecryptResponse],
#                         payoutResponseCallBackData = [jsondecryptResponse],
#                         narration=productDescription,
#                         responseCallBackTime=callbacktime,
#                         transactionUniqueId = transactionUniqueId,
#                         createdOn = datetime.datetime.now(),
#                         previousBalance=merchantPayoutBalance,
#                         currentBalance=merchantCurrentBalance,
#                         errorMessage="Success",
#                         pgOrderId=str(merchant_queryset.merchantUniqueNumber)+'-'+str(orderId),
#                         status = 1
#                         )
#                     save_payout_table = payout_table.save()
#                     resd=CreditNotifications(
#                         ecollectAccoutNo=poolingAccountNumber,
#                         vaAccoutNo=vaNumber,
#                         bankReferenceNumber=utrNo,
#                         transferType=transactionType,
#                         transactionDate=callbacktime,
#                         transactionAmount=float(transaction_amount),
#                         remitterName=remitterName,
#                         remitterAccountNumber=remitterAccountNumber,
#                         remitterIfscCode=ifscCode,
#                         remitterNote=productDescription,
#                         apiKey="",
#                         hashValue="",
#                         transactionUniqueId=transactionUniqueId,
#                         responseStatus="success",
#                         transactionAPIId=transactionAPIId,
#                         createdOn=datetime.datetime.now(),
#                         requestData=[jsondecryptResponse],
#                         status=1
#                         )
#                     save_credit_table=resd.save()
#                     save_credit_table.update(userId=ObjectId(userId))
#                 else:
#                     resd=CreditNotifications(
#                         ecollectAccoutNo=poolingAccountNumber,
#                         vaAccoutNo=vaNumber,
#                         bankReferenceNumber=utrNo,
#                         transferType=transactionType,
#                         transactionDate=callbacktime,
#                         transactionAmount=float(transaction_amount),
#                         remitterName=remitterName,
#                         remitterAccountNumber=remitterAccountNumber,
#                         remitterIfscCode=ifscCode,
#                         remitterNote=productDescription,
#                         apiKey="",
#                         hashValue="",
#                         transactionUniqueId=transactionUniqueId,
#                         responseStatus="success",
#                         transactionAPIId=transactionAPIId,
#                         createdOn=datetime.datetime.now(),
#                         requestData=[jsondecryptResponse],
#                         status=1
#                         )
#                     save_credit_table=resd.save()
#                     save_credit_table.update(userId=None)
#                 responseDict={
#                 "corRefNo":vaNumber,
#                 "ReqrefNo":utrNo,
#                 "status":"000",
#                 "statusDesc":"Success",
#                 "errorCode":"000",
#                 "errorDesc":"Success"
#                 }
#                 save_table.update(errorMessage="Success")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt
#             else:
#                 resd=CreditNotifications(
#                     ecollectAccoutNo=poolingAccountNumber,
#                     vaAccoutNo=vaNumber,
#                     bankReferenceNumber=utrNo,
#                     transferType=transactionType,
#                     transactionDate=callbacktime,
#                     transactionAmount=float(transaction_amount),
#                     remitterName=remitterName,
#                     remitterAccountNumber=remitterAccountNumber,
#                     remitterIfscCode=ifscCode,
#                     remitterNote=productDescription,
#                     apiKey="",
#                     hashValue="",
#                     transactionUniqueId=transactionUniqueId,
#                     responseStatus="success",
#                     transactionAPIId=transactionAPIId,
#                     createdOn=datetime.datetime.now(),
#                     requestData=[jsondecryptResponse],
#                     status=1
#                     )
#                 save_credit_table=resd.save()
#                 save_credit_table.update(userId=None)
#                 responseDict={
#                 "corRefNo":vaNumber,
#                 "ReqrefNo":utrNo,
#                 "status":"000",
#                 "statusDesc":"Success",
#                 "errorCode":"000",
#                 "errorDesc":"Success"
#                 }
#                 save_table.update(errorMessage="Success")
#                 responseEncrypt = idfc_encrypt(responseDict,secretKey)
#                 return responseEncrypt
#         else:
#             save_table.update(errorMessage="Invalid request")
#             responseEncrypt = idfc_encrypt(responseDict,secretKey)
#             return responseEncrypt
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         responseEncrypt = idfc_encrypt(responseDict,secretKey)
#         save_table.update(errorMessage="Invalid request")
#         return responseEncrypt

@webhooks.route("/payupaymentcallbackurl",methods=["POST"])
def payupaymentcallbackurl():
    try:
        data_status = {"responseStatus":0,"result":"Invalid Request"}
        print(request.form,"payu payin call back url request.form response result")
        data_status['responseStatus']=1
        data_status['result']="SUCCESS"
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return data_status


@webhooks.route("/setupaymentcallbackurl", methods=["POST"])
def setupaymentcallbackurl():
    secretKey="aecbbe276b1411d057f08d752241aa3c"
    data_status = {"responseStatus": 0, "result": ""}
    print(request.json)
    print("(((((((((((((((((Setu Call Back Response Data)))))))))))))))))")

    pgOrderId = request.json.get("id","")
    payment_datetime = request.json.get("txnTs","")
    bank_ref_id = request.json.get("rrn","")
    customer_vpa = request.json.get("customerVpa","")
    apiMerchantId = request.json.get("merchantId","")
    response_code = request.json.get("status","")
    amount = request.json.get("amount","")
    OrderAmount = request.json.get("amount","")
    currency = request.json.get("currency","")
    transaction_id = request.json.get("txnId","")
    order_id = request.json.get("referenceId","")

    
    requestData = [request.json]
    save_api_webhook_logs_table = save_webhook_logs_data(None,"payin","call_back","setu_payin_call_back_url",None,requestData,"api","")

    errorMessage=""
    if response_code == "success":
        transactionstatus=1
        errorMessage = "Success"
    else:
        transactionstatus=3
        errorMessage="Pending"
        if response_code == "failed":
            transactionstatus=0
            errorMessage="Failed"
        else:
            transactionstatus=3
            errorMessage="Pending"

    setu_payin_callback_request_data={
    "transaction_id":transaction_id,
    "payment_method":"UPI",
    "payment_datetime":payment_datetime,
    "response_code":response_code,
    "response_message":errorMessage,
    "pgOrderId":pgOrderId,
    "client_order_id":order_id,
    "amount":round(float(amount),2),
    "OrderAmount":round(float(OrderAmount),2),
    "currency":currency,
    "description":"",
    "name":"",
    "email":"",
    "phone":"",
    "address_line_1":"",
    "address_line_2":"",
    "city":"",
    "state":"",
    "country":"",
    "zip_code":"",
    "udf1":"",
    "udf2":"",
    "udf3":"",
    "udf4":"",
    "udf5":"",
    "customer_vpa":customer_vpa,
    "apiMerchantId":apiMerchantId,
    "transactionstatus":transactionstatus,
    "errorMessage":errorMessage,
    "hash":"",
    "paymentChannel":"Setu",
    "bank_ref_id":bank_ref_id
    }

    try:
        callbackResponseData = payin_webhook_call_back_update(setu_payin_callback_request_data,save_api_webhook_logs_table)

        data_status["responseStatus"] = callbackResponseData.get("responseStatus")
        data_status["result"] = callbackResponseData.get("result")
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to get pay in call back url!!"
        return data_status

@webhooks.route("/lyrapaymentcallbackurl", methods=["POST"])
def lyrapaymentcallbackurl():
    data_status = {"responseStatus": 0, "result": ""}
    print(request.json)
    print("(((((((((((((((((Lyra Call Back Response Data)))))))))))))))))")

    order_id = request.json.get("orderId", "")
    payment_datetime = request.json.get("date","")
    currency = request.json.get("currency", "INR")
    amount = request.json.get("amount", "")
    attempts = request.json.get("attempts", "")
    transaction_id = request.json.get("uuid", "")
    response_code = request.json.get("status", "")

    transactionsList=request.json.get('transactions')
    customerDict=request.json.get('customer')
    name=customerDict.get('name')
    phone=customerDict.get('phone')
    email=customerDict.get('email')
    bank_ref_id=""
    paymentMode=""
    cardType=""
    cardmasked=""
    issuingBank=""
    customerVpa=""
    payeeVpa=""  
    requestData = [request.json]
    save_api_webhook_logs_table = save_webhook_logs_data(None, "payin", "call_back", "lyra_payment_callback_url", None, requestData, "api", "")

    errorMessage = ""
    if response_code == "PAID":
        transactionstatus = 1
        errorMessage = "Success"
        for each_transaction in transactionsList:
            if each_transaction.get('status')=="ACCEPTED":
                if each_transaction.get('family')=="CARD":
                    if each_transaction.get('cardType')=="CREDIT":
                        paymentMode="CREDIT CARD"
                    else:
                        paymentMode="DEBIT CARD"    
                    bank_ref_id=each_transaction.get('externalId')
                    cardmasked=each_transaction.get('cardLast4')
                    issuingBank=each_transaction.get('issuingBank')
                    if each_transaction.get('scheme')=="MASTERCARD":
                        cardType="MAST"
                    elif each_transaction.get('scheme')=="RUPAY":
                        cardType="RUPAY"
                    elif each_transaction.get('scheme')=="VISA":
                        cardType="VISA"
                    else:
                        cardType=each_transaction.get('scheme')
                elif each_transaction.get('family')=="NET_BANKING":
                    paymentMode="NET BANKING"
                    bank_ref_id=each_transaction.get('externalId')
                elif each_transaction.get('family')=="UPI":
                    paymentMode="UPI"
                    bank_ref_id=each_transaction.get('rrn')
                    customerVpa=each_transaction.get('payerVpa')
                    payeeVpa=each_transaction.get('payeeVpa')
                else:
                    bank_ref_id=each_transaction.get('externalId')
    elif response_code == "DROPPED":
        transactionstatus = 0
        transactionCount=len(transactionsList)-1
        errorMessage = transactionsList[transactionCount]['error']
        payment_option=""
        if 'payment_option' in transactionsList[transactionCount]:
            payment_option=transactionsList[transactionCount]['payment_option']
        else:
            payment_option=transactionsList[transactionCount]['family']
        if payment_option=="NET_BANKING":
            paymentMode="NET BANKING"
            bank_ref_id=transactionsList[transactionCount]['externalId']
        elif payment_option=="UPI":
            paymentMode="UPI"
            bank_ref_id=transactionsList[transactionCount]['rrn']
            customerVpa=transactionsList[transactionCount]['payerVpa']
            payeeVpa=transactionsList[transactionCount]['payeeVpa']
        elif payment_option=="CARD":
            if transactionsList[transactionCount]['cardType']=="CREDIT":
                paymentMode="CREDIT CARD"
            else:
                paymentMode="DEBIT CARD"
            cardmasked=transactionsList[transactionCount]['cardLast4']
            issuingBank=transactionsList[transactionCount]['issuingBank']
            bank_ref_id=""
            if transactionsList[transactionCount]['scheme']=="MASTERCARD":
                cardType="MAST"
            elif transactionsList[transactionCount]['scheme']=="RUPAY":
                cardType="RUPAY"
            elif transactionsList[transactionCount]['scheme']=="VISA":
                cardType="VISA"
            else:
                cardType=transactionsList[transactionCount]['scheme']
    else:
        transactionstatus = 3
        errorMessage = "Pending"

    lyra_callback_request_data = {
    "transaction_id":transaction_id,
    "payment_method":paymentMode,
    "payment_datetime":payment_datetime,
    "response_code":response_code,
    "response_message":errorMessage,
    "pgOrderId":order_id,
    "client_order_id":order_id,
    "amount":round(float(amount)/100,2),
    "OrderAmount":round(float(amount)/100,2),
    "currency":currency,
    "description":"",
    "name":name,
    "email":email,
    "phone":phone,
    "address_line_1":"",
    "address_line_2":"",
    "city":"",
    "state":"",
    "country":"",
    "zip_code":"",
    "udf1":"",
    "udf2":"",
    "udf3":"",
    "udf4":"",
    "udf5":"",
    "customer_vpa":customerVpa,
    "cardType":cardType,
    "cardmasked":cardmasked,
    "issuingBank":issuingBank,
    "payeeVpa":payeeVpa,
    "apiMerchantId":"",
    "transactionstatus":transactionstatus,
    "errorMessage":errorMessage,
    "hash":"",
    "paymentChannel":"Lyra",
    "bank_ref_id":bank_ref_id
    }

    print("(((((__________Lyra_pay_in_data_)))))",lyra_callback_request_data)
    try:
        callbackResponseData = payin_webhook_call_back_update(lyra_callback_request_data, save_api_webhook_logs_table)
        data_status["responseStatus"] = callbackResponseData.get("responseStatus")
        data_status["result"] = callbackResponseData.get("result")
        return jsonify(data_status)
    except Exception as e:
        app.logger.error(traceback.format_exc())  # Keep the current log
        app.logger.error(f"Error in processing Lyra callback: {e}")  # Add this line
        data_status["result"] = f"Unable to process Lyra payment callback! Error: {str(e)}"
        return jsonify(data_status)

@webhooks.route("/payu_utility_payment_response",methods=["POST"])
def payu_utility_payment_response():
    print("payu_utility_payment_response")
    data_status = {"responseStatus": 0, "result": ""}
    # print(request.form,"request.form")
    responseDict = request.form.to_dict()
    # responseDict=request.json
    print(responseDict,"responseDict")
    # // userId = request.json.get("userId","")
    # // categoryId = request.json.get("categoryId",None)
    # // serviceId = request.json.get("serviceId",None)
    # // operatorId = request.json.get("operatorId",None)
    # // transactionAPIId = request.json.get("transactionAPIId",None)
    paymentType = responseDict.get("mode","")
    transactionId = responseDict.get("txnid","")
    # transactionData = request.json.get("transactionData")

    # // billPayment = request.json.get("billPayment",0)
    # payload = request.json.get("payload",'')
    # headers = request.json.get("headers",'')
    # // mobileNumber = request.json.get("mobileNumber","")
    # // categoryName = request.json.get("categoryName","")
    # // serviceName = request.json.get("serviceName","")
    # // operatorName = request.json.get("operatorName","")
    # // amount = request.json.get("amount")
    # // operatorReference = request.json.get("operatorReference","")
    errorMessage = responseDict.get("error_Message","")
    resstatus = responseDict.get("status")
    paymentCategory = responseDict.get("bankcode","")
    mihpayid = responseDict.get("mihpayid","")
    bank_ref_num = responseDict.get("bank_ref_num","")
    paymentchannel = responseDict.get("payment_source","")
    cardNumber = responseDict.get("cardnum","")
    customerVpa = responseDict.get("field1","")
    walletName = responseDict.get("walletName","")
    issuing_bank = responseDict.get("issuing_bank","")
    card_type = responseDict.get("card_type","")
    # accountNumber = responseDict.get("accountNumber","")
    # ifscCode = responseDict.get("ifscCode","")
    # // customeParamsList = request.json.get("customeParamsList",{})
    # transactionData=json.loads(transactionData)
    # transactionData = [transactionData]
    returnurl=domain+"user/#/billpayment/"

    # // transactionId
    print(transactionId,"transactionId")
    

    # // if categoryName and serviceName  and transactionId and mobileNumber and amount and operatorId and transactionAPIId:
    try:
        transaction_query_set = Transactions.objects(transactionId=str(transactionId),status__in=[2]).first()
        if not transaction_query_set:
            redirect_url =returnurl+"U01/PG01"     
            return redirect(redirect_url)
        
        transactionTableId = str(transaction_query_set.id)
        userId=str(transaction_query_set.userId.id)
        redirect_url =returnurl+str(userId)+'/'+str(transactionTableId)
        print(redirect_url,"redirect_url")
        user_queryset = Users.objects(id=str(transaction_query_set.userId.id),status__in=[1]).first()
        if not user_queryset:
            return redirect(redirect_url)
        paymentParams={}
        
        user_kyc_queryset=UserKYC.objects(userId=str(user_queryset.id)).first()
        billPaymentRequestData=[]
        billPaymentResponseData=[]
        status=0
        if resstatus=="success":
            status=1
        if paymentType == "NB" or paymentType == "NEFT" or paymentType == "IMPS":
            paymentParams =  {
                "accountNumber":str(user_kyc_queryset.bankAccountNumber),
                "IFSC":str(user_kyc_queryset.ifscCode)
            }
            if paymentType == "NB":
                paymentmode = "Net Banking"
            else:
                paymentmode = paymentType
        
        elif paymentType == "CC" or paymentType == "DC":
            paymentParams = {
                "cardNumber": cardNumber,
                "authCode": transactionId
            }
            if paymentType == "CC":
                paymentmode = "Credit Card"
                paymentCategory=card_type
            else:
                paymentmode = "Debit Card"
            
        
        elif paymentType == "UPI":
            paymentParams = {"VPA": customerVpa}
            paymentmode = paymentType
        
        else:
            paymentmode = paymentType
        payload = transaction_query_set.payload
        payload['paymentDetails']={
        "params": paymentParams,
        "paymentMode": paymentType
        }
        payload['additionalParams']={
        "agentTxnID": transactionId 
        }
        payload['agentId']="VFIPL20240222"
        headers = transaction_query_set.headers
        # new_payload = payload.update(payload_ext)

        print("payload",payload)
        # print("new_payload",new_payload)
        

        

        transaction_query_set.update(
            paymentType  = paymentType,
            paymentCategory  = paymentCategory,
            cardNumber  = cardNumber,
            customerVpa  = customerVpa,
            walletName  = walletName,
            # accountNumber  = accountNumber,
            # ifscCode  = ifscCode,
            transactionData = [responseDict],
            errorMessage=errorMessage,
            status = status,
            payload=payload,
            headers= headers,
        )

        print("status",status)
        print("transaction_query_set.billPayment",transaction_query_set.billPayment)
        if status==1 and transaction_query_set.billPayment=="1":
            print("headers",headers)
            billPaymentRequestData.append(payload)
            billPaymentRequestData.append(headers)
            billpaymentresult=payuBillPayment(payload,headers)
            if billpaymentresult.get('responseStatus')==1:
                billpaymentresponse=billpaymentresult.get('result')
                billPaymentResponseData.append(billpaymentresponse)
                bbpsoperatorReference=billpaymentresponse.get('payload').get('refId')
                if billpaymentresponse.get('status')=="SUCCESS":
                    print('bbps success')
                    status=1
                    errorMessage=billpaymentresponse.get('status')
                    try:
                        merchantName = str(user_queryset.fullName)
                        phoneNumber = str(user_queryset.phoneNumber)
                        merchantEmail = str(user_queryset.email)
                        tramount=formatINR("{:.2f}".format(float(transaction_query_set.amount)))
                        smsResponse=send_sms(phoneNumber,"Bill_Payment_Success","","",str(tramount),str(transaction_query_set.serviceName),str(transactionId))
                        createdOn=transaction_query_set.createdOn
                        trnsactionDate = datetime.datetime.now().strftime("%d-%m-%Y %I:%M %p")
                        mail_subject = "Bill Payment of "+str(tramount)+" was successful for "+str(transaction_query_set.serviceName)
                        recipients_list = [merchantEmail]
                        template_name = "emails/billpayment.html"
                        customeParamsList=transaction_query_set.customeParamsList
                        billerNumber = list(customeParamsList.values())[0]
                        print(billerNumber,"billerNumber")
                        mail_data = {
                        "merchantName":merchantName,
                        "billservicename":str(transaction_query_set.serviceName),
                        "billername":str(transaction_query_set.operatorName),
                        "billerNumber":str(billerNumber),
                        "amount":tramount,
                        "orderId":str(transactionId),
                        "transactionDate":trnsactionDate,
                        }
                        mailoutputData = send_asynchronous_email(mail_subject, recipients_list, template_name, mail_data)
                    except Exception as e:
                        app.logger.error(traceback.format_exc())
                        pass
                elif billpaymentresponse.get('status')=="FAILURE":
                    status=0
                    errorMessage="Payment Failed. if amount debited from your account it will be refund."

                transaction_query_set.update(billPaymentRequestData=billPaymentRequestData,billPaymentResponseData=billPaymentResponseData,operatorReference=bbpsoperatorReference,errorMessage=errorMessage)
        if status:
            return redirect(redirect_url)
        else:
            return redirect(redirect_url)
    except Exception as e:
        app.logger.error(traceback.format_exc())
        print("---------------------error exception------------------------")
        redirect_url =returnurl+"U01/PG01"
        return redirect(redirect_url)

def ecollect_insta_alert_details(vaNumber,customerCode,batchAmt,utrNo,transactionType,customerName,remitterAccountNumber,ifscCode,remitterName,productDescription,poolingAccountNumber,responseDict):
    data_status = {"responseStatus":0,"result":""}
    try:
        if vaNumber=="":
            data_status["result"]="Invalid request!!"
            return data_status

        if float(batchAmt)<1:
            data_status["result"]="Invalid amount!!"
            return data_status

        virtual_accounts_queryset = VirtualAccounts.objects(status=1,virtualAccountNumber=str(vaNumber)).first()
        if not virtual_accounts_queryset:
            data_status["result"]="Invalid Virtual Account!!"
            return data_status

        vacode=vaNumber[5:]
        escrovacode=vaNumber[5:11]
        transactionAPIId=''
        escroaccount=''
        if virtual_accounts_queryset.gatewayId.status!=1:
            data_status["result"]="Invalid Virtual Account!!"
            return data_status

        # if not virtual_accounts_queryset.gatewayId.virtualCode==vacode and not escrovacode==virtual_accounts_queryset.gatewayId.lastSixDigits[:-6]:
        #     data_status["result"]="Invalid Customer Code!!"
        #     return data_status

        transactionAPIId=str(virtual_accounts_queryset.gatewayId.id)
        benifscCode=str(virtual_accounts_queryset.gatewayId.ifscCode)
        transactionUniqueId = random_digit_generate(15)
        orderId = random_digit_generate(15)

        assigned_va_querryset=AssignedVirtualAccounts.objects(virtualAccountId=str(virtual_accounts_queryset.id)).first()
        if not assigned_va_querryset:
            data_status["result"]="Virtual Account Number not assigned to any merchant!!"
            return data_status

        if assigned_va_querryset.isThirdParty==True:
            if assigned_va_querryset.thirdpartyUserId.status==1:
                credit_notification_queryset = ThirdPartyCreditNotifications.objects(bankReferenceNumber=str(utrNo)).first()
                if credit_notification_queryset:
                    data_status["result"]="UTR Number already Exists!!"
                    return data_status

                api_key=str(assigned_va_querryset.thirdpartyUserId.apiKey)
                webhookURL = str(assigned_va_querryset.thirdpartyUserId.payoutAlertsWebhook)
                if webhookURL:
                    headers = {'Content-Type': 'application/json'}
                    webhookrequestBody = {
                    "responseStatus":1,
                    "api_key":api_key,
                    "responseBody":responseDict
                    }
                    print(webhookURL,"*****webhookURL****")
                    print(webhookrequestBody,"*****payload****")
                    responseData = requests.post(webhookURL, json=webhookrequestBody, headers=headers)
                    respnseData=json.loads(responseData.text)
                    print(respnseData,"respnseData")
                    if respnseData.get('responseStatus')==1:
                        userId=str(assigned_va_querryset.thirdpartyUserId.id)
                        callbacktime=None
                        # if creditGenerationTime:
                        #     callbacktime=datetime.datetime.strptime(creditGenerationTime,"%d-%m-%Y %H:%M:%S")
                        merchant_queryset = ThirdPartyMerchants.objects(id=userId,status=1).first()
                        if merchant_queryset:
                            payoutBalance=0
                            currentBalance=0
                            transaction_amount=float(batchAmt)
                            merchantPayoutBalance=merchant_queryset.payoutBalance
                            merchantCurrentBalance=float(merchantPayoutBalance)+float(transaction_amount)
                            merchant_queryset.update(payoutBalance = merchantCurrentBalance)
                            payout_table = ThirdPartyFundTransfers(
                                userId=userId,
                                amount=float(transaction_amount),
                                accountType=transactionType,
                                remitterAccountNumber=vaNumber,
                                remitterAccountIFSCCode=benifscCode,
                                remitterName=customerName,
                                accountNumber=remitterAccountNumber,
                                accountIFSCCode=ifscCode,
                                beneficiaryName=remitterName,
                                transferType="Credit",
                                transactionAPIId=transactionAPIId,
                                merchantReferenceNumber=orderId,
                                userType = "api",
                                apiType = "api",
                                transactionData = [responseDict],
                                payoutResponseCallBackData = [responseDict],
                                narration=productDescription,
                                responseCallBackTime=callbacktime,
                                transactionUniqueId = transactionUniqueId,
                                createdOn = datetime.datetime.now(),
                                previousBalance=merchantPayoutBalance,
                                currentBalance=merchantCurrentBalance,
                                errorMessage="Success",
                                pgOrderId=str(orderId),
                                status = 1
                                )
                            save_payout_table = payout_table.save()
                            resd=ThirdPartyCreditNotifications(
                                ecollectAccoutNo=poolingAccountNumber,
                                vaAccoutNo=vaNumber,
                                bankReferenceNumber=utrNo,
                                transferType=transactionType,
                                transactionDate=callbacktime,
                                transactionAmount=float(transaction_amount),
                                remitterName=remitterName,
                                remitterAccountNumber=remitterAccountNumber,
                                remitterIfscCode=ifscCode,
                                remitterNote=productDescription,
                                apiKey="",
                                hashValue="",
                                transactionUniqueId=transactionUniqueId,
                                responseStatus="success",
                                transactionAPIId=transactionAPIId,
                                createdOn=datetime.datetime.now(),
                                requestData=[responseDict],
                                status=1
                                )
                            save_credit_table=resd.save()
                            save_credit_table.update(userId=ObjectId(userId))
                        else:
                            resd=ThirdPartyCreditNotifications(
                                ecollectAccoutNo=poolingAccountNumber,
                                vaAccoutNo=vaNumber,
                                bankReferenceNumber=utrNo,
                                transferType=transactionType,
                                transactionDate=callbacktime,
                                transactionAmount=float(transaction_amount),
                                remitterName=remitterName,
                                remitterAccountNumber=remitterAccountNumber,
                                remitterIfscCode=ifscCode,
                                remitterNote=productDescription,
                                apiKey="",
                                hashValue="",
                                transactionUniqueId=transactionUniqueId,
                                responseStatus="success",
                                transactionAPIId=transactionAPIId,
                                createdOn=datetime.datetime.now(),
                                requestData=[responseDict],
                                status=1
                                )
                            save_credit_table=resd.save()
                            save_credit_table.update(userId=None)

                        data_status["responseStatus"]=1
                        data_status["result"]="Success"
                        return data_status
                    else:
                        data_status["result"]="Invalid request!!"
                        return data_status
                else:
                    responseDict={
                    "corRefNo":vaNumber,
                    "ReqrefNo":utrNo,
                    "status":"F",
                    "statusDesc":"Failed",
                    "errorCode":"1005",
                    "errorDesc":"Invalid Request."
                    }
                    data_status["result"]="Invalid request!!"
                    return data_status
            else:
                data_status["result"]="Invalid request data!!"
                return data_status

        credit_notification_queryset = CreditNotifications.objects(bankReferenceNumber=str(utrNo)).first()
        if credit_notification_queryset:
            data_status["result"]="UTR Number already Exists!!"
            return data_status

        if remitterAccountNumber!="":
            usersList=[str(each_user.userId.id) for each_user in assigned_va_querryset]
            user_kyc_queryset = UserKYC.objects(userId__in=usersList,bankAccountNumber=str(remitterAccountNumber),bankStatus="Approved").first()
            if not user_kyc_queryset:
                data_status["result"]="Request from invalid account number!!"
                return data_status
            
            userId=str(user_kyc_queryset.userId.id)
            callbacktime=None
            if creditGenerationTime:
                callbacktime=datetime.datetime.strptime(creditGenerationTime,"%d-%m-%Y %H:%M:%S")
            merchant_queryset = Users.objects(id=userId,status=1).first()
            if merchant_queryset:
                payoutBalance=0
                currentBalance=0
                transaction_amount=float(batchAmt)
                merchantPayoutBalance=merchant_queryset.payoutBalance
                merchantCurrentBalance=float(merchantPayoutBalance)+float(transaction_amount)
                merchant_queryset.update(payoutBalance = merchantCurrentBalance)
                payout_table = FundTransfers(
                    userId=userId,
                    amount=float(transaction_amount),
                    accountType=transactionType,
                    remitterAccountNumber=vaNumber,
                    remitterAccountIFSCCode=benifscCode,
                    remitterName=customerName,
                    accountNumber=remitterAccountNumber,
                    accountIFSCCode=ifscCode,
                    beneficiaryName=remitterName,
                    transferType="Credit",
                    transactionAPIId=transactionAPIId,
                    merchantReferenceNumber=orderId,
                    userType = "api",
                    apiType = "api",
                    transactionData = [jsondecryptResponse],
                    payoutResponseCallBackData = [jsondecryptResponse],
                    narration=productDescription,
                    responseCallBackTime=callbacktime,
                    transactionUniqueId = transactionUniqueId,
                    createdOn = datetime.datetime.now(),
                    previousBalance=merchantPayoutBalance,
                    currentBalance=merchantCurrentBalance,
                    errorMessage="Success",
                    pgOrderId=str(merchant_queryset.merchantUniqueNumber)+'-'+str(orderId),
                    status = 1
                    )
                save_payout_table = payout_table.save()
                resd=CreditNotifications(
                    ecollectAccoutNo=poolingAccountNumber,
                    vaAccoutNo=vaNumber,
                    bankReferenceNumber=utrNo,
                    transferType=transactionType,
                    transactionDate=callbacktime,
                    transactionAmount=float(transaction_amount),
                    remitterName=remitterName,
                    remitterAccountNumber=remitterAccountNumber,
                    remitterIfscCode=ifscCode,
                    remitterNote=productDescription,
                    apiKey="",
                    hashValue="",
                    transactionUniqueId=transactionUniqueId,
                    responseStatus="success",
                    transactionAPIId=transactionAPIId,
                    createdOn=datetime.datetime.now(),
                    requestData=[jsondecryptResponse],
                    status=1
                    )
                save_credit_table=resd.save()
                save_credit_table.update(userId=ObjectId(userId))
            else:
                resd=CreditNotifications(
                    ecollectAccoutNo=poolingAccountNumber,
                    vaAccoutNo=vaNumber,
                    bankReferenceNumber=utrNo,
                    transferType=transactionType,
                    transactionDate=callbacktime,
                    transactionAmount=float(transaction_amount),
                    remitterName=remitterName,
                    remitterAccountNumber=remitterAccountNumber,
                    remitterIfscCode=ifscCode,
                    remitterNote=productDescription,
                    apiKey="",
                    hashValue="",
                    transactionUniqueId=transactionUniqueId,
                    responseStatus="success",
                    transactionAPIId=transactionAPIId,
                    createdOn=datetime.datetime.now(),
                    requestData=[jsondecryptResponse],
                    status=1
                    )
                save_credit_table=resd.save()
                save_credit_table.update(userId=None)
            data_status["responseStatus"]=1
            data_status["result"]="Success"
            return data_status
        else:
            resd=CreditNotifications(
                ecollectAccoutNo=poolingAccountNumber,
                vaAccoutNo=vaNumber,
                bankReferenceNumber=utrNo,
                transferType=transactionType,
                transactionDate=callbacktime,
                transactionAmount=float(transaction_amount),
                remitterName=remitterName,
                remitterAccountNumber=remitterAccountNumber,
                remitterIfscCode=ifscCode,
                remitterNote=productDescription,
                apiKey="",
                hashValue="",
                transactionUniqueId=transactionUniqueId,
                responseStatus="success",
                transactionAPIId=transactionAPIId,
                createdOn=datetime.datetime.now(),
                requestData=[jsondecryptResponse],
                status=1
                )
            save_credit_table=resd.save()
            save_credit_table.update(userId=None)
            data_status["responseStatus"]=1
            data_status["result"]="Success"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get request data!!"
        return data_status


@webhooks.route("/idfcpayoutecollectinstaalertsurl",methods=["POST"])
def idfcpayoutecollectinstaalertsurl():
    print(request.headers,"idfcpayoutecollectinstaalertsurl headers")
    responseDict = {"corRefNo":"","ReqrefNo":"","status":"F","statusDesc":"Failed","errorCode":"1001","errorDesc":"VA_invalid_request"}
    secretKey="72616d706c65496411634145536b658573616d706c65492568634256536ba876"
    
    try:
        encryptedData=request.data
        virtual_queryset_table = VirtualAccountAlertLogs(
            encryptedData=encryptedData,
            createdOn = datetime.datetime.now(),
            errorMessage="encryptedData",
            status = 1,
            )
        save_table = virtual_queryset_table.save()
        
        print("idfcpayoutecollectinstaalertsurl encryptedData = ",encryptedData)
        if encryptedData!="":
            decrypted_text = idfc_decrypt(encryptedData, secretKey)
            jsondecryptResponse = json.loads(decrypted_text)
            print(jsondecryptResponse,"((((((((((Json Decrypted Response))))))))))")

            customerCode=jsondecryptResponse.get('customerCode')
            customerName=jsondecryptResponse.get('customerName')
            productCode=jsondecryptResponse.get('productCode')
            poolingAccountNumber=jsondecryptResponse.get('poolingAccountNumber')
            transactionType=jsondecryptResponse.get('transactionType',"")
            dataKey=jsondecryptResponse.get('dataKey',"")
            batchAmt=jsondecryptResponse.get('batchAmt')
            batchAmtCcd=jsondecryptResponse.get('batchAmtCcd',"INR")
            creditDate=jsondecryptResponse.get('creditDate',"")
            vaNumber=jsondecryptResponse.get('vaNumber')
            utrNo=jsondecryptResponse.get('utrNo')
            creditGenerationTime=jsondecryptResponse.get('creditGenerationTime',"")
            remitterName=jsondecryptResponse.get('remitterName',"")
            remitterAccountNumber=jsondecryptResponse.get('remitterAccountNumber',"")
            productDescription=jsondecryptResponse.get('productDescription',"")
            remittingBankName=jsondecryptResponse.get('remittingBankName',"")
            ifscCode=jsondecryptResponse.get('ifscCode',"")
            save_table.update(
                decryptedDict=jsondecryptResponse,
                customerCode=customerCode,
                customerName=customerName,
                paymentType=productCode[:1],
                poolingAccountNumber=poolingAccountNumber,
                dataKey=dataKey,
                currency=batchAmtCcd,
                creditDate=creditDate,
                creditGenerationTime=creditGenerationTime,
                vaNumber=vaNumber,
                utrNo=utrNo,
                remitterName=remitterName,
                remitterAccountNumber=remitterAccountNumber,
                productDescription=productDescription,
                remittingBankName=remittingBankName,
                ifscCode=ifscCode,
                amount=float(batchAmt)
                )

            if not customerCode and not customerName and not productCode and not poolingAccountNumber and not batchAmt and not vaNumber and not utrNo and not creditGenerationTime:
                responseDict={
                "corRefNo":vaNumber,
                "ReqrefNo":utrNo,
                "status":"F",
                "statusDesc":"Failed",
                "errorCode":"1001",
                "errorDesc":"Invalid request"
                }
                save_table.update(errorMessage="Invalid request .")
                responseEncrypt = idfc_encrypt(responseDict,secretKey)
                return responseEncrypt
            responseDict = {
            "customerCode":customerCode,
            "customerName":customerName,
            "productCode":productCode,
            "poolingAccountNumber":poolingAccountNumber,
            "transactionType":transactionType,
            "dataKey":dataKey,
            "batchAmt":batchAmt,
            "batchAmtCcd":batchAmtCcd,
            "creditDate":creditDate,
            "vaNumber":vaNumber,
            "utrNo":utrNo,
            "creditGenerationTime":creditGenerationTime,
            "remitterName":remitterName,
            "remitterAccountNumber":remitterAccountNumber,
            "productDescription":productDescription,
            "remittingBankName":remittingBankName,
            "ifscCode":ifscCode
            }
            ecollect_insta_alert_response = ecollect_insta_alert_details(vaNumber,customerCode,batchAmt,utrNo,transactionType,customerName,remitterAccountNumber,ifscCode,remitterName,productDescription,poolingAccountNumber,utrNo,responseDict)
                
            if ecollect_insta_alert_response.get("responseStatus") == 1:
                responseDict={
                "corRefNo":vaNumber,
                "ReqrefNo":utrNo,
                "status":"000",
                "statusDesc":"Success",
                "errorCode":"000",
                "errorDesc":ecollect_insta_alert_response.get("result")
                }
                save_table.update(errorMessage=ecollect_insta_alert_response.get("result"))
                responseEncrypt = idfc_encrypt(responseDict,secretKey)
                decrypted_text = idfc_decrypt(responseEncrypt, secretKey)
                jsondecryptResponse = json.loads(decrypted_text)
                print(jsondecryptResponse,"FOR SUCCESS IDFC ECOLLECT URL")
                return responseEncrypt
            else:
                responseDict={
                "corRefNo":vaNumber,
                "ReqrefNo":utrNo,
                "status":"F",
                "statusDesc":"Failed",
                "errorCode":"1001",
                "errorDesc":ecollect_insta_alert_response.get("result")
                }
                save_table.update(errorMessage=ecollect_insta_alert_response.get("result"))
                responseEncrypt = idfc_encrypt(responseDict,secretKey)
                decrypted_text = idfc_decrypt(responseEncrypt, secretKey)
                jsondecryptResponse = json.loads(decrypted_text)
                print(jsondecryptResponse,"FOR FAILURE IDFC ECOLLECT URL")
                return responseEncrypt
        else:
            save_table.update(errorMessage="Invalid request")
            responseEncrypt = idfc_encrypt(responseDict,secretKey)
            return responseEncrypt
    except Exception as e:
        app.logger.error(traceback.format_exc())
        responseEncrypt = idfc_encrypt(responseDict,secretKey)
        save_table.update(errorMessage="Invalid request")
        return responseEncrypt


def ecollect_verification_update_details(txnAmt,VANUm,bankRef,jsondecryptResponse,remitterAc):
    data_status = {"responseStatus":0,"result":""}
    try:
        if float(txnAmt)<1:
            data_status["result"]="VA_Number_does_not_exist_or_amount_invalid!!"
            return data_status

        virtual_accounts_queryset = VirtualAccounts.objects(status=1,virtualAccountNumber=str(VANUm)).first()
        print(virtual_accounts_queryset,"virtual_accounts_queryset")
        if not virtual_accounts_queryset:
            data_status["result"]="Invalid Virtual Account!!"
            return data_status
        if virtual_accounts_queryset.gatewayId.status!=1:
            data_status["result"]="Payment gateway in-activated!!"
            return data_status

        assigned_va_querryset=AssignedVirtualAccounts.objects(virtualAccountId=str(virtual_accounts_queryset.id)).first()
        if not assigned_va_querryset:
            data_status["result"]="Virtual Account Number not assigned to anyone!!"
            return data_status

        print(assigned_va_querryset.isThirdParty,"assigned_va_querryset.isThirdParty")

        if assigned_va_querryset.isThirdParty==True:
            if assigned_va_querryset.thirdpartyUserId.status==1:
                credit_notification_queryset = ThirdPartyCreditNotifications.objects(bankReferenceNumber=str(bankRef)).first()
                if credit_notification_queryset:
                    data_status["result"]="Requested duplicate bank reference number!!"
                    return data_status

                api_key=str(assigned_va_querryset.thirdpartyUserId.apiKey)
                webhookURL = str(assigned_va_querryset.thirdpartyUserId.payoutValidationWebhook)
                if webhookURL:
                    headers = {'Content-Type': 'application/json'}
                    webhookrequestBody = {
                    "responseStatus":1,
                    "api_key":api_key,
                    "responseBody":jsondecryptResponse
                    }
                    print(webhookURL,"*****webhookURL****")
                    print(webhookrequestBody,"*****payload****")
                    responseData = requests.post(webhookURL, json=webhookrequestBody, headers=headers)
                    respnseData=json.loads(responseData.text)
                    print(respnseData,"webhookURL respnseData")
                    if respnseData.get('responseStatus')==1:
                        data_status["responseStatus"]=1
                        data_status["result"]="Verified Successfully!"
                        return data_status
                    else:
                        data_status["result"]=respnseData.get("result")
                        return data_status
                else:
                    data_status["responseStatus"]=1
                    data_status["result"]="Verified Successfully!"
                    return data_status
            else:
                data_status["result"]="VA_Number_does_not_exist_or_amount_invalid!!"
                return data_status

        credit_notification_queryset = CreditNotifications.objects(bankReferenceNumber=str(bankRef)).first()
        if credit_notification_queryset:
            data_status["result"]="Requested duplicate bank reference number!!"
            return data_status

        if remitterAc!="":
            usersList=[str(each_user.userId.id) for each_user in assigned_va_querryset]
            user_kyc_queryset = UserKYC.objects(userId__in=usersList,bankAccountNumber=str(remitterAc),bankStatus="Approved").first()
            if not user_kyc_queryset:
                data_status["result"]="Request from invalid Account Number!!"
                return data_status
            else:
                data_status["responseStatus"]=1
                data_status["result"]="Verified Successfully!"
                return data_status
        else:
            data_status["responseStatus"]=1
            data_status["result"]="Verified Successfully!"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get ecollect verification data!!"
        return data_status


@webhooks.route("/idfcpayoutecollectverificationurl",methods=["POST"])
def idfcpayoutecollectverificationurl():
    print("idfcpayoutecollectverificationurl verified")
    print(request.headers,"idfcpayoutecollectverificationurl headers")
    responseDict = {"vANum":"","bankRef":"","status":"F","statusDesc":"Failed","errorCode":"111","errorDesc":"VA_Number_invalid_request"}
    secretKey="72616d706c65496411634145536b658573616d706c65492568634256536ba876"
    
    try:
        encryptedData=request.data
        virtual_queryset_table = VirtualAccountVerificationLogs(
            encryptedData=encryptedData,
            createdOn = datetime.datetime.now(),
            errorMessage="encryptedData",
            status = 1,
            )
        save_table = virtual_queryset_table.save()
        
        print("idfcpayoutecollectverificationurl encryptedData = ",encryptedData)
        if encryptedData!="":
            decrypted_text = idfc_decrypt(encryptedData, secretKey)
            print(decrypted_text,"decrypted_text")
            jsondecryptResponse = json.loads(decrypted_text)
            VANUm=jsondecryptResponse.get('VANum')
            bankRef=jsondecryptResponse.get('bankRef')
            txnAmt=jsondecryptResponse.get('txnAmt')
            remitterAc=jsondecryptResponse.get('remitterAc',"")
            remiterName=jsondecryptResponse.get('remiterName',"")
            remitterAcType=jsondecryptResponse.get('remitterAcType',"")
            remitterBank=jsondecryptResponse.get('remitterBank',"")
            remitterBranch=jsondecryptResponse.get('remitterBranch',"")
            remitterBankifsc=jsondecryptResponse.get('remitterBankifsc',"")
            save_table.update(
                decryptedDict=jsondecryptResponse,
                VANUm=VANUm,
                bankRef=bankRef,
                remitterAc=remitterAc,
                remiterName=remiterName,
                remitterAcType=remitterAcType,
                remitterBank=remitterBank,
                remitterBranch=remitterBranch,
                remitterBankifsc=remitterBankifsc,
                txnAmt=float(txnAmt)
                )
            if not txnAmt and not VANUm and not bankRef:
                responseDict={
                "vANum":jsondecryptResponse.get('VANum'),
                "bankRef":jsondecryptResponse.get('bankRef'),
                "status":"F",
                "statusDesc":"Failed",
                "errorCode":"111",
                "errorDesc":"VA_Number_invalid_request"
                }
                save_table.update(errorMessage="Invalid request details.")
                responseEncrypt = idfc_encrypt(responseDict,secretKey)
                return responseEncrypt

            responseDict = {
            "VANum":VANum,
            "bankRef":bankRef,
            "txnAmt":txnAmt,
            "remitterAc":remitterAc,
            "remiterName":remiterName,
            "remitterAcType":remitterAcType,
            "remitterBank":remitterBank,
            "remitterBranch":remitterBranch,
            "remitterBankifsc":remitterBankifsc
            }
            ecollect_verification_response = ecollect_verification_update_details(txnAmt,VANUm,bankRef,responseDict,remitterAc)
            if ecollect_verification_response.get("responseStatus") == 1:
                responseDict={
                "vANum":jsondecryptResponse.get('VANum'),
                "bankRef":jsondecryptResponse.get('bankRef'),
                "status":"000",
                "statusDesc":"Success",
                "errorCode":"000",
                "errorDesc":ecollect_verification_response.get("result")
                }
                save_table.update(errorMessage=ecollect_verification_response.get("result"))
                responseEncrypt = idfc_encrypt(responseDict,secretKey)
                decrypted_text = idfc_decrypt(responseEncrypt, secretKey)
                jsondecryptResponse = json.loads(decrypted_text)
                print(jsondecryptResponse,"FOR SUCCESS IDFC ECOLLECT URL")
                return responseEncrypt
            else:
                responseDict={
                "vANum":jsondecryptResponse.get('VANum'),
                "bankRef":jsondecryptResponse.get('bankRef'),
                "status":"F",
                "statusDesc":"Failed",
                "errorCode":"02",
                "errorDesc":ecollect_verification_response.get("result")
                }
                save_table.update(errorMessage=ecollect_verification_response.get("result"))
                responseEncrypt = idfc_encrypt(responseDict,secretKey)
                decrypted_text = idfc_decrypt(responseEncrypt, secretKey)
                jsondecryptResponse = json.loads(decrypted_text)
                print(jsondecryptResponse,"FOR FAILURE IDFC ECOLLECT URL")
                return responseEncrypt
        else:
            save_table.update(errorMessage="Invalid encryption format requested.")
            responseEncrypt = idfc_encrypt(responseDict,secretKey)
            return responseEncrypt
    except Exception as e:
        app.logger.error(traceback.format_exc())
        save_table.update(errorMessage="Invalid format.")
        responseEncrypt = idfc_encrypt(responseDict,secretKey)
        return responseEncrypt


@webhooks.route("/axisecollectvalidatecallbackurl",methods=["POST"])
def axisecollectvalidatecallbackurl():
    data_status={"stts_flg":"F","err_cd":"102","message":"Invalid details."}
    print(request.json,"request.json axisecollectvalidatecallbackurl")
    print(request.form,"request.form axisecollectvalidatecallbackurl")
    print(request.data,"request.data axisecollectvalidatecallbackurl")
    # json_data = request.json.get('requestData')
    secretKey = "f51085df02812201344f6f0cb6959647"
    # encryption_data=axis_webhook_encrypt(json.dumps(json_data),secretKey)
    decryptResponse=request.json
    try:
        virtual_queryset_table = VirtualAccountVerificationLogs(
            encryptedData=decryptResponse,
            createdOn = datetime.datetime.now(),
            errorMessage="encryptedData",
            status = 1,
            )
        save_table = virtual_queryset_table.save()

        clientRefNumber=decryptResponse.get('UTR',"")
        Bene_acc_no=decryptResponse.get('Bene_acc_no',"")
        Req_type=decryptResponse.get('Req_type',"")
        Req_dt_time=decryptResponse.get('Req_dt_time',"")
        Txn_amnt=decryptResponse.get('Txn_amnt',"")
        Corp_code=decryptResponse.get('Corp_code',"")
        Pmode=decryptResponse.get('Pmode',"")
        Sndr_acnt=decryptResponse.get('Sndr_acnt',"")
        Sndr_nm=decryptResponse.get('Sndr_nm',"")
        Sndr_ifsc=decryptResponse.get('Sndr_ifsc',"")
        Sndr_acnt1=decryptResponse.get('Sndr_acnt1',"")
        Sndr_nm1=decryptResponse.get('Sndr_nm1',"")
        print(clientRefNumber,"clientRefNumber")
        print(Bene_acc_no,"Bene_acc_no")
        print(Req_type,"Req_type")
        print(Txn_amnt,"Txn_amnt")
        print(Corp_code,"Corp_code")
        print(Pmode,"Pmode")
        print(Sndr_acnt,"Sndr_acnt")
        save_table.update(
            decryptedDict=decryptResponse,
            VANUm=Bene_acc_no,
            bankRef=clientRefNumber,
            remitterAc=Sndr_acnt,
            remiterName=Sndr_nm,
            remitterAcType=Req_type,
            remitterBank="",
            remitterBranch="",
            remitterBankifsc=Sndr_ifsc,
            txnAmt=float(Txn_amnt)
            )
        if not clientRefNumber!="" and not Bene_acc_no!="" and not Req_type!="" and not Req_dt_time!="" and not Txn_amnt!="" and not Corp_code!="" and not Pmode!="" and not Sndr_acnt!="":
            data_status['stts_flg']='F'
            data_status['err_cd']='102'
            data_status['message']='Requested details are invalid!!'
            return data_status

        responseDict = {
            "VANum":Bene_acc_no,
            "bankRef":clientRefNumber,
            "txnAmt":Txn_amnt,
            "remitterAc":Sndr_acnt,
            "remiterName":Sndr_nm,
            "remitterAcType":Req_type,
            "remitterBank":"",
            "remitterBranch":"",
            "remitterBankifsc":Sndr_ifsc
            }
        ecollect_verification_response = ecollect_verification_update_details(Txn_amnt,Bene_acc_no,clientRefNumber,responseDict,Sndr_acnt)
        # ecollect_verification_response = ecollect_verification_update_details(Txn_amnt,Bene_acc_no,clientRefNumber,decryptResponse,Sndr_acnt)
        print(ecollect_verification_response,"ecollect_verification_response")
        if ecollect_verification_response.get("responseStatus") == 1:
            data_status['stts_flg']='S'
            data_status['err_cd']='000'
            data_status['message']='Success'
            save_table.update(errorMessage=ecollect_verification_response.get("result"))
            return data_status
        else:
            data_status['stts_flg']='F'
            data_status['err_cd']='104'
            data_status['message']=ecollect_verification_response.get("result")
            save_table.update(errorMessage=ecollect_verification_response.get("result"))
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        print(data_status,"validation response")
        return data_status

@webhooks.route("/axisecollectnotificationcallbackurl",methods=["POST"])
def axisecollectnotificationcallbackurl():
    data_status={"stts_flg":"F","err_cd":"102","message":"Invalid details."}
    print(request.json,"request.json axisecollectnotificationcallbackurl")
    print(request.form,"request.form axisecollectnotificationcallbackurl")
    print(request.data,"request.data axisecollectnotificationcallbackurl")
    # json_data = request.json.get('requestData')
    secretKey = "f51085df02812201344f6f0cb6959647"
    # encryption_data=axis_webhook_encrypt(json.dumps(json_data),secretKey)
    decryptResponse=request.json
    # print(encryption_data,"encryption axisecollectnotificationcallbackurl")
    try:
        virtual_queryset_table = VirtualAccountAlertLogs(
            encryptedData=decryptResponse,
            createdOn = datetime.datetime.now(),
            errorMessage="decryptResponse",
            status = 1,
            )
        save_table = virtual_queryset_table.save()

        clientRefNumber=decryptResponse.get('UTR',"")
        Bene_acc_no=decryptResponse.get('Bene_acc_no',"")
        Req_type=decryptResponse.get('Req_type',"")
        Req_dt_time=decryptResponse.get('Req_dt_time',"")
        Txn_amnt=decryptResponse.get('Txn_amnt',"")
        Corp_code=decryptResponse.get('Corp_code',"")
        Pmode=decryptResponse.get('Pmode',"")
        Sndr_acnt=decryptResponse.get('Sndr_acnt',"")
        Sndr_nm=decryptResponse.get('Sndr_nm',"")
        Sndr_ifsc=decryptResponse.get('Sndr_ifsc',"")
        Sndr_acnt1=decryptResponse.get('Sndr_acnt1',"")
        Sndr_nm1=decryptResponse.get('Sndr_nm1',"")

        save_table.update(
            decryptedDict=decryptResponse,
            customerCode="",
            customerName="",
            paymentType=Pmode,
            poolingAccountNumber="",
            dataKey="",
            currency="",
            creditDate=Req_dt_time,
            creditGenerationTime=Req_dt_time,
            vaNumber=Bene_acc_no,
            utrNo=clientRefNumber,
            remitterName=Sndr_nm,
            remitterAccountNumber=Sndr_acnt,
            productDescription="",
            remittingBankName="",
            ifscCode=Sndr_ifsc,
            amount=float(Txn_amnt)
            )

        if clientRefNumber!="" and Bene_acc_no!="" and Req_type!="" and Req_dt_time!="" and Txn_amnt!="" and Corp_code!="" and Pmode!="" and Sndr_acnt!="" and Sndr_nm!="":

            responseDict = {
            "customerCode":"",
            "customerName":"",
            "productCode":"",
            "poolingAccountNumber":"",
            "transactionType":Pmode,
            "dataKey":"",
            "batchAmt":Txn_amnt,
            "batchAmtCcd":"",
            "creditDate":Req_dt_time,
            "vaNumber":Bene_acc_no,
            "utrNo":clientRefNumber,
            "creditGenerationTime":Req_dt_time,
            "remitterName":Sndr_nm,
            "remitterAccountNumber":Sndr_acnt,
            "productDescription":"",
            "remittingBankName":"",
            "ifscCode":Sndr_ifsc
            }

            ecollect_insta_alert_response = ecollect_insta_alert_details(Bene_acc_no,None,Txn_amnt,clientRefNumber,Pmode,None,Sndr_acnt,Sndr_ifsc,Sndr_nm,None,None,responseDict)
            if ecollect_insta_alert_response.get("responseStatus") == 1:
                data_status["responseStatus"]=1
                data_status['stts_flg']='S'
                data_status['err_cd']='000'
                data_status['message']='Success'
                save_table.update(errorMessage=ecollect_insta_alert_response.get("result"))
                data_status["result"]=ecollect_insta_alert_response.get("result")
                return data_status
            else:
                data_status['stts_flg']='F'
                data_status['err_cd']='104'
                data_status['message']=ecollect_insta_alert_response.get("result")
                save_table.update(errorMessage=ecollect_insta_alert_response.get("result"))
                return data_status

        else:
            data_status['stts_flg']='F'
            data_status['err_cd']='101'
            data_status['message']='Requested details are invalid.'
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        print("error exeption")
        print(data_status,"notification response")
        return data_status



@webhooks.route("/campusprolinkcallbackurl", methods=["POST"])
def campusprolinkcallbackurl():
    secretKey="f51085df02812201344f6f0cb6959647"
    data_status = {"responseStatus": 0, "result": ""}
   
    print(request.json,"(((((((((CAMPUS CALLBACK RESPONSE)))))))))")
    encrypted_data = request.form.get("msg")
    print(encrypted_data,"(((((((((((((((((encrypted_data)))))))))))))))))")
    print("(((((((((((((((((campuslinkpro Call Back Response Data)))))))))))))))))")
    creditType=""
    card_type=""

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

    # encryptDict = {
    # "encryption_data":encryption_data,
    # "iv":iv
    # }
    # transaction_data = json.loads(decrypted_data)

    requestData = request.json

    transaction_data = requestData.get("responseBody")

    pgOrderId = transaction_data.get("pgOrderId","")
    payment_datetime = transaction_data.get("payment_datetime","")
    bank_ref_id = transaction_data.get("bank_ref_id")
    amount = transaction_data.get("amount")
    OrderAmount = transaction_data.get("amount")
    customer_vpa = ""
    payment_method = transaction_data.get("payment_method","")
    response_code = transaction_data.get("response_code","")
    currency = ""
    transaction_id = transaction_data.get("transaction_id","")
    order_id = transaction_data.get("order_id","")
   

    # pgOrderId = transaction_data.get("pgOrderId","")
    # payment_datetime = transaction_data.get("paymentMethod",{}).get("paymentTransaction",{}).get("dateTime","")
    # bank_ref_id = transaction_data.get("paymentMethod",{}).get("paymentTransaction",{}).get("bankReferenceIdentifier")
    # amount = transaction_data.get("paymentMethod",{}).get("paymentTransaction",{}).get("amount")
    # OrderAmount = transaction_data.get("paymentMethod",{}).get("paymentTransaction",{}).get("amount")
    # customer_vpa = ""
    # payment_method = transaction_data.get("paymentMethod",{}).get("paymentMode","")
    # response_code = transaction_data.get("paymentMethod",{}).get("paymentTransaction",{}).get("statusCode","")
    # currency = ""
    # transaction_id = transaction_data.get("merchantTransactionIdentifier","")
    # order_id = transaction_data.get("merchantTransactionIdentifier","")

    
    requestData = [transaction_data]
    save_api_webhook_logs_table = save_webhook_logs_data(None,"payin","call_back","campusprolinkcallbackurl",None,requestData,"api","")

    errorMessage=""
    if response_code == "0300":
        transactionstatus=1
        errorMessage = "Success"
    else:
        transactionstatus=3
        errorMessage="Pending"
        print("(((((((((response_code)))))))))",response_code)
        if response_code == "0399":
            transactionstatus=0
            errorMessage="Failed"
        else:
            transactionstatus=3
            errorMessage="Pending"

    print(transactionstatus,"TXN STATUS")
    print(response_code,"response_code")
    paymentMode="CREDIT CARD"
    if payment_method=="Card":
        if creditType=="CREDIT":
            paymentMode="CREDIT CARD"
        else:
            paymentMode="DEBIT CARD"
        if card_type=="MASTERCARD":
            cardType="MAST"
        elif card_type=="RUPAY":
            cardType="RUPAY"
        elif card_type=="VISA":
            cardType="VISA"
        else:
            cardType=card_type
    elif payment_method=="Netbanking":
        paymentMode="NET BANKING"
    elif payment_method=="Upi":
        paymentMode="UPI"

    campusprolink_payin_callback_request_data={
    "transaction_id":transaction_id,
    "payment_method":paymentMode,
    "payment_datetime":payment_datetime,
    "response_code":response_code,
    "response_message":errorMessage,
    "pgOrderId":pgOrderId,
    "client_order_id":order_id,
    "amount":round(float(amount),2),
    "OrderAmount":round(float(OrderAmount),2),
    "currency":currency,
    "description":"",
    "name":"",
    "email":"",
    "phone":"",
    "address_line_1":"",
    "address_line_2":"",
    "city":"",
    "state":"",
    "country":"",
    "zip_code":"",
    "udf1":"",
    "udf2":"",
    "udf3":"",
    "udf4":"",
    "udf5":"",
    "customer_vpa":customer_vpa,
    "transactionstatus":transactionstatus,
    "errorMessage":errorMessage,
    "hash":"",
    "paymentChannel":"Worldline",
    "bank_ref_id":bank_ref_id
    }

    try:
        callbackResponseData = payin_webhook_call_back_update(campusprolink_payin_callback_request_data,save_api_webhook_logs_table)

        data_status["responseStatus"] = callbackResponseData.get("responseStatus")
        data_status["result"] = callbackResponseData.get("result")
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to get pay in call back url!!"
        return data_status

### live
        