from appservices.common.util import *
from appservices.common.gold_gateway_common import *
from appservices.common.payment_gateways.wowpe_payment_gateways import *
from appservices.common.payment_gateways.accurepay_payment_gateways import *
from appservices.common.payment_gateways.idfc_payment_gateways import *
from appservices.common.payment_gateways.lyra_payment_gateway import *
from appservices.common.payment_gateways.campuslinkpro_payment_gateway import *
from appservices.common.payment_gateways.getepay_payment_gateway import *

gold_apis = Blueprint("gold_apis",__name__)

csrf.exempt(gold_apis)

@gold_apis.route("/gold_user_balance_check", methods=["POST"])
@encrypt_decrypt_after_login
def gold_user_balance_check():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data

        print("gold_user_balance_check data",data)

        transactionApiId = data.get("transactionApiId")
        userId = data.get("userId")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if(not transactionApiId or not userId):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status

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

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status

        existing_user = GoldUsers.objects(userId=userId, transactionApiId=transactionApiId).first()
        if not existing_user:
            data_status["result"] = "Invalid User Details!!"
            return data_status
        
        safeGoldUserId=existing_user.apiReferenceId

        getUserBalanceDict = common_get_user_balance(transactionApiId=transactionApiId,safeGoldUserId=safeGoldUserId)

        print("((((((((getUserBalanceDict) frontend)))))))",getUserBalanceDict)

        if getUserBalanceDict.get("responseStatus") == 1:
            responseDict = {
                "goldApiUserId":getUserBalanceDict.get("data").get("goldApiUserId"),
                "goldBalance": getUserBalanceDict.get("data").get("goldBalance"),
                "sellableBalance": getUserBalanceDict.get("data").get("sellableBalance"),
            }
            
            data_status["responseStatus"] = 1
            data_status["result"] =  getUserBalanceDict.get("result")
            data_status["userBalanceCheckDict"] = responseDict
        else:
            data_status["result"] =  getUserBalanceDict.get("result")
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Check User Gold Balance. Please Try again"
        return data_status

@gold_apis.route("/gold_fetch_invoice", methods=["POST"])
@encrypt_decrypt_after_login
def gold_fetch_invoice():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data	

        print("request gold_fetch_invoice",data)

        transactionApiId = data.get("transactionApiId")
        userId = data.get("userId")
        transactionId = data.get("transactionId")

    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status
    
    try:
        if (
             not transactionApiId or not userId or not transactionId):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status
        
        user_pincode = str(user_queryset.pincodeId.pincode)

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

        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        existing_user = GoldUsers.objects(
            userId=userId, transactionApiId=transactionApiId,
        ).first()

        if not existing_user:
            data_status["result"] = "Invalid User Details"
            return data_status
        else:
            
            safeGoldUserId=existing_user.apiReferenceId
        
        fetchInvoiceResponseBody = common_fetch_invoice_details(transactionApiId=transactionApiId, tx_id=transactionId)
        print("((((((((fetchInvoiceResponseBody frontend)))))))",fetchInvoiceResponseBody)

        message = fetchInvoiceResponseBody.get("result")
        if fetchInvoiceResponseBody.get("responseStatus") == 1:
            responseDict = {
                "invoiceLink":fetchInvoiceResponseBody.get("data").get("invoiceLink"),
            }
            data_status["responseStatus"] = 1
            data_status["fetchInvoiceDict"] = responseDict
            data_status["result"] = message
        else:
        
            data_status["result"] = message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Get Invoice Details. Please Try again"
        return data_status

#################################################    BUY APIS START  #################################################

@gold_apis.route("/gold_get_buy_price", methods=["POST"])
@encrypt_decrypt_after_login
def gold_get_buy_price():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data

        print("request gold_get_buy_price",data)

        transactionApiId = data.get("transactionApiId")
        userId = data.get("userId")

        
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if (
             not transactionApiId or
              not userId ):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status

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

        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        getPriceResponseDict = common_get_buy_price(transactionApiId=transactionApiId)

        print("((((((((getPriceResponseDict) frontend)))))))",getPriceResponseDict)

        message = getPriceResponseDict.get("result")
        if getPriceResponseDict.get("responseStatus") == 1:
            responseDict = {
                "current_price":getPriceResponseDict.get("data").get("current_price"),
                "rate_id": getPriceResponseDict.get("data").get("rate_id"),
                "applicable_tax": float(getPriceResponseDict.get("data").get("applicable_tax")),
                "rate_validity": getPriceResponseDict.get("data").get("rate_validity"),
            }
            data_status["responseStatus"] = 1
            data_status["getBuyPriceDict"] = responseDict
            data_status["result"] = message
        else:
            data_status["result"] = message
        
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Get Buy Price Balance. Please Try again"
        return data_status
   
@gold_apis.route("/gold_buy_verify", methods=["POST"])
@encrypt_decrypt_after_login
def gold_buy_verify():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data

        print("request gold_buy_verify",data)

        transactionApiId = data.get("transactionApiId")
        userId = data.get("userId")
        rateId = data.get("rateId")
        buyType=data.get("buyType")
        goldValue=data.get("goldValue")
        goldPrice=data.get("goldPrice")
        channelType=data.get("channelType")

        
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if (
             not transactionApiId or not userId or not rateId or not buyType or not goldValue or not goldValue or not goldPrice or not channelType):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status

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

        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        existing_user = GoldUsers.objects(
            userId=userId, transactionApiId=transactionApiId,
        ).first()
        if not existing_user:
            registerUserResponse = common_gold_user_registration(userId,transactionApiId)
            if registerUserResponse.get("responseStatus") == 1:
                safeGoldUserId = registerUserResponse.get("data").get("goldApiUserId")
            else:
                data_status["result"] =  registerUserResponse.get("result")
                return data_status
        else:
            
            safeGoldUserId=existing_user.apiReferenceId

        merchantUniqueNumber=user_queryset.merchantUniqueNumber
        mid_extracted = merchantUniqueNumber[1:].lstrip("0")
        # transactionUniqueId= transaction_id_prefix + mid_extracted + random_digit_generate(15)

        goldCalcResponse =  getGoldAmountByPriceOrWeight(goldPrice=goldPrice,buyType=buyType,goldValue=goldValue,gstInclude=True)
        goldCalcData = goldCalcResponse.get("data")
        goldWeight=goldCalcData.get("goldWeight") ####pre gst amount
        goldBuyPrice=goldCalcData.get("goldBuyPrice")  ######### post gst amount
        
        print("goldCalcResponse",goldCalcResponse )

        verifyBuyResponseDict = common_verify_buy_price( transactionApiId=transactionApiId, safeGoldUserId=safeGoldUserId, rateId=rateId, gold_amount=goldWeight, buy_price=goldBuyPrice)

        print("((((((((verifyBuyResponseDict frontend)))))))",verifyBuyResponseDict)

        message = verifyBuyResponseDict.get("result")
        if verifyBuyResponseDict.get("responseStatus") == 1:
            responseDict = {
                "transactionId":verifyBuyResponseDict.get("data").get("transactionId"),
                "sgRate": verifyBuyResponseDict.get("data").get("sgRate"),
                "goldPurchaseGrams": verifyBuyResponseDict.get("data").get("gold_amount"),
                "buy_price": verifyBuyResponseDict.get("data").get("buy_price"),
                "gst_amount": verifyBuyResponseDict.get("data").get("gst_amount"),
                "pre_gst_buy_price": verifyBuyResponseDict.get("data").get("pre_gst_buy_price")
            }
            data_status["responseStatus"] = 1
            data_status["verifyBuyPriceDict"] = responseDict
            data_status["result"] = message
        else:
        
            data_status["result"] = message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Verify Buy Gold. Please Try again"
        return data_status


# @gold_apis.route("/gold_buy_confirm", methods=["POST"])
def gold_buy_confirm_helper(transactionApiId,userId,transactionId):
    data_status = {"responseStatus": 0, "result":""}
    # transactionApiId = request.json.get("transactionApiId")
    # userId = request.json.get("userId")
    # transactionId = request.json.get("transactionId")

    print("(((((((((((userId)))))))))))",userId)
    print("(((((((((((transactionApiId)))))))))))",transactionApiId)

    try:
        if (
             not transactionApiId or not userId or not transactionId):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status
        
        user_pincode = str(user_queryset.pincodeId.pincode)

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

        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        existing_user = GoldUsers.objects(
            userId=userId, transactionApiId=transactionApiId,
        ).first()

        if not existing_user:
            data_status["result"] = "Invalid User Details"
            return data_status
        else:
            
            safeGoldUserId=existing_user.apiReferenceId

        transaction_records_queryset = GoldTransactions.objects(apiTransactionId=transactionId).first()
        
        if not transaction_records_queryset:
            data_status["result"] = "Invalid Transaction Id!!!!"
            return data_status
        
        confirmBuyResponseDict = common_confirm_buy(transactionApiId=transactionApiId,safeGoldUserId=safeGoldUserId, tx_id=transactionId, pincode=user_pincode)
        print("((((((((confirmBuyResponseDict frontend)))))))",confirmBuyResponseDict)

        message = confirmBuyResponseDict.get("result")
        if confirmBuyResponseDict.get("responseStatus") == 1:
            invoiceId = confirmBuyResponseDict.get("data").get("invoice_id")
            gold_txns_queryset = GoldTransactions.objects(invoiceId=invoiceId).first()
            if gold_txns_queryset:
                data_status["result"] = "Invalid Request"
                return data_status  
            else:
                gold_txns_queryset1 = GoldTransactions.objects(apiTransactionId=transactionId).first()
                gold_txns_queryset1.update(invoiceId=invoiceId)

            buyStatusCheckResponseBody = common_buy_status_check(transactionApiId=transactionApiId, tx_id=transactionId)
            print("((((((((buyStatusCheckResponseBody frontend)))))))",buyStatusCheckResponseBody)

            if buyStatusCheckResponseBody.get("responseStatus") == 1:
                transactionStatus = buyStatusCheckResponseBody.get("data").get("transactionStatus")
                
                gold_txn_queryset = GoldTransactions.objects(goldTransactionApiId=transactionApiId,apiTransactionId=transactionId).first()
                existingStatus = gold_txn_queryset.status
                goldAmount = gold_txn_queryset.goldPurchaseGrams
                goldBalanceAmount = gold_txn_queryset.goldPurchaseAmount
                print("))))))))existingStatus",existingStatus)
                print("))))))))goldAmount",goldAmount)
                if existingStatus == 3:
                    if transactionStatus == 1:
                        gold_txn_queryset.update(status = 1)

                        gold_balance_update = user_gold_balance_update(userId,safeGoldUserId,goldAmount,"Credit",transactionApiId,transactionId,goldBalanceAmount)
                        getUserBalanceDict = common_get_user_balance(transactionApiId=transactionApiId,safeGoldUserId=safeGoldUserId)

                    elif transactionStatus == 0:
                        gold_txn_queryset.update(status = 0)
                    elif transactionStatus == 2:
                        gold_txn_queryset.update(status = 2)
                else:
                    data_status["result"] = "Invalid Request"
                    return data_status

                responseDict = {
                    "invoice_id":buyStatusCheckResponseBody.get("data").get("invoice_id"),
                    "created_at":buyStatusCheckResponseBody.get("data").get("created_at"),
                    "status":buyStatusCheckResponseBody.get("data").get("status"),
                    "transactionStatus":transactionStatus,
                }

                data_status["responseStatus"] = 1
                data_status["confirmBuyPriceDict"] = responseDict
                data_status["result"] = message
            else:
                data_status["result"] = message
        else:
            data_status["result"] = message
        return data_status
    
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Confirm Buy Please Try again"
        return data_status
    

@gold_apis.route("/gold_buy_status_check", methods=["POST"])
@encrypt_decrypt_after_login
def gold_buy_status_check():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data
        
        print("request gold_buy_status_check",data)

        transactionApiId = data.get("transactionApiId")
        userId = data.get("userId")
        transactionId = data.get("transactionId")

        
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if (
             not transactionApiId or not userId or not transactionId):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status
        
        user_pincode = str(user_queryset.pincodeId.pincode)

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

        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        existing_user = GoldUsers.objects(
            userId=userId, transactionApiId=transactionApiId,
        ).first()

        if not existing_user:
            data_status["result"] = "Invalid User Details"
            return data_status
        safeGoldUserId=existing_user.apiReferenceId

        transaction_records_queryset = GoldTransactions.objects(apiTransactionId=transactionId).first()
        
        if not transaction_records_queryset:
            data_status["result"] = "Invalid Transaction Id!!!"
            return data_status
        
        buyStatusCheckResponseBody = common_buy_status_check(transactionApiId=transactionApiId, tx_id=transactionId)
        print("((((((((buyStatusCheckResponseBody frontend)))))))",buyStatusCheckResponseBody)

        message = buyStatusCheckResponseBody.get("result")
        if buyStatusCheckResponseBody.get("responseStatus") == 1:
            transactionStatus = buyStatusCheckResponseBody.get("data").get("transactionStatus")

            gold_txn_queryset = GoldTransactions.objects(goldTransactionApiId=transactionApiId,apiTransactionId=transactionId).first()
            if not gold_txn_queryset: 
                data_status["result"] ="Invalid Transaction Id!!"
                return data_status
            goldAmount = gold_txn_queryset.goldPurchaseGrams
            
            goldBalanceAmount = gold_txn_queryset.goldPurchaseAmount

            if transactionStatus == 1:
                ### pass if status check gave success and we have success
                if gold_txn_queryset.status == 1:
                    pass
                elif gold_txn_queryset.status == 2 or gold_txn_queryset.status == 3 or gold_txn_queryset.status == 0:

                    gold_txn_queryset.update(status = 1)

                    gold_balance_update = user_gold_balance_update(userId,safeGoldUserId,goldAmount,"Credit",transactionApiId,transactionId,goldBalanceAmount)
                    getUserBalanceDict = common_get_user_balance(transactionApiId=transactionApiId,safeGoldUserId=safeGoldUserId)
            elif transactionStatus == 0:
                ### pass if status check gave faile and we have pending or initiated make it fail
                if gold_txn_queryset.status == 2 or gold_txn_queryset.status == 3:
                    gold_txn_queryset.update(status = 0)
                elif gold_txn_queryset.status == 1:
                    #### then reverse the balance so we debit 
                    gold_balance_update = user_gold_balance_update(userId,safeGoldUserId,goldAmount,"Debit",transactionApiId,transactionId,goldBalanceAmount)
                    getUserBalanceDict = common_get_user_balance(transactionApiId=transactionApiId,safeGoldUserId=safeGoldUserId)
            else:### any other just pass
                pass
            responseDict = {
                "invoice_id":buyStatusCheckResponseBody.get("data").get("invoice_id"),
                "created_at":buyStatusCheckResponseBody.get("data").get("created_at"),
                "status":buyStatusCheckResponseBody.get("data").get("status"),
                "transactionStatus":buyStatusCheckResponseBody.get("data").get("transactionStatus"),
            }
            data_status["responseStatus"] = 1
            data_status["buyStatusCheckDict"] = responseDict
            data_status["result"] = message
        else:
        
            data_status["result"] = message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Perform Buy Status Check. Please Try again"
        return data_status

#################################################    BUY APIS END    #################################################

