import base64
import binascii
# import boto3
import calendar
import csv
import datetime
import dateutil.parser
import json
import math
import ipinfo
import os
import pymongo
import pytz
import random
import requests
import string
import time
import traceback
import secrets
import re
import hashlib
import ast
import googlemaps
import phpserialize
from io import StringIO
# from botocore.exceptions import ClientError
from bson import ObjectId
from datetime import timedelta
from calendar import monthrange
from flask import Blueprint, flash, Flask, jsonify, redirect, request, render_template, send_file, send_from_directory, session, url_for, make_response
# from flask_ckeditor import CKEditor
from flask_mail import Mail, Message
from fpdf import FPDF

from functools import wraps
from html.parser import HTMLParser
from io import BytesIO
from mongoengine import *
from PIL import Image
from twilio.rest import Client as sms_client
from random import randint
from threading import Thread
from werkzeug.security import generate_password_hash, check_password_hash
from werkzeug.utils import secure_filename
from mongoengine.queryset.visitor import Q
from pyfcm import FCMNotification
from urllib.parse import unquote
import urllib.request

from appservices import app
from appservices.superAdmin.models import *
# from appservices.frontend.models import *
from datetime import date
from appservices.config import client
from dateutil.relativedelta import relativedelta
from Crypto import Random
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad
from requests.auth import HTTPBasicAuth

import jwt
from jwt.algorithms import RSAAlgorithm
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity,set_access_cookies,decode_token, unset_jwt_cookies
from jwt import ExpiredSignatureError, InvalidTokenError, encode

from Crypto.Hash import SHA256
from binascii import hexlify, unhexlify

from flask_paginate import Pagination, get_page_parameter
import pandas as pd
import numpy as np
from flask_wtf.csrf import CSRFProtect, CSRFError

from appservices.common.payment_gateways.idfc_payment_gateways import *

from appservices.common.payment_gateways.axis_payment_gateways import *

ALLOWED_CSV_EXTENSIONS = {'csv'}
ALLOWED_IMAGE_EXTENSIONS = {'jpg', 'jpeg', 'png'}
ALLOWED_DOC_EXTENSIONS = {'pdf', 'jpg', 'jpeg'}

googleApiKey="AIzaSyDQsG9fsw8cayVCFR47D1Guy_t0mA0w-WU"
mail = Mail(app)
csrf = CSRFProtect(app)
jwtManagerApp  = JWTManager(app) 
secret_val = secrets.token_urlsafe(20)
sender_email = app.config["MAIL_USERNAME"]
#admin_recieve_email = "pgateway38@gmail.com"
admin_recieve_email = "tirupati@viyonafintech.com"


app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(minutes=30)
app.config['SESSION_PERMANENT'] = True  # Ensure all sessions are marked as permanent by default
app.config["JWT_SECRET_KEY"] = "ac73a2f91d8fbb6e9dc60b33425b13ad8de61ab51aeacdb66b3e10dbc2ce1a9b"  # Replace with a secure key
app.config["JWT_TOKEN_LOCATION"] = ["headers", "cookies"]

transaction_id_prefix = "GP"
transaction_utility_id_prefix = "GPU"

app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024
encSecretKey="f51085df02812201344f6f0cb6959647"

# ROUND_LAST_DIGITS = round(float(amount),2)
def round_last_digits(number):
    return round(float(number), 2)

token_expiration_time = 30###### minutes
token_refresh_time = 1500#### seconds


def generate_token(identity, expiration_time=60):
    return create_access_token(identity=identity, expires_delta=timedelta(minutes=expiration_time))


def csrf_protect(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        try:
            return f(*args, **kwargs)
        except CSRFError:
            flash("CSRF token is missing or invalid.")
            return redirect(url_for("admin_login")) 
    return decorated_function

def csrf_exempt_route(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        setattr(request, '_csrf_exempt', True)
        return f(*args, **kwargs)
    return decorated_function

def nocache(view):
    @wraps(view)
    def no_cache_view(*args, **kwargs):
        response = make_response(view(*args, **kwargs))
        response.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0'
        response.headers['Pragma'] = 'no-cache'
        response.headers['Expires'] = '0'
        return response
    return no_cache_view

@app.before_request
def refresh_token_automatically():
    session.permanent = True
    session.modified = True  # This will refresh the session timeout
    if 'adminId' in session:
        # Only apply to specific routes
        if not request.path.startswith("/api/super_admin/"):
            return
        
        # Skip specific routes to avoid redirect loops
        if request.endpoint in ["admin.admin_login", "admin.logout"]:
            return  # Do not check tokens for these endpoints

        # Get the access token from cookies
        token = request.cookies.get("access_token_cookie")
        if not token:
            return redirect(url_for("admin.admin_login"))

        try:
            # Decode the token to check expiration
            decoded_token = decode_token(token)
            exp_timestamp = decoded_token["exp"]
            current_timestamp = datetime.datetime.now().timestamp()

            # Refresh the token if it's about to expire (e.g., within 2 minutes)
            if exp_timestamp - current_timestamp < token_refresh_time:  # 2 minutes
                current_user = decoded_token["sub"]
                token = generate_token(identity=current_user, expiration_time=token_expiration_time)
                response = make_response(redirect(url_for(str(request.endpoint))))
                set_access_cookies(response, token)
                return response
        except ExpiredSignatureError:
            # Handle expired token explicitly in before_request
            app.logger.error("Access token has expired.")
            response = redirect(url_for("admin.admin_login"))
            # Clear the invalid token from cookies
            unset_jwt_cookies(response)
            return response
        except Exception:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("admin.admin_login"))

@app.before_request
def refresh_session():
    session.permanent = True
    session.modified = True  # This will refresh the session timeout

    if 'adminId' in session:
        adminId = session['adminId']
        bankPermissions = check_permissions(adminId, "bankPermissions")
        paymentMasterPermissions = check_permissions(adminId, "paymentMasterPermissions")
        subpaymentmodePermissions = check_permissions(adminId, "subpaymentmodePermissions")
        merchantCategoriesPermissions = check_permissions(adminId, "merchantCategoriesPermissions")
        merchantSubCategoriesPermissions = check_permissions(adminId, "merchantSubCategoriesPermissions")
        networksPermissions = check_permissions(adminId, "networksPermissions")
        bankBinsPermissions = check_permissions(adminId, "bankBinsPermissions")
        patternPermissions = check_permissions(adminId, "patternPermissions")
        chargeCommissionsPermissions = check_permissions(adminId, "chargeCommissionsPermissions")
        userManagementPermissions = check_permissions(adminId, "userManagementPermissions")
        pendingKYCUsersPermissions = check_permissions(adminId, "pendingKYCUsersPermissions")
        affiliatesPermissions = check_permissions(adminId, "affiliatesPermissions")
        blockedMerchantPermissions = check_permissions(adminId, "blockedMerchantPermissions")
        apiGatewaysPermissions = check_permissions(adminId, "apiGatewaysPermissions")
        pendingTransactionPermissions = check_permissions(adminId, "pendingTransactionPermissions")
        updateTransactionPermissions = check_permissions(adminId, "updateTransactionPermissions")
        bankHolidaysPermissions = check_permissions(adminId, "bankHolidaysPermissions")
        kycEntityTypesPermissions = check_permissions(adminId, "kycEntityTypesPermissions")
        allTransactionsPermissions = check_permissions(adminId, "allTransactionsPermissions")
        successTransactionsPermissions = check_permissions(adminId, "successTransactionsPermissions")
        pendingTransactionsPermissions = check_permissions(adminId, "pendingTransactionsPermissions")
        fundSourcesPermissions = check_permissions(adminId, "fundSourcesPermissions")
        velocityRuleEnginePermissions = check_permissions(adminId, "velocityRuleEnginePermissions")
        transactionRouterPermissions = check_permissions(adminId, "transactionRouterPermissions")
        paymentLinkPermissions = check_permissions(adminId, "paymentLinkPermissions")
        paymentButtonPermissions = check_permissions(adminId, "paymentButtonPermissions")
        paymentPagePermissions = check_permissions(adminId, "paymentPagePermissions")
        payinSettlementPermissions = check_permissions(adminId, "payinSettlementPermissions")
        payoutSettlementPermissions = check_permissions(adminId, "payoutSettlementPermissions")
        payoutTransactionReportPermissions = check_permissions(adminId, "payoutTransactionReportPermissions")
        payinTransactionReportPermissions = check_permissions(adminId, "payinTransactionReportPermissions")
        reconcilationTransactionReportPermissions = check_permissions(adminId, "reconcilationTransactionReportPermissions")
        downloadPgReportPermissions = check_permissions(adminId, "downloadPgReportPermissions")
        payinLedgerReportPermissions = check_permissions(adminId, "payinLedgerReportPermissions")
        payoutLedgerReportPermissions = check_permissions(adminId, "payoutLedgerReportPermissions")
        autocollectLedgerReportPermissions = check_permissions(adminId, "autocollectLedgerReportPermissions")
        whitelistAccountHistoryPermissions = check_permissions(adminId, "whitelistAccountHistoryPermissions")
        whitelistPendingPermissions = check_permissions(adminId, "whitelistPendingPermissions")
        virtualAccountPermissions = check_permissions(adminId, "virtualAccountPermissions")
        creditToWalletPermissions = check_permissions(adminId, "creditToWalletPermissions")
        debitFromWalletPermissions = check_permissions(adminId, "debitFromWalletPermissions")
        virtualAdminBalancePermissions = check_permissions(adminId, "virtualAdminBalancePermissions")
        smslogsPermissions = check_permissions(adminId, "smslogsPermissions")
        merchantLogsPermissions = check_permissions(adminId, "merchantLogsPermissions")
        adminOtpLogsPermissions = check_permissions(adminId, "adminOtpLogsPermissions")
        apiLogsPermissions = check_permissions(adminId, "apiLogsPermissions")
        clientPermissions = check_permissions(adminId, "clientPermissions")
        adminLogsPermissions = check_permissions(adminId, "adminLogsPermissions")
        categoriesPermissions = check_permissions(adminId, "categoriesPermissions")
        servicesPermissions = check_permissions(adminId, "servicesPermissions")
        subservicesPermissions = check_permissions(adminId, "subservicesPermissions")
        operatorPermissions = check_permissions(adminId, "operatorPermissions")
        operatorupdatePermissions = check_permissions(adminId, "operatorupdatePermissions")
        operatorparameterPermissions = check_permissions(adminId, "operatorparameterPermissions")
        operatorgroupingPermissions = check_permissions(adminId, "operatorgroupingPermissions")
        subparameterPermissions = check_permissions(adminId, "subparameterPermissions")
        subparametergroupingPermissions = check_permissions(adminId, "subparametergroupingPermissions")
        taxmasterPermissions = check_permissions(adminId, "taxmasterPermissions")
        userCommissionsListPermissions = check_permissions(adminId, "userCommissionsListPermissions")
        documentsPermissions = check_permissions(adminId, "documentsPermissions")
        staffPermissions = check_permissions(adminId, "staffPermissions")
        rolePermissions = check_permissions(adminId, "rolePermissions")
        bannersPermissions = check_permissions(adminId, "bannersPermissions")
        businessDocumentsPermissions = check_permissions(adminId, "businessDocumentsPermissions")
        commissionReportsPermissions = check_permissions(adminId, "commissionReportsPermissions")
        payinTransactionsPermissions = check_permissions(adminId, "payinTransactionsPermissions")
        payinsuccessTransactionsPermissions = check_permissions(adminId, "payinsuccessTransactionsPermissions")
        payinpendingTransactionsPermissions = check_permissions(adminId, "payinpendingTransactionsPermissions")
        payinInitiatedTransactionsPermissions = check_permissions(adminId, "payinInitiatedTransactionsPermissions")
        autoCollectTransactionReportPermissions = check_permissions(adminId, "autoCollectTransactionReportPermissions")
        thirdPartyIntegrationPermissions = check_permissions(adminId, "thirdPartyIntegrationPermissions")
        serviceChargePermissions = check_permissions(adminId, "serviceChargePermissions")
        userPermissionsList = check_permissions(adminId, "userPermissionsList")
        assignvirtualAccountPermissions = check_permissions(adminId, "assignvirtualAccountPermissions")
        assignThirdpartyvirtualAccountPermissions = check_permissions(adminId, "assignThirdpartyvirtualAccountPermissions")
        beneficiariesListPermissions = check_permissions(adminId, "beneficiariesListPermissions")
        autoBeneficiariesListPermissions = check_permissions(adminId, "autoBeneficiariesListPermissions")
        invalidBeneficiariesListPermissions = check_permissions(adminId, "invalidBeneficiariesListPermissions")
        txnLimitSettingsPermissions = check_permissions(adminId, "txnLimitSettingsPermissions")
        invoiceCompanyDetailsPermissions = check_permissions(adminId, "invoiceCompanyDetailsPermissions")
        utilityTransactionReportPermissions = check_permissions(adminId, "utilityTransactionReportPermissions")
        accountSummaryPermissions = check_permissions(adminId, "accountSummaryPermissions")
        downlineListPermissions = check_permissions(adminId, "downlineListPermissions")
        balanceReportPermissions = check_permissions(adminId, "balanceReportPermissions")
        cummulativeReportPermissions = check_permissions(adminId, "cummulativeReportPermissions")
        operatorIncomeReportPermissions = check_permissions(adminId, "operatorIncomeReportPermissions")
        chargeBacksReportPermissions = check_permissions(adminId, "chargeBacksReportPermissions")
        downloadpayoutReportPermissions = check_permissions(adminId, "downloadpayoutReportPermissions")
        autoCollectReportPermissions = check_permissions(adminId, "autoCollectReportPermissions")
        gstAndTdsReportPermissions = check_permissions(adminId, "gstAndTdsReportPermissions")
        apiDocumentGuidePermissions = check_permissions(adminId, "apiDocumentGuidePermissions")
        goldApiManagementPermissions = check_permissions(adminId, "goldApiManagementPermissions")
        goldApiTransactionPermissions = check_permissions(adminId, "goldApiTransactionPermissions")
        productsPermissions = check_permissions(adminId, "productsPermissions")
        multipleAppSitesPermissions = check_permissions(adminId, "multipleAppSitesPermissions")
        contactSetupPermissions = check_permissions(adminId, "contactSetupPermissions")
        ticketCategoryPermissions = check_permissions(adminId, "ticketCategoryPermissions")
        ticketSubCategoryPermissions = check_permissions(adminId, "ticketSubCategoryPermissions")
        ticketChildCategoryPermissions = check_permissions(adminId, "ticketChildCategoryPermissions")
        complaintListPermissions = check_permissions(adminId, "complaintListPermissions")
        payinAvailableTimePermissions = check_permissions(adminId, "payinAvailableTimePermissions")
        kycApiPermissions = check_permissions(adminId, "kycApiPermissions")
        assignKycPermissions = check_permissions(adminId, "assignKycPermissions")
        smsApiPermissions = check_permissions(adminId, "smsApiPermissions")
        assignSmsPermissions = check_permissions(adminId, "assignSmsPermissions")
        smsTemplatePermissions = check_permissions(adminId, "smsTemplatePermissions")
        dynamicProfileSwitchPermissions = check_permissions(adminId, "dynamicProfileSwitchPermissions")
        switchprofilePermissions = check_permissions(adminId, "switchprofilePermissions")
        bulkprofileupdatePermissions = check_permissions(adminId, "bulkprofileupdatePermissions")
        apiSetupchargeCommissionsPermissions = check_permissions(adminId, "apiSetupchargeCommissionsPermissions")
        merchantWiseTransactionPermissions = check_permissions(adminId, "merchantWiseTransactionPermissions")
        commissionStructurePermissions = check_permissions(adminId, "commissionStructurePermissions")
        unSettlementCommissionPermissions = check_permissions(adminId, "unSettlementCommissionPermissions")
        generateSettlementCommissionPermissions = check_permissions(adminId, "generateSettlementCommissionPermissions")
        settlementCommissionPermissions = check_permissions(adminId, "settlementCommissionPermissions")
        dashboardPermissions = check_permissions(adminId, "dashboardPermissions")
        locationsPermissions = check_permissions(adminId, "locationsPermissions")
        rolesPermissions = check_permissions(adminId, "rolesPermissions")
        holidaydatesPermissions = check_permissions(adminId, "holidaydatesPermissions")
        bankcodesPermissions = check_permissions(adminId, "bankcodesPermissions")
        lockedMerchantPermissions = check_permissions(adminId, "lockedMerchantPermissions")
        settlementPermissions = check_permissions(adminId, "settlementPermissions")
        apiSecurityPermissions = check_permissions(adminId, "apiSecurityPermissions")
        kycApiChargePermissions = check_permissions(adminId, "kycApiChargePermissions")
        verificationChargePermissions = check_permissions(adminId, "verificationChargePermissions")
        pgSettlementsPermission = check_permissions(adminId, "pgSettlementsPermission")
        mobilePrepaidPermission = check_permissions(adminId, "mobilePrepaidPermission")
        circlesMasterPermission = check_permissions(adminId, "circlesMasterPermission")
        prepaidOperationPermission = check_permissions(adminId, "prepaidOperationPermission")
        userwisePermission = check_permissions(adminId, "userwisePermission")
        commissionTdsSetupPermission = check_permissions(adminId, "commissionTdsSetupPermission")
        adminPayoutDownloadReportPermission = check_permissions(adminId, "adminPayoutDownloadReportPermission")
        mobileApkVersionPermission = check_permissions(adminId, "mobileApkVersionPermission")
        onDemandSettlementChargesPermission = check_permissions(adminId, "onDemandSettlementChargesPermission")
        adminIpAddressPermission = check_permissions(adminId, "adminIpAddressPermission")
        downloadInvoicesPermission = check_permissions(adminId, "downloadInvoicesPermission")
        goldUserBalancePermission = check_permissions(adminId, "goldUserBalancePermission")
        goldBuySuccessTransactionPermission = check_permissions(adminId, "goldBuySuccessTransactionPermission")
        goldBuyPendingTransactionPermission = check_permissions(adminId, "goldBuyPendingTransactionPermission")
        goldBuyPendingPaymentPermission = check_permissions(adminId, "goldBuyPendingPaymentPermission")
        goldBuyFailedPermission = check_permissions(adminId, "goldBuyFailedPermission")
        goldBuyPaymentFailedPermission = check_permissions(adminId, "goldBuyPaymentFailedPermission")
        goldSellAllTransactionPermission = check_permissions(adminId, "goldSellAllTransactionPermission")
        goldSellSuccessTransactionPermission = check_permissions(adminId, "goldSellSuccessTransactionPermission")
        goldSellProcessTransactionPermission = check_permissions(adminId, "goldSellProcessTransactionPermission")
        goldSellFailedTransactionPermission = check_permissions(adminId, "goldSellFailedTransactionPermission")
        bankPendingPayoutTransactionPermission = check_permissions(adminId, "bankPendingPayoutTransactionPermission")
        apiSetupChargeCommissionslistPermissions = check_permissions(adminId, "apiSetupChargeCommissionslistPermissions")
        servicePaymentSetupChargeCommissionPermissions = check_permissions(adminId, "servicePaymentSetupChargeCommissionPermissions")
        servicePaymentSetupChargeCommissionTableListPermissions = check_permissions(adminId, "servicePaymentSetupChargeCommissionTableListPermissions")
        chargeBackPermissions = check_permissions(adminId, "chargeBackPermissions")
        
        
        session['bankPermissions'] = bankPermissions
        session['paymentMasterPermissions'] = paymentMasterPermissions
        session['subpaymentmodePermissions'] = subpaymentmodePermissions
        session['merchantCategoriesPermissions'] = merchantCategoriesPermissions
        session['merchantSubCategoriesPermissions'] = merchantSubCategoriesPermissions
        session['networksPermissions'] = networksPermissions
        session['bankBinsPermissions'] = bankBinsPermissions
        session['patternPermissions'] = patternPermissions
        session['chargeCommissionsPermissions'] = chargeCommissionsPermissions
        session['userManagementPermissions'] = userManagementPermissions
        session['pendingKYCUsersPermissions'] = pendingKYCUsersPermissions
        session['affiliatesPermissions'] = affiliatesPermissions
        session['blockedMerchantPermissions'] = blockedMerchantPermissions
        session['apiGatewaysPermissions'] = apiGatewaysPermissions
        session['pendingTransactionPermissions'] = pendingTransactionPermissions
        session['updateTransactionPermissions'] = updateTransactionPermissions
        session['bankHolidaysPermissions'] = bankHolidaysPermissions
        session['kycEntityTypesPermissions'] = kycEntityTypesPermissions
        session['allTransactionsPermissions'] = allTransactionsPermissions
        session['successTransactionsPermissions'] = successTransactionsPermissions
        session['pendingTransactionsPermissions'] = pendingTransactionsPermissions
        session['fundSourcesPermissions'] = fundSourcesPermissions
        session['velocityRuleEnginePermissions'] = velocityRuleEnginePermissions
        session['transactionRouterPermissions'] = transactionRouterPermissions
        session['paymentLinkPermissions'] = paymentLinkPermissions
        session['paymentButtonPermissions'] = paymentButtonPermissions
        session['paymentPagePermissions'] = paymentPagePermissions
        session['payinSettlementPermissions'] = payinSettlementPermissions
        session['payoutSettlementPermissions'] = payoutSettlementPermissions
        session['payoutTransactionReportPermissions'] = payoutTransactionReportPermissions
        session['payinTransactionReportPermissions'] = payinTransactionReportPermissions
        session['reconcilationTransactionReportPermissions'] = reconcilationTransactionReportPermissions
        session['downloadPgReportPermissions'] = downloadPgReportPermissions
        session['autocollectLedgerReportPermissions'] = autocollectLedgerReportPermissions
        session['payoutLedgerReportPermissions'] = payoutLedgerReportPermissions
        session['payinLedgerReportPermissions'] = payinLedgerReportPermissions
        session['whitelistAccountHistoryPermissions'] = whitelistAccountHistoryPermissions
        session['whitelistPendingPermissions'] = whitelistPendingPermissions
        session['virtualAccountPermissions'] = virtualAccountPermissions
        session['creditToWalletPermissions'] = creditToWalletPermissions
        session['debitFromWalletPermissions'] = debitFromWalletPermissions
        session['virtualAdminBalancePermissions'] = virtualAdminBalancePermissions
        session['smslogsPermissions'] = smslogsPermissions
        session['merchantLogsPermissions'] = merchantLogsPermissions
        session['adminOtpLogsPermissions'] = adminOtpLogsPermissions
        session['apiLogsPermissions'] = apiLogsPermissions
        session['clientPermissions'] = clientPermissions
        session['adminLogsPermissions'] = adminLogsPermissions
        session['categoriesPermissions'] = categoriesPermissions
        session['servicesPermissions'] = servicesPermissions
        session['subservicesPermissions'] = subservicesPermissions
        session['operatorPermissions'] = operatorPermissions
        session['operatorupdatePermissions'] = operatorupdatePermissions
        session['operatorparameterPermissions'] = operatorparameterPermissions
        session['operatorgroupingPermissions'] = operatorgroupingPermissions
        session['subparameterPermissions'] = subparameterPermissions
        session['subparametergroupingPermissions'] = subparametergroupingPermissions
        session['taxmasterPermissions'] = taxmasterPermissions
        session['userCommissionsListPermissions'] = userCommissionsListPermissions
        session['documentsPermissions'] = documentsPermissions
        session['staffPermissions'] = staffPermissions
        session['rolePermissions'] = rolePermissions
        session['bannersPermissions'] = bannersPermissions
        session['businessDocumentsPermissions'] = businessDocumentsPermissions
        session['commissionReportsPermissions'] = commissionReportsPermissions
        session['payinTransactionsPermissions'] = payinTransactionsPermissions
        session['payinsuccessTransactionsPermissions'] = payinsuccessTransactionsPermissions
        session['payinpendingTransactionsPermissions'] = payinpendingTransactionsPermissions
        session['payinInitiatedTransactionsPermissions'] = payinInitiatedTransactionsPermissions
        session['autoCollectTransactionReportPermissions'] = autoCollectTransactionReportPermissions
        session['thirdPartyIntegrationPermissions'] = thirdPartyIntegrationPermissions
        session['serviceChargePermissions'] = serviceChargePermissions
        session['userPermissionsList'] = userPermissionsList
        session['assignvirtualAccountPermissions'] = assignvirtualAccountPermissions
        session['assignThirdpartyvirtualAccountPermissions'] = assignThirdpartyvirtualAccountPermissions
        session['beneficiariesListPermissions'] = beneficiariesListPermissions
        session['autoBeneficiariesListPermissions'] = autoBeneficiariesListPermissions
        session['invalidBeneficiariesListPermissions'] = invalidBeneficiariesListPermissions
        session['txnLimitSettingsPermissions'] = txnLimitSettingsPermissions
        session['invoiceCompanyDetailsPermissions'] = invoiceCompanyDetailsPermissions
        session['utilityTransactionReportPermissions'] = utilityTransactionReportPermissions
        session['accountSummaryPermissions'] = accountSummaryPermissions
        session['downlineListPermissions'] = downlineListPermissions
        session['balanceReportPermissions'] = balanceReportPermissions
        session['cummulativeReportPermissions'] = cummulativeReportPermissions
        session['operatorIncomeReportPermissions'] = operatorIncomeReportPermissions
        session['chargeBacksReportPermissions'] = chargeBacksReportPermissions
        session['downloadpayoutReportPermissions'] = downloadpayoutReportPermissions
        session['autoCollectReportPermissions'] = autoCollectReportPermissions
        session['gstAndTdsReportPermissions'] = gstAndTdsReportPermissions
        session['apiDocumentGuidePermissions'] = apiDocumentGuidePermissions
        session['goldApiManagementPermissions'] = goldApiManagementPermissions
        session['goldApiTransactionPermissions'] = goldApiTransactionPermissions
        session['productsPermissions'] = productsPermissions
        session['multipleAppSitesPermissions'] = multipleAppSitesPermissions
        session['contactSetupPermissions'] = contactSetupPermissions
        session['ticketCategoryPermissions'] = ticketCategoryPermissions
        session['ticketSubCategoryPermissions'] = ticketSubCategoryPermissions
        session['ticketChildCategoryPermissions'] = ticketChildCategoryPermissions
        session['complaintListPermissions'] = complaintListPermissions
        session['payinAvailableTimePermissions'] = payinAvailableTimePermissions
        session['kycApiPermissions'] = kycApiPermissions
        session['assignKycPermissions'] = assignKycPermissions
        session['smsApiPermissions'] = smsApiPermissions
        session['assignSmsPermissions'] = assignSmsPermissions
        session['smsTemplatePermissions'] = smsTemplatePermissions
        session['dynamicProfileSwitchPermissions'] = dynamicProfileSwitchPermissions
        session['switchprofilePermissions'] = switchprofilePermissions
        session['bulkprofileupdatePermissions'] = bulkprofileupdatePermissions
        session['apiSetupchargeCommissionsPermissions'] = apiSetupchargeCommissionsPermissions
        session['merchantWiseTransactionPermissions'] = merchantWiseTransactionPermissions
        session['commissionStructurePermissions'] = commissionStructurePermissions
        session['unSettlementCommissionPermissions'] = unSettlementCommissionPermissions
        session['generateSettlementCommissionPermissions'] = generateSettlementCommissionPermissions
        session['settlementCommissionPermissions'] = settlementCommissionPermissions
        session['dashboardPermissions'] = dashboardPermissions
        session['locationsPermissions'] = locationsPermissions
        session['rolesPermissions'] = rolesPermissions
        session['holidaydatesPermissions'] = holidaydatesPermissions
        session['bankcodesPermissions'] = bankcodesPermissions
        session['lockedMerchantPermissions'] = lockedMerchantPermissions
        session['settlementPermissions'] = settlementPermissions
        session['apiSecurityPermissions'] = apiSecurityPermissions
        session['kycApiChargePermissions'] = kycApiChargePermissions
        session['verificationChargePermissions'] = verificationChargePermissions
        session['pgSettlementsPermission'] = pgSettlementsPermission
        session['mobilePrepaidPermission'] = mobilePrepaidPermission
        session['circlesMasterPermission'] = circlesMasterPermission
        session['prepaidOperationPermission'] = prepaidOperationPermission
        session['userwisePermission'] = userwisePermission
        session['commissionTdsSetupPermission'] = commissionTdsSetupPermission
        session['adminPayoutDownloadReportPermission'] = adminPayoutDownloadReportPermission
        session['mobileApkVersionPermission'] = mobileApkVersionPermission
        session['onDemandSettlementChargesPermission'] = onDemandSettlementChargesPermission
        session['adminIpAddressPermission'] = adminIpAddressPermission
        session['downloadInvoicesPermission'] = downloadInvoicesPermission
        session['goldUserBalancePermission'] = goldUserBalancePermission
        session['goldBuySuccessTransactionPermission'] = goldBuySuccessTransactionPermission
        session['goldBuyPendingTransactionPermission'] = goldBuyPendingTransactionPermission
        session['goldBuyPendingPaymentPermission'] = goldBuyPendingPaymentPermission
        session['goldBuyFailedPermission'] = goldBuyFailedPermission
        session['goldBuyPaymentFailedPermission'] = goldBuyPaymentFailedPermission
        session['goldSellAllTransactionPermission'] = goldSellAllTransactionPermission
        session['goldSellSuccessTransactionPermission'] = goldSellSuccessTransactionPermission
        session['goldSellProcessTransactionPermission'] = goldSellProcessTransactionPermission
        session['goldSellFailedTransactionPermission'] = goldSellFailedTransactionPermission
        session['bankPendingPayoutTransactionPermission'] = bankPendingPayoutTransactionPermission
        session['apiSetupChargeCommissionslistPermissions'] = apiSetupChargeCommissionslistPermissions
        session['servicePaymentSetupChargeCommissionPermissions'] = servicePaymentSetupChargeCommissionPermissions
        session['servicePaymentSetupChargeCommissionTableListPermissions'] = servicePaymentSetupChargeCommissionTableListPermissions
        session['chargeBackPermissions'] = chargeBackPermissions
    else:
        session['bankPermissions'] = []


ACCUREPAY_PAY_OUT_LIVE_API_KEY=app.config["ACCUREPAY_PAY_OUT_LIVE_API_KEY"]
ACCUREPAY_PAY_OUT_LIVE_SALT=app.config["ACCUREPAY_PAY_OUT_LIVE_SALT"]
ACCUREPAY_PAY_OUT_LIVE_URL=app.config["ACCUREPAY_PAY_OUT_LIVE_URL"]
ACCUREPAY_PAY_IN_LIVE_URL=app.config["ACCUREPAY_PAY_IN_LIVE_URL"]

# twillio Keys
account_sid=app.config["TWILIO_ACCOUNT_SID"]
auth_token=app.config["TWILIO_AUTH_TOKEN"]
from_number=app.config["FROM_NUMBER"]


domain=app.config["DOMAIN_NAME"]
merchantDashboardUrl=domain+"merchant/#/admin/"
site_root_directory = app.config['SITE_ROOT']
OPENWEATHER_API_KEY = app.config['OPENWEATHER_API_KEY']
OPENWEATHER_BASE_URL = app.config['OPENWEATHER_BASE_URL']
IPINFO_ACCESS_TOKEN = app.config['IPINFO_ACCESS_TOKEN']
sender_email = app.config['MAIL_USERNAME']

SES_REGION_NAME=app.config['SES_REGION_NAME'],
AWS_ACCESS_KEY_ID=app.config['AWS_ACCESS_KEY_ID'],
AWS_SECRET_ACCESS_KEY=app.config['AWS_SECRET_ACCESS_KEY']



SERVER_STATUS=app.config['SERVER_STATUS']
SERVER_MAINTAINCE_MESSAGE=app.config['SERVER_MAINTAINCE_MESSAGE']


PAYMENT_LINK_BASE_URL = domain+"merchant/#/paypage/"

ALLOWED_EXTENSIONS = set(['pdf','png', 'jpg', 'jpeg', 'txt','avif'])



timezone = pytz.timezone("America/Chicago")
utc_timezone = pytz.timezone("Africa/Abidjan")
ist_timezone = pytz.timezone("Asia/Calcutta")
tzinfo = pytz.timezone('America/Chicago')

# ses = boto3.client(
#     'ses',
#     region_name=app.config['SES_REGION_NAME'],
#     aws_access_key_id=app.config['AWS_ACCESS_KEY_ID'],
#     aws_secret_access_key=app.config['AWS_SECRET_ACCESS_KEY']
# )

from appservices.common.kyc_gateways.signzy_kyc_gateway import *
from appservices.common.kyc_gateways.vayana_kyc_gateway import *
from appservices.common.payment_gateways.payu_payment_gateways import *

####check accesstoken common function
def check_access_token(accessToken, adminId):
    superadmin_queryset = SuperAdmin.objects(id=adminId,accessToken=accessToken).first()
    if superadmin_queryset:
        return True
    return False


def adminid_access_token_required(route_func):
    @wraps(route_func)
    def decorated_function(*args, **kwargs):
        adminId = session.get("adminId")
        accessToken = session.get("accessToken")
        
        if not adminId:
            print("(((((((((session None)))))))))")
            return redirect(url_for("admin.admin_logout"))
        
        # # check_access_token(accessToken,adminId)
        # if accessToken:
        #     if not check_access_token(accessToken, adminId):
        #         print("(((((((no access token)))))))")
        #         return redirect(url_for("admin.admin_logout"))
        # else:
        #     return redirect(url_for("admin.admin_logout"))
        # if session.get(adminId) is None:
        #     print("(((((((((session None)))))))))")
        # #     return redirect("admin_logout")
        #     return redirect(url_for("admin.admin_logout"))
        return route_func(*args, **kwargs)
    return decorated_function

# def adminid_access_token_required(route_func):
#     @wraps(route_func)
#     def decorated_function(*args, **kwargs):
#         if not session.get("adminId"):
#             return redirect("admin_logout")
#         adminId = session.get("adminId")
#         latitude = request.form.get("latitude") or request.args.get("latitude")
#         longitude = request.form.get("longitude") or request.args.get("longitude")
#         print()
#         if not latitude or not longitude:
#             flash("Location is required to perform this action.", "warning")
#             return redirect("admin_logout")
      
#         return route_func(*args, **kwargs)
#     return decorated_function  
    
def fetching_categories_details(category_queryset):
    category_dict={}
    try:

        category_dict = {
        "id":str(category_queryset.id),
        "name":category_queryset.name
        }
        if category_queryset.status==1:
            category_dict["actionText"] = "Active"
        else:
            category_dict["actionText"] = "Deactive"

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return category_dict

#to check if it has only alpha and num and space also works
def validate_alphanumeric(input_string):
    # Iterate through each character in the input string
    for char in input_string:
        # Check if the character is neither alphanumeric nor a space
        if not (char.isalnum() or char.isspace() or char == "."):
            # If a non-alphanumeric, non-space character is found, return False
            return False
    # If all characters are alphanumeric or spaces, return True
    return True

def fetching_sub_categories_details(sub_category_queryset):
    sub_category_dict={}
    try:

        sub_category_dict = {
        "id":str(sub_category_queryset.id),
        "name":sub_category_queryset.name,
        "categoryId":str(sub_category_queryset.categoryId.id),
        "categoryName":sub_category_queryset.categoryId.name,
        }
        if sub_category_queryset.status==1:
            sub_category_dict["actionText"] = "Active"
        else:
            sub_category_dict["actionText"] = "Deactive"

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return sub_category_dict


def fetch_categories_list(categories_queryset):
    categoiresList = []
    try:
        for each_category in categories_queryset:
            category_dict = {
            "id":str(each_category.id),
            "name":each_category.name
            }
            if each_category.status==1:
                category_dict["actionText"] = "Active"
            else:
                category_dict["actionText"] = "Deactive"
            categoiresList.append(category_dict)
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return categoiresList


def fetch_sub_categories_list(sub_categories_queryset):
    subCategoiresList = []
    try:
        for each_sub_category in sub_categories_queryset:
            sub_category_dict = {
            "id":str(each_sub_category.id),
            "name":each_sub_category.name,
            "categoryId":str(each_sub_category.categoryId.id),
            "categoryName":each_sub_category.categoryId.name,
            }
            if each_sub_category.status==1:
                sub_category_dict["actionText"] = "Active"
            else:
                sub_category_dict["actionText"] = "Deactive"
            subCategoiresList.append(sub_category_dict)
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return subCategoiresList


def format_category_names(categoriesList):
    try:
        output=""
        category_list = []
        for each_category in categoriesList:
            category_list.append(each_category)
        output = ", ".join(category_list)
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return output

def format_sub_category_names(subCategoriesList):
    try:
        output=""
        sub_list = []
        for each_sub in subCategoriesList:
            sub_list.append(each_sub)
        output = ", ".join(sub_list)
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return output

def fetching_duration_type_details(duration_queryset):
    durationDict = {}
    try:
        durationDict = {
        "durationId":str(duration_queryset.id),
        "durationName":duration_queryset.durationName,
        "numberOfDays":duration_queryset.numberOfDays
        }
        if duration_queryset.status == 1:
            durationDict["actionText"]="Active"
        else:
            durationDict["actionText"]="Deactive"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return durationDict


def format_display_page_names(pagesList):
    try:
        output=""
        sub_list = []
        for each_sub in pagesList:
            sub_list.append(each_sub)
        output = ", ".join(sub_list)
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return output

def combined_encrypt(data_to_encrypt, secret_hex_key):
    final_encrypted_payload_base64 = ""
    try:
        # raw_data_to_encrypt = json.dumps(data_to_encrypt)
        final_encrypted_payload = b''
        secret_key_hex_bytes = unhexlify(secret_hex_key)
        iv = get_random_bytes(AES.block_size)
        cipher = AES.new(secret_key_hex_bytes, AES.MODE_CBC, iv=iv)
        encrypted_bytes = cipher.encrypt(pad(data_to_encrypt.encode('utf-8'), AES.block_size))
        final_encrypted_payload = iv + encrypted_bytes
        final_encrypted_payload_base64 = base64.b64encode(final_encrypted_payload).decode()
        return final_encrypted_payload_base64
    except Exception as e:
        print(traceback.format_exc())
        return final_encrypted_payload_base64

def combined_decrypt(encrypted, secret_key):
    decrypted_text = ''
    try:
        secret_key_hex_bytes = unhexlify(secret_key)
        encrypted_combined_bytes = base64.b64decode(encrypted)
        iv = encrypted_combined_bytes[:16]
        encrypted_payload = encrypted_combined_bytes[16:]
        cipher = AES.new(secret_key_hex_bytes, AES.MODE_CBC, iv=iv)
        decrypted_bytes = unpad(cipher.decrypt(encrypted_payload), AES.block_size)
        decrypted_text = decrypted_bytes.decode()
        return decrypted_text
    except Exception as e:
        print(traceback.format_exc())
        return decrypted_text

def encrypted_return(data_status,encryption_key):
    print("before encryption",data_status)
    encryptedData = encrypt(data_status, encryption_key)
    encryptedResponse = {
        "encryptedBody": encryptedData.get("encryption_data"),
        "iv": encryptedData.get("iv"),
    }
    # print(encryptedResponse,"((((((((((((((encryptedResponse))))))))))))))")
    return encryptedResponse
    
def encrypt(encryption_data, encryption_key):
    encryptDict = {}
    try:
        # Convert the dictionary to a JSON string
        raw = json.dumps(encryption_data)
        
        # Generate a random initialization vector (IV)
        iv = get_random_bytes(AES.block_size)
        
        # Create a new AES cipher object in CBC mode
        cipher = AES.new(encryption_key, AES.MODE_CBC, iv)
        
        # Pad the plaintext to be a multiple of the block size
        padded_data = pad(raw.encode(), AES.block_size)
        
        # Encrypt the padded plaintext
        encrypted_data = cipher.encrypt(padded_data)
        
        # Encode the IV and encrypted data with base64
        encryptDict = {
            "iv": base64.b64encode(iv).decode('utf-8'),
            "encryption_data": base64.b64encode(encrypted_data).decode('utf-8')
        }
        return encryptDict
    except Exception as e:
        print(traceback.format_exc())
        return encryptDict
def decrypt(decryption_data, decrypt_key,iv):
    try:
        enc = base64.b64decode(decryption_data)
        iv = base64.b64decode(iv)
        cipher = AES.new(decrypt_key, AES.MODE_CBC, iv)
        return _unpad(cipher.decrypt(enc)).decode('utf-8')
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False

def _unpad(s):
    return s[:-ord(s[len(s)-1:])]

def fetching_active_categories_details():
    categories_list=[]    
    try:
        categories_queryset=Categories.objects(status__in=[1]).order_by("-id").all()
        for each_category in categories_queryset:            
            category_dict = {
            "id":str(each_category.id),
            "name":each_category.name
            }
            sub_categories_queryset = SubCategories.objects(categoryId=str(each_category.id),status__in=[1]).order_by("-id").all()
            subcategories_list = []
            for each_sub_category in sub_categories_queryset:
                sub_category_dict = {
                "id":str(each_sub_category.id),
                "name":each_sub_category.name
                }
                subcategories_list.append(sub_category_dict)
            category_dict["subcategories_list"] = subcategories_list
            categories_list.append(category_dict)
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return categories_list

def fetching_plan_details(plan_queryset):
    plan_dict={}
    try:
        plan_dict = {
        "id":str(plan_queryset.id),
        "planName":plan_queryset.planName,
        "amount":plan_queryset.amount,
        "durationId":str(plan_queryset.durationId.id),
        "durationName":plan_queryset.durationId.durationName,
        }
        if plan_queryset.status == 1:
            plan_dict["actionText"] = "Active"
        else:
            plan_dict["actionText"] = "Deactive"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return plan_dict

# random number generate function
def random_digit_generate(length):
    key=""
    for i in range(length):
        key += random.choice(string.digits)
    return key

def random_alphanumeric_generate(length):
    characters = string.ascii_letters + string.digits  # Includes both letters and digits
    key = ""
    for i in range(length):
        key += random.choice(characters)
    return key

def card_bin_check(card_number):
    data_status = {"responseStatus": 0, "result": "cannot validate card details"}
    # card_number = "4111111111111111" 
    try:
        if not card_number:
            data_status["result"] = "Required fields are missing!"
            return data_status

        transaction_queryset = TransactionAPI.objects(cardBinEnable=True).first()

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

                ############################################ Accurepay Payout Fundtransfer Functionality Code #######################################################
                # paymentgatewayresponseDict = check_payu_bin(get_api_key,get_salt,get_base_url,var1=card_number)
                paymentgatewayresponseDict = check_payu_binInfo(get_api_key,get_salt,get_base_url,card_number)
                ######################################################################################################################################################
                print(paymentgatewayresponseDict,"paymentgatewayresponseDict")
                if paymentgatewayresponseDict.get("responseStatus") == 1:
                    data_status["responseStatus"] = 1
                    data_status["result"] = "success"
                    data_status["data"] = paymentgatewayresponseDict.get("data")
                    return data_status
                else:
                    data_status["result"] = "Please try again later"
            else:
                data_status["result"] = "Transaction API not assigned"
        else:
            data_status["result"] = "Transaction API not found"

    except Exception as e:
        # Log error for debugging
        app.logger.error(traceback.format_exc())
        data_status["result"] = "An unexpected error occurred during card validation"
    return data_status

def fetching_location_details():
    locationDetails = {}    
    try:
        temperatureAvailable = False
        celsius_temp = 25
        if request.headers.getlist("X-Forwarded-For"):
           remote_system_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
           remote_system_ip = request.remote_addr

        # remote_system_ip = request.remote_addr
        # url = "http://ip-api.com/json/"+str(remote_system_ip)
        # url = "https://ipapi.co/"+str(remote_system_ip)+"/json/"
        # url = "https://ipinfo.io/"+str(remote_system_ip)+"/json"
        # response = requests.request("GET", url)
        # locationDetails["city"] = response.json().get("city", "").upper()
        # complete_url = OPENWEATHER_BASE_URL + "appid=" + OPENWEATHER_API_KEY + "&q=" + response.json().get("city", "")

        cityName = get_city_name_from_ip(remote_system_ip)
        complete_url = OPENWEATHER_BASE_URL + "appid=" + OPENWEATHER_API_KEY + "&q=" + cityName
        weather_response = requests.get(complete_url).json()
        if weather_response.get("cod") == 200:
            kelvin_temp = weather_response.get("main",{}).get("temp")
            celsius_temp = int(kelvin_temp - 273.15)
            temperatureAvailable = True
        locationDetails["city"] = cityName
        locationDetails["temperature"] = celsius_temp
        locationDetails["temperatureAvailable"] = temperatureAvailable
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return locationDetails

def get_city_name_from_ip(ip_address):
    cityName = ""
    try:
        handler = ipinfo.getHandler(IPINFO_ACCESS_TOKEN)
        try:
            location_details = handler.getDetails(ip_address)
            cityName = str(location_details.city)
        except Exception as err:
            cityName = "Chicago"
    except:
        app.logger.error(traceback.format_exc())
    return cityName



def fetching_role_details(role_queryset):
    role_dict = {}
    try:
        role_dict = {
        "id":str(role_queryset.id),
        "roleName":role_queryset.roleName,
        "bankPermissions":role_queryset.bankPermissions,
        "paymentMasterPermissions":role_queryset.paymentMasterPermissions,
        "subpaymentmodePermissions":role_queryset.subpaymentmodePermissions,
        "merchantCategoriesPermissions":role_queryset.merchantCategoriesPermissions,
        "merchantSubCategoriesPermissions":role_queryset.merchantSubCategoriesPermissions,
        "networksPermissions":role_queryset.networksPermissions,
        "bankBinsPermissions":role_queryset.bankBinsPermissions,
        "patternPermissions":role_queryset.patternPermissions,
        "chargeCommissionsPermissions":role_queryset.chargeCommissionsPermissions,
        "userManagementPermissions":role_queryset.userManagementPermissions,
        "pendingKYCUsersPermissions":role_queryset.pendingKYCUsersPermissions,
        "affiliatesPermissions":role_queryset.affiliatesPermissions,
        "blockedMerchantPermissions":role_queryset.blockedMerchantPermissions,
        "subAdminPermissions":role_queryset.subAdminPermissions,
        "subAdminRightsPermissions":role_queryset.subAdminRightsPermissions,
        "apiGatewaysPermissions":role_queryset.apiGatewaysPermissions,
        "virtualAccountPermissions":role_queryset.virtualAccountPermissions,
        "whitelistPendingPermissions":role_queryset.whitelistPendingPermissions,
        "whitelistAccountHistoryPermissions":role_queryset.whitelistAccountHistoryPermissions,
        "refundReportPermissions":role_queryset.refundReportPermissions,
        "pendingTransactionPermissions":role_queryset.pendingTransactionPermissions,
        "updateTransactionPermissions":role_queryset.updateTransactionPermissions,
        "bankHolidaysPermissions":role_queryset.bankHolidaysPermissions,
        "kycEntityTypesPermissions":role_queryset.kycEntityTypesPermissions,
        "allTransactionsPermissions":role_queryset.allTransactionsPermissions,
        "successTransactionsPermissions":role_queryset.successTransactionsPermissions,
        "pendingTransactionsPermissions":role_queryset.pendingTransactionsPermissions,
        "fundSourcesPermissions":role_queryset.fundSourcesPermissions,
        "velocityRuleEnginePermissions":role_queryset.velocityRuleEnginePermissions,
        "transactionRouterPermissions":role_queryset.transactionRouterPermissions,
        "paymentLinkPermissions":role_queryset.paymentLinkPermissions,
        "paymentButtonPermissions":role_queryset.paymentButtonPermissions,
        "paymentPagePermissions":role_queryset.paymentPagePermissions,
        "payinSettlementPermissions":role_queryset.payinSettlementPermissions,
        "payoutSettlementPermissions":role_queryset.payoutSettlementPermissions,
        "creditDebitSettlementPermissions":role_queryset.creditDebitSettlementPermissions,
        "payoutTransactionReportPermissions":role_queryset.payoutTransactionReportPermissions,
        "payinTransactionReportPermissions":role_queryset.payinTransactionReportPermissions,
        "reconcilationTransactionReportPermissions":role_queryset.reconcilationTransactionReportPermissions,
        "downloadPgReportPermissions":role_queryset.downloadPgReportPermissions,
        "autocollectLedgerReportPermissions":role_queryset.autocollectLedgerReportPermissions,
        "payoutLedgerReportPermissions":role_queryset.payoutLedgerReportPermissions,
        "payinLedgerReportPermissions":role_queryset.payinLedgerReportPermissions,
        "masterDisputesPermissions":role_queryset.masterDisputesPermissions,
        "creditToWalletPermissions":role_queryset.creditToWalletPermissions,
        "debitFromWalletPermissions":role_queryset.debitFromWalletPermissions,
        "virtualAdminBalancePermissions":role_queryset.virtualAdminBalancePermissions,
        "smslogsPermissions":role_queryset.smslogsPermissions,
        "merchantLogsPermissions":role_queryset.merchantLogsPermissions,
        "adminOtpLogsPermissions":role_queryset.adminOtpLogsPermissions,
        "apiLogsPermissions":role_queryset.apiLogsPermissions,
        "clientPermissions":role_queryset.clientPermissions,
        "adminLogsPermissions":role_queryset.adminLogsPermissions,
        "categoriesPermissions":role_queryset.categoriesPermissions,
        "servicesPermissions":role_queryset.servicesPermissions,
        "subservicesPermissions":role_queryset.subservicesPermissions,
        "operatorPermissions":role_queryset.operatorPermissions,
        "operatorupdatePermissions":role_queryset.operatorupdatePermissions,
        "operatorparameterPermissions":role_queryset.operatorparameterPermissions,
        "operatorgroupingPermissions":role_queryset.operatorgroupingPermissions,
        "subparameterPermissions":role_queryset.subparameterPermissions,
        "subparametergroupingPermissions":role_queryset.subparametergroupingPermissions,
        "taxmasterPermissions":role_queryset.taxmasterPermissions,
        "userCommissionsListPermissions":role_queryset.userCommissionsListPermissions,
        "documentsPermissions":role_queryset.documentsPermissions,
        "staffPermissions":role_queryset.staffPermissions,
        "rolePermissions":role_queryset.rolePermissions,
        "bannersPermissions":role_queryset.bannersPermissions,
        "businessDocumentsPermissions":role_queryset.businessDocumentsPermissions,
        "commissionReportsPermissions":role_queryset.commissionReportsPermissions,
        "payinTransactionsPermissions":role_queryset.payinTransactionsPermissions,
        "payinsuccessTransactionsPermissions":role_queryset.payinsuccessTransactionsPermissions,
        "payinpendingTransactionsPermissions":role_queryset.payinpendingTransactionsPermissions,
        "payinInitiatedTransactionsPermissions":role_queryset.payinInitiatedTransactionsPermissions,
        "autoCollectTransactionReportPermissions":role_queryset.autoCollectTransactionReportPermissions,
        "thirdPartyIntegrationPermissions":role_queryset.thirdPartyIntegrationPermissions,
        "serviceChargePermissions":role_queryset.serviceChargePermissions,
        "userPermissionsList":role_queryset.userPermissionsList,
        "assignvirtualAccountPermissions":role_queryset.assignvirtualAccountPermissions,
        "assignThirdpartyvirtualAccountPermissions":role_queryset.assignThirdpartyvirtualAccountPermissions,
        "beneficiariesListPermissions":role_queryset.beneficiariesListPermissions,
        "autoBeneficiariesListPermissions":role_queryset.autoBeneficiariesListPermissions,
        "invalidBeneficiariesListPermissions":role_queryset.invalidBeneficiariesListPermissions,
        "txnLimitSettingsPermissions":role_queryset.txnLimitSettingsPermissions,
        "invoiceCompanyDetailsPermissions":role_queryset.invoiceCompanyDetailsPermissions,
        "utilityTransactionReportPermissions":role_queryset.utilityTransactionReportPermissions,
        "accountSummaryPermissions":role_queryset.accountSummaryPermissions,
        "downlineListPermissions":role_queryset.downlineListPermissions,
        "balanceReportPermissions":role_queryset.balanceReportPermissions,
        "cummulativeReportPermissions":role_queryset.cummulativeReportPermissions,
        "operatorIncomeReportPermissions":role_queryset.operatorIncomeReportPermissions,
        "chargeBacksReportPermissions":role_queryset.chargeBacksReportPermissions,
        "downloadpayoutReportPermissions":role_queryset.downloadpayoutReportPermissions,
        "autoCollectReportPermissions":role_queryset.autoCollectReportPermissions,
        "gstAndTdsReportPermissions":role_queryset.gstAndTdsReportPermissions,
        "apiDocumentGuidePermissions":role_queryset.apiDocumentGuidePermissions,
        "goldApiManagementPermissions":role_queryset.goldApiManagementPermissions,
        "goldApiTransactionPermissions":role_queryset.goldApiTransactionPermissions,
        "productsPermissions":role_queryset.productsPermissions,
        "multipleAppSitesPermissions":role_queryset.multipleAppSitesPermissions,
        "contactSetupPermissions":role_queryset.contactSetupPermissions,
        "ticketCategoryPermissions":role_queryset.ticketCategoryPermissions,
        "ticketSubCategoryPermissions":role_queryset.ticketSubCategoryPermissions,
        "ticketChildCategoryPermissions":role_queryset.ticketChildCategoryPermissions,
        "complaintListPermissions":role_queryset.complaintListPermissions,
        "payinAvailableTimePermissions":role_queryset.payinAvailableTimePermissions,
        "kycApiPermissions":role_queryset.kycApiPermissions,
        "assignKycPermissions":role_queryset.assignKycPermissions,
        "smsApiPermissions":role_queryset.smsApiPermissions,
        "assignSmsPermissions":role_queryset.assignSmsPermissions,
        "smsTemplatePermissions":role_queryset.smsTemplatePermissions,
        "dynamicProfileSwitchPermissions":role_queryset.dynamicProfileSwitchPermissions,
        "switchprofilePermissions":role_queryset.switchprofilePermissions,
        "bulkprofileupdatePermissions":role_queryset.bulkprofileupdatePermissions,
        "apiSetupchargeCommissionsPermissions":role_queryset.apiSetupchargeCommissionsPermissions,
        "merchantWiseTransactionPermissions":role_queryset.merchantWiseTransactionPermissions,
        "commissionStructurePermissions":role_queryset.commissionStructurePermissions,
        "unSettlementCommissionPermissions":role_queryset.unSettlementCommissionPermissions,
        "generateSettlementCommissionPermissions":role_queryset.generateSettlementCommissionPermissions,
        "settlementCommissionPermissions":role_queryset.settlementCommissionPermissions,
        "dashboardPermissions":role_queryset.dashboardPermissions,
        "locationsPermissions":role_queryset.locationsPermissions,
        "rolesPermissions":role_queryset.rolesPermissions,
        "holidaydatesPermissions":role_queryset.holidaydatesPermissions,
        "bankcodesPermissions":role_queryset.bankcodesPermissions,
        "lockedMerchantPermissions":role_queryset.lockedMerchantPermissions,
        "settlementPermissions":role_queryset.settlementPermissions,
        "apiSecurityPermissions":role_queryset.apiSecurityPermissions,
        "kycApiChargePermissions":role_queryset.kycApiChargePermissions,
        "verificationChargePermissions":role_queryset.verificationChargePermissions,
        "pgSettlementsPermission":role_queryset.pgSettlementsPermission,
        "mobilePrepaidPermission":role_queryset.mobilePrepaidPermission,
        "circlesMasterPermission":role_queryset.circlesMasterPermission,
        "prepaidOperationPermission":role_queryset.prepaidOperationPermission,
        "userwisePermission":role_queryset.userwisePermission,
        "commissionTdsSetupPermission":role_queryset.commissionTdsSetupPermission,
        "adminPayoutDownloadReportPermission":role_queryset.adminPayoutDownloadReportPermission,
        "mobileApkVersionPermission":role_queryset.mobileApkVersionPermission,
        "onDemandSettlementChargesPermission":role_queryset.onDemandSettlementChargesPermission,
        "adminIpAddressPermission":role_queryset.adminIpAddressPermission,
        "downloadInvoicesPermission":role_queryset.downloadInvoicesPermission,
        "goldUserBalancePermission":role_queryset.goldUserBalancePermission,
        "goldBuySuccessTransactionPermission":role_queryset.goldBuySuccessTransactionPermission,
        "goldBuyPendingTransactionPermission":role_queryset.goldBuyPendingTransactionPermission,
        "goldBuyPendingPaymentPermission":role_queryset.goldBuyPendingPaymentPermission,
        "goldBuyFailedPermission":role_queryset.goldBuyFailedPermission,
        "goldBuyPaymentFailedPermission":role_queryset.goldBuyPaymentFailedPermission,
        "goldSellAllTransactionPermission":role_queryset.goldSellAllTransactionPermission,
        "goldSellSuccessTransactionPermission":role_queryset.goldSellSuccessTransactionPermission,
        "goldSellProcessTransactionPermission":role_queryset.goldSellProcessTransactionPermission,
        "goldSellFailedTransactionPermission":role_queryset.goldSellFailedTransactionPermission,
        "bankPendingPayoutTransactionPermission":role_queryset.bankPendingPayoutTransactionPermission,
        "apiSetupChargeCommissionslistPermissions":role_queryset.apiSetupChargeCommissionslistPermissions,
        "servicePaymentSetupChargeCommissionPermissions":role_queryset.servicePaymentSetupChargeCommissionPermissions,
        "servicePaymentSetupChargeCommissionTableListPermissions":role_queryset.servicePaymentSetupChargeCommissionTableListPermissions,
        "chargeBackPermissions":role_queryset.chargeBackPermissions,
        }
        if role_queryset.status == 1:
            role_dict["actionText"]="Active"
        elif role_queryset.status == 0:
            role_dict["actionText"]="Deactive"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return role_dict


def fetch_staff_permissions(staffId):
    permission_data = {}
    try:
        admin_queryset = SuperAdmin.objects(id=staffId).first()
        role_queryset = Roles.objects(id=str(admin_queryset.roleId.id)).first()
        permission_data = fetching_role_details(role_queryset)
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return permission_data


def check_permissions(adminId,moduleName):
    permissionsList = []
    try:
        staff_member_queryset = SuperAdmin.objects(id=adminId,status__in=[0,1]).first()
        if staff_member_queryset:
            role_queryset = Roles.objects(id=str(staff_member_queryset.roleId.id)).first()
            if role_queryset:
                if moduleName == "bankPermissions":
                    permissionsList = role_queryset.bankPermissions 
                elif moduleName == "paymentMasterPermissions":
                    permissionsList = role_queryset.paymentMasterPermissions
                elif moduleName == "subpaymentmodePermissions":
                    permissionsList = role_queryset.subpaymentmodePermissions
                elif moduleName == "merchantCategoriesPermissions":
                    permissionsList = role_queryset.merchantCategoriesPermissions
                elif moduleName == "merchantSubCategoriesPermissions":
                    permissionsList = role_queryset.merchantSubCategoriesPermissions
                elif moduleName == "networksPermissions":
                    permissionsList = role_queryset.networksPermissions
                elif moduleName == "bankBinsPermissions":
                    permissionsList = role_queryset.bankBinsPermissions
                elif moduleName == "patternPermissions":
                    permissionsList = role_queryset.patternPermissions
                elif moduleName == "chargeCommissionsPermissions":
                    permissionsList = role_queryset.chargeCommissionsPermissions
                elif moduleName == "userManagementPermissions":
                    permissionsList = role_queryset.userManagementPermissions
                elif moduleName == "pendingKYCUsersPermissions":
                    permissionsList = role_queryset.pendingKYCUsersPermissions
                elif moduleName == "affiliatesPermissions":
                    permissionsList = role_queryset.affiliatesPermissions
                elif moduleName == "blockedMerchantPermissions":
                    permissionsList = role_queryset.blockedMerchantPermissions
                elif moduleName == "subAdminPermissions":
                    permissionsList = role_queryset.subAdminPermissions
                elif moduleName == "subAdminRightsPermissions":
                    permissionsList = role_queryset.subAdminRightsPermissions
                elif moduleName == "apiGatewaysPermissions":
                    permissionsList = role_queryset.apiGatewaysPermissions
                elif moduleName == "virtualAccountPermissions":
                    permissionsList = role_queryset.virtualAccountPermissions
                elif moduleName == "whitelistPendingPermissions":
                    permissionsList = role_queryset.whitelistPendingPermissions
                elif moduleName == "whitelistAccountHistoryPermissions":
                    permissionsList = role_queryset.whitelistAccountHistoryPermissions
                elif moduleName == "refundReportPermissions":
                    permissionsList = role_queryset.refundReportPermissions
                elif moduleName == "pendingTransactionPermissions":
                    permissionsList = role_queryset.pendingTransactionPermissions
                elif moduleName == "updateTransactionPermissions":
                    permissionsList = role_queryset.updateTransactionPermissions
                elif moduleName == "bankHolidaysPermissions":
                    permissionsList = role_queryset.bankHolidaysPermissions
                elif moduleName == "kycEntityTypesPermissions":
                    permissionsList = role_queryset.kycEntityTypesPermissions
                elif moduleName == "allTransactionsPermissions":
                    permissionsList = role_queryset.allTransactionsPermissions
                elif moduleName == "successTransactionsPermissions":
                    permissionsList = role_queryset.successTransactionsPermissions
                elif moduleName == "pendingTransactionsPermissions":
                    permissionsList = role_queryset.pendingTransactionsPermissions
                elif moduleName == "fundSourcesPermissions":
                    permissionsList = role_queryset.fundSourcesPermissions
                elif moduleName == "velocityRuleEnginePermissions":
                    permissionsList = role_queryset.velocityRuleEnginePermissions
                elif moduleName == "transactionRouterPermissions":
                    permissionsList = role_queryset.transactionRouterPermissions
                elif moduleName == "paymentLinkPermissions":
                    permissionsList = role_queryset.paymentLinkPermissions
                elif moduleName == "paymentButtonPermissions":
                    permissionsList = role_queryset.paymentButtonPermissions
                elif moduleName == "paymentPagePermissions":
                    permissionsList = role_queryset.paymentPagePermissions
                elif moduleName == "payinSettlementPermissions":
                    permissionsList = role_queryset.payinSettlementPermissions
                elif moduleName == "payoutSettlementPermissions":
                    permissionsList = role_queryset.payoutSettlementPermissions
                elif moduleName == "creditDebitSettlementPermissions":
                    permissionsList = role_queryset.creditDebitSettlementPermissions
                elif moduleName == "payoutTransactionReportPermissions":
                    permissionsList = role_queryset.payoutTransactionReportPermissions
                elif moduleName == "payinTransactionReportPermissions":
                    permissionsList = role_queryset.payinTransactionReportPermissions
                elif moduleName == "reconcilationTransactionReportPermissions":
                    permissionsList = role_queryset.reconcilationTransactionReportPermissions
                elif moduleName == "downloadPgReportPermissions":
                    permissionsList = role_queryset.downloadPgReportPermissions
                elif moduleName == "payinLedgerReportPermissions":
                    permissionsList = role_queryset.payinLedgerReportPermissions
                elif moduleName == "payoutLedgerReportPermissions":
                    permissionsList = role_queryset.payoutLedgerReportPermissions
                elif moduleName == "autocollectLedgerReportPermissions":
                    permissionsList = role_queryset.autocollectLedgerReportPermissions
                elif moduleName == "masterDisputesPermissions":
                    permissionsList = role_queryset.masterDisputesPermissions
                elif moduleName == "creditToWalletPermissions":
                    permissionsList = role_queryset.creditToWalletPermissions
                elif moduleName == "debitFromWalletPermissions":
                    permissionsList = role_queryset.debitFromWalletPermissions
                elif moduleName == "virtualAdminBalancePermissions":
                    permissionsList = role_queryset.virtualAdminBalancePermissions
                elif moduleName == "smslogsPermissions":
                    permissionsList = role_queryset.smslogsPermissions
                elif moduleName == "merchantLogsPermissions":
                    permissionsList = role_queryset.merchantLogsPermissions
                elif moduleName == "adminOtpLogsPermissions":
                    permissionsList = role_queryset.adminOtpLogsPermissions
                elif moduleName == "apiLogsPermissions":
                    permissionsList = role_queryset.apiLogsPermissions
                elif moduleName == "clientPermissions":
                    permissionsList = role_queryset.clientPermissions
                elif moduleName == "adminLogsPermissions":
                    permissionsList = role_queryset.adminLogsPermissions
                elif moduleName == "categoriesPermissions":
                    permissionsList = role_queryset.categoriesPermissions
                elif moduleName == "servicesPermissions":
                    permissionsList = role_queryset.servicesPermissions
                elif moduleName == "subservicesPermissions":
                    permissionsList = role_queryset.subservicesPermissions
                elif moduleName == "operatorPermissions":
                    permissionsList = role_queryset.operatorPermissions
                elif moduleName == "operatorupdatePermissions":
                    permissionsList = role_queryset.operatorupdatePermissions
                elif moduleName == "operatorparameterPermissions":
                    permissionsList = role_queryset.operatorparameterPermissions              
                elif moduleName == "operatorgroupingPermissions":
                    permissionsList = role_queryset.operatorgroupingPermissions
                elif moduleName == "subparameterPermissions":
                    permissionsList = role_queryset.subparameterPermissions
                elif moduleName == "subparametergroupingPermissions":
                    permissionsList = role_queryset.subparametergroupingPermissions
                elif moduleName == "taxmasterPermissions":
                    permissionsList = role_queryset.taxmasterPermissions
                elif moduleName == "userCommissionsListPermissions":
                    permissionsList = role_queryset.userCommissionsListPermissions
                elif moduleName == "documentsPermissions":
                    permissionsList = role_queryset.documentsPermissions
                elif moduleName == "staffPermissions":
                    permissionsList = role_queryset.staffPermissions
                elif moduleName == "rolePermissions":
                    permissionsList = role_queryset.rolePermissions
                elif moduleName == "bannersPermissions":
                    permissionsList = role_queryset.bannersPermissions
                elif moduleName == "businessDocumentsPermissions":
                    permissionsList = role_queryset.businessDocumentsPermissions
                elif moduleName == "commissionReportsPermissions":
                    permissionsList = role_queryset.commissionReportsPermissions
                elif moduleName == "payinTransactionsPermissions":
                    permissionsList = role_queryset.payinTransactionsPermissions
                elif moduleName == "payinsuccessTransactionsPermissions":
                    permissionsList = role_queryset.payinsuccessTransactionsPermissions
                elif moduleName == "payinpendingTransactionsPermissions":
                    permissionsList = role_queryset.payinpendingTransactionsPermissions
                elif moduleName == "payinInitiatedTransactionsPermissions":
                    permissionsList = role_queryset.payinInitiatedTransactionsPermissions
                elif moduleName == "autoCollectTransactionReportPermissions":
                    permissionsList = role_queryset.autoCollectTransactionReportPermissions
                elif moduleName == "thirdPartyIntegrationPermissions":
                    permissionsList = role_queryset.thirdPartyIntegrationPermissions
                elif moduleName == "serviceChargePermissions":
                    permissionsList = role_queryset.serviceChargePermissions
                elif moduleName == "userPermissionsList":
                    permissionsList = role_queryset.userPermissionsList
                elif moduleName == "assignvirtualAccountPermissions":
                    permissionsList = role_queryset.assignvirtualAccountPermissions
                elif moduleName == "assignThirdpartyvirtualAccountPermissions":
                    permissionsList = role_queryset.assignThirdpartyvirtualAccountPermissions
                elif moduleName == "beneficiariesListPermissions":
                    permissionsList = role_queryset.beneficiariesListPermissions
                elif moduleName == "autoBeneficiariesListPermissions":
                    permissionsList = role_queryset.autoBeneficiariesListPermissions
                elif moduleName == "invalidBeneficiariesListPermissions":
                    permissionsList = role_queryset.invalidBeneficiariesListPermissions
                elif moduleName == "txnLimitSettingsPermissions":
                    permissionsList = role_queryset.txnLimitSettingsPermissions
                elif moduleName == "invoiceCompanyDetailsPermissions":
                    permissionsList = role_queryset.invoiceCompanyDetailsPermissions
                elif moduleName == "utilityTransactionReportPermissions":
                    permissionsList = role_queryset.utilityTransactionReportPermissions
                elif moduleName == "accountSummaryPermissions":
                    permissionsList = role_queryset.accountSummaryPermissions
                elif moduleName == "downlineListPermissions":
                    permissionsList = role_queryset.downlineListPermissions
                elif moduleName == "balanceReportPermissions":
                    permissionsList = role_queryset.balanceReportPermissions
                elif moduleName == "cummulativeReportPermissions":
                    permissionsList = role_queryset.cummulativeReportPermissions
                elif moduleName == "operatorIncomeReportPermissions":
                    permissionsList = role_queryset.operatorIncomeReportPermissions
                elif moduleName == "chargeBacksReportPermissions":
                    permissionsList = role_queryset.chargeBacksReportPermissions
                elif moduleName == "downloadpayoutReportPermissions":
                    permissionsList = role_queryset.downloadpayoutReportPermissions
                elif moduleName == "autoCollectReportPermissions":
                    permissionsList = role_queryset.autoCollectReportPermissions
                elif moduleName == "gstAndTdsReportPermissions":
                    permissionsList = role_queryset.gstAndTdsReportPermissions
                elif moduleName == "apiDocumentGuidePermissions":
                    permissionsList = role_queryset.apiDocumentGuidePermissions
                elif moduleName == "goldApiManagementPermissions":
                    permissionsList = role_queryset.goldApiManagementPermissions
                elif moduleName == "productsPermissions":
                    permissionsList = role_queryset.productsPermissions
                elif moduleName == "multipleAppSitesPermissions":
                    permissionsList = role_queryset.multipleAppSitesPermissions
                elif moduleName == "contactSetupPermissions":
                    permissionsList = role_queryset.contactSetupPermissions
                elif moduleName == "ticketCategoryPermissions":
                    permissionsList = role_queryset.ticketCategoryPermissions
                elif moduleName == "ticketSubCategoryPermissions":
                    permissionsList = role_queryset.ticketSubCategoryPermissions
                elif moduleName == "ticketChildCategoryPermissions":
                    permissionsList = role_queryset.ticketChildCategoryPermissions
                elif moduleName == "complaintListPermissions":
                    permissionsList = role_queryset.complaintListPermissions
                elif moduleName == "payinAvailableTimePermissions":
                    permissionsList = role_queryset.payinAvailableTimePermissions
                elif moduleName == "kycApiPermissions":
                    permissionsList = role_queryset.kycApiPermissions
                elif moduleName == "assignKycPermissions":
                    permissionsList = role_queryset.assignKycPermissions
                elif moduleName == "smsApiPermissions":
                    permissionsList = role_queryset.smsApiPermissions
                elif moduleName == "assignSmsPermissions":
                    permissionsList = role_queryset.assignSmsPermissions
                elif moduleName == "smsTemplatePermissions":
                    permissionsList = role_queryset.smsTemplatePermissions
                elif moduleName == "dynamicProfileSwitchPermissions":
                    permissionsList = role_queryset.dynamicProfileSwitchPermissions
                elif moduleName == "switchprofilePermissions":
                    permissionsList = role_queryset.switchprofilePermissions
                elif moduleName == "bulkprofileupdatePermissions":
                    permissionsList = role_queryset.bulkprofileupdatePermissions
                elif moduleName == "apiSetupchargeCommissionsPermissions":
                    permissionsList = role_queryset.apiSetupchargeCommissionsPermissions
                elif moduleName == "merchantWiseTransactionPermissions":
                    permissionsList = role_queryset.merchantWiseTransactionPermissions
                elif moduleName == "commissionStructurePermissions":
                    permissionsList = role_queryset.commissionStructurePermissions
                elif moduleName == "unSettlementCommissionPermissions":
                    permissionsList = role_queryset.unSettlementCommissionPermissions
                elif moduleName == "generateSettlementCommissionPermissions":
                    permissionsList = role_queryset.generateSettlementCommissionPermissions
                elif moduleName == "settlementCommissionPermissions":
                    permissionsList = role_queryset.settlementCommissionPermissions
                elif moduleName == "dashboardPermissions":
                    permissionsList = role_queryset.dashboardPermissions
                elif moduleName == "locationsPermissions":
                    permissionsList = role_queryset.locationsPermissions
                elif moduleName == "rolesPermissions":
                    permissionsList = role_queryset.rolesPermissions
                elif moduleName == "holidaydatesPermissions":
                    permissionsList = role_queryset.holidaydatesPermissions
                elif moduleName == "bankcodesPermissions":
                    permissionsList = role_queryset.bankcodesPermissions
                elif moduleName == "lockedMerchantPermissions":
                    permissionsList = role_queryset.lockedMerchantPermissions
                elif moduleName == "goldApiTransactionPermissions":
                    permissionsList = role_queryset.goldApiTransactionPermissions
                elif moduleName == "settlementPermissions":
                    permissionsList = role_queryset.settlementPermissions
                elif moduleName == "apiSecurityPermissions":
                    permissionsList = role_queryset.apiSecurityPermissions
                elif moduleName == "kycApiChargePermissions":
                    permissionsList = role_queryset.kycApiChargePermissions
                elif moduleName == "verificationChargePermissions":
                    permissionsList = role_queryset.verificationChargePermissions
                elif moduleName == "pgSettlementsPermission":
                    permissionsList = role_queryset.pgSettlementsPermission
                elif moduleName == "mobilePrepaidPermission":
                    permissionsList = role_queryset.mobilePrepaidPermission
                elif moduleName == "circlesMasterPermission":
                    permissionsList = role_queryset.circlesMasterPermission
                elif moduleName == "prepaidOperationPermission":
                    permissionsList = role_queryset.prepaidOperationPermission
                elif moduleName == "userwisePermission":
                    permissionsList = role_queryset.userwisePermission
                elif moduleName == "commissionTdsSetupPermission":
                    permissionsList = role_queryset.commissionTdsSetupPermission
                elif moduleName == "adminPayoutDownloadReportPermission":
                    permissionsList = role_queryset.adminPayoutDownloadReportPermission
                elif moduleName == "mobileApkVersionPermission":
                    permissionsList = role_queryset.mobileApkVersionPermission
                elif moduleName == "onDemandSettlementChargesPermission":
                    permissionsList = role_queryset.onDemandSettlementChargesPermission
                elif moduleName == "adminIpAddressPermission":
                    permissionsList = role_queryset.adminIpAddressPermission
                elif moduleName == "downloadInvoicesPermission":
                    permissionsList = role_queryset.downloadInvoicesPermission
                elif moduleName == "goldUserBalancePermission":
                    permissionsList = role_queryset.goldUserBalancePermission
                elif moduleName == "goldBuySuccessTransactionPermission":
                    permissionsList = role_queryset.goldBuySuccessTransactionPermission
                elif moduleName == "goldBuyPendingTransactionPermission":
                    permissionsList = role_queryset.goldBuyPendingTransactionPermission
                elif moduleName == "goldBuyPendingPaymentPermission":
                    permissionsList = role_queryset.goldBuyPendingPaymentPermission
                elif moduleName == "goldBuyFailedPermission":
                    permissionsList = role_queryset.goldBuyFailedPermission
                elif moduleName == "goldBuyPaymentFailedPermission":
                    permissionsList = role_queryset.goldBuyPaymentFailedPermission
                elif moduleName == "goldSellAllTransactionPermission":
                    permissionsList = role_queryset.goldSellAllTransactionPermission
                elif moduleName == "goldSellSuccessTransactionPermission":
                    permissionsList = role_queryset.goldSellSuccessTransactionPermission
                elif moduleName == "goldSellProcessTransactionPermission":
                    permissionsList = role_queryset.goldSellProcessTransactionPermission
                elif moduleName == "goldSellFailedTransactionPermission":
                    permissionsList = role_queryset.goldSellFailedTransactionPermission
                elif moduleName == "bankPendingPayoutTransactionPermission":
                    permissionsList = role_queryset.bankPendingPayoutTransactionPermission
                elif moduleName == "apiSetupChargeCommissionslistPermissions":
                    permissionsList = role_queryset.apiSetupChargeCommissionslistPermissions
                elif moduleName == "servicePaymentSetupChargeCommissionPermissions":
                    permissionsList = role_queryset.servicePaymentSetupChargeCommissionPermissions
                elif moduleName == "servicePaymentSetupChargeCommissionTableListPermissions":
                    permissionsList = role_queryset.servicePaymentSetupChargeCommissionTableListPermissions
                elif moduleName == "chargeBackPermissions":
                    permissionsList = role_queryset.chargeBackPermissions
                return permissionsList
            else:
                return permissionsList
        else:   
            return permissionsList
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return permissionsList


def fetch_latest_sort_number(modelName):
    sortOrder=1
    try:
        latest_record_queryset = modelName.objects().order_by("-sortOrder").first()
        if latest_record_queryset:
            currentSortOrder = latest_record_queryset.sortOrder
            if currentSortOrder:
                sortOrder = currentSortOrder+1
            else:
                sortOrder = 1
        else:
            sortOrder = 1
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return sortOrder

def fetching_cms_pages_details(queryset):
    result_dict = {}
    try:
        result_dict = {
        "title":queryset.title,
        "metaKeyWords":queryset.metaKeyWords,
        "metaTitle":queryset.metaTitle,
        "metaDescription":queryset.metaDescription,
        "text":queryset.text,
        }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return result_dict



def fetch_admin_team_profile_details():
    admin_team_profiles_list = []
    try:
        admin_team_profiles_queryset = AdminTeamProfiles.objects(status__in=[1]).order_by("sortOrder").all()
        for each_admin_team_profile in admin_team_profiles_queryset:            
            admin_team_profile_dict = {
            "name":each_admin_team_profile.name,
            "qualification":each_admin_team_profile.qualification,
            "position":each_admin_team_profile.position,
            }
            if each_admin_team_profile.image:
                admin_team_profile_dict["image"] = domain+each_admin_team_profile.image
            else:
                admin_team_profile_dict["image"] = ""

            admin_team_profiles_list.append(admin_team_profile_dict)
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return admin_team_profiles_list



def fetch_limit_length_based_on_page_index(indexNumber,pageLimit):
    startValue=0
    endValue=20
    try:
        #Here the index starts from 1
        indexNumber = indexNumber-1
        startValue=(indexNumber)*pageLimit
        endValue=(indexNumber+1)*pageLimit
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return startValue,endValue


def generate_unique_user_name():
    username = ""
    try:
        latest_username_queryset = Subscribers.objects().order_by("-id").first()
        if latest_username_queryset:
            latest_username = latest_username_queryset.userName
        else:
            latest_username = "0"
        username = str(int(latest_username)+1)        
    except Exception as err:
        app.logger.error(traceback.format_exc())
    return username

def fetch_active_remarks_list():
    remarks_list = []
    try:
        remarks_queryset=SubscriptionRemarks.objects(status__in=[1]).order_by("-id").all()
        for each_remark in remarks_queryset:
            remarkDict = fetching_remark_details(each_remark)
            remarks_list.append(remarkDict)    
    except Exception as err:
        app.logger.error(traceback.format_exc())
    return remarks_list


def fetching_remark_details(remark_queryset):
    remarkDict = {}
    try:
        remarkDict = {
        "id":str(remark_queryset.id),
        "name":remark_queryset.name,
        "subEnabled":remark_queryset.subEnabled
        }        
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return remarkDict


def fetch_active_denominations_list():
    denominations_list = []
    try:
        denominations_queryset=SubscriptionDenominations.objects(status__in=[1]).order_by("-id").all()
        for each_den in denominations_queryset:
            denDict = fetching_denomination_details(each_den)
            denominations_list.append(denDict)    
    except Exception as err:
        app.logger.error(traceback.format_exc())
    return denominations_list


def fetching_denomination_details(denomination_queryset):
    denominationDict = {}
    try:
        denominationDict = {
        "id":str(denomination_queryset.id),
        "name":denomination_queryset.name
        }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return denominationDict



def format_address(adressList):
    try:
        output=""
        output = ", ".join(adressList)
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return output

def remove_characters_in_url_string(input_string):
    try:
        output_string = unquote(input_string)
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return output_string

# def send_asynchronous_email(mail_subject, recipients_list, template_name, mail_data):
#     msg=Message(mail_subject,sender=sender_email,recipients=recipients_list)
#     msg.html=render_template(template_name,mail_data=mail_data,domainUrl=domain)
#     Thread(target=send_async_email, args=(app, msg)).start()

# def send_async_email(app, msg):
#     with app.app_context():
#         mail.send(msg)

def send_asynchronous_email(mail_subject, recipients_list, template_name, mail_data,cc_list=[]):
	app.logger.error(f" mail_data {mail_data}")
	msg=Message(mail_subject,sender=sender_email,recipients=recipients_list)
	msg.html=render_template(template_name,mail_data=mail_data,domainUrl=domain)
	if cc_list!=[]:
		msg.cc=cc_list
	Thread(target=send_async_email, args=(app, msg)).start()

def send_async_email(app, msg):
	with app.app_context():
		mail.send(msg)

def send_asynchronous_ses_email(mail_subject, recipients_list, template_name, mail_data, mail_body):
    #Reference Link: https://docs.aws.amazon.com/ses/latest/dg/send-an-email-using-sdk-programmatically.html
    SENDER = app.config['EMAIL_SENDER_NAME']+" <"+app.config['SENDER_EMAIL']+">"
    # SENDER = "Kerala Express <news@keralaexpress.com>"
    CHARSET = "UTF-8"  
    ses.send_email(
        Destination={
            'ToAddresses': recipients_list,
        },
        Message={
            'Body': {
                # 'Html': {
                #     'Charset': CHARSET,
                #     'Data': BODY_HTML,
                # },
                'Text': {
                    'Charset': CHARSET,
                    'Data': mail_body,
                },
            },
            'Subject': {
                'Charset': CHARSET,
                'Data': mail_subject,
            },
        },
        Source=SENDER
    )


# def test_send_asynchronous_email(mail_subject, recipients_list, template_name, mail_data, mail_body):
#     sender_details = (mail_sender_name, sender_email)
#     msg=Message(mail_subject,sender=sender_details,recipients=recipients_list)
#     msg.body = mail_body
#     # msg.html=render_template(template_name,mail_data=mail_data)
#     Thread(target=send_async_email, args=(app, msg)).start()


# def test_send_asynchronous_email(mail_subject, recipients_list, template_name, mail_data, mail_body):
#     SENDER = "Kerala Express <news@appservices.com>"
#     CHARSET = "UTF-8"
#     ses = boto3.client(
#         'ses',
#         region_name=app.config['SES_REGION_NAME'],
#         aws_access_key_id="AKIA547Y2NRVFHVBPEV7",
#         aws_secret_access_key="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"
#         # aws_access_key_id=app.config['AWS_ACCESS_KEY_ID'],
#         # aws_secret_access_key=app.config['AWS_SECRET_ACCESS_KEY']
#     )

#     ses.send_email(
#         Destination={
#             'ToAddresses': recipients_list,
#         },
#         Message={
#             'Body': {
#                 # 'Html': {
#                 #     'Charset': CHARSET,
#                 #     'Data': BODY_HTML,
#                 # },
#                 'Text': {
#                     'Charset': CHARSET,
#                     'Data': mail_body,
#                 },
#             },
#             'Subject': {
#                 'Charset': CHARSET,
#                 'Data': mail_subject,
#             },
#         },
#         Source=SENDER,
#         # If you are not using a configuration set, comment or delete the
#         # following line
#         # ConfigurationSetName=CONFIGURATION_SET,
#     )


def generate_unique_post_url(url):
    output_url = ""
    try:
        url = url.replace(" ","-")
        unique_urls_list = Posts.objects().distinct("url")
        if url not in unique_urls_list:
            output_url = url
        else:
            new_url = url+"1"
            output_url = generate_unique_post_url(new_url)
    except Exception as err:
        app.logger.error(traceback.format_exc())
        pass
    return output_url


# regex = re.compile(r'<[^>]+>')
# regex = re.compile(r'<.*?>')

# def remove_html_tags(string):
#     output_string = ""
#     try:
#         return regex.sub('', string)
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#     return output_string

# # Old HTML Tags Remover Code
# class HTMLTagsRemover(HTMLParser):
#   def __init__(self):
#       super().__init__(convert_charrefs=False)
#       self.reset()
#       self.convert_charrefs = True
#       self.fed = []

#   def handle_data(self, data):
#       self.fed.append(data)

#   def handle_entityref(self, name):
#       self.fed.append(f'&{name};')

#   def handle_charref(self, name):
#       self.fed.append(f'&#{name};')

#   def get_data(self):
#       return ''.join(self.fed)

# def remove_html_tags(value):
#   remover = HTMLTagsRemover()

#   remover.feed(value)
#   remover.close()
#   return remover.get_data()


class HTMLTagsRemover(HTMLParser):
    def __init__(self):
        super().__init__(convert_charrefs=False)
        self.reset()
        self.convert_charrefs = True
        self.fed = []
        self.in_p_tag = False

    def handle_starttag(self, tag, attrs):
        if tag == 'p':
            self.in_p_tag = True

    def handle_endtag(self, tag):
        if tag == 'p':
            if self.in_p_tag:
                self.fed.append('\n\n')  # Add double new lines for paragraph breaks
                self.in_p_tag = False

    def handle_data(self, data):
        self.fed.append(data)

    def handle_entityref(self, name):
        self.fed.append(f'&{name};')

    def handle_charref(self, name):
        self.fed.append(f'&#{name};')

    def get_data(self):
        return ''.join(self.fed)

def remove_html_tags(value):
    remover = HTMLTagsRemover()
    remover.feed(value)
    remover.close()
    return remover.get_data()

def random_paypal_id_generate(length):
    key=""
    for i in range(length):
        key += random.choice(string.digits)
    return key


def random_summernote_name_generate():
    millisec = str(int(time.time() * 1000))
    return millisec

def unique_time_name_generation():
    millisec = str(int(time.time() * 1000))
    return millisec



##################### Gram Connect #########################
def get_adminId_from_session():
    adminId = None
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
    except:
        return redirect("admin_login")
    return adminId

# def fetching_category_details():
#     categoriesList = []
#     try:
#         categories_queryset = Categories.objects(status__in=[0,1]).order_by("-id")
#         for each_categry in categories_queryset:
#             category_dict = {
#             "id":str(each_categry.id),
#             "categoryName":each_categry.categoryName,
#             }
#             categoriesList.append(category_dict)
#     except:
#         app.logger.error(traceback.format_exc())
#     return categoriesList


def fetching_wallet_details():
    walletsList = []
    try:
        wallets_queryset = Wallet.objects(status__in=[0,1]).order_by("-id")
        for each_wallet in wallets_queryset:
            wallet_dict = {
            "id":str(each_wallet.id),
            "walletName":each_wallet.walletName,
            }
            walletsList.append(wallet_dict)
    except:
        app.logger.error(traceback.format_exc())
    return walletsList


def fetching_tax_type_details():
    taxTypesList = []
    try:
        tax_types_queryset = TaxTypes.objects(status__in=[0,1]).order_by("-id")
        for each_tax_type in tax_types_queryset:
            tax_type_dict = {
            "id":str(each_tax_type.id),
            "taxTypeName":each_tax_type.taxTypeName,
            }
            taxTypesList.append(tax_type_dict)
    except:
        app.logger.error(traceback.format_exc())
    return taxTypesList

def fetching_countries_details(country_queryset):
    country_dict = {}
    try:
        country_dict={
        "id":str(country_queryset.id),
        "countryName":country_queryset.countryName,
        "regex":country_queryset.regex,
        "countryCode":country_queryset.countryCode
        }
        try:
            if country_queryset.regionId:
                country_dict["regionName"]=country_queryset.regionId.regionName
            else:
                country_dict["regionName"]=""
        except Exception as e:
            country_dict["regionName"]=""
        if country_queryset.status==1:
            country_dict["actionText"] = "Active"
        else:
            country_dict["actionText"] = "Deactive"
        if country_queryset.createdOn:
            country_dict["createdOn"] = country_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            country_dict["createdOn"] = ""

        if country_queryset.countryFlag:
            country_dict["countryFlag"] = domain+country_queryset.countryFlag
        else:
            country_dict["countryFlag"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return country_dict

def fetching_state_details():
    statesList = []
    try:
        states_queryset = States.objects(status__in=[0,1]).order_by("-id")
        for each_state in states_queryset:
            state_dict = {
            "id":str(each_state.id),
            "stateName":each_state.stateName,
            }
            statesList.append(state_dict)
    except:
        app.logger.error(traceback.format_exc())
    return statesList

def fetching_states_details(state_queryset):
    state_dict = {}
    try:
        state_dict={
        "id":str(state_queryset.id),
        "stateName":state_queryset.stateName,
        "countryName":state_queryset.countryId.countryName
        }
        if state_queryset.status==1:
            state_dict["actionText"] = "Active"
        else:
            state_dict["actionText"] = "Deactive"
        if state_queryset.createdOn:
            state_dict["createdOn"] = state_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            state_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return state_dict

def fetching_cities_details(city_queryset):
    city_dict = {}
    try:
        city_dict={
        "id":str(city_queryset.id),
        "cityName":city_queryset.cityName,
        "stateName":city_queryset.stateId.stateName,
        "stateId":str(city_queryset.stateId.id)
        }
        if city_queryset.status==1:
            city_dict["actionText"] = "Active"
        else:
            city_dict["actionText"] = "Deactive"
        if city_queryset.createdOn:
            city_dict["createdOn"] = city_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            city_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return city_dict


def fetching_blocks_details(block_queryset):
    block_dict = {}
    try:
        block_dict={
        "id":str(block_queryset.id),
        "name":block_queryset.name,
        "cityName":block_queryset.cityId.cityName,
        "cityId":str(block_queryset.cityId.id)
        }
        if block_queryset.status==1:
            block_dict["actionText"] = "Active"
        else:
            block_dict["actionText"] = "Deactive"
        if block_queryset.createdOn:
            block_dict["createdOn"] = block_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            block_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return block_dict

def fetching_pincode_details(pincode_queryset):
    pincode_dict = {}
    try:
        pincode_dict={
        "id":str(pincode_queryset.id),
        "pincode":pincode_queryset.pincode,
        "blockName":pincode_queryset.blockPoId.name,
        "blockPoId":str(pincode_queryset.blockPoId.id)
        }
        if pincode_queryset.latitude:
            pincode_dict["latitude"] = pincode_queryset.latitude
        else:
            pincode_dict["latitude"] = ""
        if pincode_queryset.longitude:
            pincode_dict["longitude"] = pincode_queryset.longitude
        else:
            pincode_dict["longitude"] = ""

        if pincode_queryset.status==1:
            pincode_dict["actionText"] = "Active"
        else:
            pincode_dict["actionText"] = "Deactive"

        if pincode_queryset.status==1:
            pincode_dict["actionText"] = "Active"
        else:
            pincode_dict["actionText"] = "Deactive"
        if pincode_queryset.createdOn:
            pincode_dict["createdOn"] = pincode_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            pincode_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return pincode_dict

def get_image_format_from_base64(img_data):
    try:
        if ";" in img_data:
            new_img_data = img_data.split(";")[0].split("/")[-1]
            return new_img_data.lower()
    except:
        app.logger.error(traceback.format_exc())
    return "png"

def get_epoch_milli_time():
    millisec = int(time.time() * 1000)
    return millisec

def convert_other_info_image_to_pure_base64(img_data):
    if "," in img_data:
        new_img_data = img_data.split(",")[-1]
        return new_img_data
    else:
        return img_data


def upload_file_image(base64Data, folder_name, fileName, file_extension):
    data_status = {"responseStatus": 0, "result": ""}
    try:
        #Check whether media folder exists, if not create one
        expected_media_folder = site_root_directory+"/media/"
        if not os.path.exists(expected_media_folder):
            os.makedirs(expected_media_folder)

        #Check whether resraurant folder exists, if not create a new one
        expected_rest_folder = site_root_directory+"/media/"
        if not os.path.exists(expected_rest_folder):
            os.makedirs(expected_rest_folder)

        #Regenerating the image from base64 code
        # base64Data = convert_other_info_image_to_pure_base64(base64Data)
        image_data = bytes(base64Data, encoding="ascii")
        file_format = get_image_format_from_base64(base64Data)
        base64Data = convert_other_info_image_to_pure_base64(base64Data)

        if "svg" in file_format.lower():
            svg_binary = base64.b64decode(base64Data)
            # Convert binary SVG data to a string
            svg_string = svg_binary.decode("utf-8")

            image_name = fileName + ".svg"
            corresponding_folder_name = expected_rest_folder+"/"+folder_name
            save_folder_name = "/media/"+folder_name
            if not os.path.exists(corresponding_folder_name):
                os.makedirs(corresponding_folder_name)
                
            with open(corresponding_folder_name+"/"+image_name,"w") as svg_file:
                svg_file.write(svg_string)
                svg_file.close()
            return save_folder_name+"/"+image_name
        else:
            base_image = Image.open(BytesIO(base64.b64decode(image_data)))
            final_image = base_image.convert('RGB')
            if file_extension:
                if "." in file_extension:
                    image_name = fileName + file_extension
                else:
                    image_name = fileName +"."+ file_extension
            else:
                image_name = fileName + '.png'

            corresponding_folder_name = expected_rest_folder+"/"+folder_name
            save_folder_name = "/media/"+folder_name
            if not os.path.exists(corresponding_folder_name):
                os.makedirs(corresponding_folder_name)
            #Saving the file in corresponding folder
            final_image.save(os.path.join(corresponding_folder_name, image_name))
            return save_folder_name+"/"+image_name
    except:
        app.logger.error(traceback.format_exc())
        return False

def fetching_commission_details(commission_queryset):
    commissionDict = {}
    try:
        commissionDict={
        "id":str(commission_queryset.id),
        "name":commission_queryset.commissionName,
        }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return commissionDict



def fetching_user_type_details(user_type_queryset):
    userTypeDict = {}
    try:
        userTypeDict={
        "id":str(user_type_queryset.id),
        "userType":user_type_queryset.userType,
        "code":user_type_queryset.code,
        "description":user_type_queryset.description,
        "rank":user_type_queryset.rank,
        "isAllow":user_type_queryset.isAllow,
        "isCommission":user_type_queryset.isCommission,
        "isUser":user_type_queryset.isUser
        }
        if user_type_queryset.status==1:
            userTypeDict["actionText"] = "Active"
        else:
            userTypeDict["actionText"] = "Deactive"
        if user_type_queryset.createdOn:
            userTypeDict["createdOn"] = user_type_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            userTypeDict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return userTypeDict

def fetching_profile_details(profile_queryset):
    profileDict = {}
    try:
        profileDict={
        "id":str(profile_queryset.id),
        "name":profile_queryset.name,
        "code":profile_queryset.code,
        "signUpProfile":profile_queryset.signUpProfile,
        "userTypeId":str(profile_queryset.userTypeId.id),
        "userTypeName":profile_queryset.userTypeId.userType
        }
        if profile_queryset.status==1:
            profileDict["actionText"] = "Active"
        else:
            profileDict["actionText"] = "Deactive"
        if profile_queryset.createdOn:
            profileDict["createdOn"] = profile_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            profileDict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return profileDict

def fetching_tenant_details(tenant_queryset):
    tenantDict = {}
    try:
        tenantDict={
        "id":str(tenant_queryset.id),
        "name":tenant_queryset.name,
        "domainName":tenant_queryset.domainName,
        "version":tenant_queryset.version
        }
        if tenant_queryset.status==1:
            tenantDict["actionText"] = "Active"
        else:
            tenantDict["actionText"] = "Deactive"
        if tenant_queryset.createdOn:
            tenantDict["createdOn"] = tenant_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            tenantDict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return tenantDict


def upload_file_video(folder_name, fileName, file_extension, file):
    data_status = {"responseStatus": 0, "result": ""}
    
    try:
        # Check whether the 'media' folder exists, if not create one
        expected_media_folder = os.path.join(site_root_directory, "media")
        if not os.path.exists(expected_media_folder):
            os.makedirs(expected_media_folder)

        # Check whether the 'restaurant' folder exists, if not create a new one
        expected_folder = os.path.join(expected_media_folder, folder_name)
        if not os.path.exists(expected_folder):
            os.makedirs(expected_folder)

        if file_extension:
            if "." in file_extension:
                video_name = f"{fileName}{file_extension}"
            else:
                video_name = f"{fileName}.{file_extension}"
        else:
            video_name = f"{fileName}.mp4"

        corresponding_folder_name = os.path.join(expected_media_folder, folder_name)
        save_folder_name = f"/media/{folder_name}"

        if not os.path.exists(corresponding_folder_name):
            os.makedirs(corresponding_folder_name)

        # Saving the file in the corresponding folder
        file.save(os.path.join(corresponding_folder_name, video_name))
        return f"{save_folder_name}/{video_name}"

    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False

def fetching_wallets_details(wallet_queryset):
    wallet_dict = {}
    try:
        wallet_dict={
        "id":str(wallet_queryset.id),
        "walletName":wallet_queryset.walletName,
        "code":wallet_queryset.code,
        "description":wallet_queryset.description,
        }
        if wallet_queryset.status==1:
            wallet_dict["actionText"] = "Active"
        else:
            wallet_dict["actionText"] = "Deactive"
        if wallet_queryset.createdOn:
            wallet_dict["createdOn"] = wallet_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            wallet_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return wallet_dict

def fetching_pattern_details(pattern_queryset):
    pattern_dict = {}
    try:
        pattern_dict={
        "id":str(pattern_queryset.id),
        "adminId":str(pattern_queryset.adminId.id),
        "adminName":pattern_queryset.adminId.userName,
        "name":pattern_queryset.name,
        "rank":pattern_queryset.rank,
        "code":pattern_queryset.code,
        "isUserWise":pattern_queryset.isUserWise,
        "isAllow" : pattern_queryset.isAllow,
        "isCommission" : pattern_queryset.isCommission,
        "isSuperDistributor" : pattern_queryset.isSuperDistributor,
        "userPermissionId":pattern_queryset.userPermissionId,
        "description":pattern_queryset.description,
        "userPermissionId":str(pattern_queryset.userPermissionId.id),
        "userPermissionName":pattern_queryset.userPermissionId.permissionName,
        "payinEnable":pattern_queryset.payinEnable,
        "payoutEnable":pattern_queryset.payoutEnable,
        "defaultProfile":pattern_queryset.defaultProfile,
        }
        try:
            if pattern_queryset.payoutPaymentGatewayId:
                pattern_dict["payoutPaymentGatewayId"]=str(pattern_queryset.payoutPaymentGatewayId.id)
            else:
                pattern_dict["payoutPaymentGatewayId"]=""
        except Exception as e:
            pattern_dict["payoutPaymentGatewayId"]=""

        if pattern_queryset.payinPaymentGatewaysList:
            pattern_dict["payinPaymentGatewaysList"]=[str(each_payin_pg.id) for each_payin_pg in pattern_queryset.payinPaymentGatewaysList]
        else:
            pattern_dict["payinPaymentGatewaysList"]=[]

        if pattern_queryset.defaultPayinPaymentGatewayId:
            pattern_dict["defaultPayinPaymentGatewayId"]=str(pattern_queryset.defaultPayinPaymentGatewayId.id)
        else:
            pattern_dict["defaultPayinPaymentGatewayId"]=None

        if pattern_queryset.defaultPayoutPaymentGatewayId:
            pattern_dict["defaultPayoutPaymentGatewayId"]=str(pattern_queryset.defaultPayoutPaymentGatewayId.id)
        else:
            pattern_dict["defaultPayoutPaymentGatewayId"]=None

        if pattern_queryset.status==1:
            pattern_dict["actionText"] = "Active"
        else:
            pattern_dict["actionText"] = "Deactive"

        if pattern_queryset.createdOn:
            pattern_dict["createdOn"] = pattern_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            pattern_queryset["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return pattern_dict


def fetching_user_details(user_queryset):
    userDict = {}
    try:
        userDict={
        "id":str(user_queryset.id),
        "fullName":user_queryset.fullName,
        "phoneNumber":user_queryset.phoneNumber,
        "email":user_queryset.email,
        "address":user_queryset.address,
        "stateId":str(user_queryset.stateId.id),
        "stateName":user_queryset.stateId.stateName,
        "cityId":str(user_queryset.cityId.id),
        "cityName":user_queryset.cityId.cityName,
        "blockPoId":str(user_queryset.blockPoId.id),
        "blockPoName":user_queryset.blockPoId.name,
        "merchantUniqueNumber":user_queryset.merchantUniqueNumber,
        "enablePayin":user_queryset.enablePayin,
        "enablePayout":user_queryset.enablePayout,
        "merchantType":user_queryset.merchantType,
        "channel":user_queryset.channel,
        "maxPayinLimit":user_queryset.maxPayinLimit,
        "maxPayoutLimit":user_queryset.maxPayoutLimit,
        "remark": user_queryset.remark,
        }
        if user_queryset.walletBalance:
            userDict["walletBalance"]=formatINR("{:.2f}".format(float(user_queryset.walletBalance)))
        else:
            userDict["walletBalance"]="0.00"
        if user_queryset.payoutBalance:
            userDict["payoutBalance"]=formatINR("{:.2f}".format(float(user_queryset.payoutBalance)))
        else:
            userDict["payoutBalance"]="0.00"
            
        if user_queryset.commissionBalance:
            userDict["commissionBalance"]=formatINR("{:.2f}".format(float(user_queryset.commissionBalance)))
        else:
            userDict["commissionBalance"]="0.00"

        if user_queryset.capBalance:
            userDict["capBalance"]=formatINR("{:.2f}".format(float(user_queryset.capBalance)))
        else:
            userDict["capBalance"]="0.00"

        if user_queryset.status==0:
            userDict["actionText"] = "Pending"
        else:
            userDict["actionText"] = "Approved"

        if user_queryset.status==3:
            userDict["blockStatus"] = "UnBlock"
        else:
            userDict["blockStatus"] = "Block"

        if user_queryset.status==5:
            userDict["lockStatus"] = "Unlocked"
        else:
            userDict["lockStatus"] = "Locked"

        try:
            if user_queryset.merchantPaymentLink:
                userDict["merchantPaymentLink"]=PAYMENT_LINK_BASE_URL+user_queryset.merchantPaymentLink
            else:
                userDict["merchantPaymentLink"]=""
        except Exception as e:
            userDict["merchantPaymentLink"]=""

        if user_queryset.createdOn:
            userDict["createdOn"] = user_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            userDict["createdOn"] = ""

        try:
            if user_queryset.panReason:
                userDict["panReason"]=user_queryset.panReason
            else:
                userDict["panReason"]=""
        except Exception as e:
            userDict["panReason"]=""

        try:
            if user_queryset.pincodeId:
                userDict["pincodeId"]=str(user_queryset.pincodeId.id)
                userDict["pincode"]=user_queryset.pincodeId.pincode
            else:
                userDict["pincodeId"]=""
                userDict["pincode"]=""
        except Exception as e:
            userDict["pincodeId"]=""
            userDict["pincode"]=""

        try:
            if user_queryset.patternId:
                userDict["patternId"]=str(user_queryset.patternId.id)
                userDict["patternName"]=user_queryset.patternId.name
            else:
                userDict["patternId"]=""
                userDict["patternName"]=""
        except Exception as e:
            userDict["patternId"]=""
            userDict["patternName"]=""

        try:
            if user_queryset.payInPaymentGatewayId:
                userDict["payInPaymentGatewayId"]=str(user_queryset.payInPaymentGatewayId.id)
                userDict["payInPaymentGatewayName"]=user_queryset.payInPaymentGatewayId.apiName
            else:
                userDict["payInPaymentGatewayId"]=""
                userDict["payInPaymentGatewayName"]=""
        except Exception as e:
            userDict["payInPaymentGatewayId"]=""
            userDict["payInPaymentGatewayName"]=""

        try:
            if user_queryset.payOutPaymentGatewayId:
                userDict["payOutPaymentGatewayId"]=str(user_queryset.payOutPaymentGatewayId.id)
                userDict["payOutPaymentGatewayName"]=user_queryset.payOutPaymentGatewayId.apiName
            else:
                userDict["payOutPaymentGatewayId"]=""
                userDict["payOutPaymentGatewayName"]=""
        except Exception as e:
            userDict["payOutPaymentGatewayId"]=""
            userDict["payOutPaymentGatewayName"]=""

        try:
            if user_queryset.categoryId:
                userDict["categoryId"]=str(user_queryset.categoryId.id)
                userDict["categoryName"]=user_queryset.categoryId.name
            else:
                userDict["categoryId"]=""
                userDict["categoryName"]=""
        except Exception as e:
            userDict["categoryId"]=""
            userDict["categoryName"]=""

        try:
            if user_queryset.subCategoryId:
                userDict["subCategoryId"]=str(user_queryset.subCategoryId.id)
                userDict["subCategoryName"]=user_queryset.subCategoryId.name
            else:
                userDict["subCategoryId"]=""
                userDict["subCategoryName"]=""
        except Exception as e:
            userDict["subCategoryId"]=""
            userDict["subCategoryName"]=""

        try:
            if user_queryset.parentId:
                userDict["parentId"]=str(user_queryset.parentId.id)
                userDict["parentName"]=user_queryset.parentId.fullName
            else:
                userDict["parentId"]=""
                userDict["parentName"]=""
        except Exception as e:
            userDict["parentId"]=""
            userDict["parentName"]=""
        try:
            if user_queryset.commissionId:
                userDict["commissionId"]=str(user_queryset.commissionId.id)
                userDict["commissionName"]=user_queryset.commissionId.commissionName
            else:
                userDict["commissionId"]=None
                userDict["commissionName"]=""
        except Exception as e:
            userDict["commissionId"]=None
            userDict["commissionName"]=""

        try:
            if user_queryset.parentId:
                userDict["checkParentId"]=True
            else:
                userDict["checkParentId"]=False
        except Exception as e:
            userDict["checkParentId"]=False

        try:
            if user_queryset.entityTypeId:
                userDict["entityTypeId"]=str(user_queryset.entityTypeId.id)
                userDict["entityTypeName"]=user_queryset.entityTypeId.entityType
            else:
                userDict["entityTypeId"]=""
                userDict["entityTypeName"]=""
        except Exception as e:
            userDict["entityTypeId"]=""
            userDict["entityTypeName"]=""

        if user_queryset.profilePicture:
            userDict["profilePicture"]=domain+user_queryset.profilePicture
        else:
            userDict["profilePicture"]=""

        if user_queryset.agreementDocument:
            userDict["agreementDocument"]=domain+user_queryset.agreementDocument
        else:
            userDict["agreementDocument"]=""

        user_kyc_queryset = UserKYC.objects(userId=str(user_queryset.id)).first()
        try:
            if user_kyc_queryset:
                userDict["kycId"]= str(user_kyc_queryset.id)
            else:
                userDict["kycId"]=""
        except Exception as e:
            userDict["kycId"]=""

        try:
            if user_kyc_queryset.panName:
                userDict["panName"]= user_kyc_queryset.panName
                userDict["originalPanName"]= user_kyc_queryset.originalPanName
            else:
                userDict["panName"]=""
                userDict["originalPanName"]=""
        except Exception as e:
            userDict["panName"]=""
            userDict["originalPanName"]=""

        try:
            if user_kyc_queryset.businessName:
                userDict["businessName"]= user_kyc_queryset.businessName
                userDict["businessAddress"]= user_kyc_queryset.businessAddress
                userDict["businessStatus"]= user_kyc_queryset.businessStatus
                userDict["businessRemark"]= user_kyc_queryset.businessRemark
                userDict["documentRemark"]= user_kyc_queryset.documentRemark
                userDict["videoVerificationRemark"]= user_kyc_queryset.videoVerificationRemark
            else:
                userDict["businessName"]=""
                userDict["businessAddress"]=""
                userDict["businessStatus"]="Pending"
                userDict["businessRemark"]=""
                userDict["documentRemark"]=""
                userDict["videoVerificationRemark"]=""
        except Exception as e:
            userDict["businessName"]=""
            userDict["businessAddress"]=""
            userDict["businessStatus"]="Pending"

        try:
            if user_kyc_queryset.panNumber:
                userDict["panNumber"]= user_kyc_queryset.panNumber
            else:
                userDict["panNumber"]=""
        except Exception as e:
            userDict["panNumber"]=""

        try:
            if user_kyc_queryset.panStatus:
                userDict["panStatus"]= user_kyc_queryset.panStatus
            else:
                userDict["panStatus"]=""
        except Exception as e:
            userDict["panStatus"]="Pending"

        try:
            if user_kyc_queryset.bankId:
                userDict["bankId"]= str(user_kyc_queryset.bankId.id)
                userDict["bankName"]= user_kyc_queryset.bankId.bankName
                userDict["originalBankName"]= user_kyc_queryset.originalBankName
            else:
                userDict["bankId"]=""
                userDict["bankName"]=""
                userDict["originalBankName"]=""
        except Exception as e:
            userDict["bankId"]=""
            userDict["bankName"]=""
            userDict["originalBankName"]=""

        try:
            if user_kyc_queryset.bankAccountNumber:
                userDict["bankAccountNumber"]= user_kyc_queryset.bankAccountNumber
            else:
                userDict["bankAccountNumber"]=""
        except Exception as e:
            userDict["bankAccountNumber"]=""

        try:
            if user_kyc_queryset.bankStatus:
                userDict["bankStatus"]= user_kyc_queryset.bankStatus
            else:
                userDict["bankStatus"]=""
        except Exception as e:
            userDict["bankStatus"]="Pending"

        try:
            if user_kyc_queryset.ifscCode:
                userDict["ifscCode"]= user_kyc_queryset.ifscCode
            else:
                userDict["ifscCode"]=""
        except Exception as e:
            userDict["ifscCode"]=""

        try:
            if user_kyc_queryset.aadharName:
                userDict["aadharName"]= user_kyc_queryset.aadharName
                userDict["originalAadharName"]= user_kyc_queryset.originalAadharName
            else:
                userDict["aadharName"]=""
                userDict["originalAadharName"]=""
        except Exception as e:
            userDict["aadharName"]=""
            userDict["originalAadharName"]=""

        try:
            if user_kyc_queryset.aadharNumber:
                userDict["aadharNumber"]= user_kyc_queryset.aadharNumber
            else:
                userDict["aadharNumber"]=""
        except Exception as e:
            userDict["aadharNumber"]=""

        try:
            if user_kyc_queryset.aadharStatus:
                userDict["aadharStatus"]= user_kyc_queryset.aadharStatus
            else:
                userDict["aadharStatus"]=""
        except Exception as e:
            userDict["aadharStatus"]="Pending"


        try:
            if user_kyc_queryset.aadharDocument:
                userDict["aadharDocument"]= domain+user_kyc_queryset.aadharDocument
            else:
                userDict["aadharDocument"]=""
        except Exception as e:
            userDict["aadharDocument"]=""

        try:
            if user_kyc_queryset.aadharBackDocument:
                userDict["aadharBackDocument"]= domain+user_kyc_queryset.aadharBackDocument
            else:
                userDict["aadharBackDocument"]=""
        except Exception as e:
            userDict["aadharBackDocument"]=""


        try:
            if user_kyc_queryset.panDocument:
                userDict["panDocument"]= domain+user_kyc_queryset.panDocument
            else:
                userDict["panDocument"]=""
        except Exception as e:
            userDict["panDocument"]=""

        try:
            if user_kyc_queryset.uploadVideo:
                userDict["uploadVideo"]= domain+user_kyc_queryset.uploadVideo
            else:
                userDict["uploadVideo"]=""
        except Exception as e:
            userDict["uploadVideo"]=""
        try:
            if user_kyc_queryset.videoVerificationStatus:
                userDict["videoVerificationStatus"]= user_kyc_queryset.videoVerificationStatus
            else:
                userDict["videoVerificationStatus"]="Pending"
        except Exception as e:
            userDict["videoVerificationStatus"]="Pending"

        try:
            if user_kyc_queryset.shopVideoStatus:
                userDict["shopVideoStatus"]= user_kyc_queryset.shopVideoStatus
            else:
                userDict["shopVideoStatus"]="Pending"
        except Exception as e:
            userDict["shopVideoStatus"]="Pending"

        try:
            if user_kyc_queryset.shopRemark:
                userDict["shopRemark"]= user_kyc_queryset.shopRemark
            else:
                userDict["shopRemark"]=""
        except Exception as e:
            userDict["shopRemark"]=""

        try:
            if user_kyc_queryset.panReason:
                userDict["panReason"]=user_kyc_queryset.panReason
            else:
                userDict["panReason"]=""
        except Exception as e:
            userDict["panReason"]=""

        try:
            if user_kyc_queryset.aadharReason:
                userDict["aadharReason"]=user_kyc_queryset.aadharReason
            else:
                userDict["aadharReason"]=""
        except Exception as e:
            userDict["aadharReason"]=""
        try:
            if user_kyc_queryset.bankReason:
                userDict["bankReason"]=user_kyc_queryset.bankReason
            else:
                userDict["bankReason"]=""
        except Exception as e:
            userDict["bankReason"]=""

        try:
            if user_kyc_queryset.videoVerificationReason:
                userDict["videoVerificationReason"]=user_kyc_queryset.videoVerificationReason
            else:
                userDict["videoVerificationReason"]=""
        except Exception as e:
            userDict["videoVerificationReason"]=""

        try:
            if user_kyc_queryset.agreementVerificationStatus:
                userDict["agreementVerificationStatus"]= user_kyc_queryset.agreementVerificationStatus
                userDict["agreementVerificationReason"]= user_kyc_queryset.agreementVerificationReason
            else:
                userDict["agreementVerificationStatus"]="Pending"
                userDict["agreementVerificationReason"]="Pending"
        except Exception as e:
            userDict["agreementVerificationStatus"]="Pending"
            userDict["agreementVerificationReason"]="Pending"


        try:
            if user_kyc_queryset.businessName:
                userDict["businessName"]=user_kyc_queryset.businessName
            else:
                userDict["businessName"]=''
        except Exception as e:
            userDict["businessName"]=''
        
        try:
            if user_kyc_queryset.businessAddress:
                userDict["businessAddress"]=user_kyc_queryset.businessAddress
            else:
                userDict["businessAddress"]=""
        except Exception as e:
            userDict["businessAddress"]=""
        try:
            if user_kyc_queryset.businessRemark:
                userDict["businessRemark"]=user_kyc_queryset.businessRemark
            else:
                userDict["businessRemark"]=""
        except Exception as e:
            userDict["businessRemark"]=""

        try:
            if user_kyc_queryset.documentRemark:
                userDict["documentRemark"]=user_kyc_queryset.documentRemark
            else:
                userDict["documentRemark"]=""
        except Exception as e:
            userDict["documentRemark"]=""

        try:
            if user_kyc_queryset.videoVerificationRemark:
                userDict["videoVerificationRemark"]=user_kyc_queryset.videoVerificationRemark
            else:
                userDict["videoVerificationRemark"]=""
        except Exception as e:
            userDict["videoVerificationRemark"]=""


        try:
            if user_kyc_queryset.documentsList:
                userDict["documentsList"]= user_kyc_queryset.documentsList
            else:
                userDict["documentsList"]=""
        except Exception as e:
            userDict["documentsList"]=""
        
        try:
            if user_kyc_queryset.shopVideo:
                userDict["shopVideo"]= user_kyc_queryset.shopVideo
            else:
                userDict["shopVideo"]=""
        except Exception as e:
            userDict["shopVideo"]=""

        try:
            if user_kyc_queryset.shopRemark:
                userDict["shopRemark"]= user_kyc_queryset.shopRemark
            else:
                userDict["shopRemark"]=""
        except Exception as e:
            userDict["shopRemark"]=""

        try:
            if user_kyc_queryset.agreementVerificationReason:
                userDict["agreementVerificationReason"]= user_kyc_queryset.agreementVerificationReason
            else:
                userDict["agreementVerificationReason"]=""
        except Exception as e:
            userDict["agreementVerificationReason"]=""
        
        try:
            if user_kyc_queryset.shopImagesList:
                userDict["shopImagesList"]= user_kyc_queryset.shopImagesList
            else:
                userDict["shopImagesList"]=""
        except Exception as e:
            userDict["shopImagesList"]=""
        
        try:
            if user_kyc_queryset.businessStatus:
                userDict["businessStatus"]= user_kyc_queryset.businessStatus
            else:
                userDict["businessStatus"]=""
        except Exception as e:
            userDict["businessStatus"]=""

        try:
            if user_queryset.siteTitle:
                userDict["siteCode"] = user_queryset.siteTitle
            else:
                userDict["siteCode"] = ""
        except Exception as e:
                userDict["siteCode"] = ""

        # kycStatusList = [
        # user_queryset.panStatus,
        # user_queryset.bankStatus,
        # user_queryset.aadharStatus,
        # user_queryset.videoVerificationStatus,
        # user_queryset.agreementVerificationStatus
        # ]
        # isIndividual = True
        # try:
        #     if (user_queryset.entityTypeId == None) or (user_queryset.entityTypeId.isIndividual == True):
        #         isIndividual = True
        #     else:
        #         isIndividual = False
        # except Exception as e:
        #     isIndividual = True


        # if isIndividual == False:
        #      kycStatusList.append(user_queryset.businessStatus)
        #      kycStatusList.append(user_queryset.shopVideoStatus)
        #      for each_image_status in user_queryset.shopImagesList:
        #         shopImageStatus = each_image_status.get("shopImageStatus")
        #         kycStatusList.append(shopImageStatus)
        #      for each_document_status in user_queryset.documentsList:
        #         documentStatus = each_document_status.get("documentStatus")
        #         kycStatusList.append(documentStatus)


        # if any(status == "Rejected" for status in kycStatusList):
        #     userDict["kycStatus"] = "Rejected"
        # elif all(status == "Submitted" for status in kycStatusList):
        #     userDict["kycStatus"] = "Submitted"
        # elif all(status == "Pending" for status in kycStatusList):
        #     userDict["kycStatus"] = "Pending"
        # elif any(status == "Pending" for status in kycStatusList):
        #     userDict["kycStatus"] = "Processing"
        # elif all(status == "Approved" for status in kycStatusList):
        #     userDict["kycStatus"] = "Approved"
        # else:
        #     userDict["kycStatus"] = "Submitted"

        try:
            kycStatus = [
            user_kyc_queryset.panStatus,
            user_kyc_queryset.bankStatus,
            user_kyc_queryset.aadharStatus,
            user_kyc_queryset.videoVerificationStatus,
            user_kyc_queryset.agreementVerificationStatus,
            # user_kyc_queryset.companyRegistrationStatus,
            # user_kyc_queryset.moaStatus,
            # user_kyc_queryset.aoaStatus,
            # user_kyc_queryset.companyPanStatus
            ]
            userDict["kycStatus"] = all(status == "Approved" for status in kycStatus)
        except Exception as e:
            userDict["kycStatus"] = False
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return userDict

def fetching_user_details_by_kyc(user_queryset):
    userDict = {}
    try:
        userDict={
        "id":str(user_queryset.userId.id),
        "fullName":user_queryset.userId.fullName,
        "phoneNumber":user_queryset.userId.phoneNumber,
        "email":user_queryset.userId.email,
        "address":user_queryset.userId.address,
        "stateId":str(user_queryset.userId.stateId.id),
        "stateName":user_queryset.userId.stateId.stateName,
        "cityId":str(user_queryset.userId.cityId.id),
        "cityName":user_queryset.userId.cityId.cityName,
        "blockPoId":str(user_queryset.userId.blockPoId.id),
        "blockPoName":user_queryset.userId.blockPoId.name,
        "merchantUniqueNumber":user_queryset.userId.merchantUniqueNumber,
        "enablePayin":user_queryset.userId.enablePayin,
        "enablePayout":user_queryset.userId.enablePayout,
        "merchantType":user_queryset.userId.merchantType,
        "channel":user_queryset.userId.channel,
        "maxPayinLimit":user_queryset.userId.maxPayinLimit,
        "maxPayoutLimit":user_queryset.userId.maxPayoutLimit,
        
        }
        if user_queryset.userId.walletBalance:
            userDict["walletBalance"]=formatINR("{:.2f}".format(float(user_queryset.userId.walletBalance)))
        else:
            userDict["walletBalance"]="0.00"
        if user_queryset.userId.payoutBalance:
            userDict["payoutBalance"]=formatINR("{:.2f}".format(float(user_queryset.userId.payoutBalance)))
        else:
            userDict["payoutBalance"]="0.00"
            
        if user_queryset.userId.commissionBalance:
            userDict["commissionBalance"]=formatINR("{:.2f}".format(float(user_queryset.userId.commissionBalance)))
        else:
            userDict["commissionBalance"]="0.00"

        if user_queryset.userId.capBalance:
            userDict["capBalance"]=formatINR("{:.2f}".format(float(user_queryset.userId.capBalance)))
        else:
            userDict["capBalance"]="0.00"

        if user_queryset.userId.status==0:
            userDict["actionText"] = "Pending"
        else:
            userDict["actionText"] = "Approved"

        if user_queryset.userId.status==3:
            userDict["blockStatus"] = "UnBlock"
        else:
            userDict["blockStatus"] = "Block"

        if user_queryset.userId.status==5:
            userDict["lockStatus"] = "Unlocked"
        else:
            userDict["lockStatus"] = "Locked"

        if user_queryset.userId.createdOn:
            userDict["createdOn"] = user_queryset.userId.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            userDict["createdOn"] = ""
        try:
            if user_queryset.userId.patternId:
                userDict["patternId"]=str(user_queryset.userId.patternId.id)
                userDict["patternName"]=user_queryset.userId.patternId.name
            else:
                userDict["patternId"]=""
                userDict["patternName"]=""
        except Exception as e:
            userDict["patternId"]=""
            userDict["patternName"]=""

        try:
            if user_queryset.userId.parentId:
                userDict["parentId"]=str(user_queryset.userId.parentId.id)
                userDict["parentName"]=user_queryset.userId.parentId.fullName
            else:
                userDict["parentId"]=""
                userDict["parentName"]=""
        except Exception as e:
            userDict["parentId"]=""
            userDict["parentName"]=""

        try:
            if user_queryset.userId.parentId:
                userDict["checkParentId"]=True
            else:
                userDict["checkParentId"]=False
        except Exception as e:
            userDict["checkParentId"]=False

        
        if user_queryset.userId.profilePicture:
            userDict["profilePicture"]=domain+user_queryset.userId.profilePicture
        else:
            userDict["profilePicture"]=""
        
        try:
            if user_queryset.siteTitle:
                userDict["siteTitle"]= user_queryset.siteTitle
            else:
                userDict["siteTitle"]=""
        except Exception as e:
            userDict["siteTitle"]=""

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return userDict


def fetching_service_grouping_details(service_grouping_queryset):
    service_grouping_dict = {}
    try:
        service_grouping_dict={
        "id":str(service_grouping_queryset.id),
        "name":service_grouping_queryset.name,
        "serviceType":"grouping",
        "sorting":service_grouping_queryset.sorting
        }
        if service_grouping_queryset.status==1:
            service_grouping_dict["actionText"] = "Active"
        else:
            service_grouping_dict["actionText"] = "Deactive"

        if service_grouping_queryset.createdOn:
            service_grouping_dict["createdOn"] = service_grouping_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            service_grouping_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return service_grouping_dict


def fetching_category_details(category_queryset):
    category_dict = {}
    try:
        category_dict={
        "id":str(category_queryset.id),
        "categoryName":category_queryset.categoryName,
        "serviceType":"categories",
        "isTpin":category_queryset.isTpin,
        "displayInDashboard":category_queryset.displayInDashboard
        }
        try:
            if category_queryset.serviceGroupingId:
                category_dict["serviceGroupingId"] = str(category_queryset.serviceGroupingId.id)
                category_dict["serviceGroupingName"] = category_queryset.serviceGroupingId.name
            else:
                category_dict["serviceGroupingId"] = ""
                category_dict["serviceGroupingName"] = ""
        except:
            category_dict["serviceGroupingId"] = ""
            category_dict["serviceGroupingName"] = ""
        try:
            if category_queryset.comingsoon:
                category_dict['comingsoon']=category_queryset.comingsoon
            else:
                category_dict['comingsoon']=False
        except Exception as e:
            category_dict['comingsoon']=False
        # try:
        #     if category_queryset.transactionAPIId:
        #         category_dict["transactionAPIId"] = str(category_queryset.transactionAPIId.id)
        #         category_dict["transactionAPIName"] = category_queryset.transactionAPIId.apiName
        #     else:
        #         category_dict["transactionAPIId"] = ""
        #         category_dict["transactionAPIName"] = ""
        # except:
        #     category_dict["transactionAPIId"] = ""
        #     category_dict["transactionAPIName"] = ""

        # if category_queryset.displayInDashboard:
        #     category_dict["displayInDashboard"] = category_queryset.displayInDashboard
        # else:
        #     category_dict["displayInDashboard"] = ""

        if category_queryset.sorting:
            category_dict["sorting"] = category_queryset.sorting
        else:
            category_dict["sorting"] = ""

        if category_queryset.status==1:
            category_dict["actionText"] = "Active"
        else:
            category_dict["actionText"] = "Deactive"

        if category_queryset.image:
            category_dict["image"] = domain+category_queryset.image
        else:
            category_dict["image"] = domain+"/static/assets/images/default_image.png"

        if category_queryset.createdOn:
            category_dict["createdOn"] = category_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            category_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return category_dict


def fetching_service_details(service_queryset):
    service_dict = {}
    try:
        service_dict={
        "id":str(service_queryset.id),
        "serviceName":service_queryset.serviceName,
        "serviceType":service_queryset.serviceType,
        # "walletId":str(service_queryset.walletId.id),
        # "walletName":service_queryset.walletId.walletName,
        # "categoryId":str(service_queryset.categoryId),
        # "categoryName":service_queryset.categoryId.categoryName,
        "code":service_queryset.code,
        "isService":service_queryset.isService,
        "isbbps":service_queryset.isbbps,
        # "serviceType":"service",
        "isOperatorWise":service_queryset.isOperatorWise,
        "displayInDashboard":service_queryset.displayInDashboard,
        }
        try:
            if service_queryset.serviceGroupingId:
                service_dict["serviceGroupingId"] = str(service_queryset.serviceGroupingId.id)
                service_dict["serviceGroupingName"] = service_queryset.serviceGroupingId.name
            else:
                service_dict["serviceGroupingId"] = None
                service_dict["serviceGroupingName"] = ""
        except:
            service_dict["serviceGroupingId"] = None
            service_dict["serviceGroupingName"] = ""

        try:
            if service_queryset.categoryId:
                service_dict["categoryId"] = str(service_queryset.categoryId.id)
                service_dict["categoryName"] = service_queryset.categoryId.categoryName
            else:
                service_dict["categoryId"] = None
                service_dict["categoryName"] = ""
        except:
            service_dict["categoryId"] = None
            service_dict["categoryName"] = ""

        # try:
        #     if service_queryset.transactionAPIId:
        #         service_dict["transactionAPIId"] = str(service_queryset.transactionAPIId.id)
        #         service_dict["transactionAPIName"] = service_queryset.transactionAPIId.apiName
        #     else:
        #         service_dict["transactionAPIId"] = None
        #         service_dict["transactionAPIName"] = ""
        # except:
        #     service_dict["transactionAPIId"] = None
        #     service_dict["transactionAPIName"] = ""

        if service_queryset.sorting:
            service_dict["sorting"] = service_queryset.sorting
        else:
            service_dict["sorting"] = ""

        # if service_queryset.displayInDashboard:
        #     service_dict["displayInDashboard"] = service_queryset.displayInDashboard
        # else:
        #     service_dict["displayInDashboard"] = ""

        if service_queryset.file:
            service_dict["file"] = domain+service_queryset.file
        else:
            service_dict["file"] = ""
        if service_queryset.status==1:
            service_dict["actionText"] = "Active"
        else:
            service_dict["actionText"] = "Deactive"
        if service_queryset.createdOn:
            service_dict["createdOn"] = service_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            service_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return service_dict


def fetching_operator_details(operator_queryset):
    operator_dict = {}
    try:
        operator_dict={
        "id":str(operator_queryset.id),
        "operatorName":operator_queryset.operatorName,
        "serviceId":str(operator_queryset.serviceId.id),
        "serviceName":operator_queryset.serviceId.serviceName,
        "categoryName":operator_queryset.serviceId.categoryId.categoryName,
        "categoryId":str(operator_queryset.serviceId.categoryId.id),
        "allowType":operator_queryset.allowType,
        "taxTypeId":str(operator_queryset.taxTypeId.id),
        "taxTypeName":operator_queryset.taxTypeId.taxTypeName,
        "amountPlans":operator_queryset.amountPlans,
        "rejectedAmount":operator_queryset.rejectedAmount,
        "minLength":operator_queryset.minLength,
        "maxLength":operator_queryset.maxLength,
        "minAmount":operator_queryset.minAmount,
        "maxAmount":operator_queryset.maxAmount,
        "apiCode":operator_queryset.apiCode,
        "status":operator_queryset.status,
        "isBbps":operator_queryset.isBbps,
        "isValidate":operator_queryset.isValidate,
        "isPortial":operator_queryset.isPortial,
        "isRandom":operator_queryset.isRandom,
        "serviceType":"operator",
        "displayInDashboard":operator_queryset.displayInDashboard,
        "payWithoutFetchAllowed":operator_queryset.payWithoutFetchAllowed,
        "hascustomerParamGroups":operator_queryset.hascustomerParamGroups,
        "customerParamGroupsList":operator_queryset.customerParamGroupsList,
        "paymentChannelsAllowedList":operator_queryset.paymentChannelsAllowedList,
        "paymentModesAllowedList":operator_queryset.paymentModesAllowedList,
        "paymentAmountExactness":operator_queryset.paymentAmountExactness,
        }
        try:
            if operator_queryset.serviceGroupingId:
                operator_dict["serviceGroupingId"] = str(operator_queryset.serviceGroupingId.id)
                operator_dict["serviceGroupingName"] = operator_queryset.serviceGroupingId.name
            else:
                operator_dict["serviceGroupingId"] = ""
                operator_dict["serviceGroupingName"] = ""
        except:
            operator_dict["serviceGroupingId"] = ""
            operator_dict["serviceGroupingName"] = ""

        # try:
        #     if operator_queryset.stateId:
        #         operator_dict["stateId"] = str(operator_queryset.stateId.id)
        #         operator_dict["stateName"] = operator_queryset.stateId.stateName
        #     else:
        #         operator_dict["stateId"] = ""
        #         operator_dict["stateName"] = ""
        # except:
        #     operator_dict["stateId"] = ""
        #     operator_dict["stateName"] = ""

        try:
            if operator_queryset.transactionAPIId:
                operator_dict["transactionAPIId"] = str(operator_queryset.transactionAPIId.id)
                operator_dict["transactionAPIName"] = operator_queryset.transactionAPIId.apiName
            else:
                operator_dict["transactionAPIId"] = ""
                operator_dict["transactionAPIName"] = ""
        except:
            operator_dict["transactionAPIId"] = ""
            operator_dict["transactionAPIName"] = ""

        if operator_queryset.apiType:
            operator_dict["apiType"] = operator_queryset.apiType
        else:
            operator_dict["apiType"] = ""

        if operator_queryset.serviceId:
            operator_dict["isTpin"] = operator_queryset.serviceId.categoryId.isTpin
        else:
            operator_dict["isTpin"] = False

        if operator_queryset.sorting:
            operator_dict["sorting"] = operator_queryset.sorting
        else:
            operator_dict["sorting"] = 0

        if operator_queryset.image:
            operator_dict["image"] = domain+operator_queryset.image
        else:
            operator_dict["image"] = ""

        if operator_queryset.status==1:
            operator_dict["actionText"] = "Active"
        else:
            operator_dict["actionText"] = "Deactive"

        if operator_queryset.createdOn:
            operator_dict["createdOn"] = operator_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            operator_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return operator_dict


def fetching_operator_parameter_details(parameter_queryset):
    operator_parameter_dict = {}
    try:
        operator_parameter_dict = {
        "id":str(parameter_queryset.id),
        "parameterName":parameter_queryset.parameterName,
        "displayName":parameter_queryset.displayName,
        "operatorId":str(parameter_queryset.operatorId.id),
        "operatorName":parameter_queryset.operatorId.operatorName,
        "minLength":parameter_queryset.minLength,
        "maxLength":parameter_queryset.maxLength,
        "sort":parameter_queryset.sort,
        # "manualSort":parameter_queryset.manualSort,
        "fieldType":parameter_queryset.fieldType,
        "pattern":parameter_queryset.pattern,
        "serviceType":"operatorParameter",
        "isActive":parameter_queryset.isActive,
        "isMandatory":parameter_queryset.isMandatory,
        "isReferenceKey":parameter_queryset.isReferenceKey,
        "hasGrouping":parameter_queryset.hasGrouping,
        "hasApiCall":parameter_queryset.hasApiCall,
        "hasIncludeApiCall":parameter_queryset.hasIncludeApiCall,
        # "hasSubParameters":parameter_queryset.hasSubParameters,
        }
        if parameter_queryset.apiCall:
            operator_parameter_dict["apiCall"] = parameter_queryset.apiCall
        else:
            operator_parameter_dict["apiCall"] = ""
        if parameter_queryset.hasSubParameters:
            operator_parameter_dict["hasSubParameters"] = parameter_queryset.hasSubParameters
        else:
            operator_parameter_dict["hasSubParameters"] = ""

        if parameter_queryset.apiCode:
            operator_parameter_dict["apiCode"] = parameter_queryset.apiCode
        else:
            operator_parameter_dict["apiCode"] = ""
        try:
            if parameter_queryset.transactionAPIId:
                operator_parameter_dict["transactionAPIId"] = str(parameter_queryset.transactionAPIId.id)
                operator_parameter_dict["transactionAPIName"] = parameter_queryset.transactionAPIId.apiName
            else:
                operator_parameter_dict["transactionAPIId"] = ""
                operator_parameter_dict["transactionAPIName"] = ""
        except:
            operator_parameter_dict["transactionAPIId"] = ""
            operator_parameter_dict["transactionAPIName"] = ""

        if parameter_queryset.status==1:
            operator_parameter_dict["actionText"] = "Active"
        else:
            operator_parameter_dict["actionText"] = "Deactive"
        if parameter_queryset.createdOn:
            operator_parameter_dict["createdOn"] = parameter_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            operator_parameter_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return operator_parameter_dict


def fetching_sub_parameter_details(parameter_queryset):
    operator_parameter_dict = {}
    try:
        operator_parameter_dict = {
        "id":str(parameter_queryset.id),
        "parameterName":parameter_queryset.parameterName,
        "displayName":parameter_queryset.displayName,
        "minLength":parameter_queryset.minLength,
        "maxLength":parameter_queryset.maxLength,
        "sort":parameter_queryset.sort,
        "fieldType":parameter_queryset.fieldType,
        "pattern":parameter_queryset.pattern,
        "serviceType":"operatorParameter",
        "isActive":parameter_queryset.isActive,
        "isMandatory":parameter_queryset.isMandatory,
        "isReferenceKey":parameter_queryset.isReferenceKey,
        "hasGrouping":parameter_queryset.hasGrouping,
        "hasApiCall":parameter_queryset.hasApiCall,
        "hasIncludeApiCall":parameter_queryset.hasIncludeApiCall,
        }
        try:
            if parameter_queryset.operatorParameterId:
                operator_parameter_dict["operatorParameterId"] = str(parameter_queryset.operatorParameterId.id)
                operator_parameter_dict["parentParameterName"] = parameter_queryset.operatorParameterId.parameterName
            else:
                operator_parameter_dict["operatorParameterId"] = ""
                operator_parameter_dict["parentParameterName"] = ""
        except:
            operator_parameter_dict["operatorParameterId"] = ""
            operator_parameter_dict["parentParameterName"] = ""

        try:
            if parameter_queryset.operatorGroupingId:
                operator_parameter_dict["operatorGroupingId"] = str(parameter_queryset.operatorGroupingId.id)
                operator_parameter_dict["groupingName"] = parameter_queryset.operatorGroupingId.groupName
            else:
                operator_parameter_dict["operatorGroupingId"] = ""
                operator_parameter_dict["groupingName"] = ""
        except:
            operator_parameter_dict["operatorGroupingId"] = ""
            operator_parameter_dict["groupingName"] = ""

        try:
            if parameter_queryset.operatorId:
                operator_parameter_dict["operatorId"] = str(parameter_queryset.operatorId.id)
                operator_parameter_dict["operatorName"] = parameter_queryset.operatorId.operatorName
            else:
                operator_parameter_dict["operatorId"] = ""
                operator_parameter_dict["operatorName"] = ""
        except:
            operator_parameter_dict["operatorId"] = ""
            operator_parameter_dict["operatorName"] = ""

        if parameter_queryset.apiCall:
            operator_parameter_dict["apiCall"] = parameter_queryset.apiCall
        else:
            operator_parameter_dict["apiCall"] = ""

        if parameter_queryset.apiCode:
            operator_parameter_dict["apiCode"] = parameter_queryset.apiCode
        else:
            operator_parameter_dict["apiCode"] = ""
        try:
            if parameter_queryset.transactionAPIId:
                operator_parameter_dict["transactionAPIId"] = str(parameter_queryset.transactionAPIId.id)
                operator_parameter_dict["transactionAPIName"] = parameter_queryset.transactionAPIId.apiName
            else:
                operator_parameter_dict["transactionAPIId"] = ""
                operator_parameter_dict["transactionAPIName"] = ""
        except:
            operator_parameter_dict["transactionAPIId"] = ""
            operator_parameter_dict["transactionAPIName"] = ""

        if parameter_queryset.status==1:
            operator_parameter_dict["actionText"] = "Active"
        else:
            operator_parameter_dict["actionText"] = "Deactive"
        if parameter_queryset.createdOn:
            operator_parameter_dict["createdOn"] = parameter_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            operator_parameter_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return operator_parameter_dict


def fetching_has_grouping_operator_parameter_details():
    activeOperatorParametersList=[]
    operator_parameters_queryset = OperatorParameter.objects(
        hasGrouping=True,
        status__in=[0,1]
        ).order_by('-id')
    try:
        for each_parameter in operator_parameters_queryset:
            operator_parameter_dict = {
            "id":str(each_parameter.id),
            "parameterName":each_parameter.parameterName,
            }
            activeOperatorParametersList.append(operator_parameter_dict)

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return activeOperatorParametersList


def fetching_has_sub_operator_parameter_details():
    hasSubOperatorParametersList=[]
    operator_parameters_queryset = OperatorParameter.objects(
        hasGrouping=True,
        hasSubParameters=True,
        status__in=[0,1]
        ).order_by('-id')
    try:
        for each_parameter in operator_parameters_queryset:
            operator_parameter_dict = {
            "id":str(each_parameter.id),
            "parameterName":each_parameter.parameterName,
            "displayName":each_parameter.displayName,
            }
            hasSubOperatorParametersList.append(operator_parameter_dict)

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return hasSubOperatorParametersList


# fetching_operator_based_parameter_details
def fetching_operator_based_parameter_details(parameter_queryset):
    operator_parameter_dict = {}
    try:
        operator_parameter_dict = {
        "id":str(parameter_queryset.id),
        "parameterName":parameter_queryset.parameterName,
        "displayName":parameter_queryset.displayName,
        "operatorId":str(parameter_queryset.operatorId.id),
        "operatorName":parameter_queryset.operatorId.operatorName,
        "minLength":parameter_queryset.minLength,
        "maxLength":parameter_queryset.maxLength,
        "sort":parameter_queryset.sort,
        # "manualSort":parameter_queryset.manualSort,
        "fieldType":parameter_queryset.fieldType,
        "pattern":parameter_queryset.pattern,
        "serviceType":"operatorParameter",
        "isActive":parameter_queryset.isActive,
        "isMandatory":parameter_queryset.isMandatory,
        "isReferenceKey":parameter_queryset.isReferenceKey,
        "hasGrouping":parameter_queryset.hasGrouping,
        "hasApiCall":parameter_queryset.hasApiCall,
        "hasIncludeApiCall":parameter_queryset.hasIncludeApiCall,
        }
        if parameter_queryset.apiCall:
            operator_parameter_dict["apiCall"] = parameter_queryset.apiCall
        else:
            operator_parameter_dict["apiCall"] = ""
        if parameter_queryset.operatorId:
            operator_parameter_dict["apiCode"] = parameter_queryset.operatorId.apiCode
        else:
            operator_parameter_dict["apiCode"] = False
        try:
            if parameter_queryset.transactionAPIId:
                operator_parameter_dict["transactionAPIId"] = str(parameter_queryset.transactionAPIId.id)
                operator_parameter_dict["transactionAPIName"] = parameter_queryset.transactionAPIId.apiName
            else:
                operator_parameter_dict["transactionAPIId"] = ""
                operator_parameter_dict["transactionAPIName"] = ""
        except:
            operator_parameter_dict["transactionAPIId"] = ""
            operator_parameter_dict["transactionAPIName"] = ""

        if parameter_queryset.status==1:
            operator_parameter_dict["actionText"] = "Active"
        else:
            operator_parameter_dict["actionText"] = "Deactive"
        if parameter_queryset.createdOn:
            operator_parameter_dict["createdOn"] = parameter_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            operator_parameter_dict["createdOn"] = ""

        operatorGroupingsList = []
        if parameter_queryset.hasGrouping:
            operator_grouping_queryset = OperatorGrouping.objects(
                operatorParameterId=str(parameter_queryset.id),
                status__in=[1]
                ).order_by('-id').all()
            for each_operator_grouping in operator_grouping_queryset:
                operator_grouping_data = {
                "id":str(each_operator_grouping.id),
                "groupName":each_operator_grouping.groupName,
                "value":each_operator_grouping.value,
                }
                operatorGroupingsList.append(operator_grouping_data)
        operator_parameter_dict["operatorGroupingsList"] = operatorGroupingsList
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return operator_parameter_dict




def fetching_operator_based_sub_parameter_details(sub_parameter_queryset):
    sub_parameter_dict = {}
    try:
        sub_parameter_dict = {
        "id":str(sub_parameter_queryset.id),
        "parameterName":sub_parameter_queryset.parameterName,
        "displayName":sub_parameter_queryset.displayName,
        "operatorId":str(sub_parameter_queryset.operatorId.id),
        "operatorName":sub_parameter_queryset.operatorId.operatorName,
        }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return sub_parameter_dict


def fetching_grouping_based_sub_parameter_details(sub_arameter_queryset):
    sub_parameter_dict = {}
    try:
        sub_parameter_dict = {
        "id":str(sub_arameter_queryset.id),
        "operatorParameterId":str(sub_arameter_queryset.operatorParameterId.id),
        "operatorGroupingId":str(sub_arameter_queryset.operatorGroupingId.id),
        "parentParameterName":sub_arameter_queryset.operatorParameterId.parameterName,
        "groupingName":sub_arameter_queryset.operatorGroupingId.groupName,
        "parameterName":sub_arameter_queryset.parameterName,
        "displayName":sub_arameter_queryset.displayName,
        "operatorId":str(sub_arameter_queryset.operatorId.id),
        "operatorName":sub_arameter_queryset.operatorId.operatorName,
        "minLength":sub_arameter_queryset.minLength,
        "maxLength":sub_arameter_queryset.maxLength,
        "sort":sub_arameter_queryset.sort,
        "fieldType":sub_arameter_queryset.fieldType,
        "pattern":sub_arameter_queryset.pattern,
        "serviceType":"operatorParameter",
        "isActive":sub_arameter_queryset.isActive,
        "isMandatory":sub_arameter_queryset.isMandatory,
        "isReferenceKey":sub_arameter_queryset.isReferenceKey,
        "hasGrouping":sub_arameter_queryset.hasGrouping,
        "hasApiCall":sub_arameter_queryset.hasApiCall,
        "hasIncludeApiCall":sub_arameter_queryset.hasIncludeApiCall,
        }
        if sub_arameter_queryset.apiCall:
            sub_parameter_dict["apiCall"] = sub_arameter_queryset.apiCall
        else:
            sub_parameter_dict["apiCall"] = ""

        if sub_arameter_queryset.apiCode:
            sub_parameter_dict["apiCode"] = sub_arameter_queryset.apiCode
        else:
            sub_parameter_dict["apiCode"] = ""
        try:
            if sub_arameter_queryset.transactionAPIId:
                sub_parameter_dict["transactionAPIId"] = str(sub_arameter_queryset.transactionAPIId.id)
                sub_parameter_dict["transactionAPIName"] = sub_arameter_queryset.transactionAPIId.apiName
            else:
                sub_parameter_dict["transactionAPIId"] = ""
                sub_parameter_dict["transactionAPIName"] = ""
        except:
            sub_parameter_dict["transactionAPIId"] = ""
            sub_parameter_dict["transactionAPIName"] = ""

        if sub_arameter_queryset.status==1:
            sub_parameter_dict["actionText"] = "Active"
        else:
            sub_parameter_dict["actionText"] = "Deactive"
        if sub_arameter_queryset.createdOn:
            sub_parameter_dict["createdOn"] = sub_arameter_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            sub_parameter_dict["createdOn"] = ""


        subGroupingsList = []
        if sub_arameter_queryset.hasGrouping:
            sub_grouping_queryset = SubParameterGrouping.objects(
                operatorParameterId=str(parameter_queryset.id),
                status__in=[1]
                ).order_by('-id').all()
            for each_sub_grouping in sub_grouping_queryset:
                sub_grouping_data = {
                "id":str(each_sub_grouping.id),
                "groupName":each_sub_grouping.groupName,
                "value":each_sub_grouping.value,
                }
                subGroupingsList.append(sub_grouping_data)
        sub_parameter_dict["subGroupingsList"] = subGroupingsList

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return sub_parameter_dict


def fetching_user_type_details(user_type_queryset):
    userTypeDict = {}
    try:
        userTypeDict={
        "id":str(user_type_queryset.id),
        "userType":user_type_queryset.userType,
        "code":user_type_queryset.code,
        "description":user_type_queryset.description,
        "rank":user_type_queryset.rank,
        "isAllow":user_type_queryset.isAllow,
        "isCommission":user_type_queryset.isCommission,
        "isSuperDistributor":user_type_queryset.isSuperDistributor,
        "isUser":user_type_queryset.isUser
        }
        try:
            if user_type_queryset.userPermissionId:
                userTypeDict["userPermissionId"] = str(user_type_queryset.userPermissionId.id)
                userTypeDict["name"] = user_type_queryset.userPermissionId.permissionName
            else:
                userTypeDict["userPermissionId"] = ""
                userTypeDict["name"] = ""
        except:
            userTypeDict["userPermissionId"] = ""
            userTypeDict["name"] = ""

        if user_type_queryset.status==1:
            userTypeDict["actionText"] = "Active"
        else:
            userTypeDict["actionText"] = "Deactive"
        if user_type_queryset.createdOn:
            userTypeDict["createdOn"] = user_type_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            userTypeDict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return userTypeDict

def fetching_sub_payment_mode_details(sub_payment_mode_queryset):
    sub_payment_mode_dict = {}
    try:
        sub_payment_mode_dict={
        "id":str(sub_payment_mode_queryset.id),
        "paymentModeId":str(sub_payment_mode_queryset.paymentModeId.id),
        "paymentMode":sub_payment_mode_queryset.paymentModeId.paymentMode,
        "subPaymentModeType":sub_payment_mode_queryset.subPaymentModeType,
        "minAmount":sub_payment_mode_queryset.minAmount,
        "maxAmount":sub_payment_mode_queryset.maxAmount,
        "priority":sub_payment_mode_queryset.priority
        }
        if sub_payment_mode_queryset.status==1:
            sub_payment_mode_dict["actionText"] = "Active"
        else:
            sub_payment_mode_dict["actionText"] = "Deactive"
        if sub_payment_mode_queryset.createdOn:
            sub_payment_mode_dict["createdOn"] = sub_payment_mode_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            sub_payment_mode_dict["createdOn"] = ""

        if sub_payment_mode_queryset.image:
            sub_payment_mode_dict["image"] = domain+sub_payment_mode_queryset.image
        else:
            sub_payment_mode_dict["image"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return sub_payment_mode_dict

def fetching_config_payment_gateway_details(config_payment_gateway_queryset):
    config_payment_gateway_dict = {}
    try:
        config_payment_gateway_dict={
        "id":str(config_payment_gateway_queryset.id),
        "chargeType":config_payment_gateway_queryset.chargeType,
        "chargeValue":config_payment_gateway_queryset.chargeValue
        }
        if config_payment_gateway_queryset.status==1:
            config_payment_gateway_dict["actionText"] = "Active"
        else:
            config_payment_gateway_dict["actionText"] = "Deactive"
        if config_payment_gateway_queryset.createdOn:
            config_payment_gateway_dict["createdOn"] = config_payment_gateway_queryset.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            config_payment_gateway_dict["createdOn"] = ""

        if config_payment_gateway_queryset.subPaymentModeId:
            config_payment_gateway_dict["subPaymentModeId"] = str(config_payment_gateway_queryset.subPaymentModeId.id)
            config_payment_gateway_dict["subPaymentModeType"] = config_payment_gateway_queryset.subPaymentModeId.subPaymentModeType
        else:
            config_payment_gateway_dict["subPaymentModeId"] = ""
            config_payment_gateway_dict["subPaymentModeType"] = ""

        if config_payment_gateway_queryset.transactionAPIId:
            config_payment_gateway_dict["transactionAPIId"] = str(config_payment_gateway_queryset.transactionAPIId.id)
            config_payment_gateway_dict["transactionAPIName"] = config_payment_gateway_queryset.transactionAPIId.apiName
        else:
            config_payment_gateway_dict["transactionAPIId"] = ""
            config_payment_gateway_dict["transactionAPIName"] = ""

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return config_payment_gateway_dict


def fetching_payment_mode_details(payment_mode_queryset):
    payment_mode_dict = {}
    try:
        payment_mode_dict={
        "id":str(payment_mode_queryset.id),
        "walletType":payment_mode_queryset.walletType,
        "hasGroup":payment_mode_queryset.hasGroup,
        "groupType":payment_mode_queryset.groupType,
        "paymentMode":payment_mode_queryset.paymentMode,
        "priority":payment_mode_queryset.priority

        }
        if payment_mode_queryset.status==1:
            payment_mode_dict["actionText"] = "Active"
        else:
            payment_mode_dict["actionText"] = "Deactive"
        if payment_mode_queryset.createdOn:
            payment_mode_dict["createdOn"] = payment_mode_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            payment_mode_dict["createdOn"] = ""

        if payment_mode_queryset.image:
            payment_mode_dict["image"] = domain+payment_mode_queryset.image
        else:
            payment_mode_dict["image"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payment_mode_dict


def fetching_merchant_category_details(category_queryset):
    merchant_category_dict = {}
    try:
        merchant_category_dict={
        "id":str(category_queryset.id),
        "name":category_queryset.name,
        "isUserWise":category_queryset.isUserWise,
        "categoryCode":category_queryset.categoryCode
        }
        if category_queryset.status==1:
            merchant_category_dict["actionText"] = "Active"
        else:
            merchant_category_dict["actionText"] = "Deactive"

        if category_queryset.createdOn:
            merchant_category_dict["createdOn"] = category_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            category_queryset["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return merchant_category_dict


def fetching_sub_merchant_category_details(category_queryset):
    sub_merchant_category_dict = {}
    try:
        sub_merchant_category_dict={
        "id":str(category_queryset.id),
        "name":category_queryset.name,
        "categoryId":str(category_queryset.categoryId.id),
        "categoryName":category_queryset.categoryId.name,
        "categoryCode":category_queryset.categoryId.categoryCode
        }
        if category_queryset.status==1:
            sub_merchant_category_dict["actionText"] = "Active"
        else:
            sub_merchant_category_dict["actionText"] = "Deactive"

        if category_queryset.createdOn:
            sub_merchant_category_dict["createdOn"] = category_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            category_queryset["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return sub_merchant_category_dict

def user_required(f):
    @wraps(f)
    def get_user(*args, **kwargs):
        data_status = {"responseStatus": 0, "result": ""}
        userId = request.json.get("userId", None)
        if not userId and userId != "":
            userId = request.json.get("userId",'')
        if not userId:
            data_status["result"] = "Required fields missing!!"
            return data_status
        try:
            Users.objects.get(id=userId, status__in=[0,1])
            return f(*args, **kwargs)
        except Users.DoesNotExist as e:
            data_status["result"] = "Invalid merchant id!!"
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Invalid merchant id!!"
            return data_status
    return get_user

today = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)

def validate_date_format(date_text):
    try:
        if date_text != datetime.datetime.strptime(date_text, "%m-%d-%Y %H:%M:%S").strftime("%m-%d-%Y %H:%M:%S"):
            raise ValueError
        return True
    except ValueError:
        return False

def mask_account_number(account_number):
    masked_number = ""
    try:
        # Convert account number to string in case it's not already
        account_number = str(account_number)
        # Mask all but the last 4 digits
        masked_number = "x" * (len(account_number) - 4) + account_number[-4:]
        return masked_number
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return masked_number

# def generate_next_serial_number():
#     merchantUniqueNumber = ""
#     try:
#         # Fetch the first user from the Users collection
#         merchant_queryset = Users.objects().first()
        
#         if merchant_queryset and merchant_queryset.merchantUniqueNumber:
#             # Extract the numerical part from the existing merchantUniqueNumber
#             last_number = int(merchant_queryset.merchantUniqueNumber[1:])
#             # Increment the number by 1
#             next_number = last_number + 1
#             # Generate the next serial number with padding zeros and prefix "M"
#             merchantUniqueNumber = f"M{next_number:08}"
#         else:
#             # If no existing merchant found, start with "M00000001"
#             merchantUniqueNumber = "M000000001"

#         return merchantUniqueNumber

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


def generate_next_serial_number():
    merchantUniqueNumber = ""
    try:
        # Fetch the first user from the Users collection
        merchant_counts = Users.objects().count()
        if merchant_counts:
            merchant_count_number = merchant_counts+1
            merchantUniqueNumber=check_mid_unique(merchant_count_number)
        else:
            # If no existing merchant found, start with "M00000001"
            merchantUniqueNumber = "M000000001"

        return merchantUniqueNumber

    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False

def check_mid_unique(merchant_count_number):
    merchantUniqueNumber =f"M{merchant_count_number:08}"
    user_queryset = Users.objects(merchantUniqueNumber=merchantUniqueNumber).first()
    if user_queryset:
        merchant_count_number = merchant_count_number+1
        merchantUniqueNumber=check_mid_unique(merchant_count_number)
    else:
        merchant_count_number = merchant_count_number
        merchantUniqueNumber =f"M{merchant_count_number:08}"
    return merchantUniqueNumber


def check_mid_apikey(f):
    @wraps(f)
    def get_mid_apikey(*args, **kwargs):
        data_status = {"responseStatus": 0, "result": ""}
        merchant_id = request.headers.get("Merchant-Id", None)
        api_key = request.headers.get("Api-Key", None)
        if merchant_id and api_key:
            try:
                merchant_queryset=Users.objects.get(merchantUniqueNumber=merchant_id, status__in=[1])

                userId = str(merchant_queryset.id)

                api_security_queryset = ApiSecurities.objects.get(apiKey=api_key,apiType="payment_gateway",userId=userId,status__in=[1])
                return f(*args, **kwargs)
            except Users.DoesNotExist as e:
                data_status["result"] = "Invalid merchant id!!"
                return data_status
            except ApiSecurities.DoesNotExist as e:
                data_status["result"] = "Invalid api id!!"
                return data_status
            except Exception as e:
                app.logger.error(traceback.format_exc())
                data_status["result"] = "Invalid merchant id!!"
                return data_status
        else: 
            data_status["result"] = "Required fields are missing!!!!"
            return data_status
    return get_mid_apikey


def encrypt(encryption_data, encryption_key):
    encryptDict = {}
    try:
        # Convert the dictionary to a JSON string
        # raw = json.dumps(encryption_data)

        if isinstance(encryption_data, dict):
            raw = json.dumps(encryption_data)
        else:
            raw = json.dumps(encryption_data.get_json())
        
        # Generate a random initialization vector (IV)
        iv = get_random_bytes(AES.block_size)
        
        # Create a new AES cipher object in CBC mode
        cipher = AES.new(encryption_key, AES.MODE_CBC, iv)
        
        # Pad the plaintext to be a multiple of the block size
        padded_data = pad(raw.encode(), AES.block_size)
        
        # Encrypt the padded plaintext
        encrypted_data = cipher.encrypt(padded_data)
        
        # Encode the IV and encrypted data with base64
        encryptDict = {
            "combinedEncryption":base64.b64encode(iv+encrypted_data).decode('utf-8'),
            "iv": base64.b64encode(iv).decode('utf-8'),
            "encryption_data": base64.b64encode(encrypted_data).decode('utf-8')
        }
        return encryptDict
    except Exception as e:
        print(traceback.format_exc())
        return encryptDict

        
def decrypt(decryption_data, decrypt_key,iv):
    try:
        enc = base64.b64decode(decryption_data)
        iv = base64.b64decode(iv)
        cipher = AES.new(decrypt_key, AES.MODE_CBC, iv)
        return _unpad(cipher.decrypt(enc)).decode('utf-8')
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False

def _unpad(s):
    return s[:-ord(s[len(s)-1:])]

def Sha512Hash(requstDataDict,salt):
    try:
        myKeys = list(requstDataDict.keys())
        myKeys.sort()
        sorted_dict = {i: requstDataDict[i] for i in myKeys}

        hashdata = salt
        for key, value in sorted_dict.items():
            if value != "":
                hashdata += '|' + str(value).strip()

        hashed = hashlib.sha512(hashdata.encode('utf-8')).hexdigest()
        return hashed.upper()
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False

def chechSha512Hash(requstDataDict,salt):
    try:
        hashValue = requstDataDict.get("hash")
        if hashValue == "":
            return True
        else:
            requstDataDict.pop("hash",None)

            responseHash = Sha512Hash(requstDataDict,salt)
            if responseHash == hashValue:
                return True
            else:
                return False
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False

def accurepay_payout_request_data_response(userId,transactionAPIId,client_ip,platformType,api_key,salt,accurePayOutLiveURL,pgOrderId,amount,paymentMode,beneficiaryName,accountNumber,accountIFSCCode,bank_name,merchant_reference_number):
    responseData = {}
    try:
        responseData = {
        'api_key': api_key,
        'merchant_reference_number': merchant_reference_number,
        'amount': amount,
        'transfer_type': paymentMode,
        'account_name': beneficiaryName,
        'account_number': accountNumber,
        'ifsc_code': accountIFSCCode,
        'bank_name': bank_name
        }
        hashvalue = Sha512Hash(responseData,salt)
        responseData.update({"hash": hashvalue})
        url = accurePayOutLiveURL+"/fundtransfer"
        headers = {'Content-type': 'application/json'}
        response = requests.post(url, json=responseData, headers=headers)
        # API Logs Table Saving Here
        requestData=[responseData]
        save_api_log_table = save_api_logs_data(userId,"payout","fund_transfer",url,transactionAPIId,requestData,client_ip,platformType)
        responseData = [response.json()]
        save_api_log_table.update(responseData=responseData,responseDate=datetime.datetime.now())
        return response.json()
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return responseData

def formatINR(number):
    try:
        s, *d = str(number).partition(".")
        r = ",".join([s[x-2:x] for x in range(-3, -len(s), -2)][::-1] + [s[-3:]])
        return "".join([r] + d)
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return number

app.jinja_env.filters['formatINR'] = formatINR

def fetching_payouts_details(each_payout):
    payoutDict = {}
    try:
        payoutDict = {
        "id":str(each_payout.id),
        "userId":str(each_payout.userId.id),
        "userName":each_payout.userId.fullName,
        # "bankId":str(each_payout.bankId.id),
        # "bankName":each_payout.bankId.bankName,
        "fundTransferType":each_payout.fundTransferType,
        "accountType":each_payout.accountType,
        "accountNumber":mask_account_number(each_payout.accountNumber),
        "fullAccountNumber":each_payout.accountNumber,
        "accountIFSCCode":each_payout.accountIFSCCode,
        "beneficiaryName":each_payout.beneficiaryName,
        # "uniqueRequestNumber":each_payout.uniqueRequestNumber,
        "previousBalance":formatINR("{:.2f}".format(float(each_payout.previousBalance))),
        "currentBalance":formatINR("{:.2f}".format(float(each_payout.currentBalance))),
        # "amount":"{:,.2f}".format(float(each_payout.amount)),
        "amount":formatINR("{:.2f}".format(float(each_payout.amount))),
        "grandTotal":formatINR("{:.2f}".format(float(each_payout.grandTotal))),
        "paymentMode":each_payout.paymentMode,
        "beneficiaryMail":each_payout.beneficiaryMail,
        "beneficiaryPhone":each_payout.beneficiaryPhone,
        "bankReferenceNumber":each_payout.bankReferenceNumber,
        "narration":each_payout.narration,
        "merchantReferenceNumber":each_payout.merchantReferenceNumber,
        "bankBranch":each_payout.bankBranch,
        "transferType":each_payout.transferType,
        "transactionUniqueId":each_payout.transactionUniqueId,
        "status":each_payout.status,
        "bankResponseStatus":each_payout.bankResponseStatus,
        "errorMessage":each_payout.errorMessage,
        "pgOrderId":each_payout.pgOrderId,
        "createdOn":each_payout.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        }
        if each_payout.transactionAPIId:
            payoutDict["transactionAPIId"]=str(each_payout.transactionAPIId.id)
            payoutDict["transactionAPIName"]=each_payout.transactionAPIId.apiName
        else:
            payoutDict["transactionAPIId"]=""
            payoutDict["transactionAPIName"]=""

        if each_payout.responseCallBackTime:
            payoutDict["responseCallBackTime"]=each_payout.responseCallBackTime.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            payoutDict["responseCallBackTime"]=""
        if each_payout.commissionCharges == {}:
            commissionCharges = {
            "aggregatorType" : "",
            "aggregatorAmount" : 0.0,
            "commissionType" : "",
            "commissionAmount" : 0.0,
            "chargeType" : "",
            "chargeAmount" : 0.0,
            "transactionAmount" : 0.0,
            "gstInclude" : "",
            "gstAmount" : 0.0,
            "tdsInclude" : "",
            "tdsAmount" : 0.0,
            "priceType" : ""
            }
            payoutDict["commissionCharges"]=commissionCharges
        else:
            aggregatorAmount=0.00
            commissionAmount=0.00
            chargeAmount=0.00
            transactionAmount=0.00
            gstAmount=0.00
            tdsAmount=0.00
            if each_payout.commissionCharges.get("aggregatorAmount")!="":
                aggregatorAmount=each_payout.commissionCharges.get("aggregatorAmount")

            if each_payout.commissionCharges.get("commissionAmount")!="":
                commissionAmount=each_payout.commissionCharges.get("commissionAmount")

            if each_payout.commissionCharges.get("chargeAmount")!="":
                chargeAmount=each_payout.commissionCharges.get("chargeAmount")

            if each_payout.commissionCharges.get("transactionAmount")!="":
                transactionAmount=each_payout.commissionCharges.get("transactionAmount")
            if each_payout.commissionCharges.get("gstAmount")!="":
                gstAmount=each_payout.commissionCharges.get("gstAmount")
            if each_payout.commissionCharges.get("tdsAmount")!="":
                tdsAmount=each_payout.commissionCharges.get("tdsAmount")
                
            commissionCharges = {
            "aggregatorType" : each_payout.commissionCharges.get("aggregatorType"),
            "aggregatorAmount" : round(float(aggregatorAmount),2),
            "commissionType" : each_payout.commissionCharges.get("commissionType"),
            "commissionAmount" : round(float(commissionAmount),2),
            "chargeType" : each_payout.commissionCharges.get("chargeType"),
            "chargeAmount" : round(float(chargeAmount),2),
            "transactionAmount" : round(float(transactionAmount),2),
            "gstInclude" : each_payout.commissionCharges.get("gstInclude"),
            "gstAmount" : round(float(gstAmount),2),
            "tdsInclude" : each_payout.commissionCharges.get("tdsInclude"),
            "tdsAmount" : round(float(tdsAmount),2),
            "priceType" : each_payout.commissionCharges.get("priceType")
            }
            payoutDict["commissionCharges"]=commissionCharges

        if each_payout.commissionCharges:
            payoutDict["chargeAmount"]=formatINR("{:.2f}".format(float(each_payout.commissionCharges.get("chargeAmount"))))
            payoutDict["gstAmount"]=formatINR("{:.2f}".format(float(each_payout.commissionCharges.get("gstAmount"))))
            payoutDict["tdsAmount"]=formatINR("{:.2f}".format(float(each_payout.commissionCharges.get("tdsAmount"))))
        
        else:
            payoutDict["chargeAmount"]=0.00
            payoutDict["gstAmount"]=0.00
            payoutDict["tdsAmount"]=0.00
            payoutDict["aggregatorAmount"]=0.00
            payoutDict["transactionAmount"]=0.00

        if each_payout.uniqueRequestNumber == None:
            payoutDict["uniqueRequestNumber"]="-"
        else:
            payoutDict["uniqueRequestNumber"]=each_payout.uniqueRequestNumber

        if each_payout.transferType=="Credit" or each_payout.transferType=="Refund":
            payoutDict["creditAmount"]=each_payout.grandTotal
        elif each_payout.transferType=="Debit":
            payoutDict["debitAmount"]=each_payout.grandTotal
            
        if each_payout.status == 1:
            payoutDict["transactionStatus"]="Success"
        elif each_payout.status == 2:
            payoutDict["transactionStatus"]="Processing"
        elif each_payout.status == 4:
            payoutDict["transactionStatus"]="Reversal"
        elif each_payout.status == 5:
            payoutDict["transactionStatus"]="Refund"
        else:
            payoutDict["transactionStatus"]="Failed"

        if each_payout.bankResponseStatus == 1:
            payoutDict["bankResponseStatus"]="Success"
        elif each_payout.bankResponseStatus == 2:
            payoutDict["bankResponseStatus"]="Processing"
        elif each_payout.bankResponseStatus == 4:
            payoutDict["bankResponseStatus"]="Reversal"
        elif each_payout.bankResponseStatus == 5:
            payoutDict["bankResponseStatus"]="Refund"
        else:
            payoutDict["bankResponseStatus"]="Failed"

        if each_payout.transferType == "Refund":
            payoutDict["transferType"] = "Credit"
        try:
            if each_payout.slabId:
                payoutDict["slabId"]=str(each_payout.slabId.id)
                payoutDict["slabName"]=each_payout.slabId.slabName
            else:
                payoutDict["slabId"]=""
                payoutDict["slabName"]=""
        except Exception as e:
            payoutDict["slabId"]=""
            payoutDict["slabName"]=""
        try:
            if each_payout.siteTitle:
                payoutDict["siteTitle"]= each_payout.siteTitle
            else:
                payoutDict["siteTitle"]=""
        except Exception as e:
            payoutDict["siteTitle"]=""
        
        if each_payout.transferType == "Refund":
            payoutDict["transferType"] = "Credit"

            
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payoutDict

def validate_pan(panNumber):
    try:
        """
        Validate Indian PAN number.
        
        Parameters:
        panNumber (str): PAN number to validate
        
        Returns:
        bool: True if PAN is valid, False otherwise
        """
        pattern = r'^[A-Z]{5}[0-9]{4}[A-Z]$'
        if re.match(pattern, panNumber):
            return True
        else:
            return False
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return False
    

def fetching_transaction_api_details(each_transaction_api):
    transaction_api_dict = {}
    try:
        transaction_api_dict={
        "id":str(each_transaction_api.id),
        "apiName":each_transaction_api.apiName,
        "perdayTransactionLimit":each_transaction_api.perdayTransactionLimit,
        "code":each_transaction_api.code,
        "subCode":each_transaction_api.subCode,
        "virtualCode":each_transaction_api.virtualCode,
        "ifscCode":each_transaction_api.ifscCode,
        "transactionType":each_transaction_api.transactionType,
        "isActive":each_transaction_api.isActive,
        "isUserWise":each_transaction_api.isUserWise,
        "lastSixDigits":each_transaction_api.lastSixDigits,
        "autoSettlement":each_transaction_api.autoSettlement,
        "settlementLimit":each_transaction_api.settlementLimit,
        "cardBinEnable":each_transaction_api.cardBinEnable,
        "preAuthorization":each_transaction_api.preAuthorization,
        "isSeamless":each_transaction_api.isSeamless,
        "priceType":each_transaction_api.priceType,
        }
        if each_transaction_api.paramsList:
            transaction_api_dict["paramsList"] = each_transaction_api.paramsList
        else:
            transaction_api_dict["paramsList"] = ""

        if each_transaction_api.status==1:
            transaction_api_dict["actionText"] = "Active"
        else:
            transaction_api_dict["actionText"] = "Deactive"

        if each_transaction_api.createdOn:
            transaction_api_dict["createdOn"] = each_transaction_api.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            transaction_api_dict["createdOn"] = ""
        try:
            if each_transaction_api.siteTitle:
                transaction_api_dict["siteTitle"]= each_transaction_api.siteTitle
            else:
                transaction_api_dict["siteTitle"]=""
        except Exception as e:
            transaction_api_dict["siteTitle"]=""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return transaction_api_dict

# # Test the function
# pan_number = "ABCDE1234F"
# if validate_pan(pan_number):
#     print(f"{pan_number} is a valid PAN number.")
# else:
#     print(f"{pan_number} is not a valid PAN number.")

def fetching_payin_details(each_pay_in):
    payInDict = {}
    try:
        payInDict = {
        "transactionId":each_pay_in.transactionId,
        "orderId":each_pay_in.orderId,
        "pgOrderId":each_pay_in.pgOrderId,
        "creditType":each_pay_in.creditType,
        "comment":each_pay_in.comment,
        "amount":formatINR("{:.2f}".format(float(each_pay_in.amount))),
        "grandTotal":formatINR("{:.2f}".format(float(each_pay_in.grandTotal))),
        "createdOn":each_pay_in.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
        "id":str(each_pay_in.id),
        "payinStatus":each_pay_in.status,
        "platform":each_pay_in.platform,
        "cardType":each_pay_in.cardType,
        "cardmasked":str(each_pay_in.cardmasked),
        "paymentGatewayId":str(each_pay_in.paymentGatewayId.id),
        "apiName":each_pay_in.paymentGatewayId.apiName,
        "productName": each_pay_in.productName
        }
        try:
            payInDict["userId"]=str(each_pay_in.userId.id)
            payInDict["merchantName"]=each_pay_in.userId.fullName
            payInDict["merchantEmail"]=each_pay_in.userId.email
        except Exception as e:
            payInDict["userId"]=""
            payInDict["merchantName"]=""
            payInDict["merchantEmail"]=""

        if each_pay_in.responseCallBackTime:
            payInDict["responseCallBackTime"]=each_pay_in.responseCallBackTime.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            payInDict["responseCallBackTime"]=""
        if each_pay_in.previousBalance:
            payInDict["openingBalance"]=formatINR("{:.2f}".format(float(each_pay_in.previousBalance)))
            payInDict["previousBalance"]=formatINR("{:.2f}".format(float(each_pay_in.previousBalance)))
        else:
            payInDict["openingBalance"]= "0.00"
            payInDict["previousBalance"]= "0.00"

        if each_pay_in.currentBalance:
            payInDict["closingBalance"]=formatINR("{:.2f}".format(float(each_pay_in.currentBalance)))
            payInDict["currentBalance"]=formatINR("{:.2f}".format(float(each_pay_in.currentBalance)))
        else:
            payInDict["closingBalance"]= "0.00"
            payInDict["currentBalance"]= "0.00"

        if each_pay_in.bankRefId:
            payInDict["bankRefId"]=each_pay_in.bankRefId
        else:
            payInDict["bankRefId"]= ""

        if each_pay_in.remarks:
            payInDict["remarks"]=each_pay_in.remarks
        else:
            payInDict["remarks"]= ""

        if each_pay_in.errorMessage:
            payInDict["errorMessage"]=each_pay_in.errorMessage
        else:
            payInDict["errorMessage"]= ""

        if each_pay_in.customerVpa:
            payInDict["customerVpa"]=each_pay_in.customerVpa
        else:
            payInDict["customerVpa"]= ""

        if each_pay_in.paymentType:
            payInDict["paymentType"]=each_pay_in.paymentType
        else:
            payInDict["paymentType"]= ""

        if each_pay_in.creditType=="Credit" :
            payInDict["creditAmount"]=each_pay_in.grandTotal
        elif each_pay_in.creditType=="Debit":
            payInDict["debitAmount"]=each_pay_in.grandTotal

        if each_pay_in.commissionCharges == {}:
            commissionCharges = {
            "aggregatorType" : "",
            "aggregatorAmount" : 0.0,
            "commissionType" : "",
            "commissionAmount" : 0.0,
            "chargeType" : "",
            "chargeAmount" : 0.0,
            "transactionAmount" : 0.0,
            "gstInclude" : "",
            "gstAmount" : 0.0,
            "tdsInclude" : "",
            "tdsAmount" : 0.0,
            "priceType" : "",
            }
            payInDict["chargeAmount"]=0.00
            payInDict["gstAmount"]=0.00
            payInDict["tdsAmount"]=0.00
            payInDict["commissionCharges"]=commissionCharges
        else:
            try:
                payInDict["chargeAmount"]=formatINR("{:.2f}".format(float(each_pay_in.commissionCharges.get("chargeAmount"))))
                payInDict["gstAmount"]=formatINR("{:.2f}".format(float(each_pay_in.commissionCharges.get("gstAmount"))))
                payInDict["tdsAmount"]=formatINR("{:.2f}".format(float(each_pay_in.commissionCharges.get("tdsAmount"))))
            except Exception as e:
                payInDict["chargeAmount"]=0.00
                payInDict["gstAmount"]=0.00
                payInDict["tdsAmount"]=0.00
            payInDict["commissionCharges"]=each_pay_in.commissionCharges

        if each_pay_in.customerName == None:
            payInDict["customerName"]=""
        else:
            payInDict["customerName"]=each_pay_in.customerName

        if each_pay_in.customerEmail == None:
            payInDict["customerEmail"]=""
        else:
            payInDict["customerEmail"]=each_pay_in.customerEmail

        if each_pay_in.customerPhonenumber == None:
            payInDict["customerPhonenumber"]=""
        else:
            payInDict["customerPhonenumber"]=each_pay_in.customerPhonenumber

        if each_pay_in.status == 1:
            payInDict["status"]="Success"
        elif each_pay_in.status == 2:
            payInDict["status"]="Processing"
        elif each_pay_in.status == 3:
            payInDict["status"]="Initiated"
        elif each_pay_in.status == 4:
            payInDict["status"]="Reversal"
        elif each_pay_in.status == 5:
            payInDict["status"]="Refund"
        else:
            payInDict["status"]="Failed"
        try:
            if each_pay_in.paymentGatewayId:
                payInDict["paymentGatewayId"]=str(each_pay_in.paymentGatewayId.id)
                payInDict["paymentGatewayName"]=each_pay_in.paymentGatewayId.apiName
            else:
                payInDict["paymentGatewayId"]=""
                payInDict["paymentGatewayName"]=""
        except Exception as e:
            payInDict["paymentGatewayId"]=""
            payInDict["paymentGatewayName"]=""
        try:
            if each_pay_in.slabId:
                payInDict["slabId"]=str(each_pay_in.slabId.id)
                payInDict["slabName"]=each_pay_in.slabId.slabName
            else:
                payInDict["slabId"]=""
                payInDict["slabName"]=""
        except Exception as e:
            payInDict["slabId"]=""
            payInDict["slabName"]=""
        try:
            if each_pay_in.siteTitle:
                payInDict["siteTitle"]= each_pay_in.siteTitle
            else:
                payInDict["siteTitle"]=""
        except Exception as e:
            payInDict["siteTitle"]=""
        try:
            if each_pay_in.transactionData:
                payInDict["mode"] = each_pay_in.transactionData.mode
                payInDict["card_type"] = each_pay_in.transactionData.mode.card_type
            else:
                payInDict["mode"] = ""
                payInDict["card_type"] = ""

        except Exception as e:
            payInDict["mode"] = ""
            payInDict["card_type"] = ""
    

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payInDict




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

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

#             if fund_transfer_queryset.pgOrderId:
#                 pgOrderId = fund_transfer_queryset.pgOrderId
#             else:
#                 pgOrderId = fund_transfer_queryset.merchantReferenceNumber

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

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

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

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

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

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

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

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

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

#                 pgCheckStatusResponseDict = payaid_payout_fundtransfer_check_status(get_api_key,pgOrderId,get_salt,get_base_url)

#             else:
#                 responseBody["error"]="Unable to connect to the server!!"
#                 return responseBody

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

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

#                         # updatepayout_balance_queryset = PayoutBalances.objects(userId=str(userquery_set.id),transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id)).first()
#                         # refundpreviousBalance=updatepayout_balance_queryset.currentBalance
#                         # refundpayoutCurrentBalance=float(refundpreviousBalance)+float(fund_transfer_queryset.grandTotal)
#                         # updatepayout_balance_queryset.update(previousBalance=round(float(refundpreviousBalance),2),currentBalance=round(float(refundpayoutCurrentBalance),2),updatedOn=datetime.datetime.now())
#                         balanceResult=user_payout_balance_update(str(fund_transfer_queryset.userId.id),float(fund_transfer_queryset.grandTotal),"Credit",str(fund_transfer_queryset.transactionAPIId.id))
#                         if balanceResult.get('responseStatus')==0:
#                             responseBody["error"]="Unable to connect to the server!!"
#                             return responseBody

#                         # updatepayout_balance_queryset = PayoutBalances.objects(userId=str(fund_transfer_queryset.userId.id),transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id)).modify(inc__currentBalance=float(fund_transfer_queryset.grandTotal),new=True)
#                         # refundpayoutCurrentBalance=updatepayout_balance_queryset.currentBalance
#                         # refundpreviousBalance=float(refundpayoutCurrentBalance)-float(fund_transfer_queryset.grandTotal)
#                         # updatepayout_balance_queryset.update(previousBalance=round(float(refundpreviousBalance),2),updatedOn=datetime.datetime.now())
                        
#                         # userquery_set = Users.objects(id=str(fund_transfer_queryset.userId.id)).modify(inc__payoutBalance=float(fund_transfer_queryset.grandTotal),new=True)
#                         # usercurrentbalance = userquery_set.payoutBalance
#                         # userpreviousbalance = float(usercurrentbalance)-float(fund_transfer_queryset.grandTotal)


#                         # userquery_set=Users.objects(id=str(fund_transfer_queryset.userId.id)).first()
#                         # userpreviousbalance=userquery_set.payoutBalance
#                         # usercurrentbalance=round(float(userpreviousbalance),2)+round(float(fund_transfer_queryset.grandTotal))
#                         # userquery_set.update(payoutBalance=round(float(usercurrentbalance)))
#                         merchantReferenceNumber=str(random_digit_generate(16))
#                         if fund_transfer_queryset.slabId:
#                             slabId = str(fund_transfer_queryset.slabId.id)
#                         else:
#                             slabId = None
                            
#                         fund_transfer_table = FundTransfers(
#                             userId=str(fund_transfer_queryset.userId.id),
#                             transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id),
#                             bankId=None,
#                             transactionUniqueId=str(merchant_reference_number),
#                             bankName=str(fund_transfer_queryset.bankName),
#                             merchantReferenceNumber=str(merchantReferenceNumber),
#                             fundTransferId=str(fund_transfer_queryset.id),
#                             pgOrderId='',
#                             fundTransferType="instant",
#                             accountType="bank",
#                             apiType="api",
#                             slabId=slabId,
#                             transferType="Refund",
#                             bankBranch=str(fund_transfer_queryset.bankBranch),
#                             accountNumber=str(fund_transfer_queryset.accountNumber),
#                             accountIFSCCode=str(fund_transfer_queryset.accountIFSCCode),
#                             beneficiaryName=str(fund_transfer_queryset.beneficiaryName),
#                             uniqueRequestNumber=str(fund_transfer_queryset.beneficiaryName),
#                             amount=round(float(fund_transfer_queryset.amount),2),
#                             grandTotal=round(float(fund_transfer_queryset.grandTotal),2),
#                             beneficiaryMail=str(fund_transfer_queryset.beneficiaryMail),
#                             beneficiaryPhone=str(fund_transfer_queryset.beneficiaryPhone),
#                             paymentMode=str(fund_transfer_queryset.paymentMode),
#                             narration=str(fund_transfer_queryset.narration),
#                             commissionCharges=fund_transfer_queryset.commissionCharges,
#                             transactionData=paymentgatewayResponseStatusDict.get("transactionData"),
#                             currentBalance=round(float(balanceResult.get('userCurrentBalance')),2),
#                             previousBalance=round(float(balanceResult.get('userPreviousBalance')),2),
#                             createdOn=datetime.datetime.now(),
#                             statusCount = int(previousStatusCount)+1,
#                             errorMessage="Refunded",
#                             status=5
#                             )
#                         save_table = fund_transfer_table.save()
                        
                        
#                         payoutbalancelog_queryset=PayoutBalanceLogs(
#                             userId =str(userquery_set.id),
#                             transactionAPIId =str(fund_transfer_queryset.transactionAPIId.id),
#                             previousBalance = round(float(balanceResult.get('transactionPreviousBalance')),2),
#                             currentBalance = round(float(balanceResult.get('transactionCurrentBalance')),2),
#                             amount=round(float(fund_transfer_queryset.amount),2),
#                             grandTotal=round(float(fund_transfer_queryset.grandTotal),2),
#                             orderId=fund_transfer_queryset.merchantReferenceNumber,
#                             transferType = "Refund",
#                             userType = "user",
#                             transactionId = paymentgatewayResponseStatusDict.get("transaction_id"),
#                             createdOn = datetime.datetime.now(),
#                             status = 1
#                             ).save()

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

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

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

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

def fetching_virtual_account_details(virtual_account_queryset):
    virtualAccountDict = {}
    try:
        virtualAccountDict = {
        "id":str(virtual_account_queryset.id),
        "createdOn":virtual_account_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
        "status":virtual_account_queryset.status,
        "remark":virtual_account_queryset.remark,
        "virtualPaymentAddress":virtual_account_queryset.virtualPaymentAddress,
        "virtualAccountNumber":virtual_account_queryset.virtualAccountNumber,
        "ifscCode":virtual_account_queryset.ifscCode
        }
        try:
            if virtual_account_queryset.gatewayId:
                virtualAccountDict["gatewayId"]=str(virtual_account_queryset.gatewayId.id)
                virtualAccountDict["gatewayName"]=virtual_account_queryset.gatewayId.apiName
                virtualAccountDict["virtualCode"]=virtual_account_queryset.gatewayId.virtualCode
            else:
                virtualAccountDict["gatewayId"]=""
                virtualAccountDict["gatewayName"]=""
                virtualAccountDict["ifscCode"]=""
                virtualAccountDict["virtualCode"]=""
        except Exception as e:
            virtualAccountDict["gatewayId"]=""
            virtualAccountDict["gatewayName"]=""
            virtualAccountDict["ifscCode"]=""
            virtualAccountDict["virtualCode"]=""
        try:
            if virtual_account_queryset.isThirdParty:
                virtualAccountDict["isThirdParty"]=str(virtual_account_queryset.isThirdParty)
            else:
                virtualAccountDict["isThirdParty"]=False
        except Exception as e:
            virtualAccountDict["isThirdParty"]=False

        if virtual_account_queryset.status == 1:
            virtualAccountDict["actionText"]="Active"
        else:
            virtualAccountDict["actionText"]="Deactive"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return virtualAccountDict

def fetching_assigned_virtual_account_details(virtual_account_queryset):
    virtualAccountDict = {}
    try:
        virtualAccountDict = {
        "id":str(virtual_account_queryset.id),
        "createdOn":virtual_account_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
        "status":virtual_account_queryset.status,
        }
        try:
            if virtual_account_queryset.virtualAccountId:
                virtualAccountDict["virtualAccountId"]=str(virtual_account_queryset.virtualAccountId.id)
                virtualAccountDict["virtualAccountNumber"]=virtual_account_queryset.virtualAccountId.virtualAccountNumber
                virtualAccountDict["ifscCode"]=virtual_account_queryset.virtualAccountId.ifscCode
            else:
                virtualAccountDict["virtualAccountId"]=""
                virtualAccountDict["virtualAccountNumber"]=""
                virtualAccountDict["ifscCode"]=""
        except Exception as e:
            virtualAccountDict["virtualAccountId"]=""
            virtualAccountDict["virtualAccountNumber"]=""
            virtualAccountDict["ifscCode"]=""
        try:
            if virtual_account_queryset.userId and virtual_account_queryset.isThirdParty==False:
                virtualAccountDict["userId"]=str(virtual_account_queryset.userId.id)
                virtualAccountDict["fullName"]=virtual_account_queryset.userId.fullName
                virtualAccountDict["merchantUniqueNumber"]=virtual_account_queryset.userId.merchantUniqueNumber
            elif virtual_account_queryset.thirdpartyUserId and virtual_account_queryset.isThirdParty==True:
                virtualAccountDict["userId"]=str(virtual_account_queryset.thirdpartyUserId.id)
                virtualAccountDict["fullName"]=virtual_account_queryset.thirdpartyUserId.name
                virtualAccountDict["merchantUniqueNumber"]=virtual_account_queryset.thirdpartyUserId.apiKey
            else:
                virtualAccountDict["userId"]=""
                virtualAccountDict["fullName"]=""
                virtualAccountDict["merchantUniqueNumber"]=""
        except Exception as e:
            virtualAccountDict["userId"]=""
            virtualAccountDict["fullName"]=""
            virtualAccountDict["merchantUniqueNumber"]=""

        if virtual_account_queryset.status == 1:
            virtualAccountDict["actionText"]="Active"
        else:
            virtualAccountDict["actionText"]="Deactive"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return virtualAccountDict

def fetching_white_list_account_details(white_list_account_queryset):
    whiteListAccountDict = {}
    try:
        whiteListAccountDict = {
        "id":str(white_list_account_queryset.id),
        "virtualAccountId":str(white_list_account_queryset.virtualAccountId.id),
        "virtualAccountNumber":white_list_account_queryset.virtualAccountId.virtualAccountNumber,
        "userId":str(white_list_account_queryset.userId.id),
        "userName":white_list_account_queryset.userId.fullName,
        "merchantMobileNumber":white_list_account_queryset.userId.phoneNumber,
        "createdOn":white_list_account_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
        "whiteListAccountNumber":white_list_account_queryset.whiteListAccountNumber,
        "ifscCode":white_list_account_queryset.ifscCode,
        "status":white_list_account_queryset.status,
        "bankName":white_list_account_queryset.bankName,
        "bankDocumentName":white_list_account_queryset.bankDocumentName,
        "bankBranch":white_list_account_queryset.bankBranch
        }
        if white_list_account_queryset.document:
            whiteListAccountDict["document"]=domain+white_list_account_queryset.document
        else:
            whiteListAccountDict["document"]=""
        if white_list_account_queryset.status == 1:
            whiteListAccountDict["actionText"]="Verified"
        else:
            whiteListAccountDict["actionText"]="Pending"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return whiteListAccountDict


def fetching_credit_notifications_details(each_cred_notify):
    creditNotifyDict = {}
    try:
        creditNotifyDict = {
        "id":str(each_cred_notify.id),
        "ecollectAccoutNo":each_cred_notify.ecollectAccoutNo,
        "remitterName":each_cred_notify.remitterName,
        "remitterAccountNumber":each_cred_notify.remitterAccountNumber,
        "transactionUniqueId":each_cred_notify.transactionUniqueId,
        "transferType":each_cred_notify.transferType,
        "responseStatus":each_cred_notify.responseStatus,
        "transactionAmount":"{:.2f}".format(float(each_cred_notify.transactionAmount)),
        "createdOn":each_cred_notify.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
        "transactionDate":each_cred_notify.transactionDate.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
        }
        try:
            if each_cred_notify.userId:
                creditNotifyDict["userId"]=str(each_cred_notify.userId.id)
                creditNotifyDict["userName"]=each_cred_notify.userId.fullName
                creditNotifyDict["merchantMobileNumber"]=each_cred_notify.userId.phoneNumber
            else:
                creditNotifyDict["userId"]="" 
                creditNotifyDict["userName"]="" 
                creditNotifyDict["merchantMobileNumber"]="" 
        except Exception as e:
            creditNotifyDict["userId"]="" 
            creditNotifyDict["userName"]="" 
            creditNotifyDict["merchantMobileNumber"]=""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return creditNotifyDict


def fetching_payment_link_details(payment_link_queryset):
    paymentLinkDict = {}
    try:
        paymentLinkDict = {
        "id":str(payment_link_queryset.id),
        "userId":str(payment_link_queryset.userId.id),
        "userName":payment_link_queryset.userId.fullName,
        "createdOn":payment_link_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
        "email":payment_link_queryset.email,
        "mobileNumber":payment_link_queryset.mobileNumber,
        # "status":payment_link_queryset.status,
        "linkStatus":payment_link_queryset.linkStatus,
        "linkExpDate":payment_link_queryset.linkExpDate.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
        "paymentPurpose":payment_link_queryset.paymentPurpose,
        "paymentLink":payment_link_queryset.paymentLink,
        "amount":"{:.2f}".format(float(payment_link_queryset.amount))
        }
        if payment_link_queryset.paymentLink:
            paymentLinkDict["dynamicPaymentLink"]=PAYMENT_LINK_BASE_URL+payment_link_queryset.paymentLink
        else:
            paymentLinkDict["dynamicPaymentLink"]=""
        if payment_link_queryset.status == 0:
            paymentLinkDict["status"]="Deactive"
        elif payment_link_queryset.status == 1:
            paymentLinkDict["status"]="Active"
        elif payment_link_queryset.status == 3:
            paymentLinkDict["status"]="Expired"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return paymentLinkDict


def fetching_payment_button_details(payment_button_queryset):
    paymenButtonDict = {}
    try:
        paymenButtonDict = {
        "id":str(payment_button_queryset.id),
        "userId":str(payment_button_queryset.userId.id),
        "userName":payment_button_queryset.userId.fullName,
        "createdOn":payment_button_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
        "status":payment_button_queryset.status,
        "email":payment_button_queryset.email,
        "mobileNumber":payment_button_queryset.mobileNumber,
        "textColour":payment_button_queryset.textColour,
        "buttonColour":payment_button_queryset.buttonColour,
        "buttonLinkExpDate":payment_button_queryset.buttonLinkExpDate.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
        "buttonPurpose":payment_button_queryset.buttonPurpose,
        "buttonName":payment_button_queryset.buttonName,
        "buttonLink":payment_button_queryset.buttonLink,
        "amount":"{:.2f}".format(float(payment_button_queryset.amount))
        }
        if payment_button_queryset.status == 1:
            paymenButtonDict["actionText"]="Active"
        elif payment_button_queryset.status == 3:
            paymenButtonDict["actionText"] = "Expired"
        else:
            paymenButtonDict["actionText"]="Deactive"
        if payment_button_queryset.buttonLink:
            paymenButtonDict["dynamicPaymentButtonLink"]=PAYMENT_LINK_BASE_URL+payment_button_queryset.buttonLink
        else:
            paymenButtonDict["dynamicPaymentButtonLink"]=""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return paymenButtonDict

def fetching_api_document_guide_details(api_docs_guide_queryset):
    apiDocumentGuideDict = {}
    try:
        apiDocumentGuideDict = {
        "id":str(api_docs_guide_queryset.id),
        "title":api_docs_guide_queryset.title,
        "description":api_docs_guide_queryset.description,
        "priority":api_docs_guide_queryset.priority,
        "status":api_docs_guide_queryset.status,
        "createdOn":api_docs_guide_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        }
        if api_docs_guide_queryset.status == 1:
            apiDocumentGuideDict["actionText"]="Active"
        else:
            apiDocumentGuideDict["actionText"]="Deactive"
        imagesList = []
        if api_docs_guide_queryset.multipleImages:
            for each_image in api_docs_guide_queryset.multipleImages:
                # imageDict = {
                # "image":domain+each_image
                # }
                imagesList.append(domain+each_image)
        apiDocumentGuideDict["multipleImages"]=imagesList
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return apiDocumentGuideDict

def fetching_master_ifsc_bank_details(master_ifsc_queryset):
    master_ifsc_bank_dict = {}
    try:
        master_ifsc_bank_dict={

        "id":str(master_ifsc_queryset.id),
        "bankName":master_ifsc_queryset.bankName,
        "bankCode":master_ifsc_queryset.bankCode,
        "ifscCode":master_ifsc_queryset.ifscCode,
        "priority":master_ifsc_queryset.priority
        }
        if master_ifsc_queryset.status==1:
            master_ifsc_bank_dict["actionText"] = "Active"
        else:
            master_ifsc_bank_dict["actionText"] = "Deactive"

        if master_ifsc_queryset.createdOn:
            master_ifsc_bank_dict["createdOn"] = master_ifsc_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            master_ifsc_queryset["createdOn"] = ""
            
        if master_ifsc_queryset.image:
            master_ifsc_queryset["image"] = domain+master_ifsc_queryset.image
        else:
            master_ifsc_queryset["image"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return master_ifsc_bank_dict

def generate_checksum(data, key):
    checksum = ""
    try:
        # Ensure the key is 16 bytes (AES-128)
        if len(key) > 16:
            key = key[:16]
        elif len(key) < 16:
            key = key.ljust(16, '\0')
        
        # Create AES cipher
        cipher = AES.new(key.encode('utf-8'), AES.MODE_ECB)
        
        # Pad the data to be multiple of 16 bytes
        padded_data = pad(data.encode('utf-8'), AES.block_size)
        
        # Encrypt the data
        encrypted_data = cipher.encrypt(padded_data)
        
        # Generate checksum by taking SHA-256 hash of the encrypted data
        checksum = hashlib.sha256(encrypted_data).hexdigest()
        
        return checksum
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return checksum


def fetching_payout_download_reports(each_report):
    downloadReportDict = {}
    try:
        downloadReportDict = {
        "id":str(each_report.id),
        "reportType":each_report.reportType,
        "dateRange":each_report.dateRange.replace("_"," "),
        "createdOn":each_report.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y"),
        "startDate":each_report.startDate.astimezone(ist_timezone).strftime("%d-%m-%Y"),
        "endDate":each_report.endDate.astimezone(ist_timezone).strftime("%d-%m-%Y"),
        "status":each_report.status,
        "walletType": each_report.walletType
        }
        try:   
            if each_report.userId:
                downloadReportDict["userId"]=each_report.userId.id
                downloadReportDict["userName"]=each_report.userId.fullName
            else:
                downloadReportDict["userId"]=""
                downloadReportDict["userName"]=""
        except Exception as e:
                downloadReportDict["userId"]=""
                downloadReportDict["userName"]=""

        if each_report.status == 1:
            downloadReportDict["actionText"]="Approved"
        elif each_report.status == 2:
            downloadReportDict["actionText"]="Generated"
        else:
            downloadReportDict["actionText"]="Pending"

        if each_report.generatedOn:
            downloadReportDict["generatedOn"]=each_report.generatedOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            downloadReportDict["generatedOn"]=""

        if each_report.fileSize:
            downloadFileSize = int(each_report.fileSize)
        else:
            downloadFileSize = 0

        if downloadFileSize > 1024:
            file_size_kb = downloadFileSize / 1024
            if file_size_kb > 1024:
                file_size_mb = file_size_kb / 1024
                fileSize = str(round(file_size_mb, 2)) + " MB"
            else:
                fileSize = str(round(file_size_kb, 2)) + " KB"
        else:
            if each_report.fileSize == None:
                fileSize = str(0) + " B"
            else:
                fileSize = str(each_report.fileSize) + " B"

        downloadReportDict["fileSize"] = fileSize

        if each_report.downloadFile:
            downloadReportDict["downloadFile"] = domain+each_report.downloadFile
        else:
            downloadReportDict["downloadFile"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return downloadReportDict


def fetching_payout_admin_download_reports(each_report):
    downloadReportDict = {}
    try:
        downloadReportDict = {
        "id":str(each_report.id),
        "userId":str(each_report.userId.id),
        "userName":each_report.userId.fullName,
        "reportType":each_report.reportType,
        "dateRange":each_report.dateRange.replace("_"," "),
        "createdOn":each_report.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y"),
        "startDate":each_report.startDate.astimezone(ist_timezone).strftime("%d-%m-%Y"),
        "endDate":each_report.endDate.astimezone(ist_timezone).strftime("%d-%m-%Y"),
        "status":each_report.status,
        "walletType": each_report.walletType
        }
        if each_report.status == 1:
            downloadReportDict["actionText"]="Approved"
        elif each_report.status == 2:
            downloadReportDict["actionText"]="Generated"
        else:
            downloadReportDict["actionText"]="Pending"

        if each_report.generatedOn:
            downloadReportDict["generatedOn"]=each_report.generatedOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            downloadReportDict["generatedOn"]=""

        if each_report.downloadFile:
            downloadReportDict["downloadFile"]=domain+each_report.downloadFile
        else:
            downloadReportDict["downloadFile"]=""

        if each_report.fileSize:
            downloadFileSize = int(each_report.fileSize)
        else:
            downloadFileSize = 0

        if downloadFileSize > 1024:
            file_size_kb = downloadFileSize / 1024
            if file_size_kb > 1024:
                file_size_mb = file_size_kb / 1024
                fileSize = str(round(file_size_mb, 2)) + " MB"
            else:
                fileSize = str(round(file_size_kb, 2)) + " KB"
        else:
            if each_report.fileSize == None:
                fileSize = str(0) + " B"
            else:
                fileSize = str(each_report.fileSize) + " B"

        downloadReportDict["fileSize"] = fileSize

        if each_report.downloadFile:
            downloadReportDict["downloadFile"] = domain+each_report.downloadFile
        else:
            downloadReportDict["downloadFile"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return downloadReportDict


def fetching_payout_csv_download_reports(each_payout_report):
    payoutReportDict = {}
    try:
        if each_payout_report.accountNumber:
            payoutReportDict["Account Number"] = mask_account_number(each_payout_report.accountNumber)
        else:
            payoutReportDict["Account Number"] = ""

        if each_payout_report.accountIFSCCode:
            payoutReportDict["Account IFSCCode"] = each_payout_report.accountIFSCCode
        else:
            payoutReportDict["Account IFSCCode"] = ""

        if each_payout_report.beneficiaryName:
            payoutReportDict["Beneficiary Name"] = each_payout_report.beneficiaryName
        else:
            payoutReportDict["Beneficiary Name"] = ""

        if each_payout_report.beneficiaryPhone:
            payoutReportDict["Beneficiary Phone"] = each_payout_report.beneficiaryPhone
        else:
            payoutReportDict["Beneficiary Phone"] = ""

        if each_payout_report.amount:
            payoutReportDict["Amount"] = "{:.2f}".format(float(each_payout_report.amount))
        else:
            payoutReportDict["Amount"] = ""

        if each_payout_report.grandTotal:
            payoutReportDict["Grand Total"] = "{:.2f}".format(float(each_payout_report.grandTotal))
        else:
            payoutReportDict["Grand Total"] = ""


        if each_payout_report.status == 5 and each_payout_report.transactionUniqueId != None:
            payout_queryset = FundTransfers.objects(merchantReferenceNumber=each_payout_report.transactionUniqueId,status__nin=[5]).first()
            try:
                if payout_queryset.merchantReferenceNumber:
                    payoutReportDict["Order Id"] = "#"+str(payout_queryset.merchantReferenceNumber)
                else:
                    payoutReportDict["Order Id"] = "#"+str(each_payout_report.merchantReferenceNumber)
            except Exception as e:
                payoutReportDict["Order Id"] = "#"+str(each_payout_report.merchantReferenceNumber)

            try:
                if payout_queryset.transactionUniqueId:
                    payoutReportDict["Transaction UniqueId"] = "#"+str(payout_queryset.transactionUniqueId)
                else:
                    payoutReportDict["Transaction UniqueId"] = "#"+str(each_payout_report.transactionUniqueId)
            except Exception as e:
                payoutReportDict["Transaction UniqueId"] = "#"+str(each_payout_report.transactionUniqueId)
        else:
            if each_payout_report.merchantReferenceNumber:
                payoutReportDict["Order Id"] ="#"+ str(each_payout_report.merchantReferenceNumber)
            else:
                payoutReportDict["Order Id"] = ""

            if each_payout_report.transactionUniqueId:
                payoutReportDict["Transaction UniqueId"] = "#"+str(each_payout_report.transactionUniqueId)
            else:
                payoutReportDict["Transaction UniqueId"] = ""

        if each_payout_report.paymentMode:
            payoutReportDict["Payment Mode"] = each_payout_report.paymentMode
        else:
            payoutReportDict["Payment Mode"] = ""

        if each_payout_report.narration:
            payoutReportDict["Comment"] = each_payout_report.narration
        else:
            payoutReportDict["Comment"] = ""

        if each_payout_report.errorMessage:
            payoutReportDict["Remark"] = each_payout_report.errorMessage
        else:
            payoutReportDict["Remark"] = ""

        if each_payout_report.bankReferenceNumber:
            payoutReportDict["Bank RefId"] = each_payout_report.bankReferenceNumber
        else:
            payoutReportDict["Bank RefId"] = ""

        if each_payout_report.userType:
            payoutReportDict["User Type"] = each_payout_report.userType
        else:
            payoutReportDict["User Type"] = "user"

        if each_payout_report.transferType:
            payoutReportDict["Transfer Type"] = each_payout_report.transferType
        else:
            payoutReportDict["Transfer Type"] = ""

        if each_payout_report.bankBranch:
            payoutReportDict["Bank Branch"] = each_payout_report.bankBranch
        else:
            payoutReportDict["Bank Branch"] = ""

        try:
            if each_payout_report.bankId:
                payoutReportDict["Bank Name"] = each_payout_report.bankId.bankName
            else:
                payoutReportDict["Bank Name"] = each_payout_report.bankName
        except Exception as e:
            payoutReportDict["Bank Name"] = each_payout_report.bankName

        if each_payout_report.createdOn:
            payoutReportDict["Txn Date"] = each_payout_report.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            payoutReportDict["Txn Date"] = ""

        try:
            totalChargeAmount = 0
            chargeAmount = each_payout_report.commissionCharges.get("chargeAmount","0")
            gstAmount = each_payout_report.commissionCharges.get("gstAmount","0")
            tdsAmount = each_payout_report.commissionCharges.get("tdsAmount","0")

            totalChargeAmount = float(chargeAmount)+float(gstAmount)+float(tdsAmount)
            if totalChargeAmount:
                payoutReportDict["Charge Amount"] = "{:.2f}".format(float(totalChargeAmount))
            else:
                payoutReportDict["Charge Amount"] = "0"
        except Exception as e:
            payoutReportDict["Charge Amount"] = "0"

        if each_payout_report.status == 1:
            payoutReportDict["Transaction Status"]="Success"
        elif each_payout_report.status == 2:
            payoutReportDict["Transaction Status"]="Processing"
        elif each_payout_report.status == 4:
            payoutReportDict["Transaction Status"]="Reversal"
        elif each_payout_report.status == 5:
            payoutReportDict["Transaction Status"]="Refund"
        else:
            payoutReportDict["Transaction Status"]="Failed"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payoutReportDict



def fetching_auto_collect_csv_download_reports(each_autocollect_report):
    autocollectReportDict = {}
    try:
        if each_autocollect_report.remitter_account_number:
            autocollectReportDict["Account Number"] = mask_account_number(each_autocollect_report.remitter_account_number)
        else:
            autocollectReportDict["Account Number"] = ""

        if each_autocollect_report.remitter_ifsc_code:
            autocollectReportDict["Account IFSCCode"] = each_autocollect_report.remitter_ifsc_code
        else:
            autocollectReportDict["Account IFSCCode"] = ""

        if each_autocollect_report.remitter_name:
            autocollectReportDict["Beneficiary Name"] = each_autocollect_report.remitter_name
        else:
            autocollectReportDict["Beneficiary Name"] = ""

        if each_autocollect_report.transactionAmount:
            autocollectReportDict["Amount"] = "{:.2f}".format(float(each_autocollect_report.transactionAmount))
        else:
            autocollectReportDict["Amount"] = ""

        if each_autocollect_report.ecollect_account_no:
            autocollectReportDict["Virtual Account Number"] = each_autocollect_report.ecollect_account_no
        else:
            autocollectReportDict["Virtual Account Number"] = ""

        if each_autocollect_report.remitter_note:
            autocollectReportDict["Comment"] = each_autocollect_report.remitter_note
        else:
            autocollectReportDict["Comment"] = ""

        if each_autocollect_report.transactionUniqueId:
            autocollectReportDict["Transaction UniqueId"] = "#"+each_autocollect_report.transactionUniqueId
        else:
            autocollectReportDict["Transaction UniqueId"] = ""

        if each_autocollect_report.transferType:
            autocollectReportDict["Transfer Type"] = each_autocollect_report.transferType
        else:
            autocollectReportDict["Transfer Type"] = ""

        if each_autocollect_report.createdOn:
            autocollectReportDict["Txn Date"] = each_autocollect_report.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            autocollectReportDict["Txn Date"] = ""

        if each_autocollect_report.responseStatus:
            autocollectReportDict["Response Status"]=each_autocollect_report.responseStatus
        else:
            autocollectReportDict["Response Status"]="Failed"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return autocollectReportDict

def fetching_payin_csv_download_reports(each_payin_report):
    payinCSVReportDict = {}
    try:
        if each_payin_report.customerName:
            payinCSVReportDict["Customer Name"] = each_payin_report.customerName
        else:
            payinCSVReportDict["Customer Name"] = ""

        if each_payin_report.customerEmail:
            payinCSVReportDict["Customer Email"] = each_payin_report.customerEmail
        else:
            payinCSVReportDict["Customer Email"] = ""

        if each_payin_report.customerPhonenumber:
            payinCSVReportDict["Customer Mobile Number"] = each_payin_report.customerPhonenumber
        else:
            payinCSVReportDict["Customer Mobile Number"] = ""

        if each_payin_report.amount:
            payinCSVReportDict["Amount"] = "{:.2f}".format(float(each_payin_report.amount))
        else:
            payinCSVReportDict["Amount"] = ""

        if each_payin_report.grandTotal:
            payinCSVReportDict["Grand Total"] = "{:.2f}".format(float(each_payin_report.grandTotal))
        else:
            payinCSVReportDict["Grand Total"] = ""

        if each_payin_report.orderId:
            payinCSVReportDict["Order Id"] = "#"+each_payin_report.orderId
        else:
            payinCSVReportDict["Order Id"] = ""

        if each_payin_report.comment:
            payinCSVReportDict["Comment"] = each_payin_report.comment
        else:
            payinCSVReportDict["Comment"] = ""

        if each_payin_report.transactionId:
            payinCSVReportDict["Transaction UniqueId"] ="#"+ each_payin_report.transactionId
        else:
            payinCSVReportDict["Transaction UniqueId"] = ""

        if each_payin_report.remarks:
            payinCSVReportDict["Remarks"] = each_payin_report.remarks
        else:
            payinCSVReportDict["Remarks"] = ""

        if each_payin_report.paymentType:
            payinCSVReportDict["Payment Type"] = each_payin_report.paymentType
        else:
            payinCSVReportDict["Payment Type"] = ""

        if each_payin_report.bankRefId:
            payinCSVReportDict["Bank RefId"] = each_payin_report.bankRefId
        else:
            payinCSVReportDict["Bank RefId"] = ""

        if each_payin_report.customerVpa:
            payinCSVReportDict["Customer Account"] = each_payin_report.customerVpa
        else:
            payinCSVReportDict["Customer Account"] = ""

        if each_payin_report.userType:
            payinCSVReportDict["User Type"] = each_payin_report.userType
        else:
            payinCSVReportDict["User Type"] = "user"

        if each_payin_report.createdOn:
            payinCSVReportDict["Txn Date"] = each_payin_report.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            payinCSVReportDict["Txn Date"] = ""

        # if each_payin_report.payInResponseCallBackData:
        #     original_date_str = each_payin_report.payInResponseCallBackData[0].get("Date")

        #     payinCSVReportDict["Txn Date"] = each_payin_report.payInResponseCallBackData[0].get("Date")
        # else:
        #     payinCSVReportDict["Txn Date"] = ""


        try:
            totalChargeAmount = 0
            chargeAmount = each_payin_report.commissionCharges.get("chargeAmount","0")
            gstAmount = each_payin_report.commissionCharges.get("gstAmount","0")
            tdsAmount = each_payin_report.commissionCharges.get("tdsAmount","0")

            totalChargeAmount = float(chargeAmount)+float(gstAmount)+float(tdsAmount)
            if totalChargeAmount:
                payinCSVReportDict["Charge Amount"] = "{:.2f}".format(float(totalChargeAmount))
            else:
                payinCSVReportDict["Charge Amount"] = "0"
        except Exception as e:
            payinCSVReportDict["Charge Amount"] = "0"

        if each_payin_report.status == 1:
            payinCSVReportDict["Transaction Status"]="Success"
        elif each_payin_report.status == 2:
            payinCSVReportDict["Transaction Status"]="Initiated"
        elif each_payin_report.status == 3:
            payinCSVReportDict["Transaction Status"]="Initiated"
        elif each_payin_report.status == 4:
            payinCSVReportDict["Transaction Status"]="Reversal"
        elif each_payin_report.status == 5:
            payinCSVReportDict["Transaction Status"]="Refund"
        elif each_payin_report.status == 6:
            payinCSVReportDict["Transaction Status"]="Spam"
        else:
            payinCSVReportDict["Transaction Status"]="Failed"

        if each_payin_report:
            payinCSVReportDict["Reference Id"]=str(each_payin_report.id)
        else:
            payinCSVReportDict["Reference Id"]=""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payinCSVReportDict


def save_client_logs_data(user_id,walletType,apiCallingType,apiCallingUrl,transactionAPIId,requestData,client_ip,platformType):
    save_client_table = ""
    try:
        client_logs_table = ClientLogs(
            userId=user_id,
            walletType=walletType,
            apiCallingType=apiCallingType,
            apiCallingUrl=apiCallingUrl,
            transactionAPIId=transactionAPIId,
            requestData=requestData,
            requestDate=datetime.datetime.now(),
            clientIp=client_ip,
            platformType=platformType,
            createdOn=datetime.datetime.now(),
            status=1
            )
        save_client_table = client_logs_table.save()
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return save_client_table


def save_api_logs_data(user_id,walletType,apiCallingType,apiCallingUrl,transactionAPIId,requestData,client_ip,platformType):
    save_api_log_table = ""
    try:
        api_logs_table = ApiLogs(
            userId=user_id,
            walletType=walletType,
            transactionAPIId=str(transactionAPIId),
            apiCallingType=apiCallingType,
            apiCallingUrl=apiCallingUrl,
            requestData=requestData,
            requestDate=datetime.datetime.now(),
            clientIp = client_ip,
            platformType=platformType,
            createdOn=datetime.datetime.now(),
            status=1
            )
        save_api_log_table = api_logs_table.save()
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return save_api_log_table

def save_admin_remarks_data(commonId,adminId,remark,methodType):
    save_admin_remark_table = ""
    try:
        admin_remark_table = AdminRemarks(
            commonId=commonId,
            adminId=adminId,
            remark=remark,
            methodType=methodType,
            createdOn=datetime.datetime.now(),
            status=1
            )
        save_admin_remark_table = admin_remark_table.save()
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return save_admin_remark_table

def save_routing_switch_logs_data(user_id,walletType,transactionAPIId):
    save_routing_switch_table = ""
    try:
        currentDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
        routing_switch_counts_table = RoutingSwitchCounts(
            userId=user_id,
            walletType=walletType,
            transactionAPIId=transactionAPIId,
            numberOfFails=0,
            numberOfSuccess=0,
            maxVolume=0,
            routingDate=datetime.datetime.now(),
            createdOn=datetime.datetime.now(),
            status=1
            )
        save_routing_switch_table=routing_switch_counts_table.save()
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return save_routing_switch_table

def save_exception_logs_data(user_id,walletType,apiCallingType,apiCallingUrl,exceptionData,client_ip,platformType):
    save_exception_log_table = ""
    try:
        exception_log_table = ExceptionLogs(
            userId=user_id,
            walletType=walletType,
            apiCallingType=apiCallingType,
            apiCallingUrl=apiCallingUrl,
            transactionAPIId=None,
            exceptionData=exceptionData,
            exceptionDate=datetime.datetime.now(),
            clientIp=client_ip,
            platformType=platformType,
            createdOn=datetime.datetime.now(),
            status=1
            ).save()
        save_exception_log_table = exception_log_table.save()
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return save_exception_log_table


def save_admin_logs_data(adminId,userId,transactionAPIId,actionUrl,actionType,actionDate,client_ip,loginBrowser,message,requestData,updatedrequestData,latitude="",longitude=""):
    save_admin_log_table = ""
    try:
        liveLocation=""
        if latitude and longitude:
            liveLocationDict = getLocationByLatLong(latitude,longitude)
            liveLocation=liveLocationDict.get("address","")
            print(liveLocationDict,"((((((((((((((((liveLocationDict2222222222))))))))))))))))")
            # pass
        admin_logs_table = AdminLogs(
            adminId=adminId,
            userId=userId,
            transactionAPIId=transactionAPIId,
            actionUrl=actionUrl,
            actionType=actionType,
            actionDate=actionDate,
            platformType="admin",
            clientIp = client_ip,
            loginBrowser=loginBrowser,
            requestData=requestData,
            updatedrequestData=updatedrequestData,
            message=message,
            latitude=latitude,
            longitude=longitude,
            liveLocation=liveLocation,
            # attempts=attempts,
            createdOn=datetime.datetime.now(),
            status=1
            )
        save_admin_log_table = admin_logs_table.save()
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return save_admin_log_table

def check_transaction_routing(userId, apiId, apiCount,amount,apiType):
    data_status = {"responseStatus":0,"apiId":"","numberOfFails":0,"numberOfSuccess":0}
    try:
        startDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
        endDate = startDate.replace(hour=23, minute=59, second=59, microsecond=999999)

        api_switch_queryset = ApiSwitches.objects(userId=userId, apiId=apiId, status__in=[0,1]).first()
        if api_switch_queryset:
            routing_switch_counts_queryset = RoutingSwitchCounts.objects(userId=userId,transactionAPIId=apiId,createdOn__gte=startDate,createdOn__lte=endDate).first()
            if routing_switch_counts_queryset:
                numberOfFails = routing_switch_counts_queryset.numberOfFails
                numberOfSuccess = routing_switch_counts_queryset.numberOfSuccess
                maxVolume = routing_switch_counts_queryset.maxVolume

                numberOfFailsPerLimit = api_switch_queryset.numberOfFails
                maxAmount=api_switch_queryset.maxAmount
                totalMaxAmount=maxAmount+amount

                if numberOfFailsPerLimit >= numberOfFails or totalMaxAmount>maxVolume:
                    apiCount += 1
                    if apiCount==1 and api_switch_queryset.apiId1:
                       next_api_id=str(api_switch_queryset.apiId1.id)
                       check_transaction_routing(userId, next_api_id, apiCount,amount,apiType)
                    elif apiCount==2 and api_switch_queryset.apiId2:
                       next_api_id=str(api_switch_queryset.apiId1.id)
                       check_transaction_routing(userId, next_api_id, apiCount,amount,apiType)
                    elif apiCount==3 and api_switch_queryset.apiId3:
                       next_api_id=str(api_switch_queryset.apiId1.id)
                       check_transaction_routing(userId, next_api_id, apiCount,amount,apiType)
                    elif apiCount==4 and api_switch_queryset.apiId4:
                       next_api_id=str(api_switch_queryset.apiId1.id)
                       check_transaction_routing(userId, next_api_id, apiCount,amount,apiType)
                    elif apiCount==5 and api_switch_queryset.apiId5:
                       next_api_id=str(api_switch_queryset.apiId1.id)
                       check_transaction_routing(userId, next_api_id, apiCount,amount,apiType)
                    else:
                        return data_status

                else:
                    data_status['responseStatus']=1
                    data_status['numberOfFails']=numberOfFails
                    data_status['numberOfSuccess']=numberOfSuccess
                    data_status['userId']=userId
                    data_status['apiId']=apiId
                    return data_status
            else:
                data_status['responseStatus']=2
                data_status['apiId']=apiId
                data_status['userId']=userId
                return data_status
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return data_status

#OTP Generate With Mobile NUmber API 
def generate_with_mobile_otp(phoneNumber):
    data_status = {"responseStatus": 0, "result": ""}
    try:
        otp = random.randint(100000,999999)
        if phoneNumber:
            user_queryset = Users.objects(phoneNumber=phoneNumber,status__in=[1]).first()
            if user_queryset:
                phoneNumber = user_queryset.phoneNumber
                try:
                    smsmessage="Your Apex Pay Merchant Login OTP is "+str(otp)
                    send_sms(phoneNumber,smsmessage)
                except Exception as e:
                    pass
                    
                data_status["responseStatus"] = 1
                data_status["result"]="Otp generated successfully"
                data_status["otp"]=otp
                return data_status
            else:
                data_status["result"]="Invalid Mobile Number"
                return data_status
        else:
            data_status["result"]="Mobile Number Required."
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to generate OTP."
        return data_status

def fetching_user_kyc_details(user_kyc_queryset):
    userKycDict = {}
    try:
        userKycDict = {
        "id":str(user_kyc_queryset.id),
        "panName":user_kyc_queryset.panName,
        "panNumber":user_kyc_queryset.panNumber,
        "panStatus":user_kyc_queryset.panStatus,
        "originalPanName":user_kyc_queryset.originalPanName,
        # "bankName":user_kyc_queryset.bankName,
        "bankAccountNumber":user_kyc_queryset.bankAccountNumber,
        "bankStatus":user_kyc_queryset.bankStatus,
        "originalBankName":user_kyc_queryset.originalBankName,
        "ifscCode":user_kyc_queryset.ifscCode,
        "aadharName":user_kyc_queryset.aadharName,
        "aadharNumber":user_kyc_queryset.aadharNumber,
        "aadharStatus":user_kyc_queryset.aadharStatus,
        "originalAadharName":user_kyc_queryset.originalAadharName,
        "panReason":user_kyc_queryset.panReason,
        "aadharReason":user_kyc_queryset.aadharReason,
        "bankReason":user_kyc_queryset.bankReason,
        "videoVerificationReason":user_kyc_queryset.videoVerificationReason,
        "agreementVerificationReason":user_kyc_queryset.agreementVerificationReason,
        "submittedDate":user_kyc_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
        "aadharName":user_kyc_queryset.aadharName
        }
        kycStatusList = []
        kycStatusList = [
        user_kyc_queryset.panStatus,
        user_kyc_queryset.bankStatus,
        user_kyc_queryset.aadharStatus,
        user_kyc_queryset.videoVerificationStatus,
        user_kyc_queryset.agreementVerificationStatus
        ]
        isIndividual = True
        try:
            if (user_kyc_queryset.userId.entityTypeId == None) or (user_kyc_queryset.userId.entityTypeId.isIndividual == True):
                isIndividual = True
            else:
                isIndividual = False
        except Exception as e:
            isIndividual = True

        if isIndividual == False:
            if user_kyc_queryset.businessStatus:
                kycStatusList.append(user_kyc_queryset.businessStatus)
            elif user_kyc_queryset.businessStatus == None:
                kycStatusList.append("Pending")
            else:
                kycStatusList.append("Pending")
            
            if user_kyc_queryset.shopVideoStatus:
                kycStatusList.append(user_kyc_queryset.shopVideoStatus)
            elif user_kyc_queryset.shopVideoStatus == None:
                kycStatusList.append("Pending")
            else:
                kycStatusList.append("Pending")
            
            if user_kyc_queryset.shopImagesList==[]:
                kycStatusList.append("Pending")
            if user_kyc_queryset.documentsList==[]:
                kycStatusList.append("Pending")

            if user_kyc_queryset.shopImagesList==[]:
                kycStatusList.append("Pending")
            for each_image_status in user_kyc_queryset.shopImagesList:
                shopImageStatus = each_image_status.get("shopImageStatus")
                kycStatusList.append(shopImageStatus)

            for each_document_status in user_kyc_queryset.documentsList:
                documentStatus = each_document_status.get("documentStatus")
                kycStatusList.append(documentStatus)


        if any(status == "Rejected" for status in kycStatusList):
            userKycDict["kycStatus"] = "Rejected"
        elif all(status == "Pending" for status in kycStatusList):
            userKycDict["kycStatus"] = "Pending"
        elif all(status == "Approved" for status in kycStatusList):
            userKycDict["kycStatus"] = "Approved"
        elif any(status == "Pending" for status in kycStatusList):
            userKycDict["kycStatus"] = "Processing"
        elif any(status == "" for status in kycStatusList):
            userKycDict["kycStatus"] = "Pending"
        else:
            userKycDict["kycStatus"] = "Submitted"

        try:
            if user_kyc_queryset:
                userKycDict["panStatus"]=user_kyc_queryset.panStatus
                userKycDict["bankStatus"]=user_kyc_queryset.bankStatus
                userKycDict["aadharStatus"]=user_kyc_queryset.aadharStatus
                userKycDict["videoVerificationStatus"]=user_kyc_queryset.videoVerificationStatus
                userKycDict["agreementVerificationStatus"]=user_kyc_queryset.agreementVerificationStatus
                userKycDict["companyRegistrationStatus"]=user_kyc_queryset.companyRegistrationStatus
                userKycDict["moaStatus"]=user_kyc_queryset.moaStatus
                userKycDict["aoaStatus"]=user_kyc_queryset.aoaStatus
                userKycDict["companyPanStatus"]=user_kyc_queryset.companyPanStatus
                userKycDict["shopVideoStatus"]=user_kyc_queryset.shopVideoStatus
                userKycDict["shopRemark"]=user_kyc_queryset.shopRemark
            else:
                userKycDict["panStatus"]="Pending"
                userKycDict["bankStatus"]="Pending"
                userKycDict["aadharStatus"]="Pending"
                userKycDict["videoVerificationStatus"]="Pending"
                userKycDict["agreementVerificationStatus"]="Pending"
                userKycDict["companyRegistrationStatus"]="Pending"
                userKycDict["moaStatus"]="Pending"
                userKycDict["aoaStatus"]="Pending"
                userKycDict["companyPanStatus"]="Pending"
                userKycDict["shopVideoStatus"]="Pending"
                userKycDict["shopRemark"]=""
        except Exception as e:
            userKycDict["panStatus"]="Pending"
            userKycDict["bankStatus"]="Pending"
            userKycDict["aadharStatus"]="Pending"
            userKycDict["videoVerificationStatus"]="Pending"
            userKycDict["agreementVerificationStatus"]="Pending"
            userKycDict["companyRegistrationStatus"]="Pending"
            userKycDict["moaStatus"]="Pending"
            userKycDict["aoaStatus"]="Pending"
            userKycDict["companyPanStatus"]="Pending"
            userKycDict["shopVideoStatus"]="Pending"
            userKycDict["shopRemark"]=""

        if user_kyc_queryset.userId:
            userKycDict["userId"]=str(user_kyc_queryset.userId.id)
            userKycDict["fullName"]=user_kyc_queryset.userId.fullName
            userKycDict["merchantType"]=user_kyc_queryset.userId.merchantType
            try:
                if user_kyc_queryset.userId.parentId:
                    userKycDict["parentName"]=user_kyc_queryset.userId.parentId.fullName
                else:
                    userKycDict["parentName"]=""
            except Exception as e:
                userKycDict["parentName"]=""
            userKycDict["merchantUniqueNumber"]=user_kyc_queryset.userId.merchantUniqueNumber
            userKycDict["phoneNumber"]=user_kyc_queryset.userId.phoneNumber
            userKycDict["email"]=user_kyc_queryset.userId.email
            userKycDict["address"]=user_kyc_queryset.userId.address
            userKycDict["businessName"]=user_kyc_queryset.userId.businessName
            userKycDict["businessAddress"]=user_kyc_queryset.userId.businessAddress
            userKycDict["businessRemark"]=user_kyc_queryset.userId.businessRemark
            userKycDict["documentRemark"]=user_kyc_queryset.userId.documentRemark
            userKycDict["videoVerificationRemark"]=user_kyc_queryset.userId.videoVerificationRemark
            userKycDict["remark"]=user_kyc_queryset.remark
            userKycDict["userType"]=""
        else:
            userKycDict["userId"]=""
            userKycDict["fullName"]="-"
            userKycDict["merchantType"]=""
            userKycDict["parentName"]=""
            userKycDict["merchantUniqueNumber"]="-"

            userKycDict["phoneNumber"]="-"
            userKycDict["email"]="-"
            userKycDict["address"]="-"
            userKycDict["businessName"]="-"
            userKycDict["businessAddress"]="-"
            userKycDict["businessRemark"]="-"
            userKycDict["documentRemark"]="-"
            userKycDict["videoVerificationRemark"]="-"
            userKycDict["remark"]="-"
            userKycDict["userType"]=""

        if user_kyc_queryset.aadharDocument:
            userKycDict["aadharDocument"]=domain+user_kyc_queryset.aadharDocument
        else:
            userKycDict["aadharDocument"]=""

        if user_kyc_queryset.aadharBackDocument:
            userKycDict["aadharBackDocument"]=domain+user_kyc_queryset.aadharBackDocument
        else:
            userKycDict["aadharBackDocument"]=""


        try:
            if user_kyc_queryset.userId.parentId:
                userKycDict["parentId"]=str(user_kyc_queryset.userId.parentId.id)
                userKycDict["parentName"]=user_kyc_queryset.userId.parentId.fullName
            else:
                userKycDict["parentId"]=""
                userKycDict["parentName"]=""
        except Exception as e:
            userKycDict["parentId"]=""
            userKycDict["parentName"]=""

        if user_kyc_queryset.panDocument:
            userKycDict["panDocument"]=domain+user_kyc_queryset.panDocument
        else:
            userKycDict["panDocument"]=""

        if user_kyc_queryset.companyRegistrationDoc:
            userKycDict["companyRegistrationDoc"]=domain+user_kyc_queryset.companyRegistrationDoc
        else:
            userKycDict["companyRegistrationDoc"]=""

        if user_kyc_queryset.moaDoc:
            userKycDict["moaDoc"]=domain+user_kyc_queryset.moaDoc
        else:
            userKycDict["moaDoc"]=""

        if user_kyc_queryset.aoaDoc:
            userKycDict["aoaDoc"]=domain+user_kyc_queryset.aoaDoc
        else:
            userKycDict["aoaDoc"]=""

        if user_kyc_queryset.companyPanDoc:
            userKycDict["companyPanDoc"]=domain+user_kyc_queryset.companyPanDoc
        else:
            userKycDict["companyPanDoc"]=""

        if user_kyc_queryset.uploadVideo:
            userKycDict["uploadVideo"]=domain+user_kyc_queryset.uploadVideo
        else:
            userKycDict["uploadVideo"]=""

        if user_kyc_queryset.status==1:
            userKycDict["actionText"] = "Approved"
        else:
            userKycDict["actionText"] = "Pending"

        try:
            if user_kyc_queryset.bankId:
                userKycDict["bankId"]=str(user_kyc_queryset.bankId.id)
                userKycDict["bankName"]=user_kyc_queryset.bankId.bankName
            else:
                userKycDict["bankId"]=""
                userKycDict["bankName"]="-"
        except Exception as e:
            userKycDict["bankId"]=""
            userKycDict["bankName"]="-"

        try:
            if user_kyc_queryset.userId.patternId:
                userKycDict["patternId"]=str(user_kyc_queryset.userId.patternId.id)
                userKycDict["patternName"]=user_kyc_queryset.userId.patternId.name
            else:
                userKycDict["patternId"]=""
                userKycDict["patternName"]=""
        except Exception as e:
            userDict["patternId"]=""
            userDict["patternName"]=""
        try:
            if user_kyc_queryset.userId.entityTypeId:
                userKycDict["entityTypeId"]=str(user_kyc_queryset.userId.entityTypeId.id)
                userKycDict["entityTypeName"]=user_kyc_queryset.userId.entityTypeId.entityType
            else:
                userKycDict["entityTypeId"]=""
                userKycDict["entityTypeName"]=""
        except Exception as e:
            userKycDict["entityTypeId"]=""
            userKycDict["entityTypeName"]=""

        try:
            if user_kyc_queryset.userId.pincodeId:
                userKycDict["pincodeId"]=str(user_kyc_queryset.userId.pincodeId.id)
                userKycDict["pincode"]=user_kyc_queryset.userId.pincodeId.pincode
            else:
                userKycDict["pincodeId"]=""
                userKycDict["pincode"]=""
        except Exception as e:
            userKycDict["pincodeId"]=""
            userKycDict["pincode"]=""

        try:
            if user_kyc_queryset.userId.stateId:
                userKycDict["stateId"] = str(user_kyc_queryset.userId.stateId.id)
                userKycDict["stateName"] = user_kyc_queryset.userId.stateId.stateName
            else:
                userKycDict["stateId"] = ""
                userKycDict["stateName"] = ""
        except:
            userKycDict["stateId"] = ""
            userKycDict["stateName"] = ""

        try:
            if user_kyc_queryset.userId.cityId:
                userKycDict["cityId"] = str(user_kyc_queryset.userId.cityId.id)
                userKycDict["cityName"] = user_kyc_queryset.userId.cityId.cityName
            else:
                userKycDict["cityId"] = ""
                userKycDict["cityName"] = ""
        except:
            userKycDict["cityId"] = ""
            userKycDict["cityName"] = ""

        try:
            if user_kyc_queryset.userId.blockPoId:
                userKycDict["blockPoId"] = str(user_kyc_queryset.userId.blockPoId.id)
                userKycDict["blockPoName"] = user_kyc_queryset.userId.blockPoId.name
            else:
                userKycDict["blockPoId"] = ""
                userKycDict["blockPoName"] = ""
        except:
            userKycDict["blockPoId"] = ""
            userKycDict["blockPoName"] = ""

        try:
            if user_kyc_queryset.userId.merchantType: 
                userKycDict["merchantType"] = user_kyc_queryset.userId.merchantType
            else: 
                userKycDict["merchantType"] = ""
        except:
            userKycDict["merchantType"] = ""
        
        try:
            if user_kyc_queryset.siteTitle:
                userKycDict["siteTitle"]= user_kyc_queryset.siteTitle
            else:
                userKycDict["siteTitle"]=""
        except Exception as e:
            userKycDict["siteTitle"]=""
            
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return userKycDict

def save_webhook_logs_data(user_id,walletType,apiCallingType,apiCallingUrl,transactionAPIId,responseData,platformType,orderId):
    save_api_webhook_logs_table = ""
    try:
        webhook_api_logs_table = WebhookLogs(
            userId=user_id,
            walletType=walletType,
            orderId=orderId,
            transactionAPIId=transactionAPIId,
            apiCallingType=apiCallingType,
            apiCallingUrl=apiCallingUrl,
            responseData = responseData,
            responseDate = datetime.datetime.now(),
            platformType=platformType,
            createdOn=datetime.datetime.now(),
            status=1
            )
        save_api_webhook_logs_table = webhook_api_logs_table.save()
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return save_api_webhook_logs_table

def admin_download_payout_csv_reports_data(startDate,endDate,payouts_queryset):
    downloadPayoutCSVReportsList = []
    relative_temp_csv_file_name = ""
    fileSize = 0
    try:
        start_date_str = startDate.strftime("%d-%m-%Y")
        end_date_str = endDate.strftime("%d-%m-%Y")

        fileName = f"payout_{start_date_str}_{end_date_str}.csv"

        # payouts_queryset = FundTransfers.objects(createdOn__gte = startDate,createdOn__lte = endDate,status__in=[0,1,2,3,4,5]).order_by("-id").all()

        for each_payout_report in payouts_queryset:
            payoutCSVReportDict = fetching_payout_admin_csv_download_reports(each_payout_report)
            downloadPayoutCSVReportsList.append(payoutCSVReportDict)

        fieldnames = [
        'Account Number', 'Account IFSCCode', 'Beneficiary Mail','Beneficiary Phone', 'Beneficiary Name', 'Order Id', 'Transaction UniqueId', 'Pg OrderId', 'Amount','Total ChargeAmount','Opening Balance','Closing Balance','Grand Total','Payment Mode', 'Comment','Bank Branch', 'Transfer Type', 'User Type','Txn Date', 'Transaction Status','Reference Id'
        ]

        # Define the base directory and the relative file path
        base_dir = os.path.join(app.config['SITE_ROOT'], "media/admin_reports","payout")
        relative_temp_csv_file_name = os.path.join("media/admin_reports","payout", fileName)

        # Ensure the base directory exists
        if not os.path.exists(base_dir):
            os.makedirs(base_dir)

        # Full file name for writing
        full_file_name = os.path.join(app.config['SITE_ROOT'], relative_temp_csv_file_name)
        with open(full_file_name, 'w', encoding='UTF8', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows(downloadPayoutCSVReportsList)

        # fileSize = os.path.getsize(full_file_name)

        # return relative_temp_csv_file_name

        return send_file(
            app.config['SITE_ROOT']+"/"+relative_temp_csv_file_name,
            mimetype='text/csv',
            download_name=fileName,
            as_attachment=True
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return relative_temp_csv_file_name




def download_payout_csv_report_data(each_report):
    downloadPayoutCSVReportsList = []
    relative_temp_csv_file_name = ""
    fileSize = 0
    try:
        startDate = each_report.startDate
        endDate = each_report.endDate

        reportType = each_report.reportType
        start_date_str = startDate.strftime("%d-%m-%Y")
        end_date_str = endDate.strftime("%d-%m-%Y")
        merchantReferenceNumber=""
        fileName = f"{reportType}_{start_date_str}_{end_date_str}.csv"
        if each_report.userId:
            merchantReferenceNumber = str(each_report.userId.merchantUniqueNumber)

            fund_transfer_queryset = FundTransfers.objects(createdOn__gte = startDate,createdOn__lte = endDate,userId=str(each_report.userId.id),status__in=[0,1,2,3,4,5]).order_by("-id").all()
        else:
            fund_transfer_queryset = FundTransfers.objects(createdOn__gte = startDate,createdOn__lte = endDate,status__in=[0,1,2,3,4,5]).order_by("-id").all()

        if reportType == "ledger":
            for each_payout_report in fund_transfer_queryset:
                payoutCSVReportDict = fetching_payout_csv_download_reports_new_ledger(each_payout_report)
                if each_payout_report.previousBalance:
                    payoutCSVReportDict["Opening Balance"] = "{:.2f}".format(float(each_payout_report.previousBalance))
                else:
                    payoutCSVReportDict["Opening Balance"] = "0.00"
                if each_payout_report.currentBalance:
                    payoutCSVReportDict["Closing Balance"] = "{:.2f}".format(float(each_payout_report.currentBalance))
                else:
                    payoutCSVReportDict["Closing Balance"] = "0.00"
                downloadPayoutCSVReportsList.append(payoutCSVReportDict)
            fieldnames = [
                "Site Title",
                "User Type",
                "PG Name",
                "Merchant Name",
                "Beneficiary Name",
                "Beneficiary Account Number",
                "Beneficiary IFSC",
                "Order ID",
                "Txn ID",
                "PgOrderId",
                "Opening Balance",
                "CrDrType",
                "Credit Amount",
                "Debit Amount",
                "Closing Balance",
                "Amount",
                "UTR",
                "Charge Amount",
                "GST Amount",
                "TDS Amount",
                "Transaction Date",
                "Transaction Status"
        ]
            
        elif reportType == "transactions":
            for each_payout_report in fund_transfer_queryset:
                payoutCSVReportDict = fetching_payout_csv_download_reports_new_transactions(each_payout_report)
                downloadPayoutCSVReportsList.append(payoutCSVReportDict)

            # fieldnames = [
            # 'Account Number', 'Account IFSCCode', 'Beneficiary Name', 'Beneficiary Mail',
            # 'Beneficiary Phone', 'Amount','Charge Amount','Grand Total','Payment Mode', 'Comment', 'Order Id','Bank Name',
            # 'Bank Branch', 'Transfer Type','Transaction UniqueId','Bank RefId', 'Txn Date', 'Transaction Status','User Type','Remark'
            # ]

            fieldnames = [ "Site Title","User Type","PG Name","Merchant Name","Beneficiary Name","Beneficiary Account Number","Beneficiary IFSC","Order ID","Txn ID","Transfer Type","Amount","Grand Total","Type","Account Number","UTR","Charge Amount","GST Amount","TDS Amount","Transaction Date","Transaction Status" ]

        # Define the base directory and the relative file path
        base_dir = os.path.join(app.config['SITE_ROOT'], "media/reports", merchantReferenceNumber, "payout")
        relative_temp_csv_file_name = os.path.join("media/reports", merchantReferenceNumber, "payout", fileName)

        # Ensure the base directory exists
        if not os.path.exists(base_dir):
            os.makedirs(base_dir)

        # Full file name for writing
        full_file_name = os.path.join(app.config['SITE_ROOT'], relative_temp_csv_file_name)
        with open(full_file_name, 'w', encoding='UTF8', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows(downloadPayoutCSVReportsList)

        fileSize = os.path.getsize(full_file_name)

        return relative_temp_csv_file_name, fileSize
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return relative_temp_csv_file_name, fileSize


def download_payin_csv_report_data(each_report):
    payinDownloadCSVReportsList = []
    relative_temp_csv_file_name = ""
    fileSize = 0
    try:
        startDate = each_report.startDate
        endDate = each_report.endDate

        reportType = each_report.reportType
        start_date_str = startDate.strftime("%d-%m-%Y")
        end_date_str = endDate.strftime("%d-%m-%Y")

        fileName = f"{reportType}_{start_date_str}_{end_date_str}.csv"
        merchantReferenceNumber=""
        if each_report.userId:
            merchantReferenceNumber = str(each_report.userId.merchantUniqueNumber)
            payins_queryset = WalletTransactions.objects( createdOn__gte = startDate, createdOn__lte = endDate, userId=str(each_report.userId.id), status__in=[0,1,4,5,6] ).order_by("-id").all()
        else:
            payins_queryset = WalletTransactions.objects( createdOn__gte = startDate, createdOn__lte = endDate, status__in=[0,1,4,5,6] ).order_by("-id").all()

        if reportType == "ledger":
            for each_payin_report in payins_queryset:
                payinCSVReportDict = fetching_payin_csv_download_reports_new_ledger(each_payin_report)

                if each_payin_report.previousBalance:
                    payinCSVReportDict["Opening Balance"] = "{:.2f}".format(float(each_payin_report.previousBalance))
                else:
                    payinCSVReportDict["Opening Balance"] = "0.00"

                if each_payin_report.currentBalance:
                    payinCSVReportDict["Closing Balance"] = "{:.2f}".format(float(each_payin_report.currentBalance))
                else:
                    payinCSVReportDict["Closing Balance"] = "0.00"

                payinDownloadCSVReportsList.append(payinCSVReportDict)
            fieldnames = [
                'Site Title', 'User Type', 'PG Name','Merchant Name' ,'Order ID','Txn ID','Opening Balance','CrDrType','Credit Amount','Debit Amount','Closing Balance','Transaction Date', 'Transaction Status'
            ]
        elif reportType == "transactions":
            for each_payin_report in payins_queryset:
                payinCSVReportDict = fetching_payin_csv_download_reports_new_transactions(each_payin_report)
                payinDownloadCSVReportsList.append(payinCSVReportDict)

            
            fieldnames = [
                    'Site Title',
                    'User Type',
                    'PG Name',
                    'Payment Mode',
                    'SubPayment Mode',
                    'Order ID',
                    "PG ID",
                    'Txn ID',
                    'Merchant Name' ,
                    'Merchant Type' ,
                    'Opening Balance',
                    'CrDrType',
                    'Credit Amount',
                    'Debit Amount',
                    'Closing Balance',
                    "Amount",
                    "Charge Amount",
                    "GST Amount",
                    "TDS Amount",
                    'Transaction Date',
                    # 'Transaction Status',
                    "Status",
                    "AD Name",
                    "AD Charge",
                    "AD Amount",
                    "MD Name",
                    "MD Charge",
                    "MD Amount",
                    "SD Name",
                    "SD Charge",
                    "SD Amount",
                    "PG Amount",
                    "PG Charge",
                    "PG GST Amount",
                ]

        # Define the base directory and the relative file path
        base_dir = os.path.join(app.config['SITE_ROOT'], "media/reports", merchantReferenceNumber, "payin")
        relative_temp_csv_file_name = os.path.join("media/reports", merchantReferenceNumber, "payin", fileName)

        # Ensure the base directory exists
        if not os.path.exists(base_dir):
            os.makedirs(base_dir)

        # Full file name for writing
        full_file_name = os.path.join(app.config['SITE_ROOT'], relative_temp_csv_file_name)
        with open(full_file_name, 'w', encoding='UTF8', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows(payinDownloadCSVReportsList)

        fileSize = os.path.getsize(full_file_name)

        return relative_temp_csv_file_name, fileSize
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return relative_temp_csv_file_name, fileSize

# def send_sms(phoneNumber,message):
#     data_status={'responseStatus':0,'result':''}
#     if phoneNumber and message:
#         try:
#             client = sms_client(account_sid, auth_token)
#             message = client.messages.create(
#                 to="+91" + str(phoneNumber),
#                 #to="+919492844021",
#                 from_= from_number,
#                 body=message
#                 )
#         except Exception as e:
#             pass
#         data_status["responseStatus"] = 1
#         data_status["result"]="Otp generated successfully"
#         return data_status
#     else:
#         data_status["result"]="Required fields missing"
#         return data_status


def send_sms(phoneNumber, otpType,userName="",Reason="",amount="",departmentName="",acknowledgementNumber=""):
    data_status = {'responseStatus': 0, 'result': ''}
    if phoneNumber and otpType:
        otp = random.randint(100000, 999999)
        print(otp,"otp util")
        try:
            assign_sms_queryset = AssignSms.objects(otpTypeList__in=[otpType], status__in=[1]).first()
            if not assign_sms_queryset:
                data_status["responseStatus"] = 1
                data_status["sai"]="SAI"
                data_status["otp"] = otp  
                return data_status

            assignSmsApiId=str(assign_sms_queryset.smsApiId.id)
            sms_templates_queryset = SmsTemplates.objects(status=1, smsApiId=assignSmsApiId, otpTypeList__in=[otpType]).order_by("-id").first()
            if not sms_templates_queryset:
                data_status["responseStatus"] = 1
                data_status["otp"] = otp  
                data_status["test"] = "Hii"  
                return data_status

            template_content = sms_templates_queryset.templateContent
            dynamic_message = template_content.replace("{#var#}", str(otp), 1)

            template_content = sms_templates_queryset.templateContent
           
            
            bytes_data = template_content.encode('utf-8')
           

            decoded_string = bytes_data.decode('utf-8')
            

            dynamic_message = template_content
            dynamic_message = dynamic_message.replace("{#userName#}", str(userName))
            dynamic_message = dynamic_message.replace("{#Reason#}", str(Reason))
            dynamic_message = dynamic_message.replace("{#otpCode#}", str(otp))
            dynamic_message = dynamic_message.replace("{#Amount#}", str(amount))
            dynamic_message = dynamic_message.replace("{#Department#}", str(departmentName))
            dynamic_message = dynamic_message.replace("{#billName#}", str(departmentName))
            dynamic_message = dynamic_message.replace("{#RefId#}", str(acknowledgementNumber))
            dynamic_message = dynamic_message.replace("{#ACKNo#}", str(acknowledgementNumber))
           

            
            sms_api_queryset = smsApis.objects(id=assignSmsApiId,status=1).first()
            smsApiId = str(sms_api_queryset.id)
            
            sms_type_code = sms_api_queryset.code
            
            if sms_type_code == "Twilio":
                for each_key in sms_api_queryset.paramsList:
                    get_key = each_key.get("key")
                    if get_key == "apikey":
                        apikey = each_key.get("value")
                    if get_key == "sender":
                        sender = each_key.get("value")
                    if get_key == "url":
                        url = each_key.get("value")

                client = sms_client(account_sid, auth_token)
                message_obj = client.messages.create(
                    to="+91" + str(phoneNumber),
                    from_=from_number,
                    body=dynamic_message
                )
                data_status["result"] = "SMS sent successfully via Twilio"

            elif sms_type_code == "Text_Local":
                apikey = ""
                sender = ""
                url = ""
                for each_key in sms_api_queryset.paramsList:
                    get_key = each_key.get("key")
                    if get_key == "apikey":
                        apikey = each_key.get("value")
                    if get_key == "sender":
                        sender = each_key.get("value")
                    if get_key == "url":
                        url = each_key.get("value")
                bytesCode = bytes(dynamic_message, "utf-8").decode("utf-8")
                dynamic_message = bytesCode.encode('latin1').decode('utf-8')
                

                data = urllib.parse.urlencode({
                    'apikey': apikey,
                    'numbers': phoneNumber,
                    'message': dynamic_message,
                    # 'message': "Dear user, your KYC couldn’t be approved due to testing. Don’t worry! Update your details and try again. GraamPay is here to support you every step of the way.",
                    'sender': sender
                })
                data = data.encode('utf-8')
                
                # Send the request
                request = urllib.request.Request(url)
                with urllib.request.urlopen(request, data) as response:
                    print("(((((((((dsfwferf)))))))))")

                data_status["result"] = "SMS sent successfully via TextLocal"

            elif sms_type_code == "Fast2Sms":
                apikey = ""
                url = ""
                for each_key in sms_api_queryset.paramsList:
                    get_key = each_key.get("key")
                    if get_key == "api_key":
                        apikey = each_key.get("value")
                    if get_key == "url":
                        url = each_key.get("value")

                payload = "variables_values="+str(otp)+"&route=otp&numbers="+str(phoneNumber)
                headers = {
                    'authorization': apikey,
                    'Content-Type': "application/x-www-form-urlencoded",
                    'Cache-Control': "no-cache",
                    }

                response = requests.request("POST", url, data=payload, headers=headers)

                print(response.text,"In Fast2Sms Response")
                data_status["result"] = "SMS sent successfully via Fast2Sms!"

            else:
                data_status["result"] = "Please contact admin and enable sms api!!"
                return data_status

            data_status["responseStatus"] = 1
            data_status["otp"] = otp  
            return data_status

        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["responseStatus"] = 1
            data_status["otp"] = otp  
            return data_status
            # app.logger.error(traceback.format_exc())
            # data_status["result"] = "Error occurred while sending SMS!!"
            # return data_status
    else:
        data_status["result"] = "Required fields missing: phoneNumber, or otpType"
        return data_status

def slab_calculation_for_payout(amount,paymentModeId,subPaymentModeId,patternId,payOutPaymentGatewayId=""):
    commissionCharges = {}
    try:
        transactionAmount = amount
        grandTotal = 0
        startAmount = 0
        endAmount = 0
        chargeType = ""
        chargeValue = 0
        chargeAmount = 0
        gstAmount = 0
        tdsAmount = 0
        gstInclude = ""
        tdsInclude = ""
        aggregatorType = ""
        aggregatorValue = 0
        aggregatorAmount = 0
        commissionType = ""
        commissionValue = 0
        commissionAmount = 0
        tdsValue = 0
        gstValue = 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)
            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,
        "chargeValue":chargeValue,
        "gstValue":gstValue,
        "tdsValue":tdsValue,
        "aggregatorValue":aggregatorValue,
        "commissionValue":commissionValue,
        "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
        }
        print(commissionCharges,"((((((((((((((((((PAYOUT COMMISSION CHARGES API))))))))))))))))))")
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return commissionCharges

def slab_calculation_for_payout_merchant(amount,paymentModeId,subPaymentModeId,patternId):
    commissionCharges = {}
    try:
        transactionAmount = amount
        grandTotal = 0
        startAmount = 0
        endAmount = 0
        chargeType = ""
        chargeValue = 0
        chargeAmount = 0
        gstAmount = 0
        tdsAmount = 0
        gstInclude = ""
        tdsInclude = ""
        aggregatorType = ""
        aggregatorValue = 0
        aggregatorAmount = 0
        commissionType = ""
        commissionValue = 0
        commissionAmount = 0
        tdsValue = 0
        gstValue = 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)
            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,
        "chargeValue":chargeValue,
        "gstValue":gstValue,
        "tdsValue":tdsValue,
        "aggregatorValue":aggregatorValue,
        "commissionValue":commissionValue,
        "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
        }
        print(commissionCharges,"((((((((((((((((((PAYOUT COMMISSION CHARGES API))))))))))))))))))")
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return commissionCharges


def slab_calculation_for_payin(amount,paymentModeId,subPaymentModeId,patternId,payinPaymentGatewayId):
    commissionCharges = {}
    print(amount,"amount")
    print(paymentModeId,"paymentModeId")
    print(subPaymentModeId,"subPaymentModeId")
    print(patternId,"patternId")
    print(payinPaymentGatewayId,"payinPaymentGatewayId")
    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(transactionAPIIdsList__in=[payinPaymentGatewayId],paymentModeIdsList__in=[paymentModeId],subPaymentModeIdsList__in=[subPaymentModeId],patternIdsList__in=[patternId]).first()
        if slab_queryset:
            slabId=str(slab_queryset.id)
            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_payin_merchant(amount,paymentModeId,subPaymentModeId,patternId,instantSettlement=None):
    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
        if instantSettlement==None:
            slab_queryset = SetupChargeCommissions.objects(paymentModeIdsList__in=[paymentModeId],subPaymentModeIdsList__in=[subPaymentModeId],patternIdsList__in=[patternId]).first()
        else:
            slab_queryset = SetupChargeCommissions.objects(paymentModeIdsList__in=[paymentModeId],subPaymentModeIdsList__in=[subPaymentModeId],patternIdsList__in=[patternId],instantSettlement=instantSettlement).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_aggregator(amount,paymentModeId,subPaymentModeId,transactionAPIId,holidaytype=False):
    apiCommissionCharges = {}
    print("slab_calculation_for_aggregator")
    print(amount,"amount")
    print(holidaytype,"holidaytype")
    print(paymentModeId,"paymentModeId")
    print(subPaymentModeId,"subPaymentModeId")
    print(transactionAPIId,"transactionAPIId")
    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
        priceType=""
        slabId=None

        slab_queryset = ApiSetupChargeCommissions.objects(transactionAPIIdsList__in=[transactionAPIId],paymentModeIdsList__in=[paymentModeId],subPaymentModeIdsList__in=[subPaymentModeId],holidayPrice=holidaytype).first()
        if not slab_queryset:
            checkType= not holidaytype
            slab_queryset = ApiSetupChargeCommissions.objects(transactionAPIIdsList__in=[transactionAPIId],paymentModeIdsList__in=[paymentModeId],subPaymentModeIdsList__in=[subPaymentModeId],holidayPrice=checkType).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"))
            else:
                chargeType = slab_queryset.chargeType
                chargeValue = float(slab_queryset.chargeValue)
    

            if chargeValue > 0:
                
                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)

        apiCommissionCharges = {
        "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,
        "apiSlabId":slabId,
        "chargeValue":chargeValue,
        "gstValue":gstValue,
        "tdsValue":tdsValue,
        }
        print(apiCommissionCharges,"((((((((((((((((((PAYIN COMMISSION CHARGES API))))))))))))))))))")
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return apiCommissionCharges

# def commission_calculation_for_payin(amount,paymentModeId,subPaymentModeId,patternId,payinPaymentGatewayId):
#     commissionCharges = {}
#     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(transactionAPIIdsList__in=[payinPaymentGatewayId],paymentModeIdsList__in=[paymentModeId],subPaymentModeIdsList__in=[subPaymentModeId],patternIdsList__in=[patternId]).first()
#         if slab_queryset:
#             slabId=str(slab_queryset.id)
#             priceType = slab_queryset.priceType

#             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"))
#             else:
#                 chargeType = slab_queryset.chargeType
#                 chargeValue = float(slab_queryset.chargeValue)

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

#                 transactionAmount=float(transactionAmount) - float(chargeAmount)
#         commissionCharges = {
#         "chargeType":chargeType,
#         "chargeAmount":round(float(chargeAmount),2),
#         "transactionAmount":round(float(transactionAmount),2),
#         "totalAmount":round(float(amount),2),
#         "priceType":priceType,
#         "slabId":slabId,
#         "chargeValue":chargeValue,
#         }
#         print(commissionCharges,"((((((((((((((((((PAYIN COMMISSION CHARGES API))))))))))))))))))")
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#     return commissionCharges



def fetching_charge_backs_reports(each_charge_back):
    chargebackDict = {}
    try:
        chargebackDict = {
        "id":str(each_charge_back.id),
        "userName":each_charge_back.userId.fullName,
        "adjustDate":each_charge_back.adjustDate.astimezone(ist_timezone).strftime("%d-%m-%Y"),
        "adjustType":each_charge_back.adjustType,
        "remitter":each_charge_back.remitter,
        "beneficiaryName":each_charge_back.beneficiaryName,
        "reasonCode":each_charge_back.reasonCode,
        "remarks":each_charge_back.remarks,
        "payee":each_charge_back.payee,
        "rrn":each_charge_back.rrn,
        "upiTxnId":each_charge_back.upiTxnId,
        "referId":each_charge_back.referId,
        "pgOrderId":each_charge_back.pgOrderId,
        "adjAmount":formatINR("{:.2f}".format(float(each_charge_back.adjAmount))),
        "txnAmount":formatINR("{:.2f}".format(float(each_charge_back.txnAmount))),
        "txnDate":each_charge_back.txnDate.astimezone(ist_timezone).strftime("%d-%m-%Y")
        }
        if each_charge_back.walletTransactionId:
            chargebackDict["orderId"]=str(each_charge_back.walletTransactionId.orderId)
        else:
            chargebackDict["orderId"]=""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return chargebackDict

def fetching_payout_admin_csv_download_reports(each_payout_report):
    payoutReportDict = {}
    try:
        if each_payout_report.accountNumber:
            payoutReportDict["Account Number"] = mask_account_number(each_payout_report.accountNumber)
        else:
            payoutReportDict["Account Number"] = ""

        if each_payout_report.accountIFSCCode:
            payoutReportDict["Account IFSCCode"] = each_payout_report.accountIFSCCode
        else:
            payoutReportDict["Account IFSCCode"] = ""

        if each_payout_report.beneficiaryName:
            payoutReportDict["Beneficiary Name"] = each_payout_report.beneficiaryName
        else:
            payoutReportDict["Beneficiary Name"] = ""

        if each_payout_report.beneficiaryPhone:
            payoutReportDict["Beneficiary Phone"] = each_payout_report.beneficiaryPhone
        else:
            payoutReportDict["Beneficiary Phone"] = ""

        if each_payout_report.amount:
            payoutReportDict["Amount"] = "{:.2f}".format(float(each_payout_report.amount))
        else:
            payoutReportDict["Amount"] = "0"


        if each_payout_report.previousBalance:
            payoutReportDict["Opening Balance"] = "{:.2f}".format(float(each_payout_report.previousBalance))
        else:
            payoutReportDict["Opening Balance"] = "0"

        if each_payout_report.currentBalance:
            payoutReportDict["Closing Balance"] = "{:.2f}".format(float(each_payout_report.currentBalance))
        else:
            payoutReportDict["Closing Balance"] = "0"

        try:
            totalChargeAmount = 0
            chargeAmount = each_payout_report.commissionCharges.get("chargeAmount","0")
            gstAmount = each_payout_report.commissionCharges.get("gstAmount","0")
            tdsAmount = each_payout_report.commissionCharges.get("tdsAmount","0")

            totalChargeAmount = float(chargeAmount)+float(gstAmount)+float(tdsAmount)
            if totalChargeAmount:
                payoutReportDict["Total ChargeAmount"] = "{:.2f}".format(float(totalChargeAmount))
            else:
                payoutReportDict["Total ChargeAmount"] = "0"
        except Exception as e:
            payoutReportDict["Total ChargeAmount"] = "0"

        if each_payout_report.grandTotal:
            payoutReportDict["Grand Total"] = "{:.2f}".format(float(each_payout_report.grandTotal))
        else:
            payoutReportDict["Grand Total"] = "0"


        if each_payout_report.status == 5 and each_payout_report.transactionUniqueId != None:
            payout_queryset = FundTransfers.objects(merchantReferenceNumber=each_payout_report.transactionUniqueId,status__nin=[5]).first()
            try:
                if payout_queryset.merchantReferenceNumber:
                    payoutReportDict["Order Id"] = payout_queryset.merchantReferenceNumber
                else:
                    if each_payout_report.transactionUniqueId == None:
                        payoutReportDict["Order Id"] = each_payout_report.merchantReferenceNumber
                    else:
                        payoutReportDict["Order Id"] = each_payout_report.transactionUniqueId
            except Exception as e:
                payoutReportDict["Order Id"] = each_payout_report.transactionUniqueId

            try:
                if payout_queryset.transactionUniqueId:
                    payoutReportDict["Transaction UniqueId"] = payout_queryset.transactionUniqueId
                else:
                    payoutReportDict["Transaction UniqueId"] = each_payout_report.transactionUniqueId
            except Exception as e:
                payoutReportDict["Transaction UniqueId"] = each_payout_report.transactionUniqueId
        else:
            if each_payout_report.merchantReferenceNumber:
                payoutReportDict["Order Id"] = each_payout_report.merchantReferenceNumber
            else:
                payoutReportDict["Order Id"] = ""

            if each_payout_report.transactionUniqueId:
                payoutReportDict["Transaction UniqueId"] = each_payout_report.transactionUniqueId
            else:
                payoutReportDict["Transaction UniqueId"] = ""
                

        if each_payout_report.paymentMode:
            payoutReportDict["Payment Mode"] = each_payout_report.paymentMode
        else:
            payoutReportDict["Payment Mode"] = ""

        if each_payout_report.narration:
            payoutReportDict["Comment"] = each_payout_report.narration
        else:
            payoutReportDict["Comment"] = ""

        if each_payout_report.pgOrderId:
            payoutReportDict["Pg OrderId"] = each_payout_report.pgOrderId
        else:
            payoutReportDict["Pg OrderId"] = ""

        if each_payout_report.transferType:
            payoutReportDict["Transfer Type"] = each_payout_report.transferType
        else:
            payoutReportDict["Transfer Type"] = ""

        try:
            if each_payout_report.userType:
                payoutReportDict["User Type"] = each_payout_report.userType
            else:
                payoutReportDict["User Type"] = "user"
        except Exception as e:
            payoutReportDict["User Type"] = "user"

        if each_payout_report.bankBranch:
            payoutReportDict["Bank Branch"] = each_payout_report.bankBranch
        else:
            payoutReportDict["Bank Branch"] = ""

        if each_payout_report:
            payoutReportDict["Reference Id"] = str(each_payout_report.id)
        else:
            payoutReportDict["Reference Id"] = ""

        if each_payout_report.createdOn:
            payoutReportDict["Txn Date"] = each_payout_report.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            payoutReportDict["Txn Date"] = ""

        if each_payout_report.status == 1:
            payoutReportDict["Transaction Status"]="Success"
        elif each_payout_report.status == 2:
            payoutReportDict["Transaction Status"]="Processing"
        elif each_payout_report.status == 4:
            payoutReportDict["Transaction Status"]="Reversal"
        elif each_payout_report.status == 5:
            payoutReportDict["Transaction Status"]="Refund"
        else:
            payoutReportDict["Transaction Status"]="Failed"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payoutReportDict


def fetching_usdt_transactions(each_usdt):
    usdtDict = {}
    try:
        usdtDict = {
        "id":str(each_usdt.id),
        "userName":each_usdt.userId.fullName,
        "createdOn":each_usdt.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y"),
        "transferType":each_usdt.transferType,
        "userType":each_usdt.userType,
        "transactionUniqueId":each_usdt.transactionUniqueId,
        "narration":each_usdt.narration,
        "orderId":each_usdt.orderId,
        "errorMessage":each_usdt.errorMessage,
        "amount":formatINR("{:.2f}".format(float(each_usdt.amount))),
        "grandTotal":formatINR("{:.2f}".format(float(each_usdt.grandTotal))),
        "previousBalance":formatINR("{:.2f}".format(float(each_usdt.previousBalance))),
        "currentBalance":formatINR("{:.2f}".format(float(each_usdt.currentBalance)))
        }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return usdtDict

def user_payin_balance_update(userId,amount,transfertype,transactionAPIId):
    userCurrentBalance=0
    userPreviousBalance=0
    transactionCurrentBalance=0
    transactionPreviousBalance=0
    data_status={'responseStatus':0,"userCurrentBalance":0,"userPreviousBalance":0,"transactionCurrentBalance":0,"transactionPreviousBalance":0,"result":""}
    try:
        if transfertype=="Credit":
            userbalance_queryset = Users.objects(id=str(userId)).modify(inc__walletBalance=float(amount),new=True)
            userCurrentBalance = userbalance_queryset.walletBalance
            userPreviousBalance = float(userCurrentBalance)-float(amount)

            payin_balance_queryset1 = PayinBalances.objects(userId=str(userId),transactionAPIId=str(transactionAPIId)).first()
            if payin_balance_queryset1:
                payin_balance_queryset = PayinBalances.objects(userId=str(userId),transactionAPIId=str(transactionAPIId)).modify(inc__currentBalance=float(amount),new=True)
                transactionCurrentBalance=payin_balance_queryset.currentBalance
                transactionPreviousBalance=float(transactionCurrentBalance)-float(amount)
                payin_balance_queryset.update(previousBalance=round(float(transactionPreviousBalance),2),updatedOn=datetime.datetime.now())
            else:
                payin_balance_save=PayinBalances(
                    transactionAPIId=str(transactionAPIId),
                    userId = str(userId),
                    previousBalance=0,
                    currentBalance=float(amount),
                    createdOn=datetime.datetime.now(),
                    status=1
                    ).save()
                transactionPreviousBalance=0
                transactionCurrentBalance=float(amount)
        else:
            userbalance_queryset = Users.objects(id=str(userId)).modify(dec__walletBalance=float(amount),new=True)
            userCurrentBalance = userbalance_queryset.walletBalance
            userPreviousBalance = float(userCurrentBalance)+float(amount)

            payin_balance_queryset1 = PayinBalances.objects(userId=str(userId),transactionAPIId=str(transactionAPIId)).first()
            if payin_balance_queryset1:
                payin_balance_queryset = PayinBalances.objects(userId=str(userId),transactionAPIId=str(transactionAPIId)).modify(dec__currentBalance=float(amount),new=True)
                transactionCurrentBalance=payin_balance_queryset.currentBalance
                transactionPreviousBalance=float(transactionCurrentBalance)+float(amount)
                payin_balance_queryset.update(previousBalance=round(float(transactionPreviousBalance),2),updatedOn=datetime.datetime.now())
            else:
                payin_balance_save=PayinBalances(
                    transactionAPIId=str(transactionAPIId),
                    userId = str(userId),
                    previousBalance=0,
                    currentBalance=-float(amount),
                    createdOn=datetime.datetime.now(),
                    status=1
                    ).save()
                transactionPreviousBalance=0
                transactionCurrentBalance=-float(amount)
        data_status['responseStatus']=1
        data_status['userCurrentBalance']=userCurrentBalance
        data_status['userPreviousBalance']=userPreviousBalance
        data_status['transactionPreviousBalance']=transactionPreviousBalance
        data_status['transactionCurrentBalance']=transactionCurrentBalance
    except Exception as e:
        app.logger.error(traceback.format_exc())
    finally:
        return data_status

def user_payout_balance_update(userId,amount,transfertype,transactionAPIId):
    userCurrentBalance=0
    userPreviousBalance=0
    transactionCurrentBalance=0
    transactionPreviousBalance=0
    data_status={'responseStatus':0,"userCurrentBalance":0,"userPreviousBalance":0,"transactionCurrentBalance":0,"transactionPreviousBalance":0,"result":""}
    try:
        if transfertype=="Credit":
            userbalance_queryset = Users.objects(id=str(userId)).modify(inc__payoutBalance=float(amount),new=True)
            userCurrentBalance = userbalance_queryset.payoutBalance
            userPreviousBalance = float(userCurrentBalance)-float(amount)

            payout_balance_queryset1 = PayoutBalances.objects(userId=str(userId),transactionAPIId=str(transactionAPIId)).first()
            if payout_balance_queryset1:
                payout_balance_queryset = PayoutBalances.objects(userId=str(userId),transactionAPIId=str(transactionAPIId)).modify(inc__currentBalance=float(amount),new=True)
                transactionCurrentBalance=payout_balance_queryset.currentBalance
                transactionPreviousBalance=float(transactionCurrentBalance)-float(amount)
                payout_balance_queryset.update(previousBalance=round(float(transactionPreviousBalance),2),updatedOn=datetime.datetime.now())
            else:
                payout_balance_save=PayoutBalances(
                    transactionAPIId=str(transactionAPIId),
                    userId = str(userId),
                    previousBalance=0,
                    currentBalance=float(amount),
                    createdOn=datetime.datetime.now(),
                    status=1
                    ).save()
                transactionPreviousBalance=0
                transactionCurrentBalance=float(amount)

            data_status['responseStatus']=1
            data_status['userCurrentBalance']=userCurrentBalance
            data_status['userPreviousBalance']=userPreviousBalance
            data_status['transactionPreviousBalance']=transactionPreviousBalance
            data_status['transactionCurrentBalance']=transactionCurrentBalance
            return data_status
        else:
            payout_balance_queryset1 = PayoutBalances.objects(userId=str(userId),transactionAPIId=str(transactionAPIId)).first()
            if payout_balance_queryset1:
                payout_balance_queryset = PayoutBalances.objects(userId=str(userId),transactionAPIId=str(transactionAPIId),currentBalance__gte=float(amount)).modify(dec__currentBalance=float(amount),new=True)
                if payout_balance_queryset==None:
                    return data_status
                transactionCurrentBalance=payout_balance_queryset.currentBalance
                transactionPreviousBalance=float(transactionCurrentBalance)+float(amount)
                payout_balance_queryset.update(previousBalance=round(float(transactionPreviousBalance),2),updatedOn=datetime.datetime.now())
                userbalance_queryset = Users.objects(id=str(userId),payoutBalance__gte=float(amount)).modify(dec__payoutBalance=float(amount),new=True)
                if userbalance_queryset==None:
                    return data_status

                userCurrentBalance = userbalance_queryset.payoutBalance
                userPreviousBalance = float(userCurrentBalance)+float(amount)
                
                data_status['responseStatus']=1
                data_status['userCurrentBalance']=userCurrentBalance
                data_status['userPreviousBalance']=userPreviousBalance
                data_status['transactionPreviousBalance']=transactionPreviousBalance
                data_status['transactionCurrentBalance']=transactionCurrentBalance
                return data_status
            else:
                return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return data_status
    

def fetching_document_details(each_document):
    document_dict = {}
    try:
        document_dict = {
        "id":str(each_document.id),
        "adminName":each_document.adminId.userName,
        "documentName":each_document.documentName,
        "documentContent":each_document.documentContent,
        "createdOn":each_document.createdOn.strftime("%d-%m-%Y %I:%M %p")
        }
        if each_document.status == 1:
            document_dict["actionText"]="Active"
        else:
            document_dict["actionText"]="Deactive"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return document_dict


def merchant_kyc_status(merchantId):
    data_status = {"responseStatus": 0, "merchantKycDetails": {}}
    kycStatus = False
    merchantKycDetails = {}

    try:
        merchant_queryset = Users.objects(id=str(merchantId), status=1).first()
        if merchant_queryset:
            merchant_kyc_queryset = UserKYC.objects(userId=str(merchantId)).first()
            if merchant_kyc_queryset:
                kycStatusList = [
                    merchant_kyc_queryset.panStatus,
                    merchant_kyc_queryset.bankStatus,
                    merchant_kyc_queryset.aadharStatus,
                    merchant_kyc_queryset.videoVerificationStatus,
                    merchant_kyc_queryset.agreementVerificationStatus
                ]
                kycStatus = all(status == "Approved" for status in kycStatusList)

                merchantKycDetails = {
                    "kycStatus": kycStatus,
                    "panStatus": merchant_kyc_queryset.panStatus,
                    "bankStatus": merchant_kyc_queryset.bankStatus,
                    "aadharStatus": merchant_kyc_queryset.aadharStatus,
                    "videoVerificationStatus": merchant_kyc_queryset.videoVerificationStatus,
                    "agreementVerificationStatus": merchant_kyc_queryset.agreementVerificationStatus
                }
                data_status["responseStatus"] = 1
                data_status["merchantKycDetails"] = merchantKycDetails
                return data_status
            else:
                data_status["responseStatus"] = 0
                data_status["merchantKycDetails"] = "KYC details not found"
        else:
            data_status["responseStatus"] = 0
            data_status["merchantKycDetails"] = "Merchant not found"
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["responseStatus"] = 0
        data_status["merchantKycDetails"] = "An error occurred"
    return data_status



def check_payout_velocity_rule_engine_conditions(merchantId,amount,accountNumber):
    data_status = {"responseStatus":1,"result":""}
    todayTotalBenificiaryTxnAmount = 0
    today_payout_benificiary_max_transactions_amount = 0
    payout_merchant_perminute_transactions_count = 0
    insufficient_balance_count = 0
    try:
        merchant_queryset = Users.objects(id=merchantId,status=1).first()
        if not merchant_queryset:
            data_status["result"]="Invaild merchant id!!"
            return data_status

        velocity_rule_engine_queryset = VelocityRuleEngine.objects(userId=merchantId).first()
        if not velocity_rule_engine_queryset:
            data_status["responseStatus"]=1
            data_status["result"]="This merchant is not available for the velocity rule engine. Please contact the admin."
            return data_status

        amount = float(amount)
        velocityMinTxnAmount = float(velocity_rule_engine_queryset.minTxnAmount)
        velocityMaxTxnAmount = float(velocity_rule_engine_queryset.maxTxnAmount)
        velocityMaxTxnsPerMinute = float(velocity_rule_engine_queryset.maxTxnsPerMinute)
        velocityNoOfFailsPerInsufficientBalance = float(velocity_rule_engine_queryset.noOfFailsPerInsuffcientBalance)
        velocityMaxTxnsPerBenificiary = float(velocity_rule_engine_queryset.maxTxnsPerBenificiary)
        velocityNoOfLoadsFunds = float(velocity_rule_engine_queryset.noOfFailsPerLoadFunds) # implemented later
        velocityMaxTxnsSameAmountPerHour = float(velocity_rule_engine_queryset.maxTxnsSameAmountPerHour)
        velocityNoOfFailsPerBenificiary = float(velocity_rule_engine_queryset.noOfFailsPerBenificiary)

        if amount < velocityMinTxnAmount:
            data_status["responseStatus"]=0
            data_status["result"] = "Please give minimum transaction amount is "+str(velocityMinTxnAmount)+" ."
            return data_status

        if amount > velocityMaxTxnAmount and velocityMaxTxnAmount > 0:
            data_status["responseStatus"]=0
            data_status["result"] = "Please give maximum transaction amount is "+str(velocityMaxTxnAmount)+" ."
            return data_status

        # Merchant Max Transactions Per Minute Code
        startDateTime = datetime.datetime.now()
        endDateTime = startDateTime + datetime.timedelta(minutes=1)
        payout_merchant_perminute_transactions_count = FundTransfers.objects(userId=merchantId,createdOn__gte=startDateTime,createdOn__lte=endDateTime).count()

        if velocityMaxTxnsPerMinute > payout_merchant_perminute_transactions_count:
            data_status["responseStatus"]=0
            data_status["result"]="Your maximum transactions per minute have been completed. Please try again after some time."
            return data_status

        # Today Max Transactions Benificary Code
        todayStartDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
        todayEndDate = datetime.datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)

        today_payout_benificiary_max_transactions_amount = FundTransfers.objects(userId=merchantId,createdOn__gte=todayStartDate,createdOn__lte=todayEndDate).sum("amount")

        todayTotalBenificiaryTxnAmount = float(amount)+float(today_payout_benificiary_max_transactions_amount)

        if velocityMaxTxnsPerBenificiary >= todayTotalBenificiaryTxnAmount:
            data_status["responseStatus"]=0
            data_status["result"]="Today your maximum transactions have been completed. Please try again after some time."
            return data_status

        # Merchant Max Transactions Same Amount Per Hour Code
        startDatePerHour = datetime.datetime.now()
        endDatePerHour = startDateTime + datetime.timedelta(hours=1)
        payout_merchant_perhour_transactions_amount = FundTransfers.objects(userId=merchantId,amount=amount,createdOn__gte=startDatePerHour,createdOn__lte=endDatePerHour).count()

        if velocityMaxTxnsSameAmountPerHour > payout_merchant_perhour_transactions_amount:
            data_status["responseStatus"]=0
            data_status["result"]="Your maximum same amount transactions per hour have been completed. Please try again after some time."
            return data_status

        # Merchant No Of Fails Per Benificiary Code
        today_payout_noof_fails_benificiary = FundTransfers.objects(userId=merchantId,accountNumber=accountNumber,createdOn__gte=todayStartDate,createdOn__lte=todayEndDate,status__in=[0,4]).count()
        if velocityNoOfFailsPerBenificiary > today_payout_noof_fails_benificiary:
            data_status["responseStatus"]=0
            data_status["result"]="Your benificiary account number excesseds maximum no of failed transactions."
            return data_status

        # Merchant No Of Fails Insufficient Balances Code
        insufficient_balance_count = InsufficientBalanceLogs.objects(userId=merchantId,createdOn__gte=todayStartDate,createdOn__lte=todayEndDate).count()
        if velocityNoOfFailsPerInsufficientBalance > insufficient_balance_count:
            data_status["responseStatus"]=0
            data_status["result"]="You have reached the number of insufficient balance transaction attempts."
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["responseStatus"]=0
        data_status["result"]="Unable to connect server!!"
    return data_status

############################################## This Code is Common for all Payin Callback Resonse ##################################################
def 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")
    statusCheckId = 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","")
    try:
        if pgOrderId:
            linkAmount=0
            order_queryset = WalletTransactions.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)
            # autoSettlement = order_queryset.paymentGatewayId.autoSettlement
            instantSettlement = order_queryset.instantSettlement
            settlementLimit = order_queryset.paymentGatewayId.settlementLimit
            print(instantSettlement,"instantSettlement in whebhook")
            print(settlementLimit,"settlementLimit")
            save_api_webhook_logs_table.update(userId=ObjectId(userId),transactionAPIId=ObjectId(paymentGateWayId),orderId=user_order_id)

            if order_queryset.platform == "link":
                payment_link_queryset = PaymentLinks.objects(id=str(order_queryset.paymentLinkId.id)).first()
                if payment_link_queryset:
                    paymentLinkId=str(payment_link_queryset.id)
                    linkAmount = payment_link_queryset.amount

            elif order_queryset.platform == "button":
                button_queryset = PaymentButtons.objects(id=str(order_queryset.PaymentButtonId.id)).first()
                if button_queryset:
                    PaymentButtonId=str(button_queryset.id)
                    linkAmount = button_queryset.amount
            elif order_queryset.platform == "page":
                page_queryset = Users.objects(id=str(order_queryset.paymentPageId.id)).first()
                if page_queryset:
                    paymentPageId=str(page_queryset.id)
                linkAmount = float(order_queryset.amount)
            else:
                linkAmount = float(order_queryset.amount)

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

            ################################################### Slab Calculation for Payin #########################################################################
            slabId=None
            commissionCharges={}
            paymentModeId=""
            subPaymentModeId=""
            transactionAmount=float(linkAmount)
            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)

                patternId = str(user_queryset.patternId.id)
                if paymentModeId!="" and subPaymentModeId!="" and paymentGateWayId!="" and patternId!="":
                    commissionCharges = slab_calculation_for_payin_merchant(linkAmount,paymentModeId,subPaymentModeId,patternId,instantSettlement)

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

            #######################################################################################################################################################

            if slabId:
                order_queryset.update(slabId = ObjectId(slabId))
            else:
                order_queryset.update(slabId = slabId)

            if paymentModeId!="":
                order_queryset.update(paymentModeId=ObjectId(paymentModeId))
            if subPaymentModeId!="":
                order_queryset.update(subPaymentModeId=ObjectId(subPaymentModeId))
                
            if transactionstatus == 1:
                if float(amount) == float(linkAmount) and order_queryset.status!=6:
                    status = 1
                else:
                    status = 6
                    errorMessage = "Insufficient amount credited!!"
                lorder_queryset = WalletTransactions.objects(pgOrderId=pgOrderId,status__nin=[5]).first()
                if lorder_queryset.status!=1 and status==1:
                    balanceResult=user_payin_balance_update(str(user_queryset.id),float(transactionAmount),"Credit",str(paymentGateWayId))
                    if balanceResult.get('responseStatus')==0:
                        data_status["result"]="Unable to connect with server. Please Try again."
                        return data_status


                    payinbalancelogs_queryset=PayinBalanceLogs(
                        transactionAPIId=str(paymentGateWayId),
                        userId=str(user_queryset.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()
                    lorder_queryset.update(status=status,payInResponseCallBackData=transactionData,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,grandTotal=round_last_digits(float(transactionAmount)),walletLog="Wallet Balance is added with the amount of " + str(amount) + ".",previousBalance=round_last_digits(float(balanceResult.get('userPreviousBalance'))),currentBalance=round_last_digits(float(balanceResult.get('userCurrentBalance'))),commissionCharges=commissionCharges,statusCheckId=statusCheckId,subPaymentModeId=ObjectId(subPaymentModeId),paymentModeId=ObjectId(paymentModeId))
                    if instantSettlement==True:
                        try:
                            instantsettlement=1
                            if float(settlementLimit)>0:
                                currentDateStart = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
                                currentDateEnd = currentDateStart.replace(hour=23, minute=59, second=59, microsecond=999999)
                                pg_wallet_transaction_sumamt = WalletTransactions.objects(paymentGatewayId=str(paymentGateWayId),status__in=[1,2],userType="user",creditType="Credit",createdOn__gte=currentDateStart,createdOn__lte=currentDateEnd).sum("amount")
                                print(pg_wallet_transaction_sumamt,"pg_wallet_transaction_sumamt")
                                if float(pg_wallet_transaction_sumamt)>=float(settlementLimit):
                                    instantsettlement=0
                            print(instantsettlement,"instantsettlement")
                            if instantsettlement==1:
                                settlement_response=merchant_payin_auto_settlement(str(user_queryset.id),str(lorder_queryset.id),str(paymentGateWayId))
                                print(settlement_response,"settlement_response")
                            pass
                        except Exception as e:
                            pass
                    try:
                        merchantName = str(user_queryset.fullName)
                        trnsactionDate = datetime.datetime.now().astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
                        mail_subject = "Funds Loaded to " + merchantName + " wallet from Graam Pay"
                        sender_mail_query = SenderMails.objects(status=1,mailType="Payin Transactions Mail").first()
                        mail_data = {
                        "merchantName":merchantName,
                        "amount":formatINR("{:.2f}".format(float(amount))),
                        "transactionId":str(transaction_id),
                        "paymentMode":payment_method,
                        "cardNumber":cardmasked,
                        "orderId":str(lorder_queryset.orderId),
                        "bankRefId":str(bank_ref_id),
                        "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 = [user_queryset.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:
                        siteTitle=str(lorder_queryset.siteTitle)
                        if user_queryset.parentId and commissionCharges.get("slabId") != None:
                            user_parent_payin_commission_details(str(user_queryset.parentId.id),amount,paymentGateWayId,transaction_id,paymentModeId,subPaymentModeId,commissionCharges.get("chargeAmount"),commissionCharges.get("chargeValue"),commissionCharges.get("chargeType"),str(user_queryset.id),float(commissionCharges.get("gstAmount")),float(commissionCharges.get("tdsAmount")),commissionCharges,str(lorder_queryset.id),siteTitle,instantSettlement)
                        else:
                            payment_gateway_commission_details(str(user_queryset.id),amount,paymentGateWayId,transaction_id,str(lorder_queryset.id),paymentModeId,subPaymentModeId,commissionCharges,siteTitle)
                        
                    except Exception as e:
                        app.logger.error(traceback.format_exc())
                        pass

                else:
                    order_queryset.update(status=status,payInResponseCallBackData=transactionData,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,grandTotal=round_last_digits(float(transactionAmount)),walletLog="Wallet Balance is added with the amount of " + str(amount) + ".",commissionCharges=commissionCharges,statusCheckId=statusCheckId,subPaymentModeId=ObjectId(subPaymentModeId),paymentModeId=ObjectId(paymentModeId))
            else:
                status=2
                if transactionstatus==0:
                    status=0
                elif transactionstatus==4:
                    status=4
                else:
                    status=2
                lorder_queryset = WalletTransactions.objects(pgOrderId=pgOrderId).first()
                if lorder_queryset.status==1:
                    
                    balanceResult=user_payin_balance_update(str(user_queryset.id),float(lorder_queryset.grandTotal),"Debit",str(paymentGateWayId))
                    if balanceResult.get('responseStatus')==0:
                        data_status["result"]="Unable to connect with server. Please Try again."
                        return data_status

                    payinbalancelogs_queryset=PayinBalanceLogs(
                        transactionAPIId=str(paymentGateWayId),
                        userId=str(user_queryset.id),
                        previousBalance=round_last_digits(float(balanceResult.get('transactionPreviousBalance'))),
                        currentBalance=round_last_digits(float(balanceResult.get('transactionCurrentBalance'))),
                        orderId=lorder_queryset.orderId,
                        amount=round_last_digits(float(amount)),
                        grandTotal=round_last_digits(float(transactionAmount)),
                        transferType="Debit",
                        userType="user",
                        transactionId=transaction_id,
                        createdOn=datetime.datetime.now(),
                        status=1
                        ).save()

                    rorderId = random_digit_generate(16)
                    wallet_transaction_table = WalletTransactions(
                        userId = str(user_queryset.id),
                        amount = round_last_digits(float(order_queryset.amount)),
                        grandTotal=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.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 = errorMessage,
                        paymentChannel = paymentChannel,
                        bankRefId=bank_ref_id,
                        cardmasked=cardmasked,
                        bankName=bankName,
                        pgOrderId=order_queryset.orderId,
                        walletTransactionId=str(order_queryset.id),
                        customerVpa=customer_vpa,
                        slabId=slabId,
                        subPaymentModeId=str(subPaymentModeId),
                        paymentModeId=str(paymentModeId),
                        paymentType=payment_method,
                        commissionCharges=commissionCharges,
                        instantSettlement=instantSettlement,
                        status = 5
                        ).save()
                    order_queryset.update(status=transactionstatus,payInResponseCallBackData=transactionData,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,grandTotal=round_last_digits(float(transactionAmount)),commissionCharges=commissionCharges,statusCheckId=statusCheckId,subPaymentModeId=ObjectId(subPaymentModeId),paymentModeId=ObjectId(paymentModeId))
                else:
                    order_queryset.update(status=transactionstatus,payInResponseCallBackData=transactionData,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,grandTotal=round_last_digits(float(transactionAmount)),commissionCharges=commissionCharges,statusCheckId=statusCheckId,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()
                    webhook_queryset = ApiSecurities.objects(apiType="payment_gateway",userId=str(user_queryset.id),status=1).first()
                    if webhook_queryset:
                        webhookURL = webhook_queryset.callBackUrl
                        if webhookURL:
                            headers = {'Content-Type': 'application/json'}
                            #payload = "responseStatus=1"+"&result="+errorMessage+"&responseBody="+requestData
                            payload = {
                            "responseStatus":1,
                            "result":errorMessage,
                            "responseBody":requestData
                            }
                            respnseData = requests.post(webhookURL, json=payload, headers=headers)
            data_status["responseStatus"] = 1
            data_status["result"] = "Pay In call back url was successful!"
            return data_status
        else:
            data_status["result"]="Required fields are missing!!"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to pay in call back url!!"
        return data_status

def merchant_payin_auto_settlement(userId,walletId,payInPaymentGatewayId):
    data_status={'responseStatus':0,"result":""}
    try:
        payins_settlement_merchant = WalletTransactions.objects(id=str(walletId),status=1,settlementStatus=1,paymentGatewayId=payInPaymentGatewayId,userType="user",userId=userId).first()
        grandtotal=0
        if payins_settlement_merchant:
            grandtotal=payins_settlement_merchant.grandTotal
            
        if float(grandtotal)<=0:
            data_status['result']="invalid Amount"
            return data_status
        merchant_queryset = Users.objects(id=userId,status=1).first()
        payOutPaymentGatewayId=None
        try:
            if merchant_queryset.patternId.payoutPaymentGatewayId:
                payOutPaymentGatewayId = str(merchant_queryset.patternId.payoutPaymentGatewayId.id)
        except Exception as e:
            pass
        
        amount = round(float(grandtotal),2)
        patternId = str(merchant_queryset.patternId.id)
        check_wallet_balance = round(float(merchant_queryset.walletBalance),2)
        if check_wallet_balance < amount:
            data_status['result']="No Payout option is available"
            return data_status

        # Settlement Functionality For Payin
        balanceResult=user_payin_balance_update(userId,amount,"Debit",payInPaymentGatewayId)
        if balanceResult.get('responseStatus')==0:
            data_status['result']="wallet balnce is not available"
            return data_status

        stringAmount = formatINR("{:.2f}".format(float(amount)))
        orderId = payins_settlement_merchant.orderId
        pgOrderId = payins_settlement_merchant.pgOrderId
        transactionUniqueId = payins_settlement_merchant.transactionId
        siteTitle = payins_settlement_merchant.siteTitle
        
        commenttext=""
        paymentGatewayName=""
        try:
            get_paymentgateway_queryset = TransactionAPI.objects(id=payInPaymentGatewayId).first()
            if get_paymentgateway_queryset:
                apiName = get_paymentgateway_queryset.apiName
            else:
                apiName = ""
            
            sender_mail_query = SenderMails.objects(status=1,mailType="Settlement Mail").first()
            sendermailsList = sender_mail_query.mailsList
            mail_subject = "Settlement for the transaction of "+str(grandtotal)
            recipients_list = sendermailsList # Replace 'email' with the recipient's email
            template_name = "emails/payin_settlement_mail.html"
            createdOn = datetime.datetime.now().astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
            commenttext="settlement amount "+stringAmount+" added for "+str(apiName)+" payment gateway on "+str(createdOn)
            settlementedRemark="settlement amount "+stringAmount+" added for "+str(apiName)+" payment gateway on "+str(createdOn)
            paymentGatewayName=apiName
            # Prepare the mail data with today's totals
            mail_data = {
                "adminName":"Admin",
                "merchantName":merchant_queryset.fullName,
                "startDate": createdOn,
                "endDate": createdOn,
                "paymentGatewayName":apiName,
                "total_amount":amount,
                "settlementedRemark":settlementedRemark
            }
            send_asynchronous_email(mail_subject, recipients_list, template_name, mail_data)
            print(mail_data, "((((((((((mail_data))))))))))")
        except Exception as e:
            app.logger.error(traceback.format_exc())
            pass 

        payinbalancelogs_queryset=PayinBalanceLogs(
            transactionAPIId=str(payInPaymentGatewayId),
            userId=str(userId),
            previousBalance=balanceResult.get('transactionPreviousBalance'),
            currentBalance=balanceResult.get('transactionCurrentBalance'),
            orderId=orderId,
            amount=round(float(amount),2),
            grandTotal=round(float(amount),2),
            transferType="Debit",
            userType="user",
            transactionId=transactionUniqueId,
            createdOn=datetime.datetime.now(),
            status=1
            ).save()

        wallet_credit_table = WalletTransactions(
            userId = str(userId),
            amount = round(float(amount),2),
            grandTotal = round(float(amount),2),
            patternId = patternId,
            creditType = "Debit",
            userType = "user",
            comment = commenttext,
            transactionId = transactionUniqueId,
            paymentGatewayId = str(payInPaymentGatewayId),
            paymentType = "wallet",
            createdOn = datetime.datetime.now(),
            previousBalance=balanceResult.get('userPreviousBalance'),
            currentBalance=balanceResult.get('userCurrentBalance'),
            remarks = "",
            orderId = orderId,
            pgOrderId = pgOrderId,
            customerName = merchant_queryset.fullName,
            customerEmail = merchant_queryset.email,
            customerPhonenumber = merchant_queryset.phoneNumber,
            agent = "",
            location = "",
            platform = "",
            paymentLink = "",
            errorMessage = commenttext,
            siteTitle = siteTitle,
            paymentChannel = str(paymentGatewayName),
            bankRefId = "",
            cardmasked = "",
            customerVpa = "",
            commissionCharges = {},
            status = 1
            )
        save_table = wallet_credit_table.save()
        payins_settlement_merchant.update(settlementStatus=2,settlementedTime=datetime.datetime.now(),settlementedRemark=settlementedRemark)

        # Settlement Functionality For Payout
        # balanceResult=user_payout_balance_update(str(userId),float(amount),"Credit",str(payOutPaymentGatewayId))

        userbalance_queryset = Users.objects(id=str(userId)).modify(inc__payoutBalance=float(amount),new=True)
        userCurrentBalance = userbalance_queryset.payoutBalance
        userPreviousBalance = float(userCurrentBalance)-float(amount)
        # if balanceResult.get('responseStatus')==0:
        #     flash("Unable to connect with server. Please Try again.")
        #     return redirect(url_for("admin_reports.payin_settlement"))

        fund_transfer_table = FundTransfers(
            userId = userId,
            amount = round(float(amount),2),
            grandTotal = round(float(amount),2),
            transferType = "Credit",
            userType = "admin",
            narration = commenttext,
            transactionUniqueId = transactionUniqueId,
            createdOn = datetime.datetime.now(),
            previousBalance=float(userPreviousBalance),
            currentBalance=float(userCurrentBalance),
            uniqueRequestNumber = "",
            beneficiaryName = merchant_queryset.fullName,
            beneficiaryMail = merchant_queryset.email,
            beneficiaryPhone = "",
            accountIFSCCode = "",
            fundTransferType = "admin",
            accountType = "",
            accountNumber = "",
            paymentMode = "wallet",
            bankBranch = "",
            bankName = "",
            errorMessage = commenttext,
            internalId = "",
            pgOrderId = pgOrderId,
            siteTitle = siteTitle,
            apiType = "web",
            merchantReferenceNumber = orderId,
            commissionCharges = {},
            status = 1
            )
        save_table = fund_transfer_table.save()
        if payOutPaymentGatewayId:
            save_table.update(transactionAPIId = ObjectId(payOutPaymentGatewayId))
        else:
            save_table.update(transactionAPIId = None)
        data_status['responseStatus']=1
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return data_status


def user_parent_payin_commission_details(userId,amount,transactionAPIId,transactionId,paymentModeId,subPaymentModeId,childCommissionAmount,childCommissionValue,childCommissionType,childUserId,childGstAmount,childTdsAmount,childCommissionCharges,tableId,siteTitle="",instantSettlement=False):
    try:
        commissionCharges = {}
        user_queryset = Users.objects(id=userId).first()
        if user_queryset:
            patternId=str(user_queryset.patternId.id)
            commissionCharges = slab_calculation_for_payin_merchant(amount,paymentModeId,subPaymentModeId,patternId,instantSettlement)
            print(commissionCharges,"((((((((((commissionCharges For Payin Parent Method))))))))))")
            slabId = None
            if commissionCharges.get("slabId") == None:
                slabId = None   
            else:
                slabId = commissionCharges.get("slabId")

            if slabId!=None:
                parentgstamount=0
                parenttdsamount=0
                parentcommissionamount=float(childCommissionAmount)-float(commissionCharges.get("chargeAmount"))
                if commissionCharges.get("gstAmount")>0:
                    parentgstamount=float(childGstAmount)-float(commissionCharges.get("gstAmount"))
                if commissionCharges.get("gstAmount")>0:
                    parenttdsamount=float(childTdsAmount)-float(commissionCharges.get("tdsAmount"))
                if parentcommissionamount>=0:
                    previousBalance = user_queryset.commissionBalance
                    currentBalance=float(previousBalance)+float(parentcommissionamount)
                    user_queryset.update(commissionBalance=currentBalance)

                    child_user_queryset = Users.objects(id=childUserId).first()
                    if child_user_queryset:
                        childUserName = child_user_queryset.fullName
                    else:
                        childUserName = "merchant"

                    user_commission_table = UserCommissions(
                        userId = str(user_queryset.id),
                        childUserId =childUserId,
                        slabId =slabId,
                        commissionfor ="Payin",
                        transferType="Credit",
                        comment= "Credited for the transaction of "+str(childUserName),
                        transactionId = transactionId,
                        transactionAPIId = transactionAPIId,
                        totalAmount = amount,
                        walletId = tableId,
                        siteTitle = siteTitle,
                        paymentModeId = paymentModeId,
                        subPaymentModeId = subPaymentModeId,
                        childCommissionValue=float(childCommissionValue),
                        childCommissionType=childCommissionType,
                        parrentSlabCommissionType = commissionCharges.get("chargeType"),
                        parrentSlabCommissionValue = float(commissionCharges.get("chargeValue")),
                        parrentCommissionType = commissionCharges.get("chargeType"),
                        parrentCommissionAmount = float(parentcommissionamount),
                        parentGstAmount = float(parentgstamount),
                        parentTdsAmount = float(parenttdsamount),
                        previousBalance = float(previousBalance),
                        currentBalance = float(currentBalance),
                        parentcommissionData=[commissionCharges],
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        ).save()
                    parentId=None
                    if user_queryset.parentId:
                        parentId=str(user_queryset.parentId.id)
                    if parentId!=None and commissionCharges.get("slabId")!=None:
                        print("(((((((((((ANOTHER PARENT Commission)))))))))))")
                        user_parent_payin_commission_details(str(parentId),amount,transactionAPIId,transactionId,paymentModeId,subPaymentModeId,commissionCharges.get("chargeAmount"),commissionCharges.get("chargeValue"),commissionCharges.get("chargeType"),str(user_queryset.id),float(commissionCharges.get("gstAmount")),float(commissionCharges.get("tdsAmount")),commissionCharges,tableId,siteTitle,instantSettlement)
                    else:
                        print("api1")
                        payment_gateway_commission_details(userId,amount,transactionAPIId,transactionId,tableId,paymentModeId,subPaymentModeId,commissionCharges,siteTitle)
                else:
                    print("api2")
                    payment_gateway_commission_details(userId,amount,transactionAPIId,transactionId,tableId,paymentModeId,subPaymentModeId,commissionCharges,siteTitle)
            else:
                print("api3")
                payment_gateway_commission_details(childUserId,amount,transactionAPIId,transactionId,tableId,paymentModeId,subPaymentModeId,childCommissionCharges,siteTitle)
        else:
            print("api4")
            payment_gateway_commission_details(childUserId,amount,transactionAPIId,transactionId,tableId,paymentModeId,subPaymentModeId,childCommissionCharges,siteTitle)
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False


def payment_gateway_commission_details(userId,amount,transactionAPIId,transactionId,tableId,paymentModeId,subPaymentModeId,childCommissionCharges,siteTitle):
    try:
        commissionCharges = {}
        user_queryset = Users.objects(id=userId).first()
        wallet_queryset = WalletTransactions.objects(id=tableId).first()
        transactionCommissionCharges={}
        createdOn=datetime.datetime.now()
        if wallet_queryset:
            transactionCommissionCharges=wallet_queryset.commissionCharges
            createdOn=wallet_queryset.createdOn
        current_date_str = createdOn.strftime("%Y-%m-%d")
        holidaytype=False
        holidy_qryset=HolidayDates.objects(holidayDate=current_date_str).first()
        if holidy_qryset:
            timings_list=holidy_qryset.holidayDateTimings
            checktime=check_timings(timings_list, createdOn)
            if checktime:
                holidaytype=True
        print("((((((((((holidaytype))))))))))",holidaytype)
        print("((((((((((userssssssss))))))))))",user_queryset.id)
        print("userssuserIdssssss",userId)
        print("userssssssss",user_queryset.patternId)
        if user_queryset:
            if user_queryset.patternId != None:
                patternId=str(user_queryset.patternId.id)
            else:
                patternId=None
            commissionCharges = slab_calculation_for_aggregator(amount,paymentModeId,subPaymentModeId,transactionAPIId,holidaytype)
            print(childCommissionCharges,"((((((((((childCommissionCharges))))))))))")
            print(commissionCharges,"((((((((((payment_gateway_commission_details))))))))))")
            slabId = None
            if commissionCharges.get("apiSlabId") == None:
                slabId = None   
            else:
                slabId = commissionCharges.get("apiSlabId")

            if slabId!=None:
                parentgstamount=0
                parenttdsamount=0
                childCommissionAmount=childCommissionCharges.get('chargeAmount')
                print("(((((childCommissionAmount )))))",childCommissionAmount)
                childGstAmount=childCommissionCharges.get('gstAmount')
                childTdsAmount=childCommissionCharges.get('tdsAmount')
                parentcommissionamount=float(childCommissionAmount)-float(commissionCharges.get("chargeAmount"))
                print("(((((parent commissions)))))",parentcommissionamount)
                if commissionCharges.get("gstAmount")>0:
                    parentgstamount=float(childGstAmount)-float(commissionCharges.get("gstAmount"))
                if commissionCharges.get("gstAmount")>0:
                    parenttdsamount=float(childTdsAmount)-float(commissionCharges.get("tdsAmount"))
                # if parentcommissionamount>=0:
                if user_queryset:
                    childUserName = user_queryset.fullName
                else:
                    childUserName = "merchant"

                company_commission_table = CompanyCommissions(
                    userId = str(user_queryset.id),
                    userPatternId = str(patternId),
                    slabId =slabId,
                    commissionfor ="Payin",
                    transferType="Credit",
                    comment= "Credited for the transaction of "+str(childUserName),
                    transactionId = transactionId,
                    paymentModeId = paymentModeId,
                    subPaymentModeId = subPaymentModeId,
                    walletId = tableId,
                    transactionAPIId = transactionAPIId,
                    totalAmount = amount,
                    siteTitle = siteTitle,
                    childCommissionCharges=childCommissionCharges,
                    aggregatorCommissionCharges=commissionCharges,
                    transactionCommissionCharges=transactionCommissionCharges,
                    commissionAmount=round(float(parentcommissionamount),2),
                    aggregatorCommissionAmount=round(float(commissionCharges.get('chargeAmount')),2),
                    createdOn = createdOn,
                    status = 1,
                    ).save()
                # else:
                #     print("eeelse 1")
                #     False
            else:
                print("eeelse 2")
                False
        else:
            print("eeelse 3")
            False
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False

###################################### This Code is Common For All Payout Call Back #####################################################################
def payout_webhook_call_back_update(callbackResponseData,save_api_webhook_logs_table):
    data_status = {"responseStatus":0,"result":""}
    pgOrderId = callbackResponseData.get("pgOrderId")
    statusCode = callbackResponseData.get("statusCode","")
    orderId = callbackResponseData.get("orderId","")
    message = callbackResponseData.get("message","")
    paymentMode = callbackResponseData.get("paymentMode","")
    amount = callbackResponseData.get("amount")
    transaction_date = callbackResponseData.get("transaction_date","")
    bank_reference_number = callbackResponseData.get("bank_reference_number","")
    batchNo = callbackResponseData.get("batchNo","")
    transaction_id = callbackResponseData.get("transaction_id","")

    transactionstatus = callbackResponseData.get("transactionstatus")
    statusText = callbackResponseData.get("statusText","")
    tablerecord = callbackResponseData.get("tablerecord","")
    print(tablerecord,"(((((((((tablerecord)))))))))")
    try:
        if tablerecord!="" and tablerecord=="thirdparty_without_save":
            respnseDict = {
            "transaction_reference_number":orderId,
            "pgOrderId":orderId,
            "status":statusText,
            "error_message":message,
            "bank_reference_number":bank_reference_number,
            "transaction_date":transaction_date,
            "batchNo":batchNo,
            "transaction_amount":amount,
            }

            third_party_queryset = ThirdPartyMerchants.objects(status=1)
            for each_user in third_party_queryset:
                trnIdentifier=""
                try:
                    if each_user.trnIdentifier:
                        trnIdentifier=str(each_user.trnIdentifier)
                except Exception as e:
                    trnIdentifier=""

                if trnIdentifier!="" and str(trnIdentifier) in str(orderId):
                    try:
                        if each_user.enablePayout==True:
                            webhookURL = str(each_user.payoutWebhook)
                            if webhookURL:
                                headers = {
                                    "accept": "application/json",
                                    "content-type": "application/json"
                                }
                                payload = {"responseStatus":1,"result":message,"responseBody":respnseDict}
                                respnseData = requests.post(webhookURL, json=payload, headers=headers)
                    except Exception as e:
                        app.logger.error(traceback.format_exc())
                        pass
                        
            return data_status
        elif tablerecord!="" and tablerecord=="thirdparty":
            print("HELLOOOOOO")
            fund_transfer_queryset = ThirdPartyFundTransfers.objects(pgOrderId=pgOrderId,status__nin=[5]).first()
            if not fund_transfer_queryset:
                data_status["result"]="Invalid order id!!"
                return data_status
            try:
                print(fund_transfer_queryset,"????????????")
                if fund_transfer_queryset.bulkFundtransferId:
                    thirdparty_bulk_fundtransfer_queryset = ThirdPartyBulkFundTransfers.objects(id=str(fund_transfer_queryset.bulkFundtransferId.id)).first()
                    if thirdparty_bulk_fundtransfer_queryset:
                        thirdparty_bulk_fundtransfer_queryset.update(BatchNumber=batchNo,status=1)
                    else:
                        pass
            except Exception as e:
                app.logger.error(traceback.format_exc())
                pass
            if tablerecord=="thirdparty":
                user_queryset = ThirdPartyMerchants.objects(id=str(fund_transfer_queryset.userId.id)).first()
                if not user_queryset:
                    data_status["result"]="Invalid Merchant id!!"
                    return data_status
                
            fundTransferUserId = str(fund_transfer_queryset.userId.id)
            transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id)
            fundTransferOrderId=str(fund_transfer_queryset.merchantReferenceNumber)
            if save_api_webhook_logs_table!=None:
                save_api_webhook_logs_table.update(userId=ObjectId(fundTransferUserId),transactionAPIId=ObjectId(transactionAPIId),orderId=fundTransferOrderId)

            payoutResponseCallBackData = []
            payoutResponseCallBackData = [callbackResponseData]
            if orderId:
                transactionUniqueId=orderId
            else:
                transactionUniqueId=fund_transfer_queryset.transactionUniqueId

            fund_transfer_queryset.update(transactionUniqueId=transactionUniqueId)

            prev_fund_transfer_queryset = ThirdPartyFundTransfers.objects(pgOrderId=pgOrderId,status__nin=[5]).first()
            previousstatus=prev_fund_transfer_queryset.status

            if bank_reference_number:
                bank_reference_number = bank_reference_number
            else:
                bank_reference_number = prev_fund_transfer_queryset.bankReferenceNumber

            print(transactionstatus,"(((((((((((transactionstatus)))))))))))")
            if transactionstatus==0 or transactionstatus==4:
                print("!!!!!!!!!!!!!!")
                getrefund_record=ThirdPartyFundTransfers.objects(transactionUniqueId=prev_fund_transfer_queryset.merchantReferenceNumber,userId=str(fund_transfer_queryset.userId.id)).count()
                if (previousstatus==1 or previousstatus==2) and getrefund_record==0:
                    print("@@@@@@@@@@@@@@")
                    userbalance_queryset = ThirdPartyMerchants.objects(id=str(fund_transfer_queryset.userId.id)).modify(inc__payoutBalance=float(fund_transfer_queryset.amount),new=True)
                    userCurrentBalance = userbalance_queryset.payoutBalance
                    userPreviousBalance = float(userCurrentBalance)-float(fund_transfer_queryset.amount)

                    merchantReferenceNumber=random_digit_generate(16)
                    refund_transfer_table = ThirdPartyFundTransfers(
                        userId=str(fund_transfer_queryset.userId.id),
                        transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id),
                        bankName=str(fund_transfer_queryset.bankName),
                        merchantReferenceNumber=merchantReferenceNumber,
                        transactionUniqueId=str(fund_transfer_queryset.merchantReferenceNumber),
                        pgOrderId='',
                        fundTransferType="instant",
                        accountType="bank",
                        fundTransferId=str(fund_transfer_queryset.id),
                        apiType="api",
                        transferType="Refund",
                        transactionData=payoutResponseCallBackData,
                        bankBranch=str(fund_transfer_queryset.bankBranch),
                        accountNumber=str(fund_transfer_queryset.accountNumber),
                        accountIFSCCode=str(fund_transfer_queryset.accountIFSCCode),
                        beneficiaryName=str(fund_transfer_queryset.beneficiaryName),
                        amount=str(fund_transfer_queryset.amount),
                        grandTotal=round(float(fund_transfer_queryset.grandTotal),2),
                        previousBalance = round(float(userPreviousBalance),2),
                        currentBalance = round(float(userCurrentBalance),2),
                        beneficiaryMail=str(fund_transfer_queryset.beneficiaryMail),
                        beneficiaryPhone=str(fund_transfer_queryset.beneficiaryPhone),
                        paymentMode=str(fund_transfer_queryset.paymentMode),
                        narration=str(fund_transfer_queryset.narration),
                        createdOn=datetime.datetime.now(),
                        bankReferenceNumber=bank_reference_number,
                        userType="user",
                        batchNumber=batchNo,
                        status=5
                        )
                    save_table = refund_transfer_table.save()
            if fund_transfer_queryset.responseCallBackTime:
                responseCallBackTime=fund_transfer_queryset.responseCallBackTime
            else:
                responseCallBackTime=datetime.datetime.now()

            print(transactionstatus,"$$$$$$$$$$$$$$$$$$")
            fund_transfer_queryset.update(
                payoutResponseCallBackData=payoutResponseCallBackData,
                responseCallBackTime=responseCallBackTime,
                bankReferenceNumber=bank_reference_number,
                batchNumber=batchNo,
                errorMessage=message,
                status=transactionstatus
                )
            if fund_transfer_queryset.apiType:
                respnseDict = {
                    "transaction_reference_number":orderId,
                    "pgOrderId":pgOrderId,
                    "status":statusText,
                    "error_message":message,
                    "bank_reference_number":bank_reference_number,
                    "merchant_reference_number":fund_transfer_queryset.merchantReferenceNumber,
                    "transaction_date":transaction_date,
                    "batchNo":batchNo,
                    "transaction_amount":amount,
                    }
                try:
                    if user_queryset.enablePayout==True:
                        webhookURL = str(user_queryset.payoutWebhook)
                        if webhookURL:
                            headers = {
                                "accept": "application/json",
                                "content-type": "application/json"
                            }
                            payload = {"responseStatus":1,"result":message,"responseBody":respnseDict}
                            respnseData = requests.post(webhookURL, json=payload, headers=headers)
                            print("merchant payout webhook success ----")
                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    pass
        else:
            fund_transfer_queryset = FundTransfers.objects(pgOrderId=pgOrderId,status__nin=[5]).first()
            if not fund_transfer_queryset:
                data_status["result"]="Invalid order id!!"
                return data_status

            print(pgOrderId,"(((((((pgOrderId)))))))")
            # clientmid = pgOrderId.split("-")
            # pgmerchant_id=clientmid[0]
            # pgmerchant_id = construct_mid(pgOrderId)
            # merchant_id=str(fund_transfer_queryset.userId.merchantUniqueNumber)
            userId = str(fund_transfer_queryset.userId.id)
            user_queryset = Users.objects(id=userId).first()
            if not user_queryset:
                data_status["result"]="Invalid Merchant id!!!"
                return data_status

            # if merchant_id!=pgmerchant_id:
            #     data_status["result"]="Invalid Merchant id!!!!"
            #     return data_status
                
            fundTransferUserId = str(fund_transfer_queryset.userId.id)
            transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id)
            fundTransferOrderId=str(fund_transfer_queryset.merchantReferenceNumber)

            try:
                if fund_transfer_queryset.bulkFundtransferId:
                    bulkFundtransferId = str(fund_transfer_queryset.bulkFundtransferId.id)
                    bulk_fundtransfer_queryset = BulkFundTransfers.objects(id=bulkFundtransferId).first()
                    if bulk_fundtransfer_queryset:
                        bulk_fundtransfer_queryset.update(BatchNumber=batchNo,status=1)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                pass
            if save_api_webhook_logs_table!=None:
                save_api_webhook_logs_table.update(userId=ObjectId(fundTransferUserId),transactionAPIId=ObjectId(transactionAPIId),orderId=fundTransferOrderId)

            payoutResponseCallBackData = []
            payoutResponseCallBackData = [callbackResponseData]
            if orderId:
                transactionUniqueId=orderId
            else:
                transactionUniqueId=fund_transfer_queryset.transactionUniqueId

            fund_transfer_queryset.update(transactionUniqueId=transactionUniqueId)

            prev_fund_transfer_queryset = FundTransfers.objects(pgOrderId=pgOrderId,status__nin=[5]).first()
            previousstatus=prev_fund_transfer_queryset.status

            if bank_reference_number:
                bank_reference_number = bank_reference_number
            else:
                bank_reference_number = prev_fund_transfer_queryset.bankReferenceNumber

            if transactionstatus==0 or transactionstatus==4:
                getrefund_record=FundTransfers.objects(transactionUniqueId=prev_fund_transfer_queryset.merchantReferenceNumber,userId=str(fund_transfer_queryset.userId.id)).count()
                if (previousstatus==1 or previousstatus==2) and getrefund_record==0:
                    
                    balanceResult=user_payout_balance_update(str(fund_transfer_queryset.userId.id),float(fund_transfer_queryset.grandTotal),"Credit",str(fund_transfer_queryset.transactionAPIId.id))
                    if balanceResult.get('responseStatus')==0:
                        data_status["result"]="Unable to connect to the server!!"
                        return data_status

                    merchantReferenceNumber=random_digit_generate(16)
                    if fund_transfer_queryset.slabId:
                        slabId = str(fund_transfer_queryset.slabId.id)
                    else:
                        slabId = None
                    refund_transfer_table = FundTransfers(
                        userId=str(fund_transfer_queryset.userId.id),
                        transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id),
                        bankId=None,
                        bankName=str(fund_transfer_queryset.bankName),
                        merchantReferenceNumber=merchantReferenceNumber,
                        transactionUniqueId=str(fund_transfer_queryset.merchantReferenceNumber),
                        pgOrderId='',
                        fundTransferType="instant",
                        accountType="bank",
                        fundTransferId=str(fund_transfer_queryset.id),
                        apiType="api",
                        slabId=slabId,
                        transferType="Refund",
                        transactionData=requestData,
                        bankBranch=str(fund_transfer_queryset.bankBranch),
                        accountNumber=str(fund_transfer_queryset.accountNumber),
                        accountIFSCCode=str(fund_transfer_queryset.accountIFSCCode),
                        beneficiaryName=str(fund_transfer_queryset.beneficiaryName),
                        uniqueRequestNumber=None,
                        amount=str(fund_transfer_queryset.amount),
                        grandTotal=round(float(fund_transfer_queryset.grandTotal),2),
                        previousBalance = round(float(balanceResult.get('userPreviousBalance')),2),
                        currentBalance = round(float(balanceResult.get('userCurrentBalance')),2),
                        beneficiaryMail=str(fund_transfer_queryset.beneficiaryMail),
                        beneficiaryPhone=str(fund_transfer_queryset.beneficiaryPhone),
                        paymentMode=str(fund_transfer_queryset.paymentMode),
                        narration=str(fund_transfer_queryset.narration),
                        createdOn=datetime.datetime.now(),
                        bankReferenceNumber=bank_reference_number,
                        commissionCharges=fund_transfer_queryset.commissionCharges,
                        userType="user",
                        batchNumber=batchNo,
                        status=5
                        )
                    save_table = refund_transfer_table.save()
                    payoutbalancelog_queryset=PayoutBalanceLogs(
                        userId =str(userquery_set.id),
                        transactionAPIId =str(fund_transfer_queryset.transactionAPIId.id),
                        previousBalance = round(float(balanceResult.get('transactionPreviousBalance')),2),
                        currentBalance = round(float(balanceResult.get('transactionCurrentBalance')),2),
                        amount=round(float(fund_transfer_queryset.amount),2),
                        grandTotal=round(float(fund_transfer_queryset.grandTotal),2),
                        orderId=merchantReferenceNumber,
                        transferType = "Refund",
                        userType = "user",
                        transactionId = str(fund_transfer_queryset.merchantReferenceNumber),
                        createdOn = datetime.datetime.now(),
                        status = 1
                        ).save()

            if fund_transfer_queryset.responseCallBackTime:
                responseCallBackTime=fund_transfer_queryset.responseCallBackTime
            else:
                responseCallBackTime=datetime.datetime.now()

            fund_transfer_queryset.update(
                payoutResponseCallBackData=payoutResponseCallBackData,
                responseCallBackTime=responseCallBackTime,
                bankReferenceNumber=bank_reference_number,
                errorMessage=message,
                batchNumber=batchNo,
                status=transactionstatus
                )
            if fund_transfer_queryset.apiType:
                respnseDict = {
                    "transaction_reference_number":orderId,
                    "pgOrderId":pgOrderId,
                    "status":statusText,
                    "error_message":message,
                    "bank_reference_number":bank_reference_number,
                    "merchant_reference_number":fund_transfer_queryset.merchantReferenceNumber,
                    "transaction_date":transaction_date,
                    "batchNo":batchNo,
                    "transaction_amount":amount,
                    }
                try:
                    webhook_queryset = WebHooks.objects(webhookType="payout",userId=str(fund_transfer_queryset.userId.id),status=1).first()
                    if webhook_queryset:
                        webhookURL = webhook_queryset.webhookLink
                        if webhookURL:
                            headers = {
                                "accept": "application/json",
                                "content-type": "application/json"
                            }
                            payload = {"responseStatus":1,"result":message,"responseBody":respnseDict}
                            print(payload,"wowpe payout api payload---- payload----")
                            respnseData = requests.post(webhookURL, json=payload, headers=headers)
                            print("merchant payout webhook success ----")
                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    pass
        data_status["responseStatus"] = 1
        data_status["result"] = "Payout call back url was successful!"
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get payout call back url data!!"
        return data_status

def fetching_commission_transaction_details(each_transaction):
    transactionDict = {}
    try:
        transactionDict = {
        "id":str(each_transaction.id),
        "userId":str(each_transaction.userId.id),
        "userName":each_transaction.userId.fullName,
        "transactionId":each_transaction.transactionId,
        "totalAmount":formatINR("{:.2f}".format(float(each_transaction.totalAmount))),
        "comment":each_transaction.comment,
        "transferType":each_transaction.transferType,
        "createdOn":each_transaction.createdOn.strftime("%d-%m-%Y %H:%M:%S %p"),
        "status":each_transaction.status
        }
        parcommList=[]
        parcommDict={}
        gstAmount=0
        tdsAmount=0
        # if each_transaction.parentcommissionData:
        #     parcommDict={
        #     "gstAmount": float(each_transaction.parentcommissionData[0].get('gstAmount')),
        #     "tdsAmount": float(each_transaction.parentcommissionData[0].get('tdsAmount')),
        #     }
        #     parcommList.append(parcommDict)

        #     # transactionDict["parentcommissionData"]=each_transaction.parentcommissionData
        # else:
            # parcommDict={
            # "gstAmount": float(gstAmount),
            # "tdsAmount": float(tdsAmount),
            # }
            # parcommList.append(parcommDict)

        parcommDict={
        "gstAmount": float(gstAmount),
        "tdsAmount": float(tdsAmount),
        }
        parcommList.append(parcommDict)

        transactionDict["parentcommissionData"]=parcommList

        if each_transaction.parrentCommissionAmount:
            transactionDict["parrentCommissionAmount"]=formatINR("{:.2f}".format(float(each_transaction.parrentCommissionAmount)))
        else:
            transactionDict["parrentCommissionAmount"]="0.00"
        
        if each_transaction.childCommissionValue:
            transactionDict["childCommissionValue"]=float(each_transaction.childCommissionValue)
        else:
            transactionDict["childCommissionValue"]=float(0)

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

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

        if each_transaction.parrentSlabCommissionValue:
            transactionDict["parrentSlabCommissionValue"]=float(each_transaction.parrentSlabCommissionValue)
        else:
            transactionDict["parrentSlabCommissionValue"]=float(0)

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

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

        if each_transaction.childUserId:
            transactionDict["childUserId"]=str(each_transaction.childUserId.id)
            transactionDict["childUserName"]=each_transaction.childUserId.fullName
        else:
            transactionDict["childUserId"]=""
            transactionDict["childUserName"]=""

        if each_transaction.slabId:
            transactionDict["slabId"]=str(each_transaction.slabId.id)
            if each_transaction.slabId.slabName:
                transactionDict["slabName"]=each_transaction.slabId.slabName
            else:
                transactionDict["slabId"]=""
                transactionDict["slabName"]=""
        else:
            transactionDict["slabId"]=""
            transactionDict["slabName"]=""

        if each_transaction.transactionAPIId:
            transactionDict["transactionAPIId"]=str(each_transaction.transactionAPIId.id)
            transactionDict["apiName"]=each_transaction.transactionAPIId.apiName
        else:
            transactionDict["transactionAPIId"]=""
            transactionDict["apiName"]=""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return transactionDict


def merchant_transaction_limit_settings(pgType,paymentGatewayId,userId,amount,fundTransferType="single"):
    data_status={"responseStatus":1,"result":"Success","singleTxnLowerLimit":0,"singleTxnUpperLimit":0}
    try:
        currentDateStart = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
        currentDateEnd = currentDateStart.replace(hour=23, minute=59, second=59, microsecond=999999)

        # Get first day of the current month
        first_day_of_month = currentDateStart.replace(day=1)

        # Get start time for the first day of the month
        current_month_start_time = first_day_of_month.replace(hour=0, minute=0, second=0, microsecond=0)

        print("Current Month First Day:", current_month_start_time)

        hasdata=0
        singleTxnLowerLimit = 0
        singleTxnUpperLimit = 0
        dailyTxnLimit = 0
        dailyTxnCount = 0
        monthlyTxnLimit = 0
        monthlyTxnCount = 0

        txn_limit_setting_queryset = TransactionLimitSettings.objects(pgType=pgType,paymentGatewayIds__in=[paymentGatewayId],isUserWise=True,userIds__in=[userId],status=1).first()
        if txn_limit_setting_queryset:
            hasdata=1
            singleTxnLowerLimit=float(txn_limit_setting_queryset.singleTxnLowerLimit)
            singleTxnUpperLimit=float(txn_limit_setting_queryset.singleTxnUpperLimit)
            dailyTxnLimit=float(txn_limit_setting_queryset.dailyTxnLimit)
            dailyTxnCount=int(txn_limit_setting_queryset.dailyTxnCount)
            monthlyTxnLimit=float(txn_limit_setting_queryset.monthlyTxnLimit)
            monthlyTxnCount=int(txn_limit_setting_queryset.monthlyTxnCount)
        else:
            all_users_txn_limit_setting_queryset = TransactionLimitSettings.objects(pgType=pgType,paymentGatewayIds__in=[paymentGatewayId],isUserWise=False,status=1).first()
            if all_users_txn_limit_setting_queryset:
                hasdata=1
                singleTxnLowerLimit=float(all_users_txn_limit_setting_queryset.singleTxnLowerLimit)
                singleTxnUpperLimit=float(all_users_txn_limit_setting_queryset.singleTxnUpperLimit)
                dailyTxnLimit=float(all_users_txn_limit_setting_queryset.dailyTxnLimit)
                dailyTxnCount=int(all_users_txn_limit_setting_queryset.dailyTxnCount)
                monthlyTxnLimit=float(all_users_txn_limit_setting_queryset.monthlyTxnLimit)
                monthlyTxnCount=int(all_users_txn_limit_setting_queryset.monthlyTxnCount)
        
        data_status['singleTxnLowerLimit']=singleTxnLowerLimit
        data_status['singleTxnUpperLimit']=singleTxnUpperLimit
        if hasdata==1:
            if fundTransferType != "bulk":
                if float(singleTxnLowerLimit) != 0 and float(singleTxnLowerLimit) > float(amount):
                    data_status["responseStatus"]=0
                    data_status["result"]="The amount must be greater than or equal to "+str(singleTxnLowerLimit)
                    return data_status

                if float(singleTxnUpperLimit) != 0 and float(singleTxnUpperLimit) < float(amount):
                    data_status["responseStatus"]=0
                    data_status["result"]="The amount must be less than or equal to "+str(singleTxnUpperLimit)
                    return data_status
            if float(dailyTxnLimit) != 0 or int(dailyTxnCount) != 0:
                if pgType == "Payin":
                    wallet_transaction_queryset = WalletTransactions.objects(paymentGatewayId=paymentGatewayId,userId=userId,status__in=[1,2],userType="user",creditType="Credit").order_by("-id")
                    daily_transaction_limit = wallet_transaction_queryset.filter(createdOn__gte=currentDateStart,createdOn__lte=currentDateEnd).sum("amount")
                    daily_transaction_count = wallet_transaction_queryset.filter(createdOn__gte=currentDateStart,createdOn__lte=currentDateEnd).count()
                else:
                    fund_transfer_queryset = FundTransfers.objects(transactionAPIId=paymentGatewayId,userId=userId,status__in=[1,2]).order_by("-id")
                    daily_transaction_limit = fund_transfer_queryset.filter(createdOn__gte=currentDateStart,createdOn__lte=currentDateEnd).sum("amount")
                    daily_transaction_count = fund_transfer_queryset.filter(createdOn__gte=currentDateStart,createdOn__lte=currentDateEnd).count()

                if int(dailyTxnLimit) != 0 and  float(dailyTxnLimit) <= (float(daily_transaction_limit)+float(amount)):
                    data_status["responseStatus"]=0
                    data_status["result"]="You have reached your daily transaction limit!!"
                    return data_status

                if int(dailyTxnCount) != 0 and int(dailyTxnCount) <= int(daily_transaction_count):
                    data_status["responseStatus"]=0
                    data_status["result"]="You have reached your daily transaction count!!"
                    return data_status

            if float(monthlyTxnLimit) != 0 or int(monthlyTxnCount) != 0:
                if pgType == "Payin":
                    wallet_transaction_queryset = WalletTransactions.objects(paymentGatewayId=paymentGatewayId,userId=userId,status__in=[1,2],userType="user",creditType="Credit").order_by("-id")
                    monthly_transaction_limit = wallet_transaction_queryset.filter(createdOn__gte=current_month_start_time,createdOn__lte=currentDateEnd).sum("amount")
                    monthly_transaction_count = wallet_transaction_queryset.filter(createdOn__gte=current_month_start_time,createdOn__lte=currentDateEnd).count()
                else:
                    fund_transfer_queryset = FundTransfers.objects(transactionAPIId=paymentGatewayId,userId=userId,status__in=[1,2]).order_by("-id")
                    monthly_transaction_limit = fund_transfer_queryset.filter(createdOn__gte=current_month_start_time,createdOn__lte=currentDateEnd).sum("amount")
                    monthly_transaction_count = fund_transfer_queryset.filter(createdOn__gte=current_month_start_time,createdOn__lte=currentDateEnd).count()

                if int(monthlyTxnLimit) != 0 and  float(monthlyTxnLimit) <= (float(monthly_transaction_limit)+float(amount)):
                    data_status["responseStatus"]=0
                    data_status["result"]="You have reached your monthly transaction limit!!"
                    return data_status

                if int(monthlyTxnCount) != 0 and int(monthlyTxnCount) <= int(monthly_transaction_count):
                    data_status["responseStatus"]=0
                    data_status["result"]="You have reached your monthly transaction count!!"
                    return data_status

            payment_gateway_queryset = TransactionAPI.objects(id=paymentGatewayId,status=1).first()
            today_wallet_txn_amount = WalletTransactions.objects(paymentGatewayId=paymentGatewayId,createdOn__gte=currentDateStart,createdOn__lte=currentDateEnd,status__in=[1,2],userType="user",creditType="Credit").sum("amount")
            print(payment_gateway_queryset.perdayTransactionLimit,"Perday TXN Limit")
            print(today_wallet_txn_amount,"Today Wallet TXN Amount")
            print(amount,"Amount")
            print(float(today_wallet_txn_amount)+float(amount),"Today TXN Amount Plus Amount")
            if float(payment_gateway_queryset.perdayTransactionLimit)>0 and (float(payment_gateway_queryset.perdayTransactionLimit) < float(today_wallet_txn_amount+amount)):
                data_status["responseStatus"]=0
                data_status["result"]="Service provider not available!!"
                return data_status
        else:
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return data_status

def admin_download_payin_settlement_csv_reports_data(startDate,endDate,payins_queryset):
    downloadPayinCSVReportsList = []
    relative_temp_csv_file_name = ""
    fileSize = 0
    try:
        start_date_str = startDate.strftime("%d-%m-%Y")
        end_date_str = endDate.strftime("%d-%m-%Y")

        fileName = f"payin_settlement_{start_date_str}_{end_date_str}.csv"

        for each_payin_report in payins_queryset:
            payinCSVReportDict = fetching_payin_settlement_admin_csv_download_reports(each_payin_report)
            downloadPayinCSVReportsList.append(payinCSVReportDict)

        fieldnames = [    'User Name',     'Amount',     'Payment Type',     'Credit Type',     'Transaction Id',     'Remarks',     'User Type',     'Comment',
        'Order Id',     'Customer Name',     'Customer Email',     'Customer Phone Number',     'Opening Balance',     'Closing Balance',     'Pg OrderId'
        ]

        # Define the base directory and the relative file path
        base_dir = os.path.join(app.config['SITE_ROOT'], "media/admin_reports","payin")
        relative_temp_csv_file_name = os.path.join("media/admin_reports","payin", fileName)

        # Ensure the base directory exists
        if not os.path.exists(base_dir):
            os.makedirs(base_dir)

        # Full file name for writing
        full_file_name = os.path.join(app.config['SITE_ROOT'], relative_temp_csv_file_name)
        with open(full_file_name, 'w', encoding='UTF8', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows(downloadPayinCSVReportsList)

        # fileSize = os.path.getsize(full_file_name)

        # return relative_temp_csv_file_name

        return send_file(
            app.config['SITE_ROOT']+"/"+relative_temp_csv_file_name,
            mimetype='text/csv',
            download_name=fileName,
            as_attachment=True
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return relative_temp_csv_file_name


def fetching_payin_settlement_admin_csv_download_reports(each_payin_report):
    payinReportDict = {}
    try:
        try:            
            payinReportDict["User Name"] = each_payin_report.userId.fullName if each_payin_report.userId.fullName else ""
        except Exception:
            payinReportDict["User Name"] = ""

        if each_payin_report.amount:
            payinReportDict["Amount"] = "{:.2f}".format(float(each_payin_report.amount))
        else:
            payinReportDict["Amount"] = ""

        try:
            payinReportDict["Payment Type"] = each_payin_report.paymentType if each_payin_report.paymentType else ""
        except Exception:
            payinReportDict["Payment Type"] = ""

        if each_payin_report.transactionId:
            payinReportDict["Transaction Id"] = str(each_payin_report.transactionId)
        else:
            payinReportDict["Transaction Id"] = ""

        if each_payin_report.remarks:
            payinReportDict["Remarks"] = each_payin_report.remarks
        else:
            payinReportDict["Remarks"] = ""

        try:
            payinReportDict["Credit Type"] = each_payin_report.creditType if each_payin_report.creditType else ""
        except Exception:
            payinReportDict["Credit Type"] = ""
        try:
            payinReportDict["User Type"] = each_payin_report.userType if each_payin_report.userType else "user"
        except Exception:
            payinReportDict["User Type"] = "user"

        if each_payin_report.comment:
            payinReportDict["Comment"] = each_payin_report.comment
        else:
            payinReportDict["Comment"] = ""

        if each_payin_report.orderId:
            payinReportDict["Order Id"] = str(each_payin_report.orderId)
        else:
            payinReportDict["Order Id"] = ""

        if each_payin_report.customerName:
            payinReportDict["Customer Name"] = each_payin_report.customerName
        else:
            payinReportDict["Customer Name"] = ""

        if each_payin_report.customerEmail:
            payinReportDict["Customer Email"] = each_payin_report.customerEmail
        else:
            payinReportDict["Customer Email"] = ""

        if each_payin_report.customerPhonenumber:
            payinReportDict["Customer Phone Number"] = each_payin_report.customerPhonenumber
        else:
            payinReportDict["Customer Phone Number"] = ""

        if each_payin_report.previousBalance:
            payinReportDict["Opening Balance"] = "{:.2f}".format(float(each_payin_report.previousBalance))
        else:
            payinReportDict["Opening Balance"] = 0.0


        if each_payin_report.currentBalance:
            payinReportDict["Closing Balance"] = "{:.2f}".format(float(each_payin_report.currentBalance))
        else:
            payinReportDict["Closing Balance"] = 0.0 
      
        try:
            payinReportDict["Pg OrderId"] = each_payin_report.pgOrderId if each_payin_report.pgOrderId else ""
        except Exception:
            payinReportDict["Pg OrderId"] = ""

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payinReportDict


def fetching_business_document_details(business_documents_queryset):
    business_document_dict = {}
    try:
        business_document_dict={
        "id":str(business_documents_queryset.id),
        "name":business_documents_queryset.name,
        "isRequired":business_documents_queryset.isRequired,
        }
        if business_documents_queryset.status==1:
            business_document_dict["actionText"] = "Active"
        else:
            business_document_dict["actionText"] = "Deactive"

        if business_documents_queryset.createdOn:
            business_document_dict["createdOn"] = business_documents_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            business_document_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return business_document_dict


def is_base64(s):
    try:
        # Try to decode the string
        base64.b64decode(s, validate=True)
        return True
    except Exception:
        return False

def admin_download_payout_settlement_csv_reports_data(startDate, endDate, payouts_queryset):
    downloadPayoutCSVReportsList = []
    relative_temp_csv_file_name = ""
    fileSize = 0
    print("payouts_queryset",len(payouts_queryset))
    try:
        start_date_str = startDate.strftime("%d-%m-%Y")
        end_date_str = endDate.strftime("%d-%m-%Y")

        fileName = f"payout_settlement_{start_date_str}_{end_date_str}.csv"

        # payouts_queryset = FundTransfers.objects(createdOn__gte=startDate, createdOn__lte=endDate, status__in=[0, 1, 2, 3, 4, 5]).order_by("-id").all()

        for each_payout_report in payouts_queryset:
            payoutCSVReportDict = fetching_payout_settlement_admin_csv_download_reports(each_payout_report)
            downloadPayoutCSVReportsList.append(payoutCSVReportDict)

        fieldnames = [
        "User Name", "Fund Transfer Type", "Account Number", "IFSC Code", "Beneficiary Name", "Beneficiary Mail", "Beneficiary Phone", 
        "Amount", "Grand Total", "Transaction Unique Id", "Opening Balance", "Closing Balance", "Transaction Date", "Transfer Type", 
        "User Type", "Comment", "Pg Order Id"
    ]

        # Define the base directory and the relative file path
        base_dir = os.path.join(app.config['SITE_ROOT'], "media/admin_reports", "payout")
        relative_temp_csv_file_name = os.path.join("media/admin_reports", "payout", fileName)

        # Ensure the base directory exists
        if not os.path.exists(base_dir):
            os.makedirs(base_dir)

        # Full file name for writing
        full_file_name = os.path.join(app.config['SITE_ROOT'], relative_temp_csv_file_name)
        with open(full_file_name, 'w', encoding='UTF8', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows(downloadPayoutCSVReportsList)

        # fileSize = os.path.getsize(full_file_name)

        return send_file(
            app.config['SITE_ROOT'] + "/" + relative_temp_csv_file_name,
            mimetype='text/csv',
            download_name=fileName,
            as_attachment=True
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return relative_temp_csv_file_name



def fetching_payout_settlement_admin_csv_download_reports(each_payout_report):
    payoutReportDict = {}
    print("payouts_queryseaaaaaaaaaaaat",each_payout_report.accountNumber)
    try:
        try:
            payoutReportDict["User Name"] = each_payout_report.userId.fullName if each_payout_report.userId and each_payout_report.userId.fullName else ""
        except Exception:
            payoutReportDict["User Name"] = ""

        try:
            payoutReportDict["Fund Transfer Type"] = each_payout_report.fundTransferType if each_payout_report.fundTransferType else ""
        except Exception:
            payoutReportDict["Fund Transfer Type"] = ""

        try:
            print("_________________________","account Number","ifsc",each_payout_report.accountIFSCCode,each_payout_report.accountNumber,"_++++++++++++++++")
            payoutReportDict["Account Number"] = each_payout_report.accountNumber if each_payout_report.accountNumber else ""
        except Exception:
            payoutReportDict["Account Number"] = ""

        try:
            payoutReportDict["IFSC Code"] = each_payout_report.accountIFSCCode if each_payout_report.accountIFSCCode else ""
        except Exception:
            payoutReportDict["IFSC Code"] = ""

        try:
            payoutReportDict["Beneficiary Name"] = each_payout_report.beneficiaryName if each_payout_report.beneficiaryName else ""
        except Exception:
            payoutReportDict["Beneficiary Name"] = ""

        try:
            payoutReportDict["Beneficiary Mail"] = each_payout_report.beneficiaryMail if each_payout_report.beneficiaryMail else ""
        except Exception:
            payoutReportDict["Beneficiary Mail"] = ""

        if each_payout_report.beneficiaryPhone:
            payoutReportDict["Beneficiary Phone"] = each_payout_report.beneficiaryPhone
        else:
            payoutReportDict["Beneficiary Phone"] = ""

        try:
            payoutReportDict["Amount"] = "{:.2f}".format(float(each_payout_report.amount)) if each_payout_report.amount else "0.0"
        except Exception:
            payoutReportDict["Amount"] = "0.0"

        try:
            payoutReportDict["Grand Total"] = "{:.2f}".format(float(each_payout_report.grandTotal)) if each_payout_report.grandTotal else "0.0"
        except Exception:
            payoutReportDict["Grand Total"] = "0.0"

        try:
            payoutReportDict["Transaction Unique Id"] = each_payout_report.transactionUniqueId if each_payout_report.transactionUniqueId else ""
        except Exception:
            payoutReportDict["Transaction Unique Id"] = ""

        try:
            payoutReportDict["Opening Balance"] = "{:.2f}".format(float(each_payout_report.previousBalance)) if each_payout_report.previousBalance else "0.0"
        except Exception:
            payoutReportDict["Opening Balance"] = "0.0"

        try:
            payoutReportDict["Closing Balance"] = "{:.2f}".format(float(each_payout_report.currentBalance)) if each_payout_report.currentBalance else "0.0"
        except Exception:
            payoutReportDict["Closing Balance"] = "0.0"

        try:
            payoutReportDict["Transaction Date"] = each_payout_report.createdOn.strftime("%d-%m-%Y %I:%M %p") if each_payout_report.createdOn else ""
        except Exception:
            payoutReportDict["Transaction Date"] = ""

        try:
            payoutReportDict["Transfer Type"] = each_payout_report.transferType if each_payout_report.transferType else ""
        except Exception:
            payoutReportDict["Transfer Type"] = ""

        try:
            payoutReportDict["User Type"] = each_payout_report.userType if each_payout_report.userType else "user"
        except Exception:
            payoutReportDict["User Type"] = "user"

        try:
            payoutReportDict["Comment"] = each_payout_report.errorMessage if each_payout_report.errorMessage else ""
        except Exception:
            payoutReportDict["Comment"] = ""

        try:
            payoutReportDict["Pg Order Id"] = each_payout_report.pgOrderId if each_payout_report.pgOrderId else ""
        except Exception:
            payoutReportDict["Pg Order Id"] = ""

    except Exception as e:
        app.logger.error(traceback.format_exc())
    
    return payoutReportDict




def admin_download_utility_transaction_csv_reports_data(startDate, endDate, utilities_queryset):
    downloadUtilityCSVReportsList = []
    relative_temp_csv_file_name = ""
    fileSize = 0
    try:
        start_date_str = startDate.strftime("%d-%m-%Y")
        end_date_str = endDate.strftime("%d-%m-%Y")

        fileName = f"utility_transaction_{start_date_str}_{end_date_str}.csv"

        # utilities_queryset = FundTransfers.objects(createdOn__gte=startDate, createdOn__lte=endDate, status__in=[0, 1, 2, 3, 4, 5]).order_by("-id").all()

        for each_utility_report in utilities_queryset:
            utilityCSVReportDict = fetching_utility_transaction_admin_csv_download_reports(each_utility_report)
            downloadUtilityCSVReportsList.append(utilityCSVReportDict)

        fieldnames = [
    "User Name", "Category Name", "Service Name", "Payment Type", "Payment Category", "Transaction Id", "Amount", "Total Amount", "IFSC Code", "Mobile Number", "Comment", "Transaction Date", "Account Number"
]


        # Define the base directory and the relative file path
        base_dir = os.path.join(app.config['SITE_ROOT'], "media/admin_reports", "utility")
        relative_temp_csv_file_name = os.path.join("media/admin_reports", "utility", fileName)

        # Ensure the base directory exists
        if not os.path.exists(base_dir):
            os.makedirs(base_dir)

        # Full file name for writing
        full_file_name = os.path.join(app.config['SITE_ROOT'], relative_temp_csv_file_name)
        with open(full_file_name, 'w', encoding='UTF8', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows(downloadUtilityCSVReportsList)

        return send_file(
            app.config['SITE_ROOT'] + "/" + relative_temp_csv_file_name,
            mimetype='text/csv',
            download_name=fileName,
            as_attachment=True
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return relative_temp_csv_file_name


def fetching_utility_transaction_admin_csv_download_reports(each_utility_report):
    utilityReportDict = {}
    try:
        try:
            utilityReportDict["User Name"] = each_utility_report.userId.fullName if each_utility_report.userId and each_utility_report.userId.fullName else ""
        except Exception:
            utilityReportDict["User Name"] = ""

        try:
            utilityReportDict["Category Name"] = each_utility_report.categoryName if hasattr(each_utility_report, 'categoryName') else ""
        except Exception:
            utilityReportDict["Category Name"] = ""

        try:
            utilityReportDict["Service Name"] = each_utility_report.serviceName if hasattr(each_utility_report, 'serviceName') else ""
        except Exception:
            utilityReportDict["Service Name"] = ""

        try:
            utilityReportDict["Payment Type"] = each_utility_report.paymentType if hasattr(each_utility_report, 'paymentType') else ""
        except Exception:
            utilityReportDict["Payment Type"] = ""

        try:
            utilityReportDict["Payment Category"] = each_utility_report.paymentCategory if hasattr(each_utility_report, 'paymentCategory') else ""
        except Exception:
            utilityReportDict["Payment Category"] = ""

        try:
            utilityReportDict["Transaction Id"] = each_utility_report.transactionId if each_utility_report.transactionId else ""
        except Exception:
            utilityReportDict["Transaction Id"] = ""

        try:
            utilityReportDict["Amount"] = "{:.2f}".format(float(each_utility_report.amount)) if each_utility_report.amount else 0.0
        except Exception:
            utilityReportDict["Amount"] = 0.0

        try:
            utilityReportDict["Total Amount"] = "{:.2f}".format(float(each_utility_report.totalAmount)) if each_utility_report.totalAmount else 0.0
        except Exception:
            utilityReportDict["Total Amount"] = 0.0

        try:
            utilityReportDict["IFSC Code"] = each_utility_report.ifscCode if each_utility_report.ifscCode else ""
        except Exception:
            utilityReportDict["IFSC Code"] = ""

        try:
            utilityReportDict["Mobile Number"] = each_utility_report.mobileNumber if each_utility_report.mobileNumber else ""
        except Exception:
            utilityReportDict["Mobile Number"] = ""

        try:
            utilityReportDict["Comment"] = each_utility_report.errorMessage if each_utility_report.errorMessage else ""
        except Exception:
            utilityReportDict["Comment"] = ""

        try:
            utilityReportDict["Transaction Date"] = each_utility_report.createdOn.strftime("%d-%m-%Y %I:%M %p") if each_utility_report.createdOn else ""
        except Exception:
            utilityReportDict["Transaction Date"] = ""

        try:
            utilityReportDict["Account Number"] = each_utility_report.accountNumber if each_utility_report.accountNumber else ""
        except Exception:
            utilityReportDict["Account Number"] = ""

    except Exception as e:
        app.logger.error(traceback.format_exc())
    
    return utilityReportDict


def construct_mid(input_id):
    constructed_id = ""
    try:
        # Remove the fixed 13 digits from the end for timestamp
        step1 = input_id[:-15]
        # Remove the first 2 characters "GP"
        extracted_id = step1[2:]
        # Construct the ID to 9 digits, starting with 'A' and filling with '0'
        constructed_id = 'M' + extracted_id.zfill(9)
        return constructed_id
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return constructed_id

def payuBillPayment(payload,headers):
    data_status={'responseStatus':0,"result":""}
    try:
        url = "https://nbc.payu.in/payu-nbc/v1/nbc/billpaymentrequest"
        print(url,"url")

        # payload = {
        # "paymentDetails": {
        #     "params": {
        #     "cardNumber": "4514570020769758",
        #     "authCode": "ABC123456"
        #     },
        #     "paymentMode": "CC"
        # },
        # "userDetails": {
        # "firstName": "Kunabilli Tirupathirao",
        # "phone": "9492844021",
        # "email": "thirupathirao57@gmail.com"
        # },
        # "isQuickPay": False,
        # "deviceDetails": {
        # "INITIATING_CHANNEL": "MOB",
        # "IP": "183.83.216.35",
        # "APP": "GraamPay",
        # "OS": "Android",
        # "IMEI": "754249835820316"
        # },
        # "additionalParams": { 
        # "agentTxnID": "agTXN123456" 
        # },
        # "customerParams": {
        # "Policy Number": "619477027",
        # "Email ID": "thirupathirao57@gmail.com",
        # "Date of Birth (DD/MM/YYYY)": "25/08/1990"
        # },
        # "agentId": "VFIPL20240222",
        # "billerId": "LIFE00000NATL6",
        # "paidAmount": 8412.1,
        # "paymentName": "TOTAL",
        # "timeStamp": "2024-08-30 16:36:37",
        # "refId": "67575648668448639639746764364552765",
        # "paymentRefID": "AB123456",
        # "pgName": "other"
        # }
        print(payload,"payload util")
        # headers = {
        # "content-type": "application/json",
        # "authorization": "Bearer 35ea0a7170ffbc576292578f5d2800bde37367841d3eb3391e23bbee3431e78a",
        # }

        payuresponse = requests.post(url, json=payload, headers=headers)
        print(payuresponse.text,"payuresponse.text")
        payuresponsedata = json.loads(payuresponse.text)
        print(payuresponsedata,"bbps payuresponsedata")
        data_status['responseStatus']=1
        data_status['result']=payuresponsedata
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        print(traceback.format_exc(),"Error")
        return data_status

def fetching_departmentUsers(departmentUsers_queryset):
    departmentUsers_dict = {}
    try:
        departmentUsers_dict={
        "id":str(departmentUsers_queryset.id),
        "userName":departmentUsers_queryset.userName,
        "mobileNumber":departmentUsers_queryset.mobileNumber,
        "password":departmentUsers_queryset.password,
        "email":departmentUsers_queryset.email,
        
        }
        try:
            if departmentUsers_queryset.GrievanceAdminId:
                
                departmentUsers_dict["GrievanceAdminId"]=str(departmentUsers_queryset.GrievanceAdminId.id)
                departmentUsers_dict["name"]=departmentUsers_queryset.GrievanceAdminId.name
            else:
                departmentUsers_dict["GrievanceAdminId"]=""
                departmentUsers_dict["name"]=""
        except Exception as e:
            departmentUsers_dict["GrievanceAdminId"]=""
            departmentUsers_dict["name"]=""

        if departmentUsers_queryset.departmentIdList:
            departmentUsers_dict["departmentIdList"]=[str(each_department.id) for each_department in departmentUsers_queryset.departmentIdList]
            departmentUsers_dict["departmentNamesList"]=[str(each_department.departmentName) for each_department in departmentUsers_queryset.departmentIdList]

            departmentUsers_dict["departmentName"] = ', '.join(departmentUsers_dict["departmentNamesList"])
        else:
            departmentUsers_dict["departmentIdList"]=[]
            departmentUsers_dict["departmentName"]=""



        if departmentUsers_queryset.status==1:
            departmentUsers_dict["actionText"] = "Active"
        else:
            departmentUsers_dict["actionText"] = "Deactive"
        if departmentUsers_queryset.createdOn:
            departmentUsers_dict["createdOn"] = departmentUsers_queryset.createdOn.strftime("%d-%m-%Y")
        else:
            departmentUsers_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return departmentUsers_dict


def fetching_departments(departments_queryset):
    departments_dict = {}
    try:
        departments_dict={
        "id":str(departments_queryset.id),
        "departmentName":departments_queryset.departmentName,
        "superiorName":departments_queryset.superiorName,
        }
        if departments_queryset.status==1:
            departments_dict["actionText"] = "Active"
        else:
            departments_dict["actionText"] = "Deactive"
        
        if departments_queryset.createdOn:
            departments_dict["createdOn"] = departments_queryset.createdOn.strftime("%d-%m-%Y")
        else:
            departments_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return departments_dict

def fetch_admin_details(admin_queryset):
    loginDict={}
    try:
        loginDict={
        "id":str(admin_queryset.id),
        "name":admin_queryset.name,
        "email":admin_queryset.email,
        "mobileNumber":admin_queryset.mobileNumber,
        "createdOn":admin_queryset.createdOn.astimezone(tzinfo),
        "status":admin_queryset.status
        }
        
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return loginDict

def verify_aadhar_number(aadhaar_number,aadhaar_name,verifyType,documentType,userId=""):
    data_status={"responseStatus":0,"result":""}
    if not aadhaar_number:
        data_status["result"] = "Required fields are missing!!"
        return data_status
    try:
        otpenabled=0
        apiRequestDataDict = {}
        assign_company_data= AssignKyc.objects(Q(documentNameList__icontains=verifyType) & Q(status__in=[1])).first()
        if assign_company_data:
            kycApiId=""
            kyc_api = assign_company_data.kycApiId
            if kyc_api:
                kycApiId=str(kyc_api.id)
                if kyc_api.code == "Signzy":
                    authorization = ""
                    base_url = ""

                    for each_key in kyc_api.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "authorization":
                            authorization=each_key.get("value")
                        if get_key == "base_url":
                            base_url=each_key.get("value")
                        
                    ###################### Axis Beneficiary Creation Functionality Code #####################################
                    aadharverifyDict = signzy_aadhaar_kyc(
                                        authorization=authorization,
                                        get_base_url=base_url,
                                        aadhaar_number =aadhaar_number
                                        )
                    apiRequestDataDict = {
                    "authorization":authorization,
                    "get_base_url":base_url,
                    "aadhaar_number" :aadhaar_number
                    }
                    ##########################################################################################################

                elif kyc_api.code == "Vayana":
                    otpenabled=1
                    client_secret = ""
                    client_key = ""
                    get_base_url=""
                    for each_key in kyc_api.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "client_key":
                            client_key=each_key.get("value")
                        if get_key == "client_secret":
                            client_secret=each_key.get("value")
                        if get_key == "get_base_url":
                            get_base_url=each_key.get("value")
                        
                    ###################### Atlas Company Verification #####################################
                    aadharverifyDict = vayana_aadhar_send_otp(
                                        get_base_url,
                                        client_key,
                                        client_secret,
                                        aadhaar_number,
                                        aadhaar_name
                    )
                    apiRequestDataDict = {
                    "client_secret":client_secret,
                    "get_base_url":get_base_url,
                    "client_key":client_key,
                    "aadhaar_name":aadhaar_name,
                    "aadhaar_number" :aadhaar_number
                    }
                    ###################### Atlas Company Verification #####################################
                else:
                    print(f"Unknown API ({kyc_api.apiName}) is assigned for Aadhaar.")
                    data_status["responseStatus"] = 0
                    data_status["result"] = "Api Provider not available"
                    return data_status

                ####################################### Charges Calculations & Saving data ##################################################
                aggregatorCharges,commissionCharges,overallCommissionAmount = kyc_api_charges_details(kycApiId,documentType)

                apiRequestData = [apiRequestDataDict]
                apiResponseData = [aadharverifyDict]
                verificationNumber = aadhaar_number

                saveThirdpartyApiChargesData = save_thirdparty_api_charges_data(userId,kycApiId,aggregatorCharges,commissionCharges,overallCommissionAmount,verificationNumber,"aadhar",apiRequestData,apiResponseData)
                ################################################################################################################################

                if aadharverifyDict.get('responseStatus')==1:
                    data_status['responseStatus']=1
                    data_status['otpenabled']=otpenabled
                    data_status['kycApiId']=kycApiId
                    data_status['result']=aadharverifyDict.get('result')
                    data_status['mobileNumber']=aadharverifyDict.get('mobileNumber')
                    data_status['accessKey']=aadharverifyDict.get('accessKey')
                    data_status['aadharResponseData']=aadharverifyDict.get('responseData')
                    return data_status
                else:
                    data_status["result"] = "Aadhar number not valid."
                    return data_status
            else:
                # Handle case when no API is assigned
                app.logger.error("No service provider enabled. ")
                data_status["result"] = "No service provider enabled."
                return data_status
        else:
            app.logger.error("No service provider enabled.")
            print("No service provider enabled.")
            data_status["result"] = "No service provider enabled!!"
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to verify aadhar Number!!"
        return data_status

def verify_aadhar_otp(aadhaar_number,aadhaar_name,accessKey,otpCode,kycApiId,documentType,userId=""):
    data_status={"responseStatus":0,"result":"","responseData":{}}
    if not aadhaar_number:
        data_status["result"] = "Required fields are missing!!"
        return data_status
    try:
        apiRequestDataDict = {}
        kyc_apis_querryset= kycApis.objects(id=str(kycApiId)).first()
        if kyc_apis_querryset:
            kycApiId=""
            kycApiId=str(kyc_apis_querryset.id)
            if kycApiId:
                if kyc_apis_querryset.code == "Vayana":
                    client_secret = ""
                    client_key = ""
                    get_base_url=""
                    for each_key in kyc_apis_querryset.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "client_key":
                            client_key=each_key.get("value")
                        if get_key == "client_secret":
                            client_secret=each_key.get("value")
                        if get_key == "get_base_url":
                            get_base_url=each_key.get("value")
                        
                    ###################### Atlas Company Verification #####################################
                    aadharverifyDict = vayana_aadhar_verify_otp(
                                        get_base_url,
                                        client_key,
                                        client_secret,
                                        aadhaar_number,
                                        aadhaar_name,
                                        otpCode,
                                        accessKey
                    )
                    apiRequestDataDict = {
                    "client_secret":client_secret,
                    "get_base_url":get_base_url,
                    "client_key":client_key,
                    "aadhaar_name":aadhaar_name,
                    "otpCode":otpCode,
                    "accessKey":accessKey,
                    "aadhaar_number" :aadhaar_number
                    }
                    ###################### Atlas Company Verification #####################################
                else:
                    print(f"Unknown API ({kyc_api.apiName}) is assigned for Aadhaar.")
                    data_status["responseStatus"] = 0
                    data_status["result"] = "Api Provider not available"
                    return data_status

                ####################################### Charges Calculations & Saving data ##################################################
                aggregatorCharges,commissionCharges,overallCommissionAmount = kyc_api_charges_details(kycApiId,documentType)

                apiRequestData = [apiRequestDataDict]
                apiResponseData = [aadharverifyDict]
                verificationNumber = aadhaar_number

                saveThirdpartyApiChargesData = save_thirdparty_api_charges_data(userId,kycApiId,aggregatorCharges,commissionCharges,overallCommissionAmount,verificationNumber,"AadharMobileMatch",apiRequestData,apiResponseData)
                ################################################################################################################################

                if aadharverifyDict.get('responseStatus')==1:
                    data_status['responseStatus']=1
                    data_status['aadharResponseData']=aadharverifyDict.get('responseData')
                    data_status['result']="otp Verified successfully"
                    return data_status
                else:
                    data_status["result"] = "Invalid Otp."
                    return data_status
            else:
                # Handle case when no API is assigned
                app.logger.error("No service provider enabled. ")
                data_status["result"] = "No service provider enabled."
                return data_status
        else:
            app.logger.error("No service provider enabled.")
            print("No service provider enabled.")
            data_status["result"] = "No service provider enabled!!"
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to verify aadhar Number!!"
        return data_status

def verify_individual_pan(panNumber,documentType,userId=""):
    data_status={"responseStatus":0,"result":"","apiResponse":{}}
    if not panNumber:
        data_status["result"] = "Required fields are missing!!"
        return data_status
    try:
        assign_company_data= AssignKyc.objects(Q(documentNameList__icontains="IndividualPan") & Q(status__in=[1])).first()
        apiRequestDataDict={}
        panKycResponseStatusDict={}
        if assign_company_data:
            kyc_api = assign_company_data.kycApiId
            kycApiId = str(kyc_api.id)
            if kyc_api:
                if kyc_api.code == "Signzy":
                    authorization = ""
                    base_url = ""

                    for each_key in kyc_api.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "authorization":
                            authorization=each_key.get("value")
                        if get_key == "base_url":
                            base_url=each_key.get("value")
                        
                    ###################### Axis Beneficiary Creation Functionality Code #####################################
                    panKycResponseStatusDict = signzy_individual_pan_kyc(
                                        authorization=authorization,
                                        get_base_url=base_url,
                                        pan_number =panNumber
                                        )
                    apiRequestDataDict = {
                    "authorization":authorization,
                    "get_base_url":base_url,
                    "pan_number" :panNumber
                    }
                    ##########################################################################################################

                elif kyc_api.code == "Vayana":
                    client_secret = ""
                    client_key = ""
                    get_base_url=""
                    for each_key in kyc_api.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "client_key":
                            client_key=each_key.get("value")
                        if get_key == "client_secret":
                            client_secret=each_key.get("value")
                        if get_key == "get_base_url":
                            get_base_url=each_key.get("value")
                        
                    ###################### Atlas Company Verification #####################################
                    panKycResponseStatusDict = vayana_individual_pan_kyc(
                                        get_base_url,
                                        client_key,
                                        client_secret,
                                        panNumber
                                        
                    )
                    apiRequestDataDict = {
                    "authorization":authorization,
                    "get_base_url":get_base_url,
                    "client_secret":client_secret,
                    "client_key":client_key,
                    "pan_number" :panNumber
                    }
                    ###################### Atlas Company Verification #####################################
                else:
                    print(f"Unknown API ({kyc_api.apiName}) is assigned for Aadhaar.")
                    data_status["responseStatus"] = 0
                    data_status["result"] = "Api Provider not available"
                    return data_status

                ####################################### Charges Calculations & Saving data ##################################################
                aggregatorCharges,commissionCharges,overallCommissionAmount = kyc_api_charges_details(kycApiId,documentType)

                apiRequestData = [apiRequestDataDict]
                apiResponseData = [panKycResponseStatusDict]
                verificationNumber = panNumber

                saveThirdpartyApiChargesData = save_thirdparty_api_charges_data(userId,kycApiId,aggregatorCharges,commissionCharges,overallCommissionAmount,verificationNumber,"IndividualPan",apiRequestData,apiResponseData)
                ################################################################################################################################

                if panKycResponseStatusDict.get("responseStatus") == 1:
                    data_status["responseStatus"] = 1
                    data_status["result"] = panKycResponseStatusDict.get("result")
                    data_status["name"] = panKycResponseStatusDict.get("name")
                    data_status["address"] = panKycResponseStatusDict.get("address")
                    data_status["panStatus"] = panKycResponseStatusDict.get("panStatus")
                    data_status["responseData"] = panKycResponseStatusDict.get("apiResponse")
                    data_status["isIndividual"] = panKycResponseStatusDict.get("isIndividual")
                    return data_status
                else:
                    data_status["responseStatus"] = 0
                    data_status["result"] = panKycResponseStatusDict.get("result")
                    data_status["apiResponse"] = panKycResponseStatusDict.get("apiResponse")
                    return data_status
            else:
                # Handle case when no API is assigned
                app.logger.error("No api is assigned for Company ")
                data_status["result"] = "Unable to verify Company  detailss!!"
                return data_status
        else:
            app.logger.error("Company  is not available in document list")
            print("Company is not found in any documentNameList.")
            data_status["result"] = "Unable to verify Company  detailss!!"
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to verify Company  detailss!!"
        return data_status

# def verify_bank_account(account_number,ifsc_code,account_name="",mobileNumber="",userId="",documentType):
def verify_bank_account(account_number, ifsc_code, documentType, accountHolderName="", mobileNumber="", userId=""):
    data_status={"responseStatus":0,"result":"","apiResponse":{}}
    if not account_number and ifsc_code:
        data_status["result"] = "Required fields are missing!!"
        return data_status
    try:
        apiRequestDataDict = {}
        assign_company_data= AssignKyc.objects(Q(documentNameList__icontains="Bank") & Q(status__in=[1])).first()
        if assign_company_data:
            kyc_api = assign_company_data.kycApiId
            kycApiId = str(assign_company_data.kycApiId.id)
            if kyc_api:
                if kyc_api.code == "Signzy":
                    authorization = ""
                    base_url = ""

                    for each_key in kyc_api.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "authorization":
                            authorization=each_key.get("value")
                        if get_key == "base_url":
                            base_url=each_key.get("value")
                        
                    ############################## Axis Beneficiary Creation Functionality Code ##############################
                    bankResponseStatusDict = signzy_bank_verification_kyc(
                                        authorization=authorization,
                                        get_base_url=base_url,
                                        beneficiaryAccount =account_number,
                                        beneficiaryIFSC =ifsc_code,
                                        beneficiaryMobile =mobileNumber,
                                        beneficiaryName =accountHolderName
                                        )
                    apiRequestDataDict = {
                    "authorization":authorization,
                    "get_base_url":base_url,
                    "beneficiaryAccount":account_number,
                    "beneficiaryIFSC":ifsc_code,
                    "beneficiaryMobile":mobileNumber,
                    "beneficiaryName":accountHolderName
                    }
                    ##########################################################################################################

                elif kyc_api.code == "Vayana":
                    client_secret = ""
                    client_key = ""
                    get_base_url=""
                    for each_key in kyc_api.paramsList:
                        get_key = each_key.get("key")
                        if get_key == "client_key":
                            client_key=each_key.get("value")
                        if get_key == "client_secret":
                            client_secret=each_key.get("value")
                        if get_key == "get_base_url":
                            get_base_url=each_key.get("value")
                        
                    ###################### Atlas Company Verification #####################################
                    bankResponseStatusDict = vayana_verify_bank_details(
                                        get_base_url,
                                        client_key,
                                        client_secret,
                                        account_number,
                                        ifsc_code
                    )
                    apiRequestDataDict = {
                    "get_base_url":get_base_url,
                    "client_key":client_key,
                    "client_secret":client_secret,
                    "account_number":account_number,
                    "ifsc_code":ifsc_code
                    }
                    ###################### Atlas Company Verification #####################################
                else:
                    print(f"Unknown API ({kyc_api.apiName}) is assigned for Aadhaar.")
                    data_status["responseStatus"] = 0
                    data_status["result"] = "Api Provider not available"
                    return data_status

                ####################################### Charges Calculations & Saving data ##################################################
                aggregatorCharges,commissionCharges,overallCommissionAmount = kyc_api_charges_details(kycApiId,documentType)

                apiRequestData = [apiRequestDataDict]
                apiResponseData = [bankResponseStatusDict]
                verificationNumber = account_number

                saveThirdpartyApiChargesData = save_thirdparty_api_charges_data(userId,kycApiId,aggregatorCharges,commissionCharges,overallCommissionAmount,verificationNumber,"bank",apiRequestData,apiResponseData)
                ################################################################################################################################
                
                if bankResponseStatusDict.get("responseStatus") == 1:
                    data_status["responseStatus"] = 1
                    data_status["result"] = bankResponseStatusDict.get("result")
                    data_status["nameMatch"] = bankResponseStatusDict.get("nameMatch")
                    data_status["bankRRN"] = bankResponseStatusDict.get("bankRRN")
                    data_status["apiResponse"] = bankResponseStatusDict.get("responseData")
                    data_status["beneficiaryName"] = bankResponseStatusDict.get("beneficiaryName")
                    return data_status
                else:
                    data_status["responseStatus"] = 0
                    data_status["result"] = bankResponseStatusDict.get("result")
                    
                    return data_status
            else:
                # Handle case when no API is assigned
                app.logger.error("No api is assigned for Company ")
                data_status["result"] = "Unable to verify Company  detailss!!"
                return data_status
        else:
            app.logger.error("Company  is not available in document list")
            print("Company is not found in any documentNameList.")
            data_status["result"] = "Unable to verify Company  detailss!!"
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to verify Company  detailss!!"
        return data_status

def name_match_check(name1, name2,scorecheck=0.8):
    data_status = {"responseStatus": 0, "result": ""}
    print("(((((((((((((((((request.json)))))))))))))))))",request.json)
    name_match_queryset = AssignKyc.objects(Q(documentNameList__icontains="NameMatch") & Q(status__in=[1])).first()
    # name_match_queryset = AssignKyc.objects(status__in=[1]).first()
    if name_match_queryset:
        nameMAtchResponseStatusDict={}
        kyc_api = name_match_queryset.kycApiId
        if kyc_api:
            if kyc_api.code == "Signzy":
                authorization = ""
                base_url = ""
                for each_key in kyc_api.paramsList:
                    get_key = each_key.get("key")
                    if get_key == "authorization":
                        authorization=each_key.get("value")
                    if get_key == "base_url":
                        base_url=each_key.get("value")
                    
                ###################### Signzy Beneficiary Creation Functionality Code #####################################
                nameMAtchResponseStatusDict = signzy_name_match_check_kyc(base_url, authorization, name1, name2)
                ##########################################################################################################

            else:
                print(f"Unknown API ({kyc_api.apiName}) is assigned for Pan.")
                data_status["responseStatus"] = 0
                data_status["result"] = nameMAtchResponseStatusDict.get("result")
                return data_status
            if nameMAtchResponseStatusDict.get("responseStatus") == 1 and float(nameMAtchResponseStatusDict.get("name_match_score"))>=0.8:
                data_status["responseStatus"] = 1
                data_status["result"] = nameMAtchResponseStatusDict.get("result")
                data_status["name_match_score"] = nameMAtchResponseStatusDict.get("name_match_score")
                return data_status
            else:
                data_status["responseStatus"] = 0
                data_status["result"] = "Given names not matched"
                return data_status
        else:
            # Handle case when no API is assigned
            app.logger.error("No api is assigned for Pan")
            data_status["result"] = "Unable to verify Pan detailss!!"
            return data_status
    else:
        # Handle case when no API is assigned
        app.logger.error("No api is assigned for Pan")
        data_status["result"] = "Unable to verify Pan detailss!!"
        return data_status

def slab_calculation_for_payin_api_dynamic(amount,paymentModeId,subPaymentModeId):
    data_status = {"responseStatus": 0, "result": "cannot get paymentID"}
    commissionCharges = {}
    total_min_charges = 0
    min_charge = 0  # Use infinity (float)
    min_transactionApi_id = ""
    min_dict={"responseStatus": 0}
    try:
        if amount and paymentModeId and subPaymentModeId:
            transaction_api_queryset = TransactionAPI.objects(status=1,transactionType="PaymentGateway").order_by("-id")

            checkedAtleastOneCharge = False 

            for each_txn_query in transaction_api_queryset:
                total_charges = 0
                commissionCharges={}
                transactionAmount = float(amount)
                startAmount = 0
                endAmount = 0
                chargeType = ""
                chargeValue = 0
                chargeAmount = 0
                gstAmount = 0
                tdsAmount = 0
                gstInclude = ""
                tdsInclude = ""
                priceType = ""
                gstValue = 0
                tdsValue = 0
                priceType=""
                slabId=None
                slab_queryset = ApiSetupChargeCommissions.objects(transactionAPIIdsList__in=[each_txn_query.id],paymentModeIdsList__in=[paymentModeId],subPaymentModeIdsList__in=[subPaymentModeId],holidayPrice=False).first()
                if slab_queryset:
                    
                    slabId=str(slab_queryset.id)
                    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"))

                    else:
                        chargeType = slab_queryset.chargeType
                        chargeValue = float(slab_queryset.chargeValue)

                    if chargeValue > 0:
                        
                        if chargeType=="FLAT":
                            chargeAmount=chargeValue
                        else:
                            chargeAmount = (float(amount)*float(chargeValue))/100
                            
                        total_charges= float(total_charges) + float(chargeAmount)
                        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)
                            total_charges= float(total_charges) + float(gstAmount)

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

                    
                    if (total_min_charges >  total_charges and total_charges > 0)  or total_min_charges == 0:
                        print(str(each_txn_query.apiName),"apiName")
                        print(str(each_txn_query.id),"id")
                        checkedAtleastOneCharge = True
                        total_min_charges = total_charges
                        min_transactionApi_id = str(each_txn_query.id)
            if not checkedAtleastOneCharge:
                min_dict={"responseStatus": 0,"result":"Charges have not been set"}
                return min_dict
            min_dict={
                    "min_transactionApi_id": min_transactionApi_id,
                    "total_min_charges": total_min_charges,
                    "responseStatus": 1
                }
            print(min_dict,"min_dict")
            return min_dict
        else:
            data_status["result"] = "required fields are missing!!!"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return min_dict

def check_transaction_availability(current_datetime, transactionType):
    day_of_week = current_datetime.strftime("%a").lower()  # Gets 'mon', 'tue', 'wed', etc.
    available_timings_queryset = AvailableTimings.objects(transactionType=transactionType).first()
    if not available_timings_queryset:
        return {"responseStatus": 0, "result": "Invalid TransactionType"}

    if not available_timings_queryset.isEnabled:
        return {"responseStatus": 0, "result": "Transaction type is currently disabled"}

    current_date_str = current_datetime.strftime("%Y-%m-%d")
    for each_override in available_timings_queryset.overridesDatesList:
        if current_date_str == each_override["overrideDate"]:
            if check_timings(each_override["timingsList"], current_datetime):
                return {"responseStatus": 0, "result": "Transaction cannot be performed at this time due to an override exclusion."}

    day_enabled_key = f"{day_of_week}Enabled"
    day_timings_list_key = f"{day_of_week}AvailableTimingsList"
    if not getattr(available_timings_queryset, day_enabled_key, True):
        return {"responseStatus": 0, "result": f"Transactions are not enabled on {day_of_week.capitalize()}s."}

    if not check_timings(getattr(available_timings_queryset, day_timings_list_key, []), current_datetime):
        return {"responseStatus": 0, "result": "transactions are not allowed at current time."}
    
    return {"responseStatus": 1, "result": "Transaction available within regular timings."}

def check_timings(timings_list, current_datetime):
    """Check if current datetime is within any fromTime to toTime in overrides"""
    for timing in timings_list:
        if "fromTime" in timing and "toTime" in timing:
            from_time_dt = datetime.datetime.strptime(timing["fromTime"], "%H:%M").replace(year=current_datetime.year, month=current_datetime.month, day=current_datetime.day)
            to_time_dt = datetime.datetime.strptime(timing["toTime"], "%H:%M").replace(year=current_datetime.year, month=current_datetime.month, day=current_datetime.day)
            if from_time_dt <= current_datetime <= to_time_dt:
                return True
    return False

def dynamic_profile_switch(current_date,existing_pattern):
    dataStatus = {"responseStatus": 0,"result": ""}
    day_of_week = current_date.strftime("%a").lower()  # Gets 'mon', 'tue', 'wed', etc.
    profile_switch_queryset = ProfileSwitch.objects(status=1).first()
    if not profile_switch_queryset:
        dataStatus["result"] ="Invalid Profile Switch Data"
        return dataStatus


    current_date_str = current_date.strftime("%Y-%m-%d")

    for each_override in profile_switch_queryset.overridesProfileList:
        if current_date_str == each_override["overrideDate"]:
            profile_switch_response =  switch_profile(each_override["overrideList"], current_date,existing_pattern)
            if profile_switch_response.get("responseStatus") == 1:
                dataStatus["existingProfile"] = profile_switch_response.get("existingProfile","")
                dataStatus["NewProfile"] = profile_switch_response.get("NewProfile","")
                dataStatus["result"] = "switch available based on override date"
                dataStatus["responseStatus"] = 1
                return dataStatus

    day_enabled_key = f"{day_of_week}Enabled"
    day_default_enable = f"{day_of_week}DefaultEnable"
    day_profile_list = f"{day_of_week}ProfileList"
    if not getattr(profile_switch_queryset, day_enabled_key, False):
        dataStatus["result"] =  "day is not enabled to switch"
        return dataStatus

    if getattr(profile_switch_queryset, day_default_enable, True):
        dataStatus["result"] =  "default profile is enabled"
        return dataStatus
    
    profile_switch_response_new =  switch_profile(getattr(profile_switch_queryset, day_profile_list), current_date,existing_pattern)
    if profile_switch_response_new.get("responseStatus") == 1:
        dataStatus["existingProfile"] = profile_switch_response_new.get("existingProfile","")
        dataStatus["NewProfile"] = profile_switch_response_new.get("NewProfile","")
        dataStatus["result"] = "switch based on day"
        dataStatus["responseStatus"] = 1
        return dataStatus
    
    return dataStatus

def switch_profile(overrideList,current_date,existing_pattern):
    switchDict={"responseStatus": 0}
    if len(overrideList)< 0:
        return switchDict
    for each_sub_rec in overrideList:
        if each_sub_rec["defaultProfile"] == str(existing_pattern):
            switchDict = {
                "responseStatus": 1,
                "existingProfile": each_sub_rec["defaultProfile"],
                "NewProfile": each_sub_rec["applicableProfile"]
            }
    return switchDict
    

def payout_balance_check(apiId):
    data_status={"responseStatus":0,"result":"","balance":0}
    balance=0
    try:
        api_queryset = TransactionAPI.objects(id=apiId).first()
        if not api_queryset:
            data_status['result']="invalid Request."
            return data_status
        if api_queryset.code == "AccurePay_Payout":
            for each_key in api_queryset.paramsList:
                get_key = each_key.get("key")        
                if get_key == "api_key":
                    apiKeyValue = each_key.get("value")
                    
                if get_key == "salt":
                    saltValue = each_key.get("value")

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

            hashData = {
            "api_key":apiKeyValue
            }
            hashValue = Sha512Hash(hashData,saltValue)

            headers = {'Content-Type': 'application/x-www-form-urlencoded'}
            payload = "api_key="+apiKeyValue+"&hash="+hashValue
            respnseData = requests.post(baseUrl+"/fundtransfer/getbalance", data=payload, headers=headers)
            response_text = respnseData.text
            response_json = json.loads(response_text)
            if "data" in response_json:
                balance = response_json["data"].get("balance")
                admin_balance_queryset = AdminPayoutBalances.objects(apiTransactionId=apiId).first()
                if admin_balance_queryset:
                    admin_balance_queryset.update(currentBalance=float(balance),previousBalance=float(admin_balance_queryset.currentBalance),createdOn=datetime.datetime.now())
                else:
                    save_admin_payout_balance_table=AdminPayoutBalances(
                        apiTransactionId=apiId,
                        previousBalance=0,
                        currentBalance=float(balance),
                        createdOn=datetime.datetime.now(),
                        status=1
                        ).save()

                data_status['responseStatus']=1
                data_status['balance']=float(balance)
                data_status['result']="success"
                return data_status
            else:
                data_status['result']="Unable to get payout balance!!"
                return data_status

        elif api_queryset.code == "WowPe_Payout":
            dynamicClientId = ""
            dynamicSecret = ""
            wowpePayoutLiveURL = ""

            for each_key in api_queryset.paramsList:
                get_key = each_key.get("key")        
                if get_key == "api_key":
                    dynamicClientId = each_key.get("value").strip()
                if get_key == "secret_key":
                    dynamicSecret = each_key.get("value").strip()
                if get_key == "base_url":
                    wowpePayoutLiveURL = each_key.get("value").strip()

            requestBody = {
            "clientid":dynamicClientId,
            "secretKey":dynamicSecret
            }

            headers = {
                "accept": "application/json",
                "content-type": "application/json"
            }
            url = wowpePayoutLiveURL+"/balance"

            response = requests.post(url, json=requestBody,headers=headers)
            wowpeResponseData = json.loads(response.text)
            if not wowpeResponseData:
                data_status['result']="Unable to get payout balance!!"
                return data_status

            balance = wowpeResponseData.get("balance")
            admin_balance_queryset = AdminPayoutBalances.objects(apiTransactionId=apiId).first()
            if admin_balance_queryset:
                admin_balance_queryset.update(currentBalance=float(balance),previousBalance=float(admin_balance_queryset.currentBalance),createdOn=datetime.datetime.now())
            else:
                save_admin_payout_balance_table=AdminPayoutBalances(
                    apiTransactionId=apiId,
                    previousBalance=0,
                    currentBalance=float(balance),
                    createdOn=datetime.datetime.now(),
                    status=1
                    ).save()

            data_status['responseStatus']=1
            data_status['balance']=float(balance)
            data_status['result']="success"
            return data_status

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

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

            currentBalanceDict = idfc_get_payout_account_balance(debitAcountNumber,source,kid,aud_url,client_id,auth_url,grant_type,scope,client_assertion_type,secretKey)
            if currentBalanceDict.get("responseStatus") == 1:
                availableBalance = currentBalanceDict.get("availableBalance")
                accountNumber = currentBalanceDict.get("accountNumber")
                admin_balance_queryset = AdminPayoutBalances.objects(apiTransactionId=apiId).first()
                if admin_balance_queryset:
                    admin_balance_queryset.update(currentBalance=float(availableBalance),previousBalance=float(admin_balance_queryset.currentBalance),createdOn=datetime.datetime.now())
                else:
                    save_admin_payout_balance_table=AdminPayoutBalances(
                        apiTransactionId=apiId,
                        previousBalance=0,
                        currentBalance=float(availableBalance),
                        createdOn=datetime.datetime.now(),
                        status=1
                        ).save()
                data_status['responseStatus']=1
                data_status['balance']=float(availableBalance)
                data_status['result']="success"
                return data_status
            else:
                data_status['result']="Unable to get payout balance!!"
                return data_status
        elif api_queryset.code == "Axis_Payout":
            client_id = ""
            client_secret = ""
            get_api_key=""
            channelId=""
            serviceRequestId=""
            corpCode=""
            serviceRequestVersion=""
            get_base_url=""
            corp_account_number=""

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


            requestUUID = str(random_digit_generate(15))

            ########################################################## Axis Payout Fundtransfer Functionality Code #######################################################
            currentBalanceDict = axis_payout_get_account_balance(client_id, client_secret, get_api_key, channelId, get_base_url, requestUUID, serviceRequestId, serviceRequestVersion, corpCode, corp_account_number)
            ################################################################################################################################################################
            if currentBalanceDict.get("responseStatus") == 1:
                availableBalance = currentBalanceDict.get("availableBalance")
                admin_balance_queryset = AdminPayoutBalances.objects(apiTransactionId=apiId).first()
                if admin_balance_queryset:
                    admin_balance_queryset.update(currentBalance=float(availableBalance),previousBalance=float(admin_balance_queryset.currentBalance),createdOn=datetime.datetime.now())
                else:
                    save_admin_payout_balance_table=AdminPayoutBalances(
                        apiTransactionId=apiId,
                        previousBalance=0,
                        currentBalance=float(availableBalance),
                        createdOn=datetime.datetime.now(),
                        status=1
                        ).save()
                data_status['responseStatus']=1
                data_status['balance']=float(availableBalance)
                data_status['result']="success"
                return data_status
            else:
                data_status['result']="Unable to get payout balance!!"
                return data_status       
        else:
            data_status['result']="Unable to get payout balance!!"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to get payout balance!!")
        data_status['result']="Unable to get payout balance!!"
        return data_status



# def generate_otp_helper():
#     response = {"responseStatus": 0, "result": "", "otpCheckId": ""}
#     try:
#         admin_id = session.get("adminId")
#         if not admin_id:
#             response["result"] = "Invalid User."
#             return response
 
#         admin_queryset = SuperAdmin.objects(id=str(admin_id), status=1).first()
#         if not admin_queryset:
#             response["result"] = "Invalid Admin User."
#             return response
 
#         # user_queryset = Users.objects(id=userId,status__in=[1]).first()
#         phone_number = admin_queryset.phoneNumber
#         # userName = user_queryset.fullName
#         otpType = "Verify_OTP"
#         sms_response = send_sms(phone_number, otpType)
 
#         if sms_response.get("responseStatus") != 1:
#             response["result"] = "Failed to send OTP."
#             return response
 
#         otp_code = sms_response.get("otp")
 
#         if not otp_code:
#             response["result"] = "OTP not received from SMS function."
#             return response
 
#         otp_record = OtpChecks(
#             adminId=str(admin_id),
#             phoneNumber=str(phone_number),
#             otpCode=str(otp_code),  
#             attempts=0,
#             status=0,
#             createdOn=datetime.datetime.now()
#         ).save()
 
#         print(f"OTP Generated: {otp_code} for Admin ID: {admin_id}")
 
#         response.update({
#             "responseStatus": 1,
#             "otpCheckId": str(otp_record.id),
#             "result": "OTP generated successfully."
#         })
#         return response
 
#     except Exception as e:
#         print(traceback.format_exc())
#         response["result"] = "Unable to generate OTP."
#         return response

# def verify_otp_helper(otp_check_id, otp_code):
#     response = {"responseStatus": 0, "result": ""}

#     try:
#         admin_id = session.get("adminId")
#         if not admin_id:
#             response["result"] = "Invalid User."
#             return response

#         print(f"🔹 Checking OTP: {otp_code} for OTP ID: {otp_check_id} and Admin ID: {admin_id}")

#         # Fetch OTP record
#         otp_check = OtpChecks.objects(
#             adminId=str(admin_id), id=str(otp_check_id), status=0  # Only check unverified OTPs
#         ).first()

#         if otp_check:
#             print(f"Found OTP Record: {otp_check.otpCode}, Attempts: {otp_check.attempts}")

#             if otp_check.otpCode == otp_code:
#                 otp_check.modify(status=1, attempts=otp_check.attempts + 1, createdOn=datetime.datetime.now())  # Mark OTP as verified
#                 response["responseStatus"] = 1
#                 response["result"] = "OTP verified successfully!"
#                 return response
#             else:
#                 otp_check.modify(attempts=otp_check.attempts + 1)  # Increment attempts
#                 response["result"] = "Invalid OTP. Please try again."
#                 return response
#         else:
#             response["result"] = "Invalid OTP or OTP already used/expired."
#             return response

#     except Exception as e:
#         print(traceback.format_exc())
#         response["result"] = "Unable to verify OTP."
#         return response





# OTP Generation Helper Function
# def generate_otp_helper():
#     response = {"responseStatus": 0, "result": "", "otpCheckId": ""}

#     try:
#         user_id = request.args.get("userId")
#         admin_id = session.get("adminId")

#         phone_number = None
#         otp_owner = None  # Store reference to User or Admin
#         user_name = None 
#         is_admin = False  # Track if the OTP is for an admin

#         if user_id:
#             try:
#                 user_queryset = Users.objects(id=ObjectId(user_id)).first()
#                 if not user_queryset:
#                     response["result"] = "Invalid User. No user found with the given userId."
#                     return response

#                 phone_number = user_queryset.phoneNumber
#                 otp_owner = user_queryset
#                 user_name = user_queryset.fullName  
#                 is_admin = False  

#             except Exception:
#                 response["result"] = "Invalid User ID format."
#                 return response

#         else:
#             if not admin_id:
#                 response["result"] = "Invalid User. userId or adminId is missing."
#                 return response

#             try:
#                 admin_queryset = SuperAdmin.objects(id=ObjectId(admin_id)).first()
#                 if not admin_queryset:
#                     response["result"] = "Invalid Admin. No admin found with the given adminId."
#                     return response

#                 phone_number = admin_queryset.phoneNumber
#                 otp_owner = admin_queryset
#                 user_name = admin_queryset.userName 
#                 is_admin = True  

#             except Exception:
#                 response["result"] = "Invalid Admin ID format."
#                 return response

        
#         if not user_name or is_admin:  # If it's an admin, set userName 
#             user_name = "Admin" if is_admin else "User"

       
#         sms_response = send_sms(phone_number, "Verify_OTP", userName=user_name)

#         if sms_response.get("responseStatus") != 1:
#             response["result"] = "Failed to send OTP."
#             return response

#         # OTP from send_sms
#         otp_code = str(sms_response.get("otp"))

        
#         otp_record = OtpChecks(
#             userId=otp_owner if isinstance(otp_owner, Users) else None,
#             adminId=otp_owner if isinstance(otp_owner, SuperAdmin) else None,
#             phoneNumber=str(phone_number),
#             otpCode=otp_code, 
#             attempts=0,
#             status=0,  
#             createdOn=datetime.datetime.now()
#         ).save()

#         response.update({
#             "responseStatus": 1,
#             "otpCheckId": str(otp_record.id),
#             "userName": user_name,
#             "otpCode": otp_code, 
#             "result": "OTP generated successfully."
#         })
#         return response

#     except Exception as e:
#         print(traceback.format_exc())
#         response["result"] = f"Unable to generate OTP. Error: {str(e)}"
#         return response


# def verify_otp_helper(otp_check_id, otp_code):
#     response = {"responseStatus": 0, "result": ""}

#     try:
#         try:
#             otp_check_obj_id = ObjectId(otp_check_id)
#         except Exception:
#             response["result"] = "Invalid OTP Check ID format."
#             return response

#         # Query `OtpChecks`
#         otp_check = OtpChecks.objects(id=otp_check_obj_id, status=0).first()

#         if otp_check:
#             # Retrieve userName dynamically
#             user_name = "User"
#             if otp_check.userId:
#                 user_name = otp_check.userId.fullName
#             elif otp_check.adminId:
#                 user_name = otp_check.adminId.userName

#             if otp_check.otpCode == otp_code:
#                 otp_check.modify(status=1, attempts=otp_check.attempts + 1)
#                 response["responseStatus"] = 1
#                 response["result"] = "OTP verified successfully!"
#                 response["userName"] = user_name
#                 return response
#             else:
#                 otp_check.modify(attempts=otp_check.attempts + 1)
#                 response["result"] = "Invalid OTP. Please try again."
#                 return response
#         else:
#             response["result"] = "Invalid OTP or OTP already used/expired."
#             return response

#     except Exception as e:
#         print(traceback.format_exc())
#         response["result"] = f"Unable to verify OTP. Error: {str(e)}"
#         return response




# OTP Generation Helper Function
def generate_otp_helper(mail_type="",defaultVerificationId=None,otpCheckId="",send_type=""):
    response = {"responseStatus": 0, "result": "", "otpCheckId": ""}
    adminId = session.get("adminId")
    try:
        mobile_numbers = ""
        emailId = ""
        recipients_list = []
        if mail_type == "Profile Edititng":
            user_email = session.get("user_email")
            if user_email:
                recipients_list.append(user_email)
        else:
            mail_type_query = SenderMails.objects(status=1, mailType=mail_type).first()
            
            if not mail_type_query:
                response["result"] = f"No email configuration found for {mail_type}."
                return response

            mobile_numbers = ','.join(mail_type_query.mobileNumber) if mail_type_query.mobileNumber else ""
            emailId = ','.join(mail_type_query.mailsList) if mail_type_query.mailsList else ""
            recipients_list = mail_type_query.mailsList if mail_type_query.mailsList else []

        if not mobile_numbers and not recipients_list:
            response["result"] = f"No recipients found for {mail_type} OTP delivery."
            return response

        # Set user_name to "User" statically
        user_name = "User"
        
        otp_code= random.randint(100000, 999999)

        if mobile_numbers:
            # Send OTP via SMS
            sms_response = send_sms(mobile_numbers, "Verify_OTP", userName=user_name)

            if sms_response.get("responseStatus") != 1:
                response["result"] = f"Failed to send OTP via SMS for {mail_type}."
                return response

            otp_code = str(sms_response.get("otp"))
            # Store OTP record
        if not defaultVerificationId:
            defaultVerificationId=""
        if send_type == "resend_otp":
            otp_record = OtpChecks.objects(id=str(otpCheckId), status__in=[0, 3, 4]).first()
            
            if not otp_record:
                response["result"] = "OTP record not found"
                return response
            
            if otp_record.status == 3:
                response["responseStatus"] = 2
                response["result"] = "resend otp expired please generate new otp"
                return response
            
            if otp_record.status == 4:
                response["responseStatus"] = 2
                response["result"] = "Resend limit exceeded. OTP expired."
                return response

            if (otp_record.resendCount or 0) >= 5:
                otp_record.status = 4  # Resend Expired
                otp_record.save()
                response["responseStatus"] = 2
                response["result"] = "Resend limit exceeded. OTP expired."
                return response

            otp_record.otpCode = str(otp_code)
            otp_record.resendCount += 1
            otp_record.save()

        else:
            otp_record = OtpChecks(
                adminId=adminId,
                phoneNumber=mobile_numbers,
                emailId=emailId,
                otpCode=str(otp_code),
                attempts=0,
                status=0,
                resendCount = 0,
                createdOn=datetime.datetime.now(),
                defaultVerificationField=defaultVerificationId
            )
            otp_record.save()

# Now it's safe to use `otp_record` here
# Example: send_otp(otp_record.otpCode)

            
        
        # Send OTP via email
        if recipients_list:
            mail_subject = f"OTP Verification Code for {mail_type}"
            template_name = "emails/generate_verify_otp.html"
            mail_data = {
                "otpCode": str(otp_code),
                "userName": user_name  # Pass "User" as the static name in email data
            }
            print(f"Sending email with data: {mail_data}")  # Debugging log
            send_asynchronous_email(mail_subject, recipients_list, template_name, mail_data)

        response.update({
            "responseStatus": 1,
            "otpCheckId": str(otp_record.id),
            "userName": user_name,
            # "otpCode": otp_code,
            "result": f"OTP generated and sent successfully for {mail_type}."
        })
        print("response",response)
        return response

    except Exception as e:
        print(traceback.format_exc())
        response["result"] = f"Unable to generate OTP for {mail_type}. Error: {str(e)}"
        return response

# OTP Verification Helper Function
def verify_otp_helper(otp_check_id, otp_code,defaultVerificationId=None):
    response = {"responseStatus": 0, "result": ""}

    try:
        otp_check_obj_id = ObjectId(otp_check_id)
        if defaultVerificationId:
            otp_check = OtpChecks.objects(id=otp_check_obj_id,defaultVerificationField=defaultVerificationId, status__in=[0, 3]).first()
        else:
            otp_check = OtpChecks.objects(id=otp_check_obj_id, status__in=[0, 3]).first()

        if not otp_check:
            print("OTP Not Found or Already Used")
            response["result"] = "Invalid OTP or OTP already used/expired."
            return response
        
        if otp_check.status == 3:
            response["responseStatus"] = 2
            response["result"] = "Otp Expired"
            return response

        print(f"OTP Found: {otp_check.otpCode} (Attempts: {otp_check.attempts})")

        if otp_check.attempts >= 3:
            otp_check.modify(status=3,attempts=otp_check.attempts + 1)
            response["responseStatus"] = 2
            response["result"] = "Otp Expired"
        else:

            if str(otp_check.otpCode).strip() == str(otp_code).strip():
                otp_check.modify(status=1, attempts=otp_check.attempts + 1)
                print("OTP Verified Successfully!")
                response["responseStatus"] = 1
                response["otp_check_id"] = otp_check_id
                response["result"] = "OTP verified successfully!"
            else:
                otp_check.modify(attempts=otp_check.attempts + 1)
                print("Invalid OTP Entered")
                response["result"] = "Invalid OTP. Please try again."

        return response

    except Exception as e:
        print("Exception Occurred:", traceback.format_exc())
        response["result"] = f"Unable to verify OTP. Error: {str(e)}"
        return response


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

    requestDataDict.update({"hash_value": hash_value})
    try:
        if paymentMode.lower() == "credit card":
            if not ccnum and not ccname and not ccvv and not ccexpmon and not ccexpyr :
                data_status["result"] = "Required fields are missing for card!!"
                return data_status
            
            enforce_paymethod="creditcard"
            requestDataDict.update({
                "ccnum": ccnum,
                "ccname": ccname,
                "ccvv": ccvv,
                "ccexpmon": ccexpmon,
                "ccexpyr": ccexpyr,
                "pg": "CC",
                "bankcode": card_type
            })
        elif paymentMode.lower() == "debit card":
            if not ccnum and not ccname and not ccvv and not ccexpmon and not ccexpyr :
                data_status["result"] = "Required fields are missing for card!!"
                return data_status

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

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

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

        data_status["responseStatus"] = 1
        data_status["result"] = requestDataDict
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to verify bank detailss!!"
        return data_status


def fetch_latest_invoice_number(prev_number,createdOn):
    current_year = current_year = datetime.datetime.now().year
    created_on_date = datetime.datetime.strptime(createdOn, "%d-%m-%Y %I:%M %p").year
    if current_year == created_on_date:
        new_invoice_number = int(prev_number) +1 
    else:
        new_invoice_number = "00001"
    return str(new_invoice_number)

def fetching_multiple_app_sites(multiple_app_sites_queryset):
    multiple_app_sites_dict = {}
    try:
        multiple_app_sites_dict = {
            "id":multiple_app_sites_queryset.id,
            "siteTitle":multiple_app_sites_queryset.siteTitle,
            "siteCode":multiple_app_sites_queryset.siteCode
        }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return multiple_app_sites_dict

def getLocationByLatLong(latitude,longitude):
    data_status={"responseStatus":0,"result":"","address":"","responseData":[]}
    try:
        formatedAddress=""
        gmaps = googlemaps.Client(key=googleApiKey)
        result = gmaps.reverse_geocode((latitude, longitude))
        if result:
            formatedAddress=result[0]['formatted_address']
            data_status['address']=formatedAddress
            data_status['responseData']=result
            data_status['responseStatus']=1
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return data_status

def aggregator_calculation_for_payout(amount,paymentModeId,subPaymentModeId,payoutPaymentGatewayId=""):
    aggregatorCharges = {}
    try:
        transactionAmount = amount
        grandTotal = 0
        startAmount = 0
        endAmount = 0
        chargeType = ""
        chargeValue = 0
        chargeAmount = 0
        gstAmount = 0
        tdsAmount = 0
        gstInclude = ""
        tdsInclude = ""
        aggregatorType = ""
        aggregatorValue = 0
        aggregatorAmount = 0
        commissionType = ""
        commissionValue = 0
        commissionAmount = 0
        tdsValue = 0
        gstValue = 0
        priceType=""
        apiSetupchargeId=None
        
        api_setupcharge_queryset = ApiSetupChargeCommissions.objects(paymentModeIdsList__in=[paymentModeId],subPaymentModeIdsList__in=[subPaymentModeId],transactionAPIIdsList__in=[payoutPaymentGatewayId]).first()
        if api_setupcharge_queryset:
            apiSetupchargeId=str(api_setupcharge_queryset.id)
            priceType = api_setupcharge_queryset.priceType
            gstInclude = api_setupcharge_queryset.gstInclude
            tdsInclude = api_setupcharge_queryset.tdsInclude
            gstValue = float(api_setupcharge_queryset.gstValue)
            tdsValue = float(api_setupcharge_queryset.tdsValue)

            if priceType == "RANGE":
                priceRangeList = api_setupcharge_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 = api_setupcharge_queryset.chargeType
                chargeValue = float(api_setupcharge_queryset.chargeValue)
                # aggregatorType = api_setupcharge_queryset.aggregatorType
                # aggregatorValue = float(api_setupcharge_queryset.aggregatorValue)
                # commissionType = api_setupcharge_queryset.commissionType
                # commissionValue = float(api_setupcharge_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)
        
        aggregatorCharges = {
        "aggregatorType":aggregatorType,
        "aggregatorAmount":round(float(aggregatorAmount),2),
        "commissionType":commissionType,
        "commissionAmount":round(float(commissionAmount),2),
        "chargeType":chargeType,
        "chargeValue":chargeValue,
        "gstValue":gstValue,
        "tdsValue":tdsValue,
        "aggregatorValue":aggregatorValue,
        "commissionValue":commissionValue,
        "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,
        "apiSetupchargeId":apiSetupchargeId
        }
        print(aggregatorCharges,"((((((((((((((((((PAYOUT Aggregator CHARGES API))))))))))))))))))")
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return aggregatorCharges

def fetching_beneficiary_details(each_beneficiary):
    beneficiaryDict = {}
    try:
        beneficiaryDict = {
        "id":str(each_beneficiary.id),
        # "userId":str(each_beneficiary.userId.id),
        # "merchantName":each_beneficiary.userId.fullName,
        "name":each_beneficiary.beneficiaryName,
        "creditorAccountNumber":each_beneficiary.accountNumber,
        "transactionReferenceNumber":each_beneficiary.transactionReferenceNumber,
        # "creditorName":each_beneficiary.creditorName,
        "ifscCode":each_beneficiary.ifscCode,
        "status":each_beneficiary.status,
        "createdOn":each_beneficiary.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        }
        try:
            if each_beneficiary.masterBankId:
                beneficiaryDict["bankId"]=str(each_beneficiary.masterBankId.id)
                beneficiaryDict["bankName"]=each_beneficiary.masterBankId.bankName
            else:
                beneficiaryDict["bankId"]=""
                beneficiaryDict["bankName"]=""
        except Exception as e:
            beneficiaryDict["bankId"]=""
            beneficiaryDict["bankName"]=""

        try:
            userIdsList = []
            if each_beneficiary.userIdsList:
                beneficiaryDict["userIdsList"] = [str(each_user.id) for each_user in each_beneficiary.userIdsList]
                beneficiaryDict["merchantName"] = ", ".join(str(each_user.fullName) for each_user in each_beneficiary.userIdsList)
            else:
                beneficiaryDict["userIdsList"] =[]
                beneficiaryDict["merchantName"] = ""
        except Exception as e:
            beneficiaryDict["userIdsList"] = []
            beneficiaryDict["merchantName"] = ""

        try:
            beneCodeList = []
            if each_beneficiary.beneCodeList:
                test = [str(each_bene_code.get("beneCode")) for each_bene_code in each_beneficiary.beneCodeList if each_bene_code.get("beneCode")]
                beneficiaryDict["beneCodesList"] = [str(each_bene_code.get("beneCode")) for each_bene_code in each_beneficiary.beneCodeList if each_bene_code.get("status")=="Pending"]
            else:
                beneficiaryDict["beneCodesList"] = []
        except Exception as e:
            beneficiaryDict["beneCodesList"] = []

        # try:
        #     if each_beneficiary.beneCodeList:
        #         beneficiaryDict["beneCodeStatus"] = ", ".join(str(each_bene_code.get("beneCode")) for each_bene_code in (each_beneficiary.beneCodeList or []) if each_bene_code.get("status"))
        #     else:
        #         beneficiaryDict["beneCodeStatus"] = ""
        # except Exception as e:
        #     beneficiaryDict["beneCodeStatus"] = ""

        try:
            if each_beneficiary.beneCodeList:
                for each_bene_code_status in each_beneficiary.beneCodeList:
                    beneCodeStatus = each_bene_code_status.get("status")
                beneficiaryDict["beneCodeStatus"] = beneCodeStatus
            else:
                beneficiaryDict["beneCodeStatus"] = ""
        except Exception as e:
            beneficiaryDict["beneCodeStatus"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return beneficiaryDict

def save_thirdparty_api_charges_data(userId,kycApiId,aggregatorCharges,commissionCharges,overallCommissionAmount,verificationNumber,verificationType,apiRequestData,apiResponseData):
    save_thirdparty_api_charges_table = ""
    try:
        thirdparty_api_charges_table = ThirdpartyApiCharges(
            userId=userId,
            kycApiId=kycApiId,
            aggregatorCharges=aggregatorCharges,
            commissionCharges=commissionCharges,
            overallCommissionAmount=overallCommissionAmount,
            verificationNumber=verificationNumber,
            verificationType=verificationType,
            apiRequestData = apiRequestData,
            apiResponseData=apiResponseData,
            createdOn=datetime.datetime.now(),
            status=1
            )
        save_thirdparty_api_charges_table = thirdparty_api_charges_table.save()
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return save_thirdparty_api_charges_table

def kyc_api_charges_details(kycApiId,documentType):
    aggregatorCharges = {}
    commissionCharges = {}
    overallCommissionAmount = 0
    finalCommissionChargeAmount = 0
    finalAggregatorChargeAmount = 0
    try:
        kyc_api_charges_queryset = KycApiCharges.objects(kycApiId=kycApiId,documentType=documentType).first()
        if kyc_api_charges_queryset:
            chargeType = ""
            chargeValue = 0
            chargeAmount = 0
            gstAmount = 0
            tdsAmount = 0
            gstInclude = ""
            tdsInclude = ""
            gstValue = 0
            tdsValue = 0
            transactionAmount = 0

            gstInclude = kyc_api_charges_queryset.gstInclude
            gstValue = kyc_api_charges_queryset.gstValue
            tdsInclude = kyc_api_charges_queryset.tdsInclude
            tdsValue = kyc_api_charges_queryset.tdsValue
            chargeType = kyc_api_charges_queryset.chargeType
            chargeValue = kyc_api_charges_queryset.chargeValue
            transactionAmount = float(chargeValue)
            
            if chargeValue > 0:
                if chargeType=="FLAT":
                    chargeAmount=chargeValue
                else:
                    chargeAmount = 0

                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)

            aggregatorCharges = {
            "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),
            "apiSlabId":str(kyc_api_charges_queryset.id),
            "chargeValue":chargeValue,
            "gstValue":gstValue,
            "tdsValue":tdsValue,
            }

        service_charges_queryset = ServiceCharges.objects(chargeType=documentType).first()
        if service_charges_queryset:
            commissionChargeType = ""
            commissionChargeValue = 0
            commissionChargeAmount = 0
            commissionGstAmount = 0
            commissionTdsAmount = 0
            commissionGstInclude = ""
            commissionTdsInclude = ""
            commissionGstValue = 0
            commissionTdsValue = 0
            commissionTransactionAmount = 0

            commissionGstInclude = service_charges_queryset.gstInclude
            commissionGstValue = service_charges_queryset.gstValue
            commissionTdsInclude = service_charges_queryset.tdsInclude
            commissionTdsValue = service_charges_queryset.tdsValue
            commissionChargeType = service_charges_queryset.amountType
            commissionChargeValue = service_charges_queryset.amount

            commissionTransactionAmount = float(commissionChargeValue)

            if commissionChargeValue > 0:
                if commissionChargeType=="FLAT":
                    commissionChargeAmount=commissionChargeValue
                else:
                    commissionChargeAmount = 0

                commissionTransactionAmount=float(commissionTransactionAmount) + float(commissionChargeAmount)

                if commissionGstValue>0:   
                    commissionGstAmount = (float(commissionChargeAmount)*float(commissionGstValue))/100

                if commissionTdsValue>0:
                    commissionTdsAmount = (float(commissionChargeAmount)*float(commissionTdsValue))/100
                    
                if commissionGstInclude == "Yes":
                    commissionChargeAmount = float(commissionChargeAmount)-float(commissionGstAmount)
                else:
                    commissionTransactionAmount = float(commissionTransactionAmount)+float(commissionGstAmount)

                if commissionTdsInclude == "Yes":
                    commissionChargeAmount = float(commissionChargeAmount)-float(commissionTdsAmount)
                else:
                    commissionTransactionAmount = float(commissionTransactionAmount)+float(commissionTdsAmount)
        
            commissionCharges = {
            "chargeType":commissionChargeType,
            "chargeValue":commissionChargeValue,
            "gstValue":commissionGstValue,
            "tdsValue":commissionTdsValue,
            "chargeAmount":round(float(commissionChargeAmount),2),
            "transactionAmount":round(float(commissionTransactionAmount),2),
            "gstInclude":commissionGstInclude,
            "gstAmount":round(float(commissionGstAmount),2),
            "tdsInclude":commissionTdsInclude,
            "tdsAmount":round(float(commissionTdsAmount),2),
            "apiSlabId":str(service_charges_queryset.id),
            }
            if commissionCharges.get("chargeAmount"):
                finalCommissionChargeAmount = float(commissionCharges.get("chargeAmount"))
            else:
                finalCommissionChargeAmount = 0

            finalAggregatorChargeAmount = float(aggregatorCharges.get("chargeAmount"))
        overallCommissionAmount = float(finalCommissionChargeAmount) - float(finalAggregatorChargeAmount)

        return aggregatorCharges,commissionCharges,overallCommissionAmount
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return aggregatorCharges,commissionCharges,overallCommissionAmount



def validate_password(password):
    # Regex pattern for password validation
    # pattern = r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,30}$"
    pattern = r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_\-+[\]{}:;\"',./\\<>?|`~])[A-Za-z\d!@#$%^&*()_\-+[\]{}:;\"',./\\<>?|`~]{8,30}$"
    return bool(re.match(pattern, password))

def validate_email(value):
    """Check if the email is in a valid format."""
    email_regex = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
    return re.match(email_regex, value) is not None
    

def is_valid_alphabets(value):
    """Validate that a string contains only alphabetic characters (letters) and spaces."""
    return bool(re.match(r"^[a-zA-Z\s@#$()+_\-/]+$", value))

def is_valid_alphanumeric(value,acceptSpace=False):
    if acceptSpace:
        """Validate that a string contains only alphanumeric characters and special characters(letters and digits)."""
        return bool(re.match(r"^[a-zA-Z0-9\s@#$()+_\-/.]*$", value))
    """Validate that a string contains only alphanumeric characters (letters and digits)."""
    return bool(re.match(r"^[a-zA-Z0-9\s@#$()+_\-/\.]+$", value))


def is_valid_numeric(value):
    """Validate that a string contains only numeric characters."""
    return bool(re.match(r"^\d+(\.\d+)?$", value))

def is_valid_ifsc_code(value):
    """Validate IFSC Code format: 4 letters, 1 digit, and 6 alphanumeric characters."""
    return bool(re.match(r"^[A-Za-z]{4}\d{1}[A-Za-z0-9]{6}$", value))

def is_valid_description(value):
    # Regex pattern: allows alphabets, numbers, spaces, special characters, and newlines
    pattern = r'^[\s\S]*$'
    return bool(re.match(pattern, value))

def is_valid_phone(value):
    # Regex for 10-digit phone number
    pattern = r"^[0-9]{10}$"
    return bool(re.match(pattern, value))

def is_valid_txn_limit(value):
    pattern = r"^[0-9]+([.][0-9]*)?|[.][0-9]$"
    return bool(re.match(pattern, value))


def is_allowed_file(filename):
    """Check if the uploaded file has a valid extension."""
    return filename and '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_CSV_EXTENSIONS


def is_allowed_image(filename):
    """Check if the uploaded file is a valid image."""
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_IMAGE_EXTENSIONS


def is_allowed_document(filename):
    """Check if the uploaded file has a valid extension."""
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_DOC_EXTENSIONS


def is_valid_alphanumeric_without_specialCharacters(value):
    """Validate that a string contains only alphanumeric characters (letters, digits) and spaces."""
    return bool(re.match(r"^[a-zA-Z0-9\s]+$", value))

def is_valid_numeric_allow_muldots(value):
    """Validate that a string contains only numeric characters and allows multiple dots."""
    return bool(re.match(r"^\d+(\.\d+)*$", value))

def is_valid_country_code(value):
    pattern = r"^\+?[0-9]{1,4}$"
    return bool(re.match(pattern, value))


def is_valid_latitude(value):
    pattern = r"^-?(90(\.0{1,6})?|[0-8]?[0-9](\.[0-9]{1,6})?)$"
    return bool(re.fullmatch(pattern, value))

def is_valid_longitude(value):
    pattern = r"^-?(180(\.0{1,6})?|1[0-7][0-9](\.[0-9]{1,6})?|[0-9]{1,2}(\.[0-9]{1,6})?)$"
    return bool(re.fullmatch(pattern, value))


    

def get_dynamic_payment_gateway_id(amount,payment_mode,card_number,transactionApiId,siteId,instantSettlement):
    data_status = {"responseStatus": 0, "result": "","card_category":"", "card_type": ""}
    print(instantSettlement,"instantSettlement")
    if not amount and not payment_mode:
        data_status["result"] = "Required fields are missing!!"
        return data_status
    try:
        paymentModeId=""
        subPaymentModeId=""
        card_category=""
        card_type=""
        paymentType=""
        subPaymentMode=""
        issuing_bank=""
        is_domestic="0"
        additonalCardType=""
        if payment_mode.lower() == "card":
            card_bin_response = card_bin_check(card_number)
            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)

            if is_domestic!="1":
                data_status["result"] = "Only Accepts domestic cards!!"
                return data_status
            
            if card_category!="":
                if card_category == "creditcard":
                    paymentType = "CREDIT CARD"
                elif card_category == "debitcard":
                    paymentType = "DEBIT CARD"
                else:
                    data_status["result"] = "Invalid Card Type!!"
                    return data_status
        elif payment_mode.lower() == "upi" or payment_mode.lower() == "nb":
            if payment_mode.lower()=="nb":
                paymentType="NET BANKING"
            else:
                paymentType="UPI"
        else:
            data_status["result"] = "Unknown payment mode!!"
            return data_status
        paymentmode_queryset = PaymentMode.objects(paymentMode=paymentType,status=1).first()
        if paymentmode_queryset:
            paymentModeId = str(paymentmode_queryset.id)
            if card_type!="":
                subPaymentMode=card_type
                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=paymentType
                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=paymentType
            sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType=str(subPaymentMode)).first()
            if sub_payment_mode_queryset:
                subPaymentModeId = str(sub_payment_mode_queryset.id)

        data_status["paymentMode"] = paymentType
        data_status["subPaymentMode"] = subPaymentMode
        data_status["cardType"] = card_type
        data_status["issuingBank"] = issuing_bank
        data_status["paymentmodeId"] = paymentModeId
        data_status["subPaymentModeId"] = subPaymentModeId
        # instantSettlementtype=False
        get_site_paymentgateway=None

        if transactionApiId=="":
            if siteId!="":
                # if instantSettlement==0 or instantSettlement==1:
                #     if instantSettlement==0:
                #         instantSettlementtype=True
                #     else:
                #         instantSettlementtype=False
                #     get_site_paymentgateway=SiteAssignPaymentgateways.objects(siteId=siteId,paymentModeId=paymentModeId,subPaymentModeId=subPaymentModeId,status=1,instantSettlement=instantSettlementtype).first()
                # else:
                
                if instantSettlement==None:
                    print("instantSettlement none")
                    get_site_paymentgateway=SiteAssignPaymentgateways.objects(siteId=siteId,paymentModeId=paymentModeId,subPaymentModeId=subPaymentModeId,status=1,transactionApiId__ne=None).first()
                else:
                    print("instantSettlement else")
                    print("siteId",siteId)
                    print("paymentModeId",paymentModeId)
                    print("subPaymentModeId",subPaymentModeId)
                    print("instantSettlement",instantSettlement)

                    get_site_paymentgateway=SiteAssignPaymentgateways.objects(siteId=siteId,paymentModeId=paymentModeId,subPaymentModeId=subPaymentModeId,status=1,instantSettlement=instantSettlement).first()

                # print(get_site_paymentgateway.to_mongo().to_dict(),"get_site_paymentgateway")
                if not get_site_paymentgateway:
                    data_status["result"]="Service Provider is not available!!!"
                    return data_status
                if get_site_paymentgateway.transactionApiId==None:
                    data_status["result"]="Service Provider is not available!"
                    return data_status
                print(str(get_site_paymentgateway.transactionApiId.id),"transactionApiId")
                # instantSettlementtype=get_site_paymentgateway.instantSettlement
                transactionApiId=str(get_site_paymentgateway.transactionApiId.id)
            else:
                calculated_charges = slab_calculation_for_payin_api_dynamic(amount,paymentModeId,subPaymentModeId) 
                if calculated_charges.get("responseStatus") == 1:
                    transactionApiId =calculated_charges.get('min_transactionApi_id')
                else:
                    data_status["result"]=calculated_charges.get("result")
                    return data_status
                
        data_status["result"]="success"
        data_status["transactionApiId"] = transactionApiId
        data_status["instantSettlementtype"] = instantSettlement
        data_status["responseStatus"] =1
        print(data_status,"data_status2")
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to get PaymentMode id!!"
        return data_status


def is_fancy_number(num):
    """Check if a number is a fancy number (repeated digits or strict sequential patterns)."""
    str_num = str(num)
    # Check for repeated digits (e.g., 111, 222)
    if len(set(str_num)) == 1:
        return True
    # Check for patterns like 121 (two unique digits with a repeat)
    for digit in set(str_num):
        count = str_num.count(digit)
        if count >= 3:  # Handle clusters like 111, 11666
            return True
        if count >= len(str_num) - 1:  # Handle patterns like 121, 1122
            return True
    # Check for strict sequential patterns (e.g., 123, 456, 987)
    if "".join(sorted(str_num)) in "0123456789" or "".join(sorted(str_num, reverse=True)) in "9876543210":
        return True
    return False

 
# def generate_random_prices(target,loop_count=4,start=None, end=None, step=1):
#     """
#     Generate a random number from a dynamic range while excluding:
#     - Rounded numbers (e.g., multiples of 10)
#     - Fancy numbers (repeated digits, sequential patterns).
#     """
#     if target < 10:
#         return [target]
#     # Define the range dynamically based on the magnitude of the target
#     if start is None or end is None:
#         # Adjust the range to ±x% of the target, ensuring a minimum range of 3 for very small targets
#         delta = max(5, abs(target) * 2 // 100)  
#         start = target - delta if start is None else start
#         end = target + delta if end is None else end
#         start=int(start)
#         end=int(end)
#     # Generate the range of numbers
#     numbers = range(start, end + 1, step)
#     # Filter out invalid numbers: target, rounded, and fancy numbers
#     filtered_numbers = [
#         x for x in numbers
#         if x % 10 != 0 and not is_fancy_number(x)
#     ]

#     # If no valid numbers remain, return None
#     if not filtered_numbers:
#         return None
#     print(filtered_numbers,"filtered_numbers")
#     # Pick a random number from the filtered list
    
#     return random.sample(filtered_numbers,k=min(int(loop_count), len(filtered_numbers)))


def generate_random_prices(target,min_limit=1,max_limit=99995, loop_count=4, start=None, end=None, step=1):
    """
    Generate a random number from a dynamic range while excluding:
    - Rounded numbers (e.g., multiples of 10)
    - Fancy numbers (repeated digits, sequential patterns).
    """
    if target < 10:
        return [target]
    
    # Define the range dynamically based on the magnitude of the target
    if start is None or end is None:
        # delta = max(15, abs(target)*0.5 // 100)  
        delta = 20
        start = target - delta if start is None else start
        end = target + delta if end is None else end
        if float(min_limit)>float(start):
            start=min_limit
        start = int(start)
        if float(max_limit)>0 and float(max_limit)<float(end):
            end=max_limit
        end = int(end)

    # Generate the range of numbers
    numbers = range(start, end + 1, step)
    print(f"Start: {start}, End: {end}")  # Debug

    # Filter out invalid numbers
    filtered_numbers = [
        x for x in numbers if x % 10 != 0 and not is_fancy_number(x)
    ]
    

    # Handle empty filtered numbers
    if not filtered_numbers:
        print("Filtered numbers are empty. Returning target as a fallback.")
        return [target]
    
    # Generate random samples
    k = min(loop_count, len(filtered_numbers))
    return random.sample(filtered_numbers, k)



###new fields in Download 

def fetching_payout_csv_download_reports_new_transactions(each_payout_report):
    payoutReportDict = {}
    try:
        if each_payout_report.siteTitle:
            payoutReportDict["Site Title"] = mask_account_number(each_payout_report.siteTitle)
        else:
            payoutReportDict["Site Title"] = ""

        if each_payout_report.userType:
            payoutReportDict["User Type"] = each_payout_report.userType
        else:
            payoutReportDict["User Type"] = ""
        try:
            if each_payout_report.transactionAPIId.apiName:
                payoutReportDict["PG Name"] = each_payout_report.transactionAPIId.apiName
            else:
                payoutReportDict["PG Name"] = ""
        except Exception as e:
            payoutReportDict["PG Name"] = ""
        try:
            if each_payout_report.userId.fullName:
                payoutReportDict["Merchant Name"] = each_payout_report.userId.fullName
            else:
                payoutReportDict["Merchant Name"] = ""
        except Exception as e:
            payoutReportDict["Merchant Name"] = ""

        if each_payout_report.beneficiaryName:
            payoutReportDict["Beneficiary Name"] = each_payout_report.beneficiaryName
        else:
            payoutReportDict["Beneficiary Name"] = ""

        if each_payout_report.accountNumber:
            payoutReportDict["Beneficiary Account Number"] = each_payout_report.accountNumber
        else:
            payoutReportDict["Beneficiary Account Number"] = ""

        if each_payout_report.accountIFSCCode:
            payoutReportDict["Beneficiary IFSC"] = each_payout_report.accountIFSCCode
        else:
            payoutReportDict["Beneficiary IFSC"] = ""


        if each_payout_report.status == 5 and each_payout_report.transactionUniqueId != None:
            payout_queryset = FundTransfers.objects(merchantReferenceNumber=each_payout_report.transactionUniqueId,status__nin=[5]).first()
            try:
                if payout_queryset.merchantReferenceNumber:
                    payoutReportDict["Order ID"] = "#"+str(payout_queryset.merchantReferenceNumber)
                else:
                    payoutReportDict["Order ID"] = "#"+str(each_payout_report.merchantReferenceNumber)
            except Exception as e:
                payoutReportDict["Order ID"] = "#"+str(each_payout_report.merchantReferenceNumber)

            try:
                if payout_queryset.transactionUniqueId:
                    payoutReportDict["Txn ID"] = "#"+str(payout_queryset.transactionUniqueId)
                else:
                    payoutReportDict["Txn ID"] = "#"+str(each_payout_report.transactionUniqueId)
            except Exception as e:
                payoutReportDict["Txn ID"] = "#"+str(each_payout_report.transactionUniqueId)
        else:
            if each_payout_report.merchantReferenceNumber:
                payoutReportDict["Order ID"] ="#"+ str(each_payout_report.merchantReferenceNumber)
            else:
                payoutReportDict["Order ID"] = ""
                payoutReportDict["Txn ID"] = ""

            # if each_payout_report.transactionUniqueId:
            #     payoutReportDict["Transaction UniqueId"] = "#"+str(each_payout_report.transactionUniqueId)
            # else:
            #     payoutReportDict["Transaction UniqueId"] = ""
        
        # if each_payout_report.pgOrderId:
        #     payoutReportDict["PgOrderId"] = each_payout_report.pgOrderId
        # else:
        #     payoutReportDict["PgOrderId"] = ""    

        if each_payout_report.transferType:
            payoutReportDict["Transfer Type"] = "Credit" if each_payout_report.transferType == "Refund" else each_payout_report.transferType
        else:
            payoutReportDict["Transfer Type"] = ""
        
        # if each_payout_report.transferType:
        #     payoutReportDict["CrDrType"] = each_payout_report.transferType
        # else:
        #     payoutReportDict["CrDrType"] = ""

        if each_payout_report.amount:
            payoutReportDict["Amount"] = "{:.2f}".format(float(each_payout_report.amount))
        else:
            payoutReportDict["Amount"] = ""

        # if each_payout_report.amount:
        #     payoutReportDict["Credit Amount(₹)"] = each_payout_report.grandTotal if each_payout_report.transferType in ["Credit", "Refund"] else None
        # else:
        #     payoutReportDict["Credit Amount(₹)"] = ""

        # if each_payout_report.amount:
        #     payoutReportDict["Debit Amount(₹)"] = each_payout_report.grandTotal if each_payout_report.transferType == "Debit" else None
        # else:
        #     payoutReportDict["Debit Amount(₹)"] = ""

        if each_payout_report.grandTotal:
            payoutReportDict["Grand Total"] = "{:.2f}".format(float(each_payout_report.grandTotal))
        else:
            payoutReportDict["Grand Total"] = ""

        if each_payout_report.paymentMode:
            payoutReportDict["Type"] = each_payout_report.paymentMode
        else:
            payoutReportDict["Type"] = ""

        if each_payout_report.accountNumber:
            payoutReportDict["Account Number"] = each_payout_report.accountNumber
        else:
            payoutReportDict["Account Number"] = ""

        if each_payout_report.bankReferenceNumber:
            payoutReportDict["UTR"] = each_payout_report.bankReferenceNumber
        else:
            payoutReportDict["UTR"] = ""

        if each_payout_report.createdOn:
            payoutReportDict["Transaction Date"] = each_payout_report.createdOn
        else:
            payoutReportDict["Transaction Date"] = ""

        if each_payout_report.status == 1:
            payoutReportDict["Transaction Status"]="Success"
        elif each_payout_report.status == 2:
            payoutReportDict["Transaction Status"]="Processing"
        elif each_payout_report.status == 4:
            payoutReportDict["Transaction Status"]="Reversal"
        elif each_payout_report.status == 5:
            payoutReportDict["Transaction Status"]="Refund"
        else:
            payoutReportDict["Transaction Status"]="Failed"

        try:
            totalChargeAmount = 0
            chargeAmount = each_payout_report.commissionCharges.get("chargeAmount",0.00)
            gstAmount = each_payout_report.commissionCharges.get("gstAmount",0.00)
            tdsAmount = each_payout_report.commissionCharges.get("tdsAmount",0.00)

            totalChargeAmount = float(chargeAmount)+float(gstAmount)+float(tdsAmount)
            if totalChargeAmount:
                payoutReportDict["Charge Amount"] = chargeAmount
                payoutReportDict["GST Amount"] = gstAmount
                payoutReportDict["TDS Amount"] = tdsAmount
            else:
                payoutReportDict["Charge Amount"] = 0.00
                payoutReportDict["GST Amount"] = 0.00
                payoutReportDict["TDS Amount"] = 0.00
        except Exception as e:
            payoutReportDict["Charge Amount"] = 0.00
            payoutReportDict["GST Amount"] = 0.00
            payoutReportDict["TDS Amount"] = 0.00

        
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payoutReportDict

def fetching_payout_csv_download_reports_new_ledger(each_payout_report):
    payoutReportDict = {}
    try:
        if each_payout_report.siteTitle:
            payoutReportDict["Site Title"] = mask_account_number(each_payout_report.siteTitle)
        else:
            payoutReportDict["Site Title"] = ""

        if each_payout_report.userType:
            payoutReportDict["User Type"] = each_payout_report.userType
        else:
            payoutReportDict["User Type"] = ""
        try:
            if each_payout_report.transactionAPIId.apiName:
                payoutReportDict["PG Name"] = each_payout_report.transactionAPIId.apiName
            else:
                payoutReportDict["PG Name"] = ""
        except Exception as e:
            payoutReportDict["PG Name"] = ""
        try:
            if each_payout_report.userId.fullName:
                payoutReportDict["Merchant Name"] = each_payout_report.userId.fullName
            else:
                payoutReportDict["Merchant Name"] = ""
        except Exception as e:
            payoutReportDict["Merchant Name"] = ""

        if each_payout_report.beneficiaryName:
            payoutReportDict["Beneficiary Name"] = each_payout_report.beneficiaryName
        else:
            payoutReportDict["Beneficiary Name"] = ""

        if each_payout_report.accountNumber:
            payoutReportDict["Beneficiary Account Number"] = each_payout_report.accountNumber
        else:
            payoutReportDict["Beneficiary Account Number"] = ""

        if each_payout_report.accountIFSCCode:
            payoutReportDict["Beneficiary IFSC"] = each_payout_report.accountIFSCCode
        else:
            payoutReportDict["Beneficiary IFSC"] = ""


        if each_payout_report.status == 5 and each_payout_report.transactionUniqueId != None:
            payout_queryset = FundTransfers.objects(merchantReferenceNumber=each_payout_report.transactionUniqueId,status__nin=[5]).first()
            try:
                if payout_queryset.merchantReferenceNumber:
                    payoutReportDict["Order ID"] = "#"+str(payout_queryset.merchantReferenceNumber)
                else:
                    payoutReportDict["Order ID"] = "#"+str(each_payout_report.merchantReferenceNumber)
            except Exception as e:
                payoutReportDict["Order ID"] = "#"+str(each_payout_report.merchantReferenceNumber)

            try:
                if payout_queryset.transactionUniqueId:
                    payoutReportDict["Txn ID"] = "#"+str(payout_queryset.transactionUniqueId)
                else:
                    payoutReportDict["Txn ID"] = "#"+str(each_payout_report.transactionUniqueId)
            except Exception as e:
                payoutReportDict["Txn ID"] = "#"+str(each_payout_report.transactionUniqueId)
        else:
            if each_payout_report.merchantReferenceNumber:
                payoutReportDict["Order ID"] ="#"+ str(each_payout_report.merchantReferenceNumber)
            else:
                payoutReportDict["Order ID"] = ""
                payoutReportDict["Txn ID"] = ""

            # if each_payout_report.transactionUniqueId:
            #     payoutReportDict["Transaction UniqueId"] = "#"+str(each_payout_report.transactionUniqueId)
            # else:
            #     payoutReportDict["Transaction UniqueId"] = ""
        
        if each_payout_report.pgOrderId:
            payoutReportDict["PgOrderId"] = each_payout_report.pgOrderId
        else:
            payoutReportDict["PgOrderId"] = ""    

        # if each_payout_report.transferType:
        #     payoutReportDict["Transfer Type"] = "Credit" if each_payout_report.transferType == "Refund" else each_payout_report.transferType
        # else:
        #     payoutReportDict["Transfer Type"] = ""
        
        if each_payout_report.transferType:
            payoutReportDict["CrDrType"] = each_payout_report.transferType
        else:
            payoutReportDict["CrDrType"] = ""

        if each_payout_report.amount:
            payoutReportDict["Amount"] = "{:.2f}".format(float(each_payout_report.amount))
        else:
            payoutReportDict["Amount"] = ""

        if each_payout_report.amount:
            payoutReportDict["Credit Amount"] = each_payout_report.grandTotal if each_payout_report.transferType in ["Credit", "Refund"] else None
        else:
            payoutReportDict["Credit Amount"] = ""

        if each_payout_report.amount:
            payoutReportDict["Debit Amount"] = each_payout_report.grandTotal if each_payout_report.transferType == "Debit" else None
        else:
            payoutReportDict["Debit Amount"] = ""

        # if each_payout_report.grandTotal:
        #     payoutReportDict["Grand Total(₹)"] = "{:.2f}".format(float(each_payout_report.grandTotal))
        # else:
        #     payoutReportDict["Grand Total(₹)"] = ""

        # if each_payout_report.paymentMode:
        #     payoutReportDict["Type"] = each_payout_report.paymentMode
        # else:
        #     payoutReportDict["Type"] = ""

        # if each_payout_report.accountNumber:
        #     payoutReportDict["Account Number"] = each_payout_report.accountNumber
        # else:
        #     payoutReportDict["Account Number"] = ""

        if each_payout_report.bankReferenceNumber:
            payoutReportDict["UTR"] = each_payout_report.bankReferenceNumber
        else:
            payoutReportDict["UTR"] = ""

        if each_payout_report.createdOn:
            payoutReportDict["Transaction Date"] = each_payout_report.createdOn
        else:
            payoutReportDict["Transaction Date"] = ""

        if each_payout_report.status == 1:
            payoutReportDict["Transaction Status"]="Success"
        elif each_payout_report.status == 2:
            payoutReportDict["Transaction Status"]="Processing"
        elif each_payout_report.status == 4:
            payoutReportDict["Transaction Status"]="Reversal"
        elif each_payout_report.status == 5:
            payoutReportDict["Transaction Status"]="Refund"
        else:
            payoutReportDict["Transaction Status"]="Failed"

        try:
            totalChargeAmount = 0
            chargeAmount = each_payout_report.commissionCharges.get("chargeAmount",0.00)
            gstAmount = each_payout_report.commissionCharges.get("gstAmount",0.00)
            tdsAmount = each_payout_report.commissionCharges.get("tdsAmount",0.00)

            totalChargeAmount = float(chargeAmount)+float(gstAmount)+float(tdsAmount)
            if totalChargeAmount:
                payoutReportDict["Charge Amount"] = chargeAmount
                payoutReportDict["GST Amount"] = gstAmount
                payoutReportDict["TDS Amount"] = tdsAmount
            else:
                payoutReportDict["Charge Amount"] = 0.00
                payoutReportDict["GST Amount"] = 0.00
                payoutReportDict["TDS Amount"] = 0.00
        except Exception as e:
            payoutReportDict["Charge Amount"] = 0.00
            payoutReportDict["GST Amount"] = 0.00
            payoutReportDict["TDS Amount"] = 0.00

        
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payoutReportDict


def fetching_payin_csv_download_reports_new_ledger(each_payin_report):
    payinCSVReportDict = {}
    try:
        try:
            if each_payin_report.siteTitle:
                payinCSVReportDict["Site Title"] = mask_account_number(each_payin_report.siteTitle)
            else:
                payinCSVReportDict["Site Title"] = ""
        except Exception as e:
            payinCSVReportDict["Site Title"] = ""

        if each_payin_report.userType:
            payinCSVReportDict["User Type"] = each_payin_report.userType
        else:
            payinCSVReportDict["User Type"] = ""
        try:
            if each_payin_report.paymentGatewayId:
                payinCSVReportDict["PG Name"] = each_payin_report.paymentGatewayId.apiName
            else:
                payinCSVReportDict["PG Name"] = ""
        except Exception as e:
            payinCSVReportDict["PG Name"] = ""

        if each_payin_report.userId:
            payinCSVReportDict["Merchant Name"] = each_payin_report.userId.fullName
        else:
            payinCSVReportDict["Merchant Name"] = ""


        if each_payin_report.orderId:
            payinCSVReportDict["Order ID"] = each_payin_report.orderId
        else:
            payinCSVReportDict["Order ID"] = ""

        if each_payin_report.pgOrderId:
            payinCSVReportDict["Txn ID"] = each_payin_report.pgOrderId
        else:
            payinCSVReportDict["Txn ID"] = ""

        if each_payin_report.previousBalance:
            payinCSVReportDict["Opening Balance"] = each_payin_report.previousBalance
        else:
            payinCSVReportDict["Opening Balance"] = ""

        if each_payin_report.creditType:
            payinCSVReportDict["CrDrType"] = each_payin_report.creditType
        else:
            payinCSVReportDict["CrDrType"] = ""

        if each_payin_report.creditType=="Credit" :
            creditAmount=each_payin_report.grandTotal
        else:
            creditAmount = 0
        if each_payin_report.creditType=="Debit":
            debitAmount=each_payin_report.grandTotal
        else:
            debitAmount=0

        if each_payin_report.grandTotal:
            payinCSVReportDict["Credit Amount"] = creditAmount
        else:
            payinCSVReportDict["Credit Amount"] = ""

        if each_payin_report.orderId:
            payinCSVReportDict["Debit Amount"] = debitAmount
        else:
            payinCSVReportDict["Debit Amount"] = ""

        if each_payin_report.currentBalance:
            payinCSVReportDict["Closing Balance"] = each_payin_report.currentBalance
        else:
            payinCSVReportDict["Closing Balance"] = ""

        if each_payin_report.createdOn:
            payinCSVReportDict["Transaction Date"] = each_payin_report.createdOn
        else:
            payinCSVReportDict["Transaction Date"] = ""

        if each_payin_report.status == 1:
            payinCSVReportDict["Transaction Status"]="Success"
        elif each_payin_report.status == 2:
            payinCSVReportDict["Transaction Status"]="Processing"
        else:
            payinCSVReportDict["Transaction Status"]="Failed"

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payinCSVReportDict

def fetching_payin_csv_download_reports_new_transactions(each_payin_report):
    payinCSVReportDict = {}
    try:
        try:
            if each_payin_report.siteTitle:
                payinCSVReportDict["Site Title"] = mask_account_number(each_payin_report.siteTitle)
            else:
                payinCSVReportDict["Site Title"] = ""
        except Exception as e:
            payinCSVReportDict["Site Title"] = ""

        if each_payin_report.userType:
            payinCSVReportDict["User Type"] = each_payin_report.userType
        else:
            payinCSVReportDict["User Type"] = ""

        try:
            if each_payin_report.paymentGatewayId:
                payinCSVReportDict["PG Name"] = each_payin_report.paymentGatewayId.apiName
            else:
                payinCSVReportDict["PG Name"] = ""
        except Exception as e:
            payinCSVReportDict["PG Name"] = ""
        payinCSVReportDict["Payment Mode"] = each_payin_report.paymentType
        try:
            if each_payin_report.subPaymentModeId:
                payinCSVReportDict["SubPayment Mode"] = each_payin_report.subPaymentModeId.subPaymentModeType
            else:
                payinCSVReportDict["SubPayment Mode"] = ""
        except Exception as e:
            payinCSVReportDict["SubPayment Mode"] = ""
        if each_payin_report.userId:
            payinCSVReportDict["Merchant Name"] = each_payin_report.userId.fullName
        else:
            payinCSVReportDict["Merchant Name"] = ""


        if each_payin_report.orderId:
            payinCSVReportDict["Order ID"] = each_payin_report.orderId
        else:
            payinCSVReportDict["Order ID"] = ""

        if each_payin_report.pgOrderId:
            payinCSVReportDict["Txn ID"] = each_payin_report.pgOrderId
        else:
            payinCSVReportDict["Txn ID"] = ""

        if each_payin_report.previousBalance:
            payinCSVReportDict["Opening Balance"] = each_payin_report.previousBalance
        else:
            payinCSVReportDict["Opening Balance"] = ""

        if each_payin_report.creditType:
            payinCSVReportDict["CrDrType"] = each_payin_report.creditType
        else:
            payinCSVReportDict["CrDrType"] = ""

        if each_payin_report.creditType=="Credit" :
            creditAmount=each_payin_report.grandTotal
        else:
            creditAmount = 0
        if each_payin_report.creditType=="Debit":
            debitAmount=each_payin_report.grandTotal
        else:
            debitAmount=0

        if each_payin_report.grandTotal:
            payinCSVReportDict["Credit Amount"] = creditAmount
        else:
            payinCSVReportDict["Credit Amount"] = ""

        if each_payin_report.orderId:
            payinCSVReportDict["Debit Amount"] = debitAmount
        else:
            payinCSVReportDict["Debit Amount"] = ""

        if each_payin_report.currentBalance:
            payinCSVReportDict["Closing Balance"] = each_payin_report.currentBalance
        else:
            payinCSVReportDict["Closing Balance"] = ""

        if each_payin_report.createdOn:
            payinCSVReportDict["Transaction Date"] = each_payin_report.createdOn
        else:
            payinCSVReportDict["Transaction Date"] = ""

        if each_payin_report.status == 1:
            payinCSVReportDict["Status"]="Success"
        elif each_payin_report.status == 2:
            payinCSVReportDict["Status"]="Processing"
        else:
            payinCSVReportDict["Status"]="Failed"
        
        if each_payin_report.statusCheckId:
            payinCSVReportDict["PG ID"] = each_payin_report.statusCheckId
        else:
            payinCSVReportDict["PG ID"] = ""

        if each_payin_report.amount:
            payinCSVReportDict["Amount"] = each_payin_report.amount
        else:
            payinCSVReportDict["Amount"] = 0

        if each_payin_report.commissionCharges == {}:
            payinCSVReportDict["Charge Amount"] = 0.00
            payinCSVReportDict["GST Amount"] = 0.00
            payinCSVReportDict["TDS Amount"] = 0.00
        else:
            payinCSVReportDict["Charge Amount"] = each_payin_report.commissionCharges.get("chargeAmount", 0.00)
            payinCSVReportDict["GST Amount"] = each_payin_report.commissionCharges.get("gstAmount", 0.00)
            payinCSVReportDict["TDS Amount"] = each_payin_report.commissionCharges.get("tdsAmount", 0.00)
        try:
            payinCSVReportDict["Merchant Type"]=each_payin_report.userId.merchantType
        except Exception as e:
            payinCSVReportDict["Merchant Type"]=""
            pass
        if each_payin_report.creditType == "Credit" and each_payin_report.status==1:
            sd_check = False
            md_check = False
            ad_check = False
            user_commissions_queryset = UserCommissions.objects(Q(walletId=each_payin_report.id ) | Q(transactionId = each_payin_report.transactionId)).all()
            if len(user_commissions_queryset) > 0:
                for each_user_comm_record in user_commissions_queryset:
                    name = str(each_user_comm_record.userId.fullName) + " - "+  str(each_payin_report.userId.phoneNumber)
                    if each_user_comm_record.userId.merchantType == "Super Distributor":
                        sd_check = True
                        payinCSVReportDict["SD Name"] = name
                        payinCSVReportDict["SD Charge"] = round(float(each_user_comm_record.parrentSlabCommissionValue),2)
                        payinCSVReportDict["SD Amount"] = round(float(each_user_comm_record.parrentCommissionAmount),2)

                    elif each_user_comm_record.userId.merchantType == "Master Distributor":
                        md_check = True
                        payinCSVReportDict["MD Name"]=name
                        payinCSVReportDict["MD Charge"]=round(float(each_user_comm_record.parrentSlabCommissionValue),2)
                        payinCSVReportDict["MD Amount"]=round(float(each_user_comm_record.parrentCommissionAmount),2)

                    elif each_user_comm_record.userId.merchantType == "Area Distributor":
                        ad_check = True
                        payinCSVReportDict["AD Name"]=name
                        payinCSVReportDict["AD Charge"]=round(float(each_user_comm_record.parrentSlabCommissionValue),2)
                        payinCSVReportDict["AD Amount"]=round(float(each_user_comm_record.parrentCommissionAmount),2)

                    else:
                        pass

            if not sd_check:
                payinCSVReportDict["SD Name"] = ""
                payinCSVReportDict["SD Charge"] = 0.00
                payinCSVReportDict["SD Amount"] = 0.00
            if not md_check:
                payinCSVReportDict["MD Name"] = ""
                payinCSVReportDict["MD Charge"] = 0.00
                payinCSVReportDict["MD Amount"] = 0.00
            if not ad_check:
                payinCSVReportDict["AD Name"] = ""
                payinCSVReportDict["AD Charge"] = 0.00
                payinCSVReportDict["AD Amount"] = 0.00

            company_commissions_queryset = CompanyCommissions.objects(Q(walletId=each_payin_report.id ) | Q(transactionId = each_payin_report.transactionId)).first()
            if company_commissions_queryset:
                payinCSVReportDict["PG Amount"]=company_commissions_queryset.aggregatorCommissionCharges.get("chargeAmount")
                payinCSVReportDict["PG Charge"]=company_commissions_queryset.aggregatorCommissionCharges.get("chargeValue")
                payinCSVReportDict["PG GST Amount"]=company_commissions_queryset.aggregatorCommissionCharges.get("gstAmount")
            else:
                payinCSVReportDict["PG Charge"] = 0.0
                payinCSVReportDict["PG Amount"] =0.00
                payinCSVReportDict["PG GST Amount"] = 0.00
        else:
            payinCSVReportDict["SD Name"] = ""
            payinCSVReportDict["SD Charge"] = 0.00
            payinCSVReportDict["SD Amount"] = 0.00
            payinCSVReportDict["MD Name"] = ""
            payinCSVReportDict["MD Charge"] = 0.00
            payinCSVReportDict["MD Amount"] = 0.00
            payinCSVReportDict["AD Name"] = ""
            payinCSVReportDict["AD Charge"] = 0.00
            payinCSVReportDict["AD Amount"] = 0.00
            payinCSVReportDict["PG Charge"] = 0.00
            payinCSVReportDict["PG Amount"] =  0.00
            payinCSVReportDict["PG GST Amount"] =  0.00
    except Exception as e:
        
        app.logger.error(traceback.format_exc())
    return payinCSVReportDict




def getGoldAmountByPriceOrWeight(goldPrice,buyType,goldValue,gstInclude=True,gstPercentage=3): ## type is gms or amount
    data_status={"responseStatus": 0, "message":""}
    goldWeightCalc=0
    buyPriceCalc=0
    print("goldPrice",goldPrice)
    print("buyType",buyType)
    print("goldValue",goldValue)
    print("gstInclude",gstInclude)
    print("gstPercentage",gstPercentage)
    print("gst calac with amount ",(1 + ( gstPercentage / 100)))

    if gstInclude:
        goldPricewithGst = round(float(goldPrice) * (1 + ( gstPercentage / 100)),2) ######### (adding 3 %)
    else: #### for sell we dont need to add gst so keep price as it is 
        goldPricewithGst = round(float(goldPrice),2)
        
    # goldPricewithGst=math.ceil(goldPricewithGst*100)/100
    # goldPricewithGst = math.ceil(float(goldPrice) * (1 + (gstPercentage / 100)))
    print("goldPricewithGst",goldPricewithGst)
    try:
        if buyType == "amount":
            goldWeightCalc = float(goldValue) / float(goldPricewithGst)
            goldWeightCalc = math.floor(goldWeightCalc * 10000) / 10000
            buyPriceCalc=float(goldValue)
            print("goldPricewithGst round",goldPricewithGst)
        elif buyType == "gms":

            print("(((((((((goldPricewithGst float)))))))))",goldPricewithGst)
            # goldValue=math.floor(ceil(goldValue) * 10000) / 10000
            goldValue=math.floor(float(goldValue) * 10000) / 10000

            print("(((((((((goldValue)))))))))",goldValue)
            buyPriceCalc = goldValue * float(goldPricewithGst)

            print(buyPriceCalc,"buyPriceCalc")
            print("goldPricewithGst round",goldPricewithGst)

            buyPriceStr = f"{buyPriceCalc:.5f}"  # Convert to string with 5 decimal places

            print("buyPriceStr",buyPriceStr)

            third_decimal = float(buyPriceStr.split(".")[1][2])
            # (Rounded up to 2 decimals) [Don't round up in case the 3rd decimal place is 0]

            if third_decimal > 0:
                buyPriceCalc = round(buyPriceCalc, 2)  # Round up
            else:
                buyPriceCalc = round(buyPriceCalc, 2)  # Normal rounding
            goldWeightCalc = goldValue

        else:
            data_status["message"] = "Invalid Buy Type"
            return data_status
        data={
            "goldWeight": (float(goldWeightCalc)),
            # "goldBuyPrice": round(buyPriceCalc,2),
            "goldBuyPrice": buyPriceCalc,
            "goldPrice": float(goldPrice)
        }
        print("data",data)
        data_status["data"] = data
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return data_status

def user_gold_balance_update(userId,goldUserId,grams,transfertype,transactionAPIId,transactionUniqueId,goldBalanceAmount):
    print("inside gold balance update")
    amount = grams
    userCurrentBalance=0
    userPreviousBalance=0
    transactionCurrentBalance=0
    transactionPreviousBalance=0
    print("userId",userId)
    print("transactionAPIId",transactionAPIId)
    data_status={'responseStatus':0,"userCurrentBalance":0,"userPreviousBalance":0,"transactionCurrentBalance":0,"transactionPreviousBalance":0,"result":""}
    try:
        if transfertype=="Credit":
            userbalance_queryset = GoldUsers.objects(userId=str(userId)).modify(inc__goldBalanceGrams=round(float(amount),4),inc__goldBalanceAmount=round(float(goldBalanceAmount), 2),new=True)
            userCurrentBalance = userbalance_queryset.goldBalanceGrams
            userPreviousBalance = float(userCurrentBalance)-float(amount)
            transferType="Credit"
        else:
            userbalance_queryset = GoldUsers.objects(userId=str(userId)).modify(dec__goldBalanceGrams=round(float(amount),4),dec__goldBalanceAmount=round(float(goldBalanceAmount), 2),new=True)
            userCurrentBalance = userbalance_queryset.goldBalanceGrams
            userPreviousBalance = float(userCurrentBalance)+float(amount)
            transferType="Debit"

        payinbalancelogs_queryset=GoldBalanceLogs(
                transactionAPIId=str(transactionAPIId),
                userId=str(userId),
                goldUserId=str(goldUserId),
                previousBalance=round(float(userPreviousBalance),4),
                currentBalance=round(float(userCurrentBalance),4),
                orderId="", ###### what to add here
                amount=round(float(amount),4),
                grandTotal=round(float(amount),4),
                transferType=transferType,
                userType="user",
                transactionId=transactionUniqueId,
                createdOn=datetime.datetime.now(),
                status=1
                ).save()
        transactionPreviousBalance=0
        transactionCurrentBalance=round(float(amount),4)
        data_status['responseStatus']=1
        data_status['userCurrentBalance']=userCurrentBalance
        data_status['userPreviousBalance']=userPreviousBalance
        data_status['transactionPreviousBalance']=transactionPreviousBalance
        data_status['transactionCurrentBalance']=transactionCurrentBalance
    except Exception as e:
        app.logger.error(traceback.format_exc())
    finally:
        return data_status
 
def fetch_payout_fund_transfer_details(payout_fund_queryset):
    result_dict = {}
    try:
        result_dict = {
            "id":str(payout_fund_queryset.id),
            "createdBy": payout_fund_queryset.createdBy,
            "paymentGatewayId": str(payout_fund_queryset.transactionAPIId.id),
            "apiName": payout_fund_queryset.transactionAPIId.apiName,
            "beneficiaryName": payout_fund_queryset.beneficiaryName,
            "amount": payout_fund_queryset.amount,
            "grandTotal": payout_fund_queryset.grandTotal,
            "paymentMode": payout_fund_queryset.paymentMode,
            "beneficiaryMail": payout_fund_queryset.beneficiaryMail,
            "beneficiaryPhone": payout_fund_queryset.beneficiaryPhone,
            "merchantReferenceNumber": payout_fund_queryset.merchantReferenceNumber,
            "transactionId": payout_fund_queryset.transactionUniqueId,
            "createdOn": payout_fund_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
            "status": payout_fund_queryset.status,
            "previousBalance": payout_fund_queryset.previousBalance,
            "currentBalance": payout_fund_queryset.currentBalance,
            "transferType": payout_fund_queryset.transferType,
            "userType": payout_fund_queryset.userType,
            "pgOrderId": payout_fund_queryset.pgOrderId,
            "invoiceId": payout_fund_queryset.invoiceId
        }
        try:
            result_dict["gstAmount"] = payout_fund_queryset.commissionCharges.get("gstAmount")
        except Exception as e:
            app.logger.error(traceback.format_exc())
            result_dict["gstAmount"] = 0
        try:
            result_dict["chargeAmount"] = payout_fund_queryset.commissionCharges.get("chargeAmount")
        except Exception as e:
            app.logger.error(traceback.format_exc())
            result_dict["chargeAmount"] = 0
        


    except Exception as e:
        app.logger.error(traceback.format_exc())
    finally:
        return result_dict

def fetch_company_invoice_details():
    result_dict = {}
    try:
        invoice_company_queryset  = InvoiceCompanyDetails.objects().order_by("-createdOn").all()
        for each_invoice in invoice_company_queryset:
            for each_transaction in each_invoice.transactionApiIdsList:
                result_dict[str(each_transaction.id)] = each_invoice.invoiceTemplate
    
    except Exception as e:
        app.logger.error(traceback.format_exc())
    finally:
        return result_dict

def get_financial_year_dates(selected_month, selected_year):
    # List of month names in the year
    month_names = {
        'January': 1,
        'February': 2,
        'March': 3,
        'April': 4,
        'May': 5,
        'June': 6,
        'July': 7,
        'August': 8,
        'September': 9,
        'October': 10,
        'November': 11,
        'December': 12
    }
    
    # Convert selected_month to title case and check for validity
    selected_month = selected_month.capitalize()
    
    if selected_month not in month_names:
        return "Invalid Month"
    
    # Get the numeric representation of the month
    month_number = month_names[selected_month]
    
    # Financial Year Calculation Logic
    current_year = selected_year
    
    if month_number <= 3:  # January, February, March
        start_date = datetime.datetime(current_year - 1, 4, 1)
        end_date = datetime.datetime(current_year, 3, 31)
    elif month_number >= 4:  # April and above
        start_date = datetime.datetime(current_year, 4, 1)
        end_date = datetime.datetime(current_year + 1, 3, 31)
    
    return start_date, end_date

static_encryption_key = "Ab9Zx4LmNqRp2sVyT1UwXy3ZqWe8RtPa"

def encrypt_decrypt_after_login(f):
    @wraps(f)
    def after_login(*args, **kwargs):
        encryption_key = static_encryption_key.encode()
        data_status = {"responseStatus": 0, "result": ""}
        merchant_id = request.headers.get("Merchant-Id")
        access_token = None
        if not merchant_id:
            data_status["result"] = "Invalid merchant id!"
            return encrypted_return(data_status, encryption_key)

        try:
            decrypted_data = ""
        
            if request.is_json:
                encrypted_json = request.get_json()
                encrypted_body = encrypted_json.get("encryptedBody")
                iv_key = encrypted_json.get("ivKey")

                if not (encrypted_body and iv_key):
                    data_status["result"] = "Required fields are missing!!"
                    return encrypted_return(data_status,encryption_key)

                decrypted_data = decrypt(encrypted_body, encryption_key, iv_key)

            elif request.form:
                iv_key = request.form.get("ivKey")
                encrypted_body = request.form.get("encryptedBody")
                if not (encrypted_body and iv_key):
                    data_status["result"] = "Required fields are missing!!"
                    return encrypted_return(data_status,encryption_key)

                decrypted_data = decrypt(encrypted_body, encryption_key, iv_key)


            if decrypted_data:
                decrypted_data = json.loads(decrypted_data)
                access_token = decrypted_data.get("accessToken")
            else:
                data_status["result"] = "Invalid Request."
                return encrypted_return(data_status, encryption_key)
            
            if not access_token:
                data_status["responseStatus"] = -1
                data_status["result"] = "Session Expired!"
                return encrypted_return(data_status, encryption_key)

            merchant_queryset=Users.objects(merchantUniqueNumber=merchant_id, userAccessToken=access_token, status__in=[0,1]).first()
            if not merchant_queryset:
                data_status["responseStatus"] = -1
                data_status["result"] = "Session Expired"
                return encrypted_return(data_status, encryption_key) 
            
            request.decrypted_data = decrypted_data

            # function call
            response = f(*args, **kwargs)
            encrypted_response = encrypted_return(response, encryption_key)
            return encrypted_response
        except Exception as e:
            data_status["result"] = "Invalid Request"
            app.logger.error(traceback.format_exc())
            return encrypted_return(data_status, encryption_key)

    return after_login



def encrypt_decrypt_before_login(f):
    @wraps(f)
    def before_login(*args, **kwargs):
        encryption_key = static_encryption_key.encode()
        data_status = {"responseStatus": 0, "result": ""}
        if request.is_json:
            encrypted_json = request.get_json()
            encrypted_body = encrypted_json.get("encryptedBody")
            iv_key = encrypted_json.get("ivKey")
            if not (encrypted_body and iv_key):
                data_status["result"] = "Required fields are missing!!"
                return encrypted_return(data_status,encryption_key)
            
            decrypted_data = decrypt(encrypted_body,encryption_key, iv_key )
            if decrypted_data:
                request.decrypted_data = json.loads(decrypted_data)
            else:
                data_status["result"] = "Invalid Request."
                return encrypted_return(data_status, encryption_key)
            
        response = f(*args, **kwargs)
        encrypted_response = encrypted_return(response, encryption_key)
        return encrypted_response

    return before_login


def save_user_services_data(userId,operatorId,operatorCustomerParametersList,operatorName,operatorNumber,fetchResponseList,payloadList, serviceId):
    savedataFlag = False
    try:
        exisit_user_service_queryset = UsersSavedServices.objects(userId=userId,serviceId=serviceId).first()
        if not exisit_user_service_queryset:
            users_services_table = UsersSavedServices(
                userId=userId,
                operatorId=operatorId,
                serviceId=serviceId,
                operatorCustomerParametersList=operatorCustomerParametersList,
                operatorName=operatorName,
                operatorNumber=operatorNumber,
                fetchResponseList=fetchResponseList,
                payloadList=payloadList,
                createdOn=datetime.datetime.now(),
                status=1
                ).save()
        savedataFlag = True
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return savedataFlag


def getBbpsAuthorizationToken():
    data_status = {"responseStatus":0,"result":"","accessToken":""}
    try:
        url = "https://accounts.payu.in/oauth/token"
        headers = {
        "content-type": "application/json",
        "content-type": "application/x-www-form-urlencoded"
        }
        # payload="client_id=33d68849106a4674db942a69532349b4bdddc73b20806ce9a7229c37e54cf836&client_secret=52794e8f850d5960a0a84d1795b55b60121a4f24136340759ebed9a229a70f94&scope=read_bills create_transactions read_billers read_biller_categories read_transactions&grant_type=client_credentials"

        payload="client_id=35e731ff20e6bc521de9f29618b22c1240a4c69f6350c50e0fcb8e6b7d6c1bec&client_secret=610a66e8fb918d2c6a7ccf5674ea2893cb7cbbd589a0c3d9544e3f3ddf7366f4&scope=read_bills create_transactions read_billers read_biller_categories read_transactions&grant_type=client_credentials"
        payuresponse = requests.post(url, data=payload, headers=headers)
        payuresponseData = json.loads(payuresponse.text)
        print("payuresponse.text",payuresponse.text)
        data_status['responseStatus']=1
        data_status['accessToken']=payuresponseData.get("access_token")
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch bill request data!!"
        return data_status