#################################################    Sell Apis End   #################################################
@gold_apis.route("/gold_get_sell_price", methods=["POST"])
@encrypt_decrypt_after_login
def gold_get_sell_price():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data
        
        print("request gold_get_sell_price",data)

        transactionApiId = data.get("transactionApiId")
        userId = data.get("userId")

        
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if (
             not transactionApiId or
              not userId ):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status

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

        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        getPriceResponseDict = common_get_sell_price(transactionApiId=transactionApiId)

        print("((((((((getPriceResponseDict) frontend)))))))",getPriceResponseDict)

        message = getPriceResponseDict.get("result")
        if getPriceResponseDict.get("responseStatus") == 1:
            responseDict = {
                "current_price":getPriceResponseDict.get("data").get("current_price"),
                "rate_id": getPriceResponseDict.get("data").get("rate_id"),
                "rate_validity": getPriceResponseDict.get("data").get("rate_validity"),
            }
            data_status["responseStatus"] = 1
            data_status["getSellPriceDict"] = responseDict
            data_status["result"] = message
        else:
            data_status["result"] = message
        
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Get Sell Price Balance. Please Try again"
        return data_status
   
@gold_apis.route("/gold_sell_verify", methods=["POST"])
@encrypt_decrypt_after_login
def gold_sell_verify():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data
        
        print("request gold_sell_verify",data)

        transactionApiId = data.get("transactionApiId")
        userId = data.get("userId")
        rateId = data.get("rateId")
        sellType=data.get("sellType")
        goldValue=data.get("goldValue")
        goldPrice=data.get("goldPrice")
        channelType=data.get("channelType")

        
    
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if (
             not transactionApiId or not userId or not rateId or not sellType or not goldValue or not goldValue or not goldPrice or not channelType):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status

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

        user_kyc_queryset = UserKYC.objects(userId=userId,status=1).first()
        if user_kyc_queryset.bankStatus != "Approved":
            data_status["result"]="Bank Account Verification is not completed please Complete it!!"
            return data_status
        
        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        existing_user = GoldUsers.objects(
            userId=userId, transactionApiId=transactionApiId,
        ).first()
        if not existing_user:
            data_status["result"] =  "Invalid User Details"
            return data_status
            # registerUserResponse = common_gold_user_registration(userId,transactionApiId)
            # if registerUserResponse.get("responseStatus") == 1:
            #     safeGoldUserId = registerUserResponse.get("data").get("goldApiUserId")
            # else:
            #     data_status["result"] =  registerUserResponse.get("result")
            #     return data_status
        # else:
        #     
        safeGoldUserId=existing_user.apiReferenceId

        merchantUniqueNumber=user_queryset.merchantUniqueNumber
        mid_extracted = merchantUniqueNumber[1:].lstrip("0")
        transactionUniqueId= transaction_id_prefix + mid_extracted + random_digit_generate(15)

        goldCalcResponse =  getGoldAmountByPriceOrWeight(goldPrice=goldPrice,buyType=sellType,goldValue=goldValue,gstInclude=False)
        goldCalcData = goldCalcResponse.get("data")
        goldWeight=goldCalcData.get("goldWeight") ####pre gst amount
        goldSellPrice=goldCalcData.get("goldBuyPrice")  ######### post gst amount
        
        verifySellResponseDict = common_verify_sell_price(transactionApiId=transactionApiId,safeGoldUserId=safeGoldUserId, rateId=rateId, gold_amount=goldWeight,sell_price=goldSellPrice,channelType=channelType,userId=userId,goldPrice=goldPrice,transactionUniqueId=transactionUniqueId)

        print("((((((((verifySellResponseDict frontend)))))))",verifySellResponseDict)

        message = verifySellResponseDict.get("result")
        if verifySellResponseDict.get("responseStatus") == 1:
            responseDict = {
                "transactionId":verifySellResponseDict.get("data").get("transactionId"),
                "rate_id": verifySellResponseDict.get("data").get("rate_id"),
                "sgRate": verifySellResponseDict.get("data").get("sgRate"),
                "goldPurchaseGrams": verifySellResponseDict.get("data").get("gold_amount"),
                "sell_price": verifySellResponseDict.get("data").get("sell_price"),
            }
            data_status["responseStatus"] = 1
            data_status["sellVerifyDict"] = responseDict
            data_status["result"] = message
        else:
        
            data_status["result"] = message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Verify Sell Gold. Please Try again"
        return data_status

@gold_apis.route("/gold_sell_confirm", methods=["POST"])
@encrypt_decrypt_after_login
def gold_sell_confirm():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data
        
        print("request gold_sell_confirm",data)

        transactionApiId = data.get("transactionApiId")
        userId = data.get("userId")
        transactionId = data.get("transactionId")

        
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if (
             not transactionApiId or not userId or not transactionId):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status
        
        user_pincode = str(user_queryset.pincodeId.pincode)

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

        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        user_kyc_queryset = UserKYC.objects(userId=userId,status=1).first()
        if user_kyc_queryset.bankStatus != "Approved":
            data_status["result"]="Bank Account Verification is not completed please Complete it!!"
            return data_status

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        existing_user = GoldUsers.objects(
            userId=userId, transactionApiId=transactionApiId,
        ).first()

        if not existing_user:
            data_status["result"] = "Invalid User Details"
            return data_status
        else: 
            
            safeGoldUserId=existing_user.apiReferenceId

        transaction_records_queryset = GoldTransactions.objects(apiTransactionId=transactionId).first()
        
        if not transaction_records_queryset:
            data_status["result"] = "Invalid Transaction Id"
            return data_status
        
        confirmSellResponseDict = common_confirm_sell(transactionApiId=transactionApiId,safeGoldUserId=safeGoldUserId, tx_id=transactionId, pincode=user_pincode)
        print("((((((((confirmSellResponseDict frontend)))))))",confirmSellResponseDict)

        message = confirmSellResponseDict.get("result")
        if confirmSellResponseDict.get("responseStatus") == 1:
            invoiceId = confirmSellResponseDict.get("data").get("invoice_id")
            gold_txns_queryset = GoldTransactions.objects(invoiceId=invoiceId).first()
            if gold_txns_queryset:
                data_status["result"] = "Invalid Request"
                return data_status
            else:
                gold_txns_queryset1 = GoldTransactions.objects(apiTransactionId=transactionId).first()
                gold_txns_queryset1.update(invoiceId=invoiceId)

            sellStatusCheckResponseBody = common_sell_status_check(transactionApiId=transactionApiId, tx_id=transactionId)

            print("((((((((sellStatusCheckResponseBody frontend)))))))",sellStatusCheckResponseBody)
            message = sellStatusCheckResponseBody.get("result")

            if sellStatusCheckResponseBody.get("responseStatus") == 1:

                transactionStatus = sellStatusCheckResponseBody.get("data").get("transactionStatus")

                gold_txn_queryset = GoldTransactions.objects(goldTransactionApiId=transactionApiId,apiTransactionId=transactionId).first()
                existingStatus = gold_txn_queryset.status
                goldAmount = gold_txn_queryset.goldPurchaseGrams ### purchaseamount key can be used for sell its just key name 
                goldBalanceAmount = gold_txn_queryset.goldPurchaseAmount
                walletId = gold_txn_queryset.id
                print("))))))))existingStatus",existingStatus)
                print("))))))))goldAmount",goldAmount)

                if existingStatus == 3:
                    if transactionStatus == 1:
                        gold_txn_queryset.update(status = 1)
                        gold_txn_queryset.update(bankStatus = 2)
                        gold_txn_queryset.update(bankAccountNumber = user_kyc_queryset.bankAccountNumber)
                        gold_txn_queryset.update(ifscCode = user_kyc_queryset.ifscCode)
                        gold_txn_queryset.update(originalBankName = user_kyc_queryset.originalBankName)
                        gold_balance_update = user_gold_balance_update(userId,safeGoldUserId,goldAmount,"Debit",transactionApiId,transactionId,goldBalanceAmount)
                        getUserBalanceDict = common_get_user_balance(transactionApiId=transactionApiId,safeGoldUserId=safeGoldUserId)

                    elif transactionStatus == 0:
                        gold_txn_queryset.update(status = 0)
                    elif transactionStatus == 2:
                        gold_txn_queryset.update(status = 2)
                else:
                    data_status["result"] = "Invalid Request"
                    return data_status

                responseDict = {
                    "invoice_id":sellStatusCheckResponseBody.get("data").get("invoice_id"),
                    "created_at":sellStatusCheckResponseBody.get("data").get("created_at"),
                    "status":sellStatusCheckResponseBody.get("data").get("status"),
                    "transactionStatus":transactionStatus,
                    "walletId":str(walletId),
                }

                data_status["responseStatus"] = 1
                data_status["sellConfirmDict"] = responseDict
                data_status["result"] = message
            else:
                data_status["result"] = message
        else:
            data_status["result"] = message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Confirm Buy Please Try again"
        return data_status

@gold_apis.route("/gold_sell_status_check", methods=["POST"])
@encrypt_decrypt_after_login
def gold_sell_status_check():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data
        
        print("request gold_sell_status_check",data)

        transactionApiId = data.get("transactionApiId")
        userId = data.get("userId")
        transactionId = data.get("transactionId")

        
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if (
             not transactionApiId or not userId or not transactionId):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status
        
        # user_pincode = str(user_queryset.pincodeId.pincode)

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

        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        existing_user = GoldUsers.objects( userId=userId, transactionApiId=transactionApiId).first()

        if not existing_user:
            data_status["result"] = "Invalid User Details"
            return data_status
        safeGoldUserId=existing_user.apiReferenceId

        transaction_records_queryset = GoldTransactions.objects(apiTransactionId=transactionId).first()
        
        if not transaction_records_queryset:
            data_status["result"] = "Invalid Transaction Id"
            return data_status
        
        sellStatusCheckResponseBody = common_sell_status_check(transactionApiId=transactionApiId, tx_id=transactionId)
        print("((((((((sellStatusCheckResponseBody frontend)))))))",sellStatusCheckResponseBody)

        message = sellStatusCheckResponseBody.get("result")
        if sellStatusCheckResponseBody.get("responseStatus") == 1:

            transactionStatus = sellStatusCheckResponseBody.get("data").get("transactionStatus")

            gold_txn_queryset = GoldTransactions.objects(goldTransactionApiId=transactionApiId,apiTransactionId=transactionId).first()

            goldAmount = gold_txn_queryset.goldPurchaseGrams
            goldBalanceAmount = gold_txn_queryset.goldPurchaseAmount
            if transactionStatus == 1:
                ### pass if status check gave success and we have success
                if gold_txn_queryset.status == 1:
                    pass
                elif gold_txn_queryset.status == 2 or gold_txn_queryset.status == 3 or gold_txn_queryset.status == 0:

                    gold_txn_queryset.update(status = 1)
                    gold_balance_update = user_gold_balance_update(userId,safeGoldUserId,goldAmount,"Debit",transactionApiId,transactionId,goldBalanceAmount)
                    getUserBalanceDict = common_get_user_balance(transactionApiId=transactionApiId,safeGoldUserId=safeGoldUserId)
            elif transactionStatus == 0:
                ### pass if status check gave faile and we have pending or initiated make it fail
                if gold_txn_queryset.status == 2 or gold_txn_queryset.status == 3:
                    gold_txn_queryset.update(status = 0)
                elif gold_txn_queryset.status == 1:
                    #### then reverse the balance so we debit 
                    gold_balance_update = user_gold_balance_update(userId,safeGoldUserId,goldAmount,"Credit",transactionApiId,transactionId,goldBalanceAmount)
                    getUserBalanceDict = common_get_user_balance(transactionApiId=transactionApiId,safeGoldUserId=safeGoldUserId)
            else:### any other just pass
                pass
            responseDict = {
                "invoice_id":sellStatusCheckResponseBody.get("data").get("invoice_id"),
                "created_at":sellStatusCheckResponseBody.get("data").get("created_at"),
                "status":sellStatusCheckResponseBody.get("data").get("status"),
                "transactionStatus":sellStatusCheckResponseBody.get("data").get("transactionStatus"),
            }

            data_status["responseStatus"] = 1
            data_status["sellStatusCheckDict"] = responseDict
            data_status["result"] = message
        else:
        
            data_status["result"] = message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Perform Buy Status Check. Please Try again"
        return data_status

#################################################    Sell APIS END    #################################################

@gold_apis.route("/gold_user_kyc_update", methods=["POST"])
@encrypt_decrypt_after_login
def gold_user_kyc_update():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data
        
        print("request gold_user_kyc_update",data)
        transactionApiId = data.get("transactionApiId")
        userId = data.get("userId")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if ( not transactionApiId or not userId ):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status

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

        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status

        existing_user = GoldUsers.objects(
            userId=userId, transactionApiId=transactionApiId,
        ).first()
        if not existing_user:
            data_status["result"] = "Invalid User Details!!"
            return data_status
        
        safeGoldUserId=existing_user.apiReferenceId

        userKycUpdateDict = common_user_kyc_update(userId=userId,transactionApiId=transactionApiId,safeGoldUserId=safeGoldUserId)

        print("((((((((userKycUpdateDict) frontend)))))))",userKycUpdateDict)

        if userKycUpdateDict.get("responseStatus") == 1:
            responseDict = {
                "kycUpdatedStatus": userKycUpdateDict.get("data").get("kycUpdatedStatus")
            }
            
            data_status["responseStatus"] = 1
            data_status["result"] =  userKycUpdateDict.get("result")
            data_status["userKycDict"] = responseDict
        else:
            data_status["result"] =  userKycUpdateDict.get("result")
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Update User KYC. Please Try again"
        return data_status

@gold_apis.route("/gold_historical_prices_interval", methods=["POST"])
@encrypt_decrypt_after_login
def gold_historical_prices_interval():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data
        print("request gold_historical_prices_interval",data)
        transactionApiId = data.get("transactionApiId")
        userId = data.get("userId")
        from_date = data.get("from_date")
        to_date = data.get("to_date")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if (
             not transactionApiId or not userId or not to_date or not from_date):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status

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

        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        existing_user = GoldUsers.objects(
            userId=userId, transactionApiId=transactionApiId,
        ).first()

        if not existing_user:
            data_status["result"] = "Invalid User Details"
            return data_status
        else:
            safeGoldUserId=existing_user.apiReferenceId
        
        histPricesIntervalResponseBody = common_historical_prices_interval(transactionApiId, from_date,to_date)
        print("((((((((histPricesIntervalResponseBody frontend)))))))",histPricesIntervalResponseBody)

        message = histPricesIntervalResponseBody.get("result")
        if histPricesIntervalResponseBody.get("responseStatus") == 1:
            responseDict = {
                "pricesList":histPricesIntervalResponseBody.get('data').get("pricesList"),
                "purity":histPricesIntervalResponseBody.get('data').get("purity"),
            }
            data_status["responseStatus"] = 1
            data_status["histPricesIntervalDict"] = responseDict
            data_status["result"] = message
        else:
        
            data_status["result"] = message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Get Invoice Details. Please Try again"
        return data_status

@gold_apis.route("/gold_historical_prices", methods=["POST"])
@encrypt_decrypt_after_login
def gold_historical_prices():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data
        print("request gold_historical_prices",data)
        transactionApiId = data.get("transactionApiId")
        userId = data.get("userId")
        from_date = data.get("from_date")
        to_date = data.get("to_date")
        priceFetchType = data.get("priceFetchType") #### options are d w m q y

        
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if (
             not transactionApiId or not userId or not to_date or not from_date or not priceFetchType):
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status

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

        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        existing_user = GoldUsers.objects(
            userId=userId, transactionApiId=transactionApiId,
        ).first()

        if not existing_user:
            data_status["result"] = "Invalid User Details"
            return data_status
        else:
            
            safeGoldUserId=existing_user.apiReferenceId
        
        histPricesIntervalResponseBody = common_historical_prices(transactionApiId, from_date,to_date, priceFetchType)
        print("((((((((histPricesIntervalResponseBody frontend)))))))",histPricesIntervalResponseBody)

        message = histPricesIntervalResponseBody.get("result")
        if histPricesIntervalResponseBody.get("responseStatus") == 1:
            responseDict = {
                "pricesList":histPricesIntervalResponseBody.get('data').get("pricesList"),
                "purity":histPricesIntervalResponseBody.get('data').get("purity"),
            }
            data_status["responseStatus"] = 1
            data_status["histPricesDict"] = responseDict
            data_status["result"] = message
        else:
        
            data_status["result"] = message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Get Invoice Details. Please Try again"
        return data_status

@gold_apis.route("/gold_fetch_all_buy_prices", methods=["POST"])
@encrypt_decrypt_after_login
def gold_fetch_all_buy_prices():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data
        
        print("request gold_fetch_all_buy_prices",data)
        userId = data.get("userId")

        print("(((((((((((userId)))))))))))",userId)
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if not userId:
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status

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

        if kycStatus == False:
            data_status["result"]="User KYC is not completed please contact to admin!!"
            return data_status

        getPriceResponseDict = common_fetch_all_buy_prices()

        print("((((((((get all Price ResponseDict) frontend)))))))",getPriceResponseDict)

        message = getPriceResponseDict.get("result")
        if getPriceResponseDict.get("responseStatus") == 1:
            data_status["responseStatus"] = 1
            data_status["fetchAllGoldPricesList"] = getPriceResponseDict.get("transactionDetailsList",[])
            data_status["result"] = message
        else:
            data_status["result"] = message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Fetch All Buy Prices.. Please Try again"
        return data_status


@gold_apis.route("/gold_fetch_all_gold_balances", methods=["POST"])
@encrypt_decrypt_after_login
def gold_fetch_all_gold_balances():
    data_status = {"responseStatus": 0, "result":""}
    try:
        data = request.decrypted_data
        print("request gold_fetch_all_gold_balances",data)
        userId = data.get("userId")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if not userId:
            data_status["result"] = "required fields are missing"
            return data_status
        
        user_queryset = Users.objects(id=userId,status=1).first()
        if not user_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status

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

        # transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        # if not transaction_apis_queryset:
        #     data_status["result"] = "Transaction API not found"
        #     return data_status
        userBalancesList = []
        gold_users_queryset = GoldUsers.objects(userId=userId).all()
        # if len(gold_users_queryset) < 1:
        #     data_status["result"] = "Invalid User Details!!"
        #     return data_status
        for each_user in gold_users_queryset:
            # safeGoldUserId=each_user.apiReferenceId

            # getUserBalanceDict = common_get_user_balance(transactionApiId=each_user.transactionApiId.id,safeGoldUserId=safeGoldUserId)

            # print("((((((((userBalancesList) frontend)))))))")

            # if getUserBalanceDict.get("responseStatus") == 1:
            userBalanceDict = {
                "transactionApiId": str(each_user.transactionApiId.id),
                "apiName": each_user.transactionApiId.apiName,
                "goldApiUserId": each_user.apiReferenceId,
                "goldBalanceGms": each_user.goldBalanceGrams,
                "goldBalanceAmount": each_user.goldBalanceAmount,
            }
            userBalancesList.append(userBalanceDict)
            # else:
                # data_status["result"]=message
                # print("Fetching all gold prcies errors data")
        
        data_status["responseStatus"] = 1
        data_status["result"] = "successfully Fetched Prices!!!"
        data_status["allGoldBalancesList"] = userBalancesList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Check User Gold Balance. Please Try again"
        return data_status


################################################# gold payment Apis #################################################
@gold_apis.route("/gold_payment_create_intent_seamless", methods=["POST"])
@encrypt_decrypt_after_login
def gold_payment_create_intent_seamless():
    data_status = {"responseStatus":0,"result":""}

    try:
        # startDate = datetime.datetime.now()
        # availability_check = check_transaction_availability(startDate, "paymentgateway")
        # if availability_check.get('responseStatus')==0:
        # 	data_status["result"]="Service Provider is not available. Please try after sometime."
        # 	return data_status

        # encryptedBody = request.json.get("encryptedBody")
        # ivKey = request.json.get("ivKey")
        # try:
        # 	encryption_key = bytes(encSecretKey, 'utf-8')
        # 	jsonData = decrypt(encryptedBody,encryption_key,ivKey)
        # 	decryptResponse = json.loads(jsonData)
        # 	decryptResponse = json.loads(decryptResponse)
        # 	print(decryptResponse,"JSON DATA")
        # except Exception as e:
        # 	app.logger.error(traceback.format_exc())
        # 	data_status["result"]="Invalid Request"
        # 	return data_status


        decryptResponse = request.decrypted_data
        print(decryptResponse,"payin_payment_create_intent_seamless")
        userId = decryptResponse.get("userId","")
        paymentChannel = decryptResponse.get("paymentChannel","")
        agent = decryptResponse.get("agent","")
        location = decryptResponse.get("location","")
        
        # amount = decryptResponse.get("amount","")
        otpCheckId = decryptResponse.get("otpCheckId","")
        productName = decryptResponse.get("productName","Testing")
        setlementId =""
        paymentMode = decryptResponse.get("paymentMode","")
        # transactionApiId = decryptResponse.get("transactionApiId","") ## need to fetch it from assign_gold_pg
        subPaymentMode = decryptResponse.get("subPaymentMode","")
        issuingBank = decryptResponse.get("issuingBank","")
        productinfo = productName
        # email = decryptResponse.get("email","")
        # firstname = decryptResponse.get("firstname","")
        # phone = decryptResponse.get("mobileNumber","")
        ccnum = decryptResponse.get("ccnum","")
        ccname = decryptResponse.get("ccname","")
        ccvv = decryptResponse.get("ccvv","")
        ccexpmon = decryptResponse.get("ccexpmon","")
        ccexpyr = decryptResponse.get("ccexpyr","")
        vpa = decryptResponse.get("vpa","")
        bankId = decryptResponse.get("bankId","")
        cardType=decryptResponse.get("cardType","")

        apiTransactionId=decryptResponse.get("apiTransactionId","")
        rateId=decryptResponse.get("rateId","")
        currentGoldPrice=decryptResponse.get("currentGoldPrice","")
        goldPurchaseAmount=decryptResponse.get("goldPurchaseAmount","")
        pre_gst_buy_price=decryptResponse.get("pre_gst_buy_price","")
        goldPurchaseGrams=decryptResponse.get("goldPurchaseGrams","")
        goldGatewayId=decryptResponse.get("goldGatewayId","")
        goldTransactionType=decryptResponse.get("goldTransactionType","")
        bankCode=""
        bankName=""

        print("intent create gold request ", decryptResponse)


        if not userId or not goldPurchaseAmount or not paymentMode: # and not firstname and not email and not phone
            data_status["result"]="Required fields are missing!!"
            return data_status
        
        assign_gold_pg_queryset = AssignGoldPaymentGateway.objects(goldTransactionApiIdsList__in=[goldGatewayId],status=1).first()

        merchant_queryset = Users.objects(id=str(userId),status=1).first()
        if not merchant_queryset:
            data_status["result"]="Invalid Request."
            return data_status

        if not assign_gold_pg_queryset:
            data_status["result"]="No Payment Provider Available!!"
            return data_status
        
        if goldTransactionType != "Credit":
            data_status["result"]="Invalid Transaction Type!!"
            return data_status
        
        transactionApiId = assign_gold_pg_queryset.paymentGatewayApiId.id

        #######bin check####
        if paymentMode=="CARD":
            card_category=""
            card_type=""
            issuing_bank=""
            is_domestic="0"
            additonalCardType=""
    
            card_bin_response = card_bin_check(ccnum)
            print(card_bin_response,"card_bin_response123")
            if card_bin_response.get("responseStatus") == 1:
                card_category = card_bin_response.get("data").get("cardCategory")
                card_type = card_bin_response.get("data").get("cardType")
                is_domestic = card_bin_response.get("data").get("isDomestic")
                issuing_bank = card_bin_response.get("data").get("issuingBank")
                additonalCardType = card_bin_response.get("data").get("additonalCardType")
                if additonalCardType!=None:
                    if issuing_bank=="HDFC":
                        card_type=str(additonalCardType)+"_"+str(issuing_bank)+"_"+str(card_type)
                    else:
                        card_type=str(additonalCardType)+"_"+str(card_type)
                elif issuing_bank=="HDFC":
                    card_type=str(issuing_bank)+"_"+str(card_type)
            subPaymentMode = card_type
            print(card_type,"card_type")
            print(subPaymentMode,"subPaymentMode")
            print(is_domestic,"is_domestic")
            if is_domestic!="1":
                data_status["result"] = "Only Accepts domestic cards only!!"
                return data_status

            if card_category!="":
                if card_category == "creditcard":
                    paymentMode = "CREDIT CARD"
                elif card_category == "debitcard":
                    paymentMode = "DEBIT CARD"
                else:
                    data_status["result"] = "Invalid Card Type!!"
                    return data_status

        ################################################### Slab Calculation for Payin #########################################################################
        ##same var assign 
        payment_method=paymentMode 
        linkAmount=goldPurchaseAmount
        paymentGateWayId=transactionApiId

        servicePaymentType="digitalGold"

        slabId=None
        commissionCharges={}
        paymentModeId=""
        subPaymentModeId=""
        transactionAmount=float(goldPurchaseAmount)
        print("payment_method",payment_method)
        if payment_method!="":
            payment_mode_queryset = PaymentMode.objects(paymentMode=str(payment_method)).first()
            paymentModeId=""
            subPaymentModeId=""
            if payment_mode_queryset:
                paymentModeId = str(payment_mode_queryset.id)
                if cardType!="":
                    # subPaymentMode=cardType ####edit
                    print(" paymentmodeid",paymentModeId)
                    print(" subPaymentMode",subPaymentMode)
                    sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=str(subPaymentMode)).first()
                    if sub_payment_mode_queryset:
                        subPaymentModeId = str(sub_payment_mode_queryset.id)
                else:
                    # subPaymentMode=payment_method
                    print(" paymentmodeid",paymentModeId)
                    print(" subPaymentMode",subPaymentMode)
                    sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=str(subPaymentMode)).first()
                    if sub_payment_mode_queryset:
                        subPaymentModeId = str(sub_payment_mode_queryset.id)

                if subPaymentModeId=="":
                    # subPaymentMode=payment_method
                    sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=str(subPaymentMode)).first()
                    if sub_payment_mode_queryset:
                        subPaymentModeId = str(sub_payment_mode_queryset.id)
            patternId = str(merchant_queryset.patternId.id)
            if paymentModeId!="" and subPaymentModeId!="" and paymentGateWayId!="" and patternId!="":
                commissionCharges = slab_calculation_for_gold_service_payment_type(transactionAmount,paymentModeId,subPaymentModeId,servicePaymentType)

                if commissionCharges.get("slabId") == None:
                    slabId = None
                    transactionAmount = linkAmount
                else:
                    slabId = commissionCharges.get("slabId")
                    transactionAmount = float(commissionCharges.get("transactionAmount"))

        #######################################################################################################################################################
        cardType=subPaymentMode
        amount = transactionAmount

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

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

        

        # print(":transactionApiId(()",transactionApiId)
        # currentDateStart = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
        # currentDateEnd = currentDateStart.replace(hour=23, minute=59, second=59, microsecond=999999)

        # checkphoneNumber = WalletTransactions.objects(customerPhonenumber=str(phone),status=1,createdOn__gte=currentDateStart,createdOn__lte=currentDateEnd).first()
        # if checkphoneNumber:
        #     data_status["result"]="Only one transaction is allowed per Phone Number for one customer per day."
        #     return data_status

        # checkEmail = WalletTransactions.objects(customerEmail=str(email),status=1,createdOn__gte=currentDateStart,createdOn__lte=currentDateEnd).first()
        # if checkEmail:
        #     data_status["result"]="Only one transaction is allowed per Email for one customer per day."
        #     return data_status

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

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

        if merchant_queryset.merchantType=="customer":
            if otpCheckId=="":
                data_status["result"]="Invalid Request.!"
                return data_status
            otpcheck_querryset=OtpChecks.objects(userId=str(userId),id=str(otpCheckId),status=1).first()
            if not otpcheck_querryset:
                data_status["result"]="Invalid Request.!!"
                return data_status
            otpcheck_querryset.update(status=2)

        payin_gate_way_queryset = TransactionAPI.objects(id=str(transactionApiId),status=1).first()
        if not payin_gate_way_queryset:
            data_status["result"]="Invalid Request.!!!"
            return data_status
        
        existing_user = GoldUsers.objects(userId=userId, transactionApiId=goldGatewayId).first()
        if not existing_user:
            data_status["result"] = "Invalid User Details!!"
            return data_status
        
        safeGoldUserId=existing_user.id
        
        # check_transaction_limits = merchant_transaction_limit_settings("Payin",transactionApiId,userId,amount)
        # if check_transaction_limits.get("responseStatus") == 0:
        #     data_status['result']=check_transaction_limits.get("result")
        #     return data_status

        paymentGateWayCode = payin_gate_way_queryset.code

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

            paymentDetailsDecrypted = combined_decrypt(paymentDetailsEncrypted, encSecretKey)

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

        merchantUniqueNumber=str(merchant_queryset.merchantUniqueNumber)
        mid_extracted = merchantUniqueNumber[1:].lstrip("0")
        pgOrderId=str(transaction_id_prefix)+"DG"+str(mid_extracted)+str(orderId)
        
        gold_txn_table = GoldTransactions(
            userId = userId,
            paymentAmount = round_last_digits(float(amount)),
            paymentGrandTotal=round_last_digits(float(transactionAmount)),
            paymentGatewayId = transactionApiId,
            currency="INR",
            paymentType = paymentMode,
            subPaymentMode = subPaymentMode,
            creditType = "Credit",
            patternId=patternId,
            transactionId = transactionId,
            transactionData = [transactionData],
            orderId = orderId,
            # walletLog="",
            userType="user",
            # createdBy = None,
            createdOn = datetime.datetime.now(),
            location = location,
            platform = "app",
            agent = agent,
            customerEmail = email,
            customerName = firstname,
            customerPhonenumber = phone,
            # previousBalance=0,
            # currentBalance=0,
            # paymentLinkId = None,
            # PaymentButtonId = None,
            # paymentPageId = None,
            errorMessage = errorMessage,
            paymentChannel = paymentChannel,
            bankRefId="",
            cardmasked=cardmasked,
            productName=productName,
            setlementId=setlementId,
            pgOrderId=pgOrderId,
            paymentStatusCheckId=pgOrderId,
            customerVpa=vpa,
            commissionCharges=commissionCharges,
            slabId=slabId,
            settlementStatus = 1,
            paymentDetails=paymentDetailsEncrypted,
            comment = productinfo,
            bankCode=bankCode,
            bankName=bankName,
            cardType=cardType,
            goldTransactionType = goldTransactionType, ### credit indicates gold credit
            goldTransactionApiId = goldGatewayId,
            goldUserId = safeGoldUserId, ### need to add this ####
            # goldUserReferenceId=goldUserReferenceId,
            currentGoldPrice =  float(currentGoldPrice),
            rateId = rateId,
            goldPurchaseAmount = float(pre_gst_buy_price),
            goldPurchaseGrams = float(goldPurchaseGrams),
            purchaseGrandTotal = float(goldPurchaseAmount),
            paymentGatewayRequestBody = [transactionData],
            paymentGatewayResponseBody =  [],
            goldApiRequestData = [],
            goldApiResponseData = [],
            paymentStatus = 3,
            invoiceId="",
            subPaymentModeId=ObjectId(subPaymentModeId),
            paymentModeId=ObjectId(paymentModeId),
            statusCheckId = str(apiTransactionId),
            status=3, ###initiated
            apiTransactionId = str(apiTransactionId),
            )


        wallet_save=gold_txn_table.save()
        walletId=str(wallet_save.id)
        upi_intent_url=""
        currency="INR"
        client_ip="125.40.25.126"
        # print("(((paymentGateWayCode)))",paymentGateWayCode )
        if walletId:
            if paymentGateWayCode == "Lyra_Payin":
                get_client = ""
                get_secret = ""
                get_base_url = ""
                user_name = ""
                get_base_url = ""
                password = ""
                webhook_url = ""
                return_url = ""
                for each_key in payin_gate_way_queryset.paramsList:
                    
                    
                    get_key = each_key.get("key")
                    if get_key == "api_key":
                        get_client = each_key.get("value")
                    if get_key == "secret_key":
                        get_secret = each_key.get("value")
                    if get_key == "base_url":
                        get_base_url = each_key.get("value")
                    if get_key == "webhook_url":
                        webhook_url = each_key.get("value")
                    if get_key == "return_url":
                        return_url = each_key.get("b")
                    if get_key == "user_name":
                        user_name = each_key.get("value")
                    if get_key == "password":
                        password = each_key.get("value")
                ###################################################### Lyra Payin Code #########################################################################
                # paymentgatewayresponseDict = lyra_payin_payment_intent(get_base_url,pgOrderId,note,amount,currency,merchant_queryset.fullName,merchant_queryset.phoneNumber,merchant_queryset.email,webhook_url,return_url,userId,payInPaymentGatewayId,client_ip,"api",user_name,password)
                paymentgatewayresponseDict = lyra_payin_payment_intent(get_base_url,pgOrderId,productName,amount,currency,firstname,phone,email,webhook_url,return_url,userId,transactionApiId,client_ip,agent,user_name,password)
                ################################################################################################################################################
            
                if paymentgatewayresponseDict.get("responseStatus") == 1:
                    transactionId = paymentgatewayresponseDict.get("payment_request_id")
                    transactionData = paymentgatewayresponseDict.get("transactionData")
                    paymentChannel = paymentgatewayresponseDict.get("paymentChannel")
                    pgOrderId=paymentgatewayresponseDict.get("pgOrderId")
                    upi_intent_url=paymentgatewayresponseDict.get("upi_intent_url")
                    wallet_save.update(transactionId=transactionId,transactionData=transactionData,paymentChannel=paymentChannel,paymentLink=upi_intent_url)
                    data_status["responseStatus"]=1
                    data_status["transactionId"]=pgOrderId
                    data_status["walletId"]=walletId
                    data_status["PaymentLink"]=upi_intent_url
                    data_status["gatewayType"]=paymentGateWayCode
                    data_status["result"]="Payin response data saved successfully!"
                    return data_status
                else:
                    errorresult=paymentgatewayresponseDict.get("result")
                    wallet_save.update(errorMessage=errorresult,paymentStatus=0)
                    data_status["result"]=errorresult
                    return data_status
                ################## PAYU Gateway
            elif paymentGateWayCode == "Payu_Payin":
                upi_intent_url=domain+"api/frontend/gold_payment_dynamic_link/"+str(walletId)
                data_status["responseStatus"]=1
                data_status["transactionId"]=pgOrderId
                data_status["walletId"]=walletId
                data_status["PaymentLink"]=upi_intent_url
                data_status["gatewayType"]=paymentGateWayCode
                data_status["result"]="Payin response data saved successfully!"
                return data_status

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

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

            elif paymentGateWayCode == "Campuslinkpro_Payin":
                print("((((((((((((((((((Campuslinkpro_Payin))))))))))))))))))")
                get_base_url = ""
                api_key = ""
                secret_key = ""
                graampay_check = ""
                for each_key in payin_gate_way_queryset.paramsList:
                    get_key = each_key.get("key")
                    if get_key == "get_base_url":
                        get_base_url = each_key.get("value")
                    if get_key == "api_key":
                        api_key = each_key.get("value")
                    if get_key == "secret_key":
                        secret_key = each_key.get("value")
                    if get_key == "graampay_check":
                        graampay_check = each_key.get("value")
                ###################################################### Wowpe Payin Code #########################################################################
                paymentgatewayresponseDict = create_campuslinkpro_payment_link(get_base_url,api_key,secret_key,graampay_check,pgOrderId,productName,amount,currency,firstname,phone,email,transactionApiId,client_ip,agent,userId)
                ###############################################################################################################################################

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


@gold_apis.route("/gold_payment_dynamic_link/<walletId>",methods=["GET"])
# @encrypt_decrypt_after_login
def gold_payment_dynamic_link(walletId):
    data_status = {"responseStatus": 0, "result": ""}
    
    # walletId = request.json.get("walletId")
    if not walletId:
        data_status["result"] = "Required fields are missing!!"
    
    try:
        gold_payment_query_set = GoldTransactions.objects(id=ObjectId(walletId),paymentStatus__in=[3]).first()
        if gold_payment_query_set:

            txnid = gold_payment_query_set.pgOrderId
            paymentMode = gold_payment_query_set.paymentType
            productinfo =  gold_payment_query_set.productName
            amount = gold_payment_query_set.paymentAmount
            email = gold_payment_query_set.customerEmail
            firstname = gold_payment_query_set.customerName
            phone = gold_payment_query_set.customerPhonenumber
            currency = gold_payment_query_set.currency
            client_ip="125.40.25.126"

            vpa=""
            ccnum=""
            ccname=""
            ccvv=""
            ccexpmon=""
            ccexpyr=""
            bankCode=""
            cardType=""

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

            paymentGatewayId = gold_payment_query_set.paymentGatewayId
            if paymentGatewayId.code == "Payu_Payin":
                key = ""
                salt = ""
                get_base_url = ""
                surl = ""
                furl = ""
                gold_s_f_url = ""

                for each_key in paymentGatewayId.paramsList:
                    get_key = each_key.get("key")
                    if get_key == "api_key":
                        key = each_key.get("value")
                    if get_key == "salt":
                        salt = each_key.get("value")
                    if get_key == "dynamic_base_url":
                        get_base_url = each_key.get("value")
                    if get_key == "surl":
                        surl = each_key.get("value")
                    if get_key == "furl":
                        furl = each_key.get("value")
                    if get_key == "gold_s_f_url": ## since GoldTransactions table the success url will be table as per new table23-*````-==========================================================================================================================
                        gold_s_f_url = each_key.get("value")
                testresponse = payupayment_dynamic( paymentMode=paymentMode, get_salt=salt,get_base_url=get_base_url, key= key, txnid=txnid, productinfo=productinfo,amount=amount,email=email,firstname=firstname,surl=gold_s_f_url,furl=gold_s_f_url, phone=phone,ccnum=ccnum,ccname=ccname, ccvv=ccvv, ccexpmon=ccexpmon, ccexpyr=ccexpyr, vpa=vpa, bankCode=bankCode, card_type=cardType )
                if testresponse.get('responseStatus')==1:
                    return render_template("frontend/payupaymenttemplate.html",requestDataDict=testresponse.get('result'))
                else:
                    return testresponse

            elif paymentGatewayId.code == "Getepay_Payin":
                mid = ""
                get_base_url = ""
                callback_url = ""
                return_url=""
                encryption_key = ""
                encryption_iv = ""
                terminalId = ""
                encrypted_request = ""
                vpa = ""
                token = ""
                for each_key in paymentGatewayId.paramsList:
                    get_key = each_key.get("key")
                    if get_key == "mid":
                        mid = each_key.get("value")
                    if get_key == "get_base_url":
                        get_base_url = each_key.get("value")
                    if get_key == "callback_url":
                        callback_url = each_key.get("value")
                    if get_key == "return_url":
                        return_url = each_key.get("value")
                    if get_key == "encryption_key":
                        encryption_key = each_key.get("value")
                    if get_key == "encryption_iv":
                        encryption_iv = each_key.get("value")
                    if get_key == "terminalId":
                        terminalId = each_key.get("value")
                    if get_key == "vpa":
                        vpa = each_key.get("value")
                token=gold_payment_query_set.transactionData[0].get('token')
                paymentgatewayresponseDict = getepaypaymentseamless(encryption_key,encryption_iv, return_url,amount,firstname,phone,currency,txnid,client_ip,token,ccnum,ccexpmon,ccexpyr,ccvv,paymentMode)
                if paymentgatewayresponseDict.get('responseStatus')==1:
                    encrypted_request=paymentgatewayresponseDict.get('encrypted_request')
                    return render_template("frontend/getepaypayment.html",get_base_url=get_base_url,mid=mid,terminalId=terminalId,encrypted_data=encrypted_request)
                else:
                    data_status["result"] = "Invalid payment request."
                    return data_status
            else:
                data_status["result"] = "No Service Provider Assigned!."
                return data_status
        else:
            data_status["result"] = "Invalid transaction Id"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "unable to test payu payment"
        return data_status


# Latest Common Payin Payment Response Code
@gold_apis.route("/gold_payment_response",methods=["POST"])
def gold_payment_response():
    data_status = {"responseStatus":0,"result":""}
    userId=""
    walletId=""
    agent=""
    try:
        responseDict = request.form.to_dict()

        txn_id = responseDict.get("txnid")
        productinfo = responseDict.get("productinfo")
        save_api_webhook_logs_table = save_webhook_logs_data(None, "payin", "return_url", "payureturnurl", None, [responseDict], "api", "")
        gold_payment_txn_query_set = GoldTransactions.objects(pgOrderId=txn_id).first()
        walletId=str(gold_payment_txn_query_set.id)
        if not gold_payment_txn_query_set:
            print("gold_payment_txn_query_set error")
            redirect_url=url_for("web_hooks.paymentreturnsuccessurl",transactionId=walletId)
            return redirect(redirect_url)

        cardmasked = ""
        customerVpa = ""
        cardType = str(gold_payment_txn_query_set.cardType)
        agent=str(gold_payment_txn_query_set.agent)
        payInPaymentGatewayId = str(gold_payment_txn_query_set.paymentGatewayId.id)
        autoSettlement = gold_payment_txn_query_set.paymentGatewayId.autoSettlement
        status = gold_payment_txn_query_set.paymentStatus
        userId = str(gold_payment_txn_query_set.userId.id)

        jsonResponseDict = responseDict

        if agent=="web":
            redirect_url = f"{domain}user/#/vendorpayment/{userId}/{walletId}"
        else:
            redirect_url=url_for("web_hooks.paymentreturnsuccessurl",transactionId=walletId)

        print("gold_payment_txn_query_set error2")
        merchant_queryset = Users.objects(id=userId,status=1).first()
        if jsonResponseDict and status == 3:
            print("in if and status ==== 3 ")
            print("jsonResponseDict",jsonResponseDict)
            # if gold_payment_txn_query_set.orderId != jsonResponseDict.get("txnid"):
            #     data_status["result"]="Invalid Request!!"
            #     return data_status

            bankName=""
            customerVpa=""
            paymentStatusCheckId=str(jsonResponseDict.get("mihpayid"))
            bankRefId=str(jsonResponseDict.get("bank_ref_num"))
            pgOrderId=str(jsonResponseDict.get("txnid")) #doubt
            paymentMode=str(jsonResponseDict.get("mode"))
            payment_datetime=str(jsonResponseDict.get("addedon"))

            currency="INR"
            if jsonResponseDict.get("mode")=="UPI":
                customerVpa = jsonResponseDict.get("field1")

            elif jsonResponseDict.get("mode")=="CC":
                paymentMode="CREDIT CARD"
                if cardType=="":
                    cardType=jsonResponseDict.get("card_type")
                bankName=jsonResponseDict.get("issuing_bank")
                # customerVpa=jsonResponseDict.get("card_type")
                cardmasked=jsonResponseDict.get("cardnum")

            elif jsonResponseDict.get("mode")=="DC":
                paymentMode="DEBIT CARD"
                if cardType=="":
                    cardType=jsonResponseDict.get("card_type")
                cardmasked=jsonResponseDict.get("cardnum")

            elif jsonResponseDict.get("mode")=="NB":
                paymentMode="NET BANKING"
                customerVpa="" ## doubt no vpa in NB 
            # elif jsonResponseDict.get("mode")=="NEFT":
            #     cardmasked=""
            # elif jsonResponseDict.get("mode")=="AEPS":
            #     cardmasked=""
            # elif jsonResponseDict.get("mode")=="IMPS":
            #     cardmasked=""
            elif jsonResponseDict.get("mode")=="CASH": ### we dont have cash ?
                paymentMode="WALLET"
                customerVpa=""
            else:
                paymentMode="CREDIT CARD"
                customerVpa=""

            print(paymentMode,"((((((((((((((((paymentMode????????????))))))))))))))))")
            print(cardType,"((((((((((((((((cardType????????????))))))))))))))))")

            amount = jsonResponseDict.get("amount")

            errorMessage=""
            if jsonResponseDict.get("error")=="E000":
                errorMessage = jsonResponseDict.get("field9")
            else:
                errorMessage = jsonResponseDict.get("Field9")


            if jsonResponseDict.get("status") == "success":
                transactionstatus=1
                response_code = "Success"
                errorMessage = "Success"
            else:
                transactionstatus=0
                response_code="Failed"
                errorMessage="Failed"
            payin_callback_request_data={
            "transaction_id":paymentStatusCheckId,
            "payment_method":paymentMode,
            "payment_datetime":payment_datetime,
            "response_code":response_code,
            "response_message":errorMessage,
            "pgOrderId":pgOrderId,
            "client_order_id":pgOrderId,
            "statusCheckId":paymentStatusCheckId,
            "amount":round(float(amount),2),
            "OrderAmount":round(float(amount),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":"",
            "cardType":cardType,
            "cardmasked":cardmasked,
            "transactionstatus":transactionstatus,
            "errorMessage":errorMessage,
            "hash":"",
            "paymentChannel":"payu",
            "bank_ref_id":bankRefId,
            "paymentApiresponseData":responseDict
            }

            try:
                callbackResponseData = gold_payin_webhook_call_back_update(payin_callback_request_data,save_api_webhook_logs_table)

                data_status["responseStatus"] = callbackResponseData.get("responseStatus")
                data_status["result"] = callbackResponseData.get("result")

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

    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to get pay in call back url!!"
        redirect_url=url_for("web_hooks.paymentreturnsuccessurl",transactionId=None)
        return redirect(redirect_url)   


#################################################
def gold_payin_webhook_call_back_update(callbackResponseData,save_api_webhook_logs_table):
    data_status = {"responseStatus":0,"result":""}
    transaction_id = callbackResponseData.get("transaction_id","")
    payment_method = callbackResponseData.get("payment_method","")
    payment_datetime = callbackResponseData.get("payment_datetime","")
    amount = callbackResponseData.get("amount","")
    currency = callbackResponseData.get("currency","")
    name = callbackResponseData.get("name","")
    phone = callbackResponseData.get("phone","")
    pgOrderId = callbackResponseData.get("pgOrderId")
    client_order_id = callbackResponseData.get("client_order_id")
    paymentStatusCheckId = callbackResponseData.get("statusCheckId","")
    
    bank_ref_id = callbackResponseData.get("bank_ref_id","")
    customer_vpa = callbackResponseData.get("customer_vpa","")
    cardType = callbackResponseData.get("cardType","")
    cardmasked = callbackResponseData.get("cardmasked","")
    bankName = callbackResponseData.get("issuingBank","")
    payeeVpa = callbackResponseData.get("payeeVpa","")

    apiMerchantId = callbackResponseData.get("apiMerchantId","")
    OrderAmount = callbackResponseData.get("OrderAmount","")

    paymentChannel = callbackResponseData.get("paymentChannel","")
    transactionstatus = callbackResponseData.get("transactionstatus","")
    errorMessage = callbackResponseData.get("errorMessage","")
    paymentApiresponseData = callbackResponseData.get("paymentApiresponseData","")
    transactionAmount =amount
    print("transaction amount debited in gateway", transactionAmount)
    try:
        if pgOrderId:
            linkAmount=0
            order_queryset = GoldTransactions.objects(pgOrderId=pgOrderId,status__nin=[5]).first()
            if not order_queryset:
                data_status["result"]="Invalid Order id!!"
                return data_status
            clientmid = client_order_id.split("-")
            pgmerchant_id=clientmid[0]
            merchantId=str(order_queryset.userId.merchantUniqueNumber)
            user_order_id=str(order_queryset.orderId)
            # if pgmerchant_id!=merchantId:
            #     data_status["result"]="Invalid merchant id!!"
            #     return data_status

            user_queryset = Users.objects(merchantUniqueNumber=merchantId).first()
            if not user_queryset:
                data_status["result"]="Invalid merchant id!!"
                return data_status

            paymentGateWayId = str(order_queryset.paymentGatewayId.id)
            userId = str(user_queryset.id)
            paymentGrandTotal = order_queryset.paymentAmount
            goldGatewayId = order_queryset.goldTransactionApiId
            apiTransactionId = order_queryset.apiTransactionId

            print(paymentGrandTotal,"(((((((((paymentGrandTotal)))))))))")
            transactionData = [callbackResponseData]

            
            print("(((((((((((((in else )))))))))))))",transactionstatus)
                
            if transactionstatus == 1:
                if float(amount) == float(paymentGrandTotal) and order_queryset.paymentStatus!=6:
                    status = 1
                else:
                    status = 6
                    errorMessage = "Insufficient amount credited!!"
                lorder_queryset = GoldTransactions.objects(pgOrderId=pgOrderId,paymentStatus__nin=[5]).first()
                if lorder_queryset.paymentStatus!=1 and status==1:
                                     
                    lorder_queryset.update(
                        paymentStatus=status,
                        payInResponseCallBackData=transactionData,
                        paymentApiresponseData=paymentApiresponseData,
                        responseCallBackTime=datetime.datetime.now(),
                        transactionId=transaction_id,
                        bankRefId=bank_ref_id,
                        customerVpa=customer_vpa,
                        cardmasked=cardmasked,
                        bankName=bankName,
                        paymentType=payment_method,
                        currency=currency,
                        errorMessage=errorMessage,
                        paymentGrandTotal=round_last_digits(float(transactionAmount)),
                        # walletLog="Wallet Balance is added with the amount of "+str(amount)+".",
                        # previousBalance=round_last_digits(float(balanceResult.get('userPreviousBalance'))),
                        # currentBalance=round_last_digits(float(balanceResult.get('userCurrentBalance'))),
                        # commissionCharges=commissionCharges,
                        paymentStatusCheckId=paymentStatusCheckId,
                        # subPaymentModeId=ObjectId(subPaymentModeId),
                        # paymentModeId=ObjectId(paymentModeId)
                        )
                    goldConfirmResponseData =gold_buy_confirm_helper(goldGatewayId.id,userId,apiTransactionId)
                    print("goldConfirmResponseData",goldConfirmResponseData)
                    result = goldConfirmResponseData.get("result")
                    if goldConfirmResponseData.get("responseStatus") == 1:
                        confirmBuyPriceDict = goldConfirmResponseData.get("confirmBuyPriceDict")
                        GoldTransactionStatus = confirmBuyPriceDict.get("transactionStatus")
                        invoice_id = confirmBuyPriceDict.get("invoice_id")
                        created_at = confirmBuyPriceDict.get("created_at")
                        status = confirmBuyPriceDict.get("status")
                        if GoldTransactionStatus == 1:
                            data_status["goldConfirmStatus"] = 1
                            data_status["invoice_id"] = invoice_id
                            data_status["created_at"] = created_at
                        else:
                            data_status["goldConfirmStatus"] = 0
                    else:
                        data_status["goldConfirmStatus"] = 0
                    data_status["result"] = result
                    return data_status
                    
                else:
                    order_queryset.update(
                        paymentStatus=status,
                        payInResponseCallBackData=transactionData,
                        paymentApiresponseData=paymentApiresponseData,
                        responseCallBackTime=datetime.datetime.now(),
                        transactionId=transaction_id,
                        bankRefId=bank_ref_id,
                        customerVpa=customer_vpa,
                        cardmasked=cardmasked,
                        bankName=bankName,
                        paymentType=payment_method,
                        currency=currency,
                        errorMessage=errorMessage,
                        paymentGrandTotal=round_last_digits(float(transactionAmount)),
                        # walletLog="Wallet Balance is added with the amount of "+str(amount)+".",
                        # commissionCharges=commissionCharges,
                        paymentStatusCheckId=paymentStatusCheckId,
                        # subPaymentModeId=ObjectId(subPaymentModeId),
                        # paymentModeId=ObjectId(paymentModeId)
                        )
            else:
                status=2
                if transactionstatus==0:
                    status=0
                elif transactionstatus==4:
                    status=4
                else:
                    status=2
                lorder_queryset = GoldTransactions.objects(pgOrderId=pgOrderId).first()
                if lorder_queryset.paymentStatus==1:
                    rorderId = random_digit_generate(16)
                    wallet_transaction_table = GoldTransactions(
                        userId = str(user_queryset.id),
                        paymentAmount = round_last_digits(float(order_queryset.paymentAmount)),
                        paymentGrandTotal=round_last_digits(float(transactionAmount)),
                        paymentGatewayId = str(paymentGateWayId),
                        currency=order_queryset.currency,
                        creditType = "Debit",
                        transactionId = transaction_id,
                        transactionData = transactionData,
                        orderId = str(rorderId),
                        # walletLog="Wallet Balance is refunded with the amount of " + str(order_queryset.paymentAmount) + ".",
                        userType="user",
                        # createdBy = None,
                        createdOn = datetime.datetime.now(),
                        location = "",
                        platform = "api",
                        agent = "",
                        customerEmail = order_queryset.customerEmail,
                        customerName = order_queryset.customerName,
                        customerPhonenumber = order_queryset.customerPhonenumber,
                        # previousBalance=round_last_digits(float(balanceResult.get('userPreviousBalance'))),
                        # currentBalance=round_last_digits(float(balanceResult.get('userCurrentBalance'))),
                        # paymentLinkId = None,
                        # PaymentButtonId = None,
                        # paymentPageId = None,
                        errorMessage = errorMessage,
                        paymentChannel = paymentChannel,
                        bankRefId=bank_ref_id,
                        cardmasked=cardmasked,
                        bankName=bankName,
                        pgOrderId=order_queryset.orderId,
                        walletTransactionId=str(order_queryset.id),
                        customerVpa=customer_vpa,
                        slabId=order_queryset.slabId,
                        subPaymentModeId=str(order_queryset.subPaymentModeId),
                        paymentModeId=str(order_queryset.paymentModeId),
                        paymentType=payment_method,
                        commissionCharges=order_queryset.commissionCharges,
                        paymentApiresponseData=paymentApiresponseData,
                        paymentStatus = 5
                        ).save()
                    order_queryset.update(
                        status=0,###making gold status 0 as payment failed
                        paymentStatus=transactionstatus,
                        payInResponseCallBackData=transactionData,
                        paymentApiresponseData=paymentApiresponseData,
                        responseCallBackTime=datetime.datetime.now(),
                        transactionId=transaction_id,
                        bankRefId=bank_ref_id,
                        customerVpa=customer_vpa,
                        cardmasked=cardmasked,
                        bankName=bankName,
                        paymentType=payment_method,
                        currency=currency,
                        errorMessage=errorMessage,
                        paymentGrandTotal=round_last_digits(float(transactionAmount)),
                        # commissionCharges=commissionCharges,
                        paymentStatusCheckId=paymentStatusCheckId,
                        # subPaymentModeId=ObjectId(subPaymentModeId),
                        # paymentModeId=ObjectId(paymentModeId)
                        )
                else:
                    order_queryset.update(
                        status=0,###making gold status 0 as payment failed
                        paymentStatus=transactionstatus,
                        payInResponseCallBackData=transactionData,
                        paymentApiresponseData=paymentApiresponseData,
                        responseCallBackTime=datetime.datetime.now(),
                        transactionId=transaction_id,
                        bankRefId=bank_ref_id,
                        customerVpa=customer_vpa,
                        cardmasked=cardmasked,
                        bankName=bankName,
                        paymentType=payment_method,
                        currency=currency,
                        errorMessage=errorMessage,
                        paymentGrandTotal=round_last_digits(float(transactionAmount)),
                        # commissionCharges=commissionCharges,
                        paymentStatusCheckId=paymentStatusCheckId,
                        # subPaymentModeId=ObjectId(subPaymentModeId),
                        # paymentModeId=ObjectId(paymentModeId)
                    )
            # if order_queryset.platform == "link":
            # 	if payment_link_queryset:
            # 		payment_link_queryset.update(status=3)
            # elif order_queryset.platform == "button":
            # 	if button_queryset:
            # 		button_queryset.update(status=3)
                    
            # if order_queryset.platform:
            #     api_request_queryset = ApiRequestData.objects(userOrderId=user_order_id).first()
            #     if api_request_queryset:
            #         requestData=api_request_queryset.requestData[0]
            #         requestData['status']=errorMessage
            #         requestData['transaction_id']=transaction_id
            #         requestData['bank_reference_number']=bank_ref_id
            #         webhook_queryset = WebHooks.objects(webhookType="payment_gateway",userId=str(user_queryset.id),status=1).first()
            #         if webhook_queryset:
            #             webhookURL = webhook_queryset.webhookLink
            #             if webhookURL:
            #                 headers = {'Content-Type': 'application/json'}
            #                 #payload = "responseStatus=1"+"&result="+errorMessage+"&responseBody="+requestData
            #                 payload = {
            #                 "responseStatus":1,
            #                 "result":errorMessage,
            #                 "responseBody":requestData
            #                 }
            #                 print(webhookURL,"*****webhookURL****")
            #                 print(payload,"*****payload****")
            #                 respnseData = requests.post(webhookURL, json=payload, headers=headers)
            #                 print("*****webhook payin success response****")
            data_status["responseStatus"] = 1
            data_status["result"] = "Gold Callback Url was successful!"
            return data_status
        else:
            data_status["result"]="Required fields are missing!!"
            return data_status
    except Exception as e:
        print("GETTING ERROR")
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to pay in call back url!!"
        return data_status


@gold_apis.route("/gold_status_check_admin_common", methods=["POST"])
def gold_status_check_admin_common():
    data_status = {"responseStatus": 0, "result":""}
    print("(((((sasdasdasd)))))",request.form)
    statusCheckId = request.form.get("statusCheckId","")

    print("(((((((((((transactionApiId)))))))))))",statusCheckId)

    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        
        if not statusCheckId:
            data_status["result"] = "required fields are missing"
            return data_status
        
        gold_transactions_queryset = GoldTransactions.objects(statusCheckId=statusCheckId,status__nin=[1]).first()
        if not gold_transactions_queryset:
            data_status["result"]="Invalid Status Check Id!!"
            return data_status
        
        statusCheckId = str(gold_transactions_queryset.statusCheckId)
        userId = gold_transactions_queryset.userId
        goldTransactionType = gold_transactions_queryset.goldTransactionType

        goldGatewayId = str(gold_transactions_queryset.goldTransactionApiId.id)
        gold_gate_way_queryset = TransactionAPI.objects(id=str(goldGatewayId)).first()
        if not gold_gate_way_queryset:
            data_status["result"]="Invalid request found!!"
            return data_status
        

        print("((((((((before status check function)))))))")
        if goldTransactionType == "Credit":
            print(" in type Credit")
            responseDict = gold_buy_status_check_admin(goldGatewayId,statusCheckId,userId)
        elif goldTransactionType == "Debit":
            print(" in type Debit")
            responseDict = gold_sell_status_check_admin(goldGatewayId,statusCheckId,userId)
        if responseDict.get("responseStatus") == 1:
            print("responseDict",responseDict)
            buyStatusCheckDict= responseDict.get("buyStatusCheckDict")
            result= responseDict.get("result")
            transactionStatus= buyStatusCheckDict.get("transactionStatus")
            if transactionStatus == 1:
                status="success"
            elif transactionStatus == 2:
                status="processing"
            elif transactionStatus == 3:
                status="initiated"
            elif transactionStatus == 0:
                status="failed"
            else:
                status="processing"
            responseDict = {
                "responseStatus": 1,
                "status":status
            }
            data_status["responseStatus"]=1
            data_status['result']=responseDict
            return data_status
        else:
            responseDict={
            "status":"failed",
            "message":responseDict.get("result")
            }
            data_status["result"]=responseDict
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Perform Buy Status Check. Please Try again"
        return data_status


def gold_buy_status_check_admin(goldGatewayId,statusCheckId,userId):
    data_status = {"responseStatus": 0, "result":""}
    try:
        buyStatusCheckResponseBody = common_buy_status_check(transactionApiId=goldGatewayId, tx_id=statusCheckId)
        print("((((((((buyStatusCheckResponseBody frontend)))))))",buyStatusCheckResponseBody)

        message = buyStatusCheckResponseBody.get("result")
        if buyStatusCheckResponseBody.get("responseStatus") == 1:
            transactionStatus = buyStatusCheckResponseBody.get("data").get("transactionStatus")
            invoice_id = buyStatusCheckResponseBody.get("data").get("invoice_id","")

            gold_txn_queryset = GoldTransactions.objects(goldTransactionApiId=goldGatewayId,apiTransactionId=statusCheckId).first()
            goldAmount = gold_txn_queryset.goldPurchaseGrams

            existing_user = GoldUsers.objects(
                userId=userId, transactionApiId=goldGatewayId,
            ).first()
            if not existing_user:
                data_status["result"] = "Invalid User Details!!"
                return data_status

            safeGoldUserId =  existing_user.apiReferenceId
            
            goldBalanceAmount = gold_txn_queryset.goldPurchaseAmount

            gold_txn_queryset.update(invoiceId = invoice_id)
            if transactionStatus == 1:
                ### pass if status check gave success and we have success
                if gold_txn_queryset.status == 1:
                    pass
                elif gold_txn_queryset.status == 2 or gold_txn_queryset.status == 3 or gold_txn_queryset.status == 0:

                    gold_txn_queryset.update(status = 1)

                    gold_balance_update = user_gold_balance_update(userId,safeGoldUserId,goldAmount,"Credit",goldGatewayId,statusCheckId,goldBalanceAmount)
                    getUserBalanceDict = common_get_user_balance(transactionApiId=goldGatewayId,safeGoldUserId=safeGoldUserId)
            elif transactionStatus == 0:
                ### pass if status check gave faile and we have pending or initiated make it fail
                print("gold status check for buy in txnstatus 0 elif",gold_txn_queryset.status)
                if gold_txn_queryset.status == 2 or gold_txn_queryset.status == 3:
                    print("gold status check for buy in txnstatus 0 inner if")
                    gold_txn_queryset.update(status = 0)
                elif gold_txn_queryset.status == 1:
                    #### then reverse the balance so we debit 
                    print("gold status check for buy in txnstatus 0 inner elfif")
                    gold_balance_update = user_gold_balance_update(userId,safeGoldUserId,goldAmount,"Debit",goldGatewayId,statusCheckId,goldBalanceAmount)
                    getUserBalanceDict = common_get_user_balance(transactionApiId=goldGatewayId,safeGoldUserId=safeGoldUserId)
            else:### any other just pass
                print("gold status check for buy got transaction status as else not 1 not 0 ")
                pass
            responseDict = {
                "invoice_id":invoice_id,
                "created_at":buyStatusCheckResponseBody.get("data").get("created_at"),
                "status":buyStatusCheckResponseBody.get("data").get("status"),
                "transactionStatus":buyStatusCheckResponseBody.get("data").get("transactionStatus"),
            }
            data_status["responseStatus"] = 1
            data_status["buyStatusCheckDict"] = responseDict
            data_status["result"] = message
        else:
        
            data_status["result"] = message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Perform Buy Status Check. Please Try again"
        return data_status


def gold_sell_status_check_admin(goldGatewayId,statusCheckId,userId):
    data_status = {"responseStatus": 0, "result":""}
    statusCheckId = request.form.get("statusCheckId","")

    try:
        sellStatusCheckResponseBody = common_sell_status_check(transactionApiId=goldGatewayId, tx_id=statusCheckId)
        print("((((((((sellStatusCheckResponseBody frontend)))))))",sellStatusCheckResponseBody)

        message = sellStatusCheckResponseBody.get("result")
        if sellStatusCheckResponseBody.get("responseStatus") == 1:

            transactionStatus = sellStatusCheckResponseBody.get("data").get("transactionStatus")

            gold_txn_queryset = GoldTransactions.objects(goldTransactionApiId=goldGatewayId,apiTransactionId=statusCheckId).first()

            safeGoldUserId =  gold_txn_queryset.goldUserId
            goldAmount = gold_txn_queryset.goldPurchaseGrams
            goldBalanceAmount = gold_txn_queryset.goldPurchaseAmount
            if transactionStatus == 1:
                ### pass if status check gave success and we have success
                if gold_txn_queryset.status == 1:
                    pass
                elif gold_txn_queryset.status == 2 or gold_txn_queryset.status == 3 or gold_txn_queryset.status == 0:

                    gold_txn_queryset.update(status = 1)
                    gold_balance_update = user_gold_balance_update(userId,safeGoldUserId,goldAmount,"Debit",goldGatewayId,statusCheckId,goldBalanceAmount)
                    getUserBalanceDict = common_get_user_balance(transactionApiId=goldGatewayId,safeGoldUserId=safeGoldUserId)
            elif transactionStatus == 0:
                ### pass if status check gave faile and we have pending or initiated make it fail
                if gold_txn_queryset.status == 2 or gold_txn_queryset.status == 3:
                    gold_txn_queryset.update(status = 0)
                elif gold_txn_queryset.status == 1:
                    #### then reverse the balance so we debit 
                    gold_balance_update = user_gold_balance_update(userId,safeGoldUserId,goldAmount,"Credit",goldGatewayId,statusCheckId,goldBalanceAmount)
                    getUserBalanceDict = common_get_user_balance(transactionApiId=goldGatewayId,safeGoldUserId=safeGoldUserId)
            else:### any other just pass
                pass
            responseDict = {
                "invoice_id":sellStatusCheckResponseBody.get("data").get("invoice_id"),
                "created_at":sellStatusCheckResponseBody.get("data").get("created_at"),
                "status":sellStatusCheckResponseBody.get("data").get("status"),
                "transactionStatus":sellStatusCheckResponseBody.get("data").get("transactionStatus"),
            }

            data_status["responseStatus"] = 1
            data_status["sellStatusCheckDict"] = responseDict
            data_status["result"] = message
        else:
        
            data_status["result"] = message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Perform Buy Status Check. Please Try again"
        return data_status

def slab_calculation_for_gold_payin_merchant(amount,paymentModeId,subPaymentModeId,patternId):
    commissionCharges = {}
    print(amount,"amount")
    print(paymentModeId,"paymentModeId")
    print(subPaymentModeId,"subPaymentModeId")
    print(patternId,"patternId")
    try:
        transactionAmount = float(amount)
        grandTotal = 0
        startAmount = 0
        endAmount = 0
        chargeType = ""
        chargeValue = 0
        chargeAmount = 0
        gstAmount = 0
        tdsAmount = 0
        gstInclude = ""
        tdsInclude = ""
        priceType = ""
        aggregatorType = ""
        aggregatorValue = 0
        aggregatorAmount = 0
        commissionType = ""
        commissionValue = 0
        commissionAmount = 0
        gstValue = 0
        tdsValue = 0
        priceType=""
        slabId=None

        slab_queryset = SetupChargeCommissions.objects(paymentModeIdsList__in=[paymentModeId],subPaymentModeIdsList__in=[subPaymentModeId],patternIdsList__in=[patternId]).first()
        if slab_queryset:
            slabId=str(slab_queryset.id)
            print(slabId,"slabId For Util response")
            priceType = slab_queryset.priceType
            gstInclude = slab_queryset.gstInclude
            tdsInclude = slab_queryset.tdsInclude
            gstValue = float(slab_queryset.gstValue)
            tdsValue = float(slab_queryset.tdsValue)

            if priceType == "RANGE":
                priceRangeList = slab_queryset.priceRangeList
                for each_record in priceRangeList:
                    startAmount = float(each_record.get("startAmount"))
                    endAmount = float(each_record.get("endAmount"))
                    
                    if (float(startAmount) <= float(amount)) and (float(amount) <= float(endAmount) or float(endAmount)==0):
                        chargeType = each_record.get("chargeType")
                        chargeValue = float(each_record.get("chargeValue"))
                        # aggregatorType = each_record.get("aggregatorType")
                        # aggregatorValue = float(each_record.get("aggregatorValue"))
                        # commissionType = each_record.get("commissionType")
                        # commissionValue = float(each_record.get("commissionValue"))

            else:
                chargeType = slab_queryset.chargeType
                chargeValue = float(slab_queryset.chargeValue)
                # aggregatorType = slab_queryset.aggregatorType
                # aggregatorValue = float(slab_queryset.aggregatorValue)
                # commissionType = slab_queryset.commissionType
                # commissionValue = float(slab_queryset.commissionValue)


            if chargeValue > 0:
                # if aggregatorType=="FLAT":
                #     aggregatorAmount=float(aggregatorValue)
                # else:
                #     aggregatorAmount=(float(aggregatorValue)*float(amount))/100

                # if commissionType=="FLAT":
                #     commissionAmount=float(commissionValue)
                # else:
                #     commissionAmount=(float(commissionValue)*float(amount))/100

                if chargeType=="FLAT":
                    chargeAmount=chargeValue
                else:
                    chargeAmount = (float(amount)*float(chargeValue))/100

                transactionAmount=float(transactionAmount) + float(chargeAmount)

                if gstValue>0:   
                    gstAmount = (float(chargeAmount)*float(gstValue))/100

                if tdsValue>0:
                    tdsAmount = (float(chargeAmount)*float(tdsValue))/100
                    
                if gstInclude == "Yes":
                    chargeAmount = float(chargeAmount)+float(gstAmount)
                else:
                    transactionAmount = float(transactionAmount)+float(gstAmount)

                if tdsInclude == "Yes":
                    chargeAmount = float(chargeAmount)+float(tdsAmount)
                else:
                    transactionAmount = float(transactionAmount)+float(tdsAmount)

        commissionCharges = {
        "aggregatorType":aggregatorType,
        "aggregatorAmount":round(float(aggregatorAmount),2),
        "commissionType":commissionType,
        "commissionAmount":round(float(commissionAmount),2),
        "chargeType":chargeType,
        "chargeAmount":round(float(chargeAmount),2),
        "transactionAmount":round(float(transactionAmount),2),
        "gstInclude":gstInclude,
        "gstAmount":round(float(gstAmount),2),
        "tdsInclude":tdsInclude,
        "tdsAmount":round(float(tdsAmount),2),
        "priceType":priceType,
        "slabId":slabId,
        "chargeValue":chargeValue,
        "gstValue":gstValue,
        "tdsValue":tdsValue,
        "aggregatorValue":aggregatorValue,
        "commissionValue":commissionValue,
        }
        print(commissionCharges,"((((((((((((((((((PAYIN COMMISSION CHARGES API))))))))))))))))))")
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return commissionCharges


def slab_calculation_for_gold_service_payment_type(amount,paymentModeId,subPaymentModeId,servicePaymentType):
    commissionCharges = {}
    print(amount,"amount")
    print(paymentModeId,"paymentModeId")
    print(subPaymentModeId,"subPaymentModeId")
    try:
        transactionAmount = float(amount)
        grandTotal = 0
        startAmount = 0
        endAmount = 0
        chargeType = ""
        chargeValue = 0
        chargeAmount = 0
        gstAmount = 0
        tdsAmount = 0
        gstInclude = ""
        tdsInclude = ""
        priceType = ""
        gstValue = 0
        tdsValue = 0
        slabId=None

        slab_queryset = ServicePaymentSetupChargeCommission.objects(paymentModeIdsList__in=[paymentModeId],subPaymentModeIdsList__in=[subPaymentModeId],servicePaymentType=servicePaymentType).first()
        if slab_queryset:
            slabId=str(slab_queryset.id)
            print(slabId,"slabId For Util response")
            priceType = slab_queryset.priceType
            gstInclude = slab_queryset.gstInclude
            tdsInclude = slab_queryset.tdsInclude
            gstValue = float(slab_queryset.gstValue)
            tdsValue = float(slab_queryset.tdsValue)

            if priceType == "RANGE":
                priceRangeList = slab_queryset.priceRangeList
                for each_record in priceRangeList:
                    startAmount = float(each_record.get("startAmount"))
                    endAmount = float(each_record.get("endAmount"))
                    
                    if (float(startAmount) <= float(amount)) and (float(amount) <= float(endAmount) or float(endAmount)==0):
                        chargeType = each_record.get("chargeType")
                        chargeValue = float(each_record.get("chargeValue"))
                        # aggregatorType = each_record.get("aggregatorType")
                        # aggregatorValue = float(each_record.get("aggregatorValue"))
                        # commissionType = each_record.get("commissionType")
                        # commissionValue = float(each_record.get("commissionValue"))

            else:
                chargeType = slab_queryset.chargeType
                chargeValue = float(slab_queryset.chargeValue)
                # aggregatorType = slab_queryset.aggregatorType
                # aggregatorValue = float(slab_queryset.aggregatorValue)
                # commissionType = slab_queryset.commissionType
                # commissionValue = float(slab_queryset.commissionValue)


            if chargeValue > 0:
                # if aggregatorType=="FLAT":
                #     aggregatorAmount=float(aggregatorValue)
                # else:
                #     aggregatorAmount=(float(aggregatorValue)*float(amount))/100

                # if commissionType=="FLAT":
                #     commissionAmount=float(commissionValue)
                # else:
                #     commissionAmount=(float(commissionValue)*float(amount))/100

                if chargeType=="FLAT":
                    chargeAmount=chargeValue
                else:
                    chargeAmount = (float(amount)*float(chargeValue))/100

                transactionAmount=float(transactionAmount) + float(chargeAmount)

                if gstValue>0:   
                    gstAmount = (float(chargeAmount)*float(gstValue))/100

                if tdsValue>0:
                    tdsAmount = (float(chargeAmount)*float(tdsValue))/100
                    
                if gstInclude == "Yes":
                    chargeAmount = float(chargeAmount)+float(gstAmount)
                else:
                    transactionAmount = float(transactionAmount)+float(gstAmount)

                if tdsInclude == "Yes":
                    chargeAmount = float(chargeAmount)+float(tdsAmount)
                else:
                    transactionAmount = float(transactionAmount)+float(tdsAmount)

        commissionCharges = {
        "chargeType":chargeType,
        "chargeAmount":round(float(chargeAmount),2),
        "goldAmount":round(float(amount),2),
        "transactionAmount":round(float(transactionAmount),2),
        "gstInclude":gstInclude,
        "gstAmount":round(float(gstAmount),2),
        "tdsInclude":tdsInclude,
        "tdsAmount":round(float(tdsAmount),2),
        "priceType":priceType,
        "slabId":slabId,
        "chargeValue":round(float(chargeValue),2),
        "gstValue":round(float(gstValue),2),
        "tdsValue":round(float(tdsValue),2),
        }
        print(commissionCharges,"((((((((((((((((((PAYIN COMMISSION CHARGES API))))))))))))))))))")
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return commissionCharges

@gold_apis.route("/gold_payin_charges_calculation", methods=["GET","POST"])
@encrypt_decrypt_after_login
def gold_payin_charges_calculation():
    data_status = {"responseStatus":0,"result":""}
    try:
        data = request.decrypted_data
        amount = data.get("amount")
        # paymentModeId = data.get("paymentModeId","")
        # subPaymentModeId = data.get("subPaymentModeId","")
        cardType=data.get("cardType","")
        ccnum = data.get("ccnum","")
        paymentMode = data.get("paymentMode","")
        vpa = data.get("vpa","")
        bankId = data.get("bankId","")

        if amount:
            if paymentMode=="CARD":
                if not ccnum or not paymentMode:
                    data_status["result"] = "Required fields are missing!!"
                    return data_status
                card_category=""
                card_type=""
                issuing_bank=""
                is_domestic="0"
                additonalCardType=""
        
                card_bin_response = card_bin_check(ccnum)
                print(card_bin_response,"card_bin_response123")
                if card_bin_response.get("responseStatus") == 1:
                    card_category = card_bin_response.get("data").get("cardCategory")
                    card_type = card_bin_response.get("data").get("cardType")
                    is_domestic = card_bin_response.get("data").get("isDomestic")
                    issuing_bank = card_bin_response.get("data").get("issuingBank")
                    additonalCardType = card_bin_response.get("data").get("additonalCardType")
                    if additonalCardType!=None:
                        if issuing_bank=="HDFC":
                            card_type=str(additonalCardType)+"_"+str(issuing_bank)+"_"+str(card_type)
                        else:
                            card_type=str(additonalCardType)+"_"+str(card_type)
                    elif issuing_bank=="HDFC":
                        card_type=str(issuing_bank)+"_"+str(card_type)
                subPaymentMode = card_type
                print(subPaymentMode,"subPaymentMode")
                print(is_domestic,"is_domestic")
                if is_domestic!="1":
                    print('is_domestic')
                    data_status["result"] = "Only Accepts domestic cards only!!"
                    return data_status

                if card_category!="":
                    if card_category == "creditcard":
                        paymentMode = "CREDIT CARD"
                    elif card_category == "debitcard":
                        paymentMode = "DEBIT CARD"
                    else:
                        data_status["result"] = "Invalid Card Type!!"
                        return data_status

            ################################################### Slab Calculation for Payin #########################################################################
            ##same var assign 
            payment_method=paymentMode
            payment_method=paymentMode
            # paymentGateWayId=transactionApiId

            commissionCharges={}
            paymentModeId=""
            subPaymentModeId=""

            print("payment_method",payment_method)

            if payment_method!="":
                payment_mode_queryset = PaymentMode.objects(paymentMode=str(payment_method)).first()
                paymentModeId=""
                subPaymentModeId=""
                if payment_mode_queryset:
                    paymentModeId = str(payment_mode_queryset.id)
                    if cardType!="":
                        subPaymentMode=cardType
                        sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=str(subPaymentMode)).first()
                        if sub_payment_mode_queryset:
                            subPaymentModeId = str(sub_payment_mode_queryset.id)
                    else:
                        subPaymentMode=payment_method
                        sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=str(subPaymentMode)).first()
                        if sub_payment_mode_queryset:
                            subPaymentModeId = str(sub_payment_mode_queryset.id)

                    if subPaymentModeId=="":
                        subPaymentMode=payment_method
                        sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=str(subPaymentMode)).first()
                        if sub_payment_mode_queryset:
                            subPaymentModeId = str(sub_payment_mode_queryset.id)

                if paymentModeId!="" and subPaymentModeId!="":
                    servicePaymentType="digitalGold"
                    commissionCharges = slab_calculation_for_gold_service_payment_type(amount=amount,paymentModeId=paymentModeId,subPaymentModeId=subPaymentModeId,servicePaymentType=servicePaymentType)

                    # if commissionCharges.get("slabId") == None:
                    #     slabId = None
                    #     transactionAmount = linkAmount
                    # else:
                    #     slabId = commissionCharges.get("slabId")
                    #     transactionAmount = float(commissionCharges.get("transactionAmount"))

                if commissionCharges:
                    data_status["responseStatus"] = 1
                    data_status["result"] = "Charges Fetched Successfully"
                    data_status["digitalGoldCharges"] = commissionCharges
                    return data_status
                else:
                    data_status["result"] = "Failed to Fetch Gold Payin Charges"
                    return data_status
            else:
                data_status["result"] = "Unable to Check for given Payment Mode"
                return data_status
        
        else:    
            data_status["result"] = "Required fields are missing!!"
            return data_status
    
    except Exception as e:
        app.logger.error(traceback.format_exc())
        print(traceback.format_exc(),"traceback_error")
        data_status["result"]="Unable to Fetch Gold Payin Charges!!"
        return data_status
    
@gold_apis.route("/gold_transaction_detailed_view",methods=["POST"])
# @user_required
@encrypt_decrypt_after_login
def gold_transaction_detailed_view():
    data_status = {"responseStatus": 0, "result": ""}
    try:        
        data = request.decrypted_data

        print("request gold_transaction_detailed_view",data)

        userId = data.get("userId","")
        walletId = data.get("transactionId","")
        transactionDict = {}
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if not walletId or not userId:
            data_status["result"]="Required fields are missing!!"
            return data_status
        transaction_queryset = GoldTransactions.objects(userId=userId,id=walletId).first()
        if not transaction_queryset:
            data_status["result"]="Invalid transaction id!!"
            return data_status

        transactionDict = fetching_gold_payment_transaction_details(transaction_queryset)

        data_status["result"] = "Transaction details fetched successfully"
        data_status["responseStatus"] = 1
        data_status["transactionDetails"] = transactionDict
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch transaction data!!"
        return data_status

def fetching_gold_payment_transaction_details(each_transaction):
    transactionDict = {}
    try:
        transactionDict = {
        "id":str(each_transaction.id),
        "userId":str(each_transaction.userId.id),
        "fullName":each_transaction.userId.fullName,
        "goldTransactionType":each_transaction.goldTransactionType,
        "goldTransactionApiId":str(each_transaction.goldTransactionApiId.id),
        "goldTransactionApiName":each_transaction.goldTransactionApiId.apiName,
        "currentGoldPrice":each_transaction.currentGoldPrice,
        "goldPurchaseAmount":each_transaction.goldPurchaseAmount,
        # "goldPurchaseAmount":each_transaction.goldAmount,
        "goldPurchaseGrams":each_transaction.goldPurchaseGrams,
        "purchaseGrandTotal":each_transaction.purchaseGrandTotal,
        "currency":each_transaction.currency,
        "paymentType":each_transaction.paymentType,
        "creditType":each_transaction.creditType,
        "transactionId":each_transaction.transactionId,
        "invoiceId":each_transaction.invoiceId,
        "orderId":each_transaction.orderId,
        "createdOn":each_transaction.createdOn.strftime("%d-%m-%Y %I:%M %p"),
        "errorMessage":each_transaction.errorMessage,
        "productName":each_transaction.productName,
        "customerVpa":each_transaction.customerVpa,
        "paymentAmount":each_transaction.paymentAmount,
        "status":each_transaction.status,
        }
        if each_transaction.currency:
            transactionDict["currency"]=each_transaction.currency
        else:
            transactionDict["currency"]=""

        if each_transaction.customerName:
            transactionDict["customerEmail"] = each_transaction.customerEmail
            transactionDict["customerName"] = each_transaction.customerName
            transactionDict["customerPhonenumber"] = each_transaction.customerPhonenumber
            transactionDict["errorMessage"] = each_transaction.errorMessage
            transactionDict["customerVpa"] = each_transaction.customerVpa
            transactionDict["productName"] = each_transaction.productName
        else:
            transactionDict["customerEmail"] = ""
            transactionDict["customerName"] = ""
            transactionDict["customerPhonenumber"] = ""
            transactionDict["errorMessage"] = ""
            transactionDict["customerVpa"] = ""
            transactionDict["productName"] = ""

        if each_transaction.paymentType:
            transactionDict["paymentType"]=each_transaction.paymentType
        else:
            transactionDict["paymentType"]=""

        if each_transaction.bankRefId:
            transactionDict["bankRefId"]=str(each_transaction.bankRefId)
        else:
            transactionDict["bankRefId"]=""

        if each_transaction.paymentGrandTotal:
            transactionDict["paymentGrandTotal"]=each_transaction.paymentGrandTotal
        else:
            transactionDict["paymentGrandTotal"]=0
    
        
        if each_transaction.transactionId:
            transactionDict["orderId"]=each_transaction.orderId
            transactionDict["transactionId"]=each_transaction.transactionId
        else:
            transactionDict["orderId"]=""
            transactionDict["transactionId"]=""
        try:
            if each_transaction.cardType:
                transactionDict["cardType"] = each_transaction.cardType
                transactionDict["cardmasked"] = each_transaction.cardmasked
                transactionDict["creditType"] = each_transaction.creditType
            else:
                transactionDict["cardType"] =""
                transactionDict["cardmasked"] =""
                transactionDict["creditType"] =""
        except Exception as e:
            transactionDict["cardType"] =""
            transactionDict["cardmasked"] =""
            transactionDict["creditType"] =""

        try:
            if each_transaction.paymentGatewayId:
                transactionDict["paymentGatewayId"] = str(each_transaction.paymentGatewayId.id)
                transactionDict["paymentGatewayName"] = each_transaction.paymentGatewayId.apiName
            else:
                transactionDict["paymentGatewayId"] =""
                transactionDict["paymentGatewayName"] =""
        except Exception as e:
            transactionDict["paymentGatewayId"] =""
            transactionDict["paymentGatewayName"] =""

        try:
            if each_transaction.paymentStatus:
                transactionDict["paymentStatus"] =each_transaction.paymentStatus
            else:
                transactionDict["paymentStatus"] = 0
        except Exception as e:
            transactionDict["paymentStatus"]=0

        # if each_transaction.status == 1:
       
        try:
            if each_transaction.bankStatus:
                transactionDict["bankStatus"] = each_transaction.bankStatus
            else:
                transactionDict["bankStatus"] = 0
                mask_account_number(each_transaction.bankAccountNumber)
            transactionDict["bankAccountNumber"]=mask_account_number(each_transaction.bankAccountNumber)
            transactionDict["ifscCode"]=each_transaction.ifscCode
            transactionDict["originalBankName"]=each_transaction.originalBankName
        except Exception as e:
            transactionDict["bankStatus"]=""
            transactionDict["bankAccountNumber"]=""
            transactionDict["ifscCode"]=""
            transactionDict["originalBankName"]=""
        try:
            if each_transaction.commissionCharges:
                transactionDict["commissionCharges"]=each_transaction.commissionCharges
            else:
                commissionCharges = {
                "aggregatorType":"",
                "aggregatorAmount":0,
                "commissionType":"",
                "commissionAmount":"",
                "chargeType":"FLAT",
                "chargeValue":0,
                "gstValue":0,
                "tdsValue":0,
                "aggregatorValue":0,
                "commissionValue":0,
                "chargeAmount":"0",
                "transactionAmount":"0",
                "gstInclude":0,
                "gstAmount":"0",
                "tdsInclude":0,
                "tdsAmount":0,
                "priceType":"Fixed",
                "slabId":""
                }
                transactionDict["commissionCharges"]=commissionCharges
        except Exception as e:
            commissionCharges = {
            "aggregatorType":"",
            "aggregatorAmount":0,
            "commissionType":"",
            "commissionAmount":"",
            "chargeType":"FLAT",
            "chargeValue":0,
            "gstValue":0,
            "tdsValue":0,
            "aggregatorValue":0,
            "commissionValue":0,
            "chargeAmount":"0",
            "transactionAmount":"0",
            "gstInclude":0,
            "gstAmount":"0",
            "tdsInclude":0,
            "tdsAmount":0,
            "priceType":"Fixed",
            "slabId":""
            }
            transactionDict["commissionCharges"]=commissionCharges
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return transactionDict

@gold_apis.route("/gold_transactions_list_user_wise",methods=["POST"])
@encrypt_decrypt_after_login
def gold_transactions_list_user_wise():
    data_status = {"responseStatus": 0, "result": ""}
    try:        
        data = request.decrypted_data
        # data = request.json

        print("request.decrypted_data",data) 

        userId = data.get("userId","")
        goldTransactionApiId = data.get("goldTransactionApiId","")
        startDate = data.get("startDate","")
        endDate = data.get("endDate","")
        goldTransactionType = data.get("goldTransactionType","All")
        goldTransactionTypecheck=["Credit","Debit"]
        transactionsList = []

    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status
    try:
        if not userId or not goldTransactionApiId:
            data_status["result"]="Required fields are missing!!"
            return data_status

        if startDate and endDate:
            startDate = startDate + " 00:00:00"
            endDate = endDate + " 23:59:59"
            start_date = datetime.datetime.strptime(startDate, "%d-%m-%Y %H:%M:%S")
            end_date = datetime.datetime.strptime(endDate, "%d-%m-%Y %H:%M:%S")
        if goldTransactionType == "All":
            goldTransactionTypecheck = ["Credit","Debit"]
        print(goldTransactionTypecheck,"goldTransactionTypecheck")
        
        gold_txns_queryset = GoldTransactions.objects(createdOn__gte=start_date,goldTransactionApiId=goldTransactionApiId,createdOn__lte=end_date,userId=userId,goldTransactionType__in=goldTransactionTypecheck).order_by("-id").all()

        # gold_txns_queryset = GoldTransactions.objects(createdOn__gte=startDate,goldTransactionApiId=goldTransactionApiId,createdOn__lte=end_date,userId=userId).order_by("-id").all()
        print("len",len(gold_txns_queryset))
        for each_gold_txn in gold_txns_queryset:

            txnDict = {
                "id": str(each_gold_txn.id),
                "goldTransactionType": str(each_gold_txn.goldTransactionType),
                "createdOn": each_gold_txn.createdOn.strftime("%d-%m-%Y %I:%M %p"),
                "status": each_gold_txn.status,
                "bankStatus": each_gold_txn.bankStatus,
                # "paymentStatus": each_gold_txn.paymentStatus,
                # "amount": each_gold_txn.paymentGrandTotal, ###total amount debited from user with all taxes
                "goldPurchaseGrams": each_gold_txn.goldPurchaseGrams,
            }   
            if each_gold_txn.bankStatus:
                txnDict["bankStatus"] = each_gold_txn.bankStatus
            else:
                txnDict["bankStatus"] = 0

            if each_gold_txn.goldTransactionType == "Credit":
                txnDict["amount"] = each_gold_txn.paymentGrandTotal
            else:
                txnDict["amount"] = each_gold_txn.purchaseGrandTotal
            if each_gold_txn.paymentStatus:
                txnDict["paymentStatus"] = each_gold_txn.paymentStatus
            else:
                txnDict["paymentStatus"] = 0
            transactionsList.append(txnDict)

        data_status["result"] = "Transaction details fetched successfully"
        data_status["responseStatus"] = 1
        data_status["transactionsList"] = transactionsList
        return data_status

    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch transactions List!!"
        return data_status

@gold_apis.route("/gold_payment_status_check_admin", methods=["POST"])
def gold_payment_status_check_admin():
    data_status = {"responseStatus":0,"result":""}
    id = request.form.get("id","")
    print(id,"id")
    responseDict = {}
    payinPaymentstatusResponseDict = {}
    try:
        if not session.get("adminId"):
            return redirect("admin_login")

        if not id:
            data_status["result"]="Required fields are missing!!"
            return data_status
        
        gold_transactions_queryset = GoldTransactions.objects(id=id).first()
        if not gold_transactions_queryset:
            data_status["result"]="Invalid Order Id!!"
            return data_status

        order_id = str(gold_transactions_queryset.orderId)
        pgOrderId = str(gold_transactions_queryset.pgOrderId)
        payInPaymentGatewayId = str(gold_transactions_queryset.paymentGatewayId.id)
        payin_gate_way_queryset = TransactionAPI.objects(id=str(payInPaymentGatewayId)).first()
        if not payin_gate_way_queryset:
            data_status["result"]="Invalid request found!!"
            return data_status
        paymentGateWayCode = payin_gate_way_queryset.code
        paramsList = payin_gate_way_queryset.paramsList
        autoSettlement = payin_gate_way_queryset.autoSettlement
        txnDate = payin_gate_way_queryset.createdOn.strftime("%d-%m-%Y")

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

        ###################################################################################################################################################
        
        if paymentGateWayCode == "AccurePay_PayIn":
            get_api_key = ""
            get_salt = ""
            get_base_url=''
            for each_key in paramsList:
                
                get_key = each_key.get("key")
                
                if get_key == "api_key":
                    get_api_key = each_key.get("value")
                    
                if get_key == "salt":
                    get_salt = each_key.get("value")

                if get_key == "base_url":
                    get_base_url = each_key.get("value")
            
            ######################################################### Check Accurepay Payin Payment Status #############################################################
            payinPaymentstatusResponseDict = check_accurepay_payin_paymentstatus(get_api_key,get_salt,get_base_url,pgOrderId)
            ########################################################################################################################################################

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

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


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

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

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


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

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

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

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

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

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


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

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

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

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

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


            transactionstatus = payinPaymentstatusResponseDict.get("paymentStatus","")
            paymentMode=payinPaymentstatusResponseDict.get('payment_mode',"")
            transactionData = payinPaymentstatusResponseDict.get("transactionData")
            customerVpa = str(payinPaymentstatusResponseDict.get('customerVpa'))
            currency=str(payinPaymentstatusResponseDict.get('currency'))
            cardmasked=str(payinPaymentstatusResponseDict.get('cardmasked'))
            
            order_queryset = GoldTransactions.objects(pgOrderId=pgOrderId).first()
            goldGatewayId = order_queryset.goldTransactionApiId
            apiTransactionId = order_queryset.apiTransactionId
            paymentAmount=float(order_queryset.paymentAmount)
            transactionAmount = float(order_queryset.paymentAmount)
            pgOrderId = str(order_queryset.pgOrderId)
            transaction_id=str(order_queryset.transactionId)
            if transactionstatus== 1:
                errorMessage=""
                paymentGrandTotal = order_queryset.paymentGrandTotal
                if float(payinPaymentstatusResponseDict.get("orderAmount")) == float(paymentGrandTotal) and order_queryset.paymentStatus!=6:
                    amountstatus = 1
                    errorMessage = "Success"
                else:
                    amountstatus = 6
                    errorMessage = "Insufficient amount credited!!"
                
                if order_queryset.paymentStatus!=1 and amountstatus==1:
                    userId=str(order_queryset.userId.id)
                    walletId=str(order_queryset.id)
                    
                    cardType = str(gold_transactions_queryset.cardType)
                    if cardType=="":
                        cardType=payinPaymentstatusResponseDict.get('cardType')
                    # payment_mode_queryset = PaymentMode.objects(paymentMode=str(paymentMode)).first()
                    # paymentModeId=""
                    # subPaymentModeId=""
                    # commissionCharges={}
                    # if payment_mode_queryset:
                    #     paymentModeId = str(payment_mode_queryset.id)
                    #     if cardType!="":
                    #         subPaymentMode=cardType
                    #         sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=str(subPaymentMode)).first()
                    #         if sub_payment_mode_queryset:
                    #             subPaymentModeId = str(sub_payment_mode_queryset.id)
                    #     else:
                    #         subPaymentMode=paymentMode
                    #         sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=str(subPaymentMode)).first()
                    #         if sub_payment_mode_queryset:
                    #             subPaymentModeId = str(sub_payment_mode_queryset.id)

                    #     if subPaymentModeId=="":
                    #         subPaymentMode=paymentMode
                    #         sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=str(subPaymentMode)).first()
                    #         if sub_payment_mode_queryset:
                    #             subPaymentModeId = str(sub_payment_mode_queryset.id)

                    # print(subPaymentModeId,"(((((((((((subPaymentModeId)))))))))))")
                    # print(paymentModeId,"(((((((((((paymentModeId)))))))))))")
                    # if subPaymentModeId!="" and paymentModeId!="":
                    #     commissionCharges = slab_calculation_for_payin_merchant(amount,paymentModeId,subPaymentModeId,patternId)
                    #     if commissionCharges.get("transactionAmount"):
                    #         transactionAmount=commissionCharges.get("transactionAmount")
                    #     else:
                    #         transactionAmount=transactionAmount
                    
                    

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

                    order_queryset.update(
                        paymentStatus=1,
                        payInResponseCallBackData=payinPaymentstatusResponseDict.get("transactionData"),
                        responseCallBackTime=datetime.datetime.now(),
                        transactionId=transaction_id,
                        bankRefId=bank_reference_number,
                        errorMessage=payinPaymentstatusResponseDict.get("message"),
                        paymentGrandTotal=round_last_digits(float(transactionAmount)),
                        # walletLog="Wallet Balance is added with the amount of " + str(amount) + ".",previousBalance=round_last_digits(float(balanceResult.get('userPreviousBalance'))),
                        # currentBalance=round_last_digits(float(balanceResult.get('userCurrentBalance'))),
                        # commissionCharges=commissionCharges,
                        pgOrderId=str(payinPaymentstatusResponseDict.get('pgOrderId')),
                        customerVpa=customerVpa,
                        currency=currency,
                        cardmasked=cardmasked,
                        paymentType=paymentMode)
                    
                    # if paymentModeId!="":
                    #     order_queryset.update(paymentModeId=ObjectId(paymentModeId))
                    # if subPaymentModeId!="":
                    #     order_queryset.update(subPaymentModeId=ObjectId(subPaymentModeId))
                    
                    getPriceResponseDict = common_get_buy_price(transactionApiId=order_queryset.goldTransactionApiId.id)
                    print("((((((((getPriceResponseDict))))))))",getPriceResponseDict)
                    rateId = getPriceResponseDict.get("data",{}).get("rate_id")
                    if getPriceResponseDict.get("responseStatus") != 1 :
                        data_status["result"]="Failed to get buy price and verify !!"
                        return data_status

                    verifyBuyResponseDict = common_verify_buy_price( transactionApiId=order_queryset.goldTransactionApiId.id, safeGoldUserId=order_queryset.goldUserId.apiReferenceId, rateId=rateId, gold_amount=order_queryset.goldPurchaseGrams, buy_price=order_queryset.purchaseGrandTotal)
                    print("((((((((verifyBuyResponseDict))))))))",verifyBuyResponseDict)

                    if verifyBuyResponseDict.get("responseStatus") != 1 :
                        data_status["result"]="Failed to Reverify and confirm gold buy request!!"
                        return data_status

                    goldConfirmResponseData =gold_buy_confirm_helper(goldGatewayId.id,userId,apiTransactionId)
                    print("goldConfirmResponseData",goldConfirmResponseData)
                    result = goldConfirmResponseData.get("result")
                    if goldConfirmResponseData.get("responseStatus") == 1:
                        confirmBuyPriceDict = goldConfirmResponseData.get("confirmBuyPriceDict")
                        GoldTransactionStatus = confirmBuyPriceDict.get("transactionStatus")
                        invoice_id = confirmBuyPriceDict.get("invoice_id")
                        created_at = confirmBuyPriceDict.get("created_at")
                        status = confirmBuyPriceDict.get("status")
                        if GoldTransactionStatus == 1:
                            data_status["goldConfirmStatus"] = 1
                            data_status["invoice_id"] = invoice_id
                            data_status["created_at"] = created_at
                        else:
                            data_status["goldConfirmStatus"] = 0
                    else:
                        data_status["goldConfirmStatus"] = 0
                else:
                    order_queryset.update(
                        paymentStatus=transactionstatus,
                        payInResponseCallBackData=payinPaymentstatusResponseDict.get("transactionData"),
                        responseCallBackTime=datetime.datetime.now(),
                        transactionId=transaction_id,
                        bankRefId=bank_reference_number,
                        customerVpa=str(payinPaymentstatusResponseDict.get('customerVpa')),
                        cardmasked=str(payinPaymentstatusResponseDict.get('cardmasked')),
                        paymentType=paymentMode,
                        currency=str(payinPaymentstatusResponseDict.get('currency')),
                        errorMessage=errorMessage,
                        paymentGrandTotal=round_last_digits(float(transactionAmount)),
                        pgOrderId=str(payinPaymentstatusResponseDict.get('pgOrderId',""))
                        # walletLog="Wallet Balance is added with the amount of "+str(amount)+".",
                        # commissionCharges=commissionCharges,
                        # paymentStatusCheckId=paymentStatusCheckId, #doubt
                        # subPaymentModeId=ObjectId(subPaymentModeId),
                        # paymentModeId=ObjectId(paymentModeId)
                        )

                    # if paymentModeId!="":
                    #     order_queryset.update(paymentModeId=ObjectId(paymentModeId))
                    # if subPaymentModeId!="":
                    #     order_queryset.update(subPaymentModeId=ObjectId(subPaymentModeId))

                    # if autoSettlement==True:
                    #     try:
                    #         settlement_response=merchant_payin_auto_settlement(str(userId),str(walletId),str(payInPaymentGatewayId))
                    #         print(settlement_response,"settlement_response")
                    #         pass
                    #     except Exception as e:
                    #         pass
                    # try:
                    #     merchantName = str(order_queryset.userId.fullName)
                    #     trnsactionDate = datetime.datetime.now().astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
                    #     mail_subject = "Load Funds for Graam Pay from Merchant " + merchantName + "."
                    #     sender_mail_query = SenderMails.objects(status=1,mailType="Payin Transactions Mail").first()
                    #     mail_data = {
                    #     "merchantName":merchantName,
                    #     "amount":formatINR("{:.2f}".format(float(amount))),
                    #     "transactionId":str(order_queryset.transactionId),
                    #     "paymentMode":paymentMode,
                    #     "cardNumber":str(payinPaymentstatusResponseDict.get('cardmasked')),
                    #     "orderId":str(order_queryset.orderId),
                    #     "bankRefId":str(bank_reference_number),
                    #     "transactionDate":trnsactionDate,
                    #     }
                    #     if sender_mail_query:
                    #         sendermailsList = sender_mail_query.mailsList
                    #         recipients_list = sendermailsList
                    #         template_name = "emails/loadfunds.html"
                            
                    #         mailoutputData = send_asynchronous_email(mail_subject, recipients_list, template_name, mail_data)
                            
                    #         merchant_mail_subject = "Payment Transaction Alert From Graam Pay"
                    #         merchant_recipients_list = [order_queryset.userId.email]

                    #         mailoutputData = send_asynchronous_email(merchant_mail_subject, merchant_recipients_list, template_name, mail_data)

                    # except Exception as e:
                    #     app.logger.error(traceback.format_exc())
                    #     pass

                    # try:
                    #     user_queryset=Users.objects(id=str(order_queryset.userId.id)).first()
                    #     if user_queryset.parentId and commissionCharges.get("slabId") != None:
                    #         user_parent_payin_commission_details(str(user_queryset.parentId.id),amount,payInPaymentGatewayId,order_queryset.transactionId,str(paymentModeId),str(subPaymentModeId),commissionCharges.get("chargeAmount"),commissionCharges.get("chargeValue"),commissionCharges.get("chargeType"),str(user_queryset.id),float(commissionCharges.get("gstAmount")),float(commissionCharges.get("tdsAmount")))
                    # except Exception as e:
                    #     app.logger.error(traceback.format_exc())
                    #     pass
                # else:
                #     order_queryset.update(
                #         status=amountstatus,payInResponseCallBackData=payinPaymentstatusResponseDict.get("transactionData"),responseCallBackTime=datetime.datetime.now(),
                #         transactionId=order_queryset.transactionId,
                #         bankRefId=bank_reference_number,
                #         currency=payinPaymentstatusResponseDict.get("currency",""),
                #         paymentGrandTotal=round_last_digits(float(transactionAmount)),
                #         # walletLog="Wallet Balance is added with the amount of " + str(amount) + ".",
                #         pgOrderId=str(payinPaymentstatusResponseDict.get('pgOrderId',"")),
                #         customerVpa=str(payinPaymentstatusResponseDict.get('customerVpa',"")),
                #         errorMessage=errorMessage,
                #         cardmasked=str(payinPaymentstatusResponseDict.get('cardmasked',""))
                #     )

            else:
                status=2
                if transactionstatus==0:
                    status=0
                elif transactionstatus==4:
                    status=4
                else:
                    status=2
                lorder_queryset = GoldTransactions.objects(pgOrderId=pgOrderId).first()
                transaction_id=lorder_queryset.transactionId
                if lorder_queryset.paymentStatus==1:
                    rorderId = random_digit_generate(16)
                    wallet_transaction_table = GoldTransactions(
                        userId = userId,
                        paymentAmount = round_last_digits(float(order_queryset.paymentAmount)),
                        paymentGrandTotal=round_last_digits(float(transactionAmount)),
                        paymentGatewayId = str(order_queryset.paymentGatewayId.id),
                        currency=order_queryset.currency,
                        creditType = "Debit",
                        transactionId = transaction_id,
                        # transactionData = transactionData,#
                        orderId = str(rorderId),
                        # walletLog="Wallet Balance is refunded with the amount of " + str(order_queryset.paymentAmount) + ".",
                        userType="user",
                        # createdBy = None,
                        createdOn = datetime.datetime.now(),
                        location = "",
                        platform = "api",
                        agent = "",
                        customerEmail = order_queryset.customerEmail,
                        customerName = order_queryset.customerName,
                        customerPhonenumber = order_queryset.customerPhonenumber,
                        # previousBalance=round_last_digits(float(balanceResult.get('userPreviousBalance'))),
                        # currentBalance=round_last_digits(float(balanceResult.get('userCurrentBalance'))),
                        # paymentLinkId = None,
                        # PaymentButtonId = None,
                        # paymentPageId = None,
                        paymentChannel = "", #doubt
                        bankRefId=bank_reference_number,
                        cardmasked=cardmasked,
                        errorMessage=errorMessage,
                        bankName="", #doubt
                        pgOrderId=order_queryset.orderId,
                        walletTransactionId=str(order_queryset.id),
                        customerVpa=customerVpa,
                        slabId=order_queryset.slabId,
                        subPaymentModeId=str(order_queryset.subPaymentModeId),
                        paymentModeId=str(order_queryset.paymentModeId),
                        paymentType=paymentMode,
                        commissionCharges=order_queryset.commissionCharges,
                        paymentApiresponseData="", #doubt
                        paymentStatus = 5
                        ).save()
                    lorder_queryset.update(
                        status=0,###making gold status 0 as payment failed
                        paymentStatus=transactionstatus,
                        paymentApiresponseData="", #doubt
                        transactionId=transaction_id,
                        bankRefId=bank_reference_number,
                        bankName="",
                        paymentType=paymentMode,
                        customerVpa=customerVpa,
                        currency=currency,
                        cardmasked=cardmasked,
                        errorMessage=payinPaymentstatusResponseDict.get("message"),
                        paymentGrandTotal=round_last_digits(float(transactionAmount)),
                        # commissionCharges=commissionCharges,
                        # paymentStatusCheckId=paymentStatusCheckId,# doubt
                        # subPaymentModeId=ObjectId(subPaymentModeId),
                        # paymentModeId=ObjectId(paymentModeId)
                        )
                    
                else:
                    lorder_queryset.update(
                        status=0,###making gold status 0 as payment failed
                        paymentStatus=transactionstatus,
                        payInResponseCallBackData=transactionData,
                        paymentApiresponseData="", #doubt
                        responseCallBackTime=datetime.datetime.now(),
                        transactionId=transaction_id,
                        bankRefId=bank_reference_number,
                        customerVpa=customerVpa,
                        cardmasked=cardmasked,
                        bankName="", #doubt
                        paymentType=paymentMode,
                        currency=currency,
                        errorMessage=payinPaymentstatusResponseDict.get("message"),
                        paymentGrandTotal=round_last_digits(float(transactionAmount))
                        # commissionCharges=commissionCharges,
                        # paymentStatusCheckId=paymentStatusCheckId, #doubt
                        # subPaymentModeId=ObjectId(subPaymentModeId),
                        # paymentModeId=ObjectId(paymentModeId)
                    )
                 
            # elif payinPaymentstatusResponseDict.get("paymentStatus")==0 or payinPaymentstatusResponseDict.get("paymentStatus")==4:
                
            #     order_queryset = GoldTransactions.objects(orderId=order_id).first()
            #     amount=float(order_queryset.amount)
            #     if order_queryset.status==1:
            #         amount=float(order_queryset.amount)
            #         transactionAmount = float(order_queryset.grandTotal)
            #         transaction_id=order_queryset.transactionId
                    
            #         balanceResult=user_payin_balance_update(str(order_queryset.userId.id),float(order_queryset.grandTotal),"Debit",str(payInPaymentGatewayId))
            #         if balanceResult.get('responseStatus')==0:
            #             data_status["result"]="Unable to connect with server. Please Try again."
            #             return data_status
                        
            #         payinbalancelogs_queryset=PayinBalanceLogs(
            #             transactionAPIId=str(payInPaymentGatewayId),
            #             userId=str(order_queryset.userId.id),
            #             previousBalance=float(balanceResult.get('transactionPreviousBalance')),
            #             currentBalance=float(balanceResult.get('transactionCurrentBalance')),
            #             orderId=order_queryset.orderId,
            #             amount=round_last_digits(float(amount)),
            #             grandTotal=round_last_digits(float(order_queryset.grandTotal)),
            #             transferType="Debit",
            #             userType="user",
            #             transactionId=transaction_id,
            #             createdOn=datetime.datetime.now(),
            #             status=1
            #             ).save()

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

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

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

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