from appservices.common.util import *

service_configurations = Blueprint("service_configurations",__name__)

################### services Grouping List ################

@service_configurations.route("/service_grouping_list",methods=["POST","GET"])
def service_grouping_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    serviceGroupingList = []
    servicegroupingPagination = ""
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"categoriesPermissions")
    print(permissionsList,"((((((((permissionsList))))))))")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","ServiceGrouping")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "ServiceGrouping"
            search_element = request.args.get('search_element','')

            ############################################################### service grouping list ######################################################################

            service_grouping_queryset = ServiceGrouping.objects(status__in=[0,1]).order_by('sorting')
            if search_element:
                service_grouping_queryset = ServiceGrouping.filter(Q(name__icontains=search_element))

            servicegrouping = request.args.get(get_page_parameter('servicegrouping'), type=int, default=1)
            print(servicegrouping,"servicegrouping")
            per_page = 20

            total_count = service_grouping_queryset.count()

            start = (servicegrouping - 1) * per_page

            end = min(start + per_page, total_count)

            total_servicegrouping = service_grouping_queryset[start:end]
            
            snoCount = start
            
            for each_service_grouping in total_servicegrouping:
                snoCount +=1
                service_grouping_dict = fetching_service_grouping_details(each_service_grouping)
                service_grouping_dict["snoCount"]=snoCount
                serviceGroupingList.append(service_grouping_dict)

            # for each_service_grouping in service_grouping_queryset:
            #     service_grouping_dict = fetching_service_grouping_details(each_service_grouping)
            #     serviceGroupingDropdownList.append(service_grouping_dict)    

            servicegroupingPagination = Pagination(servicegrouping=servicegrouping, total=total_count,page_parameter="servicegrouping", per_page=per_page, alignment="right", record_name="servicegrouping")                     
            
            return render_template("super_admin_templates/service_grouping_list.html",
                servicegroupingPagination=servicegroupingPagination,
                serviceGroupingList=serviceGroupingList,
                search_element=search_element,
                redirectval=redirectval
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch categories details!!"
            return render_template("super_admin_templates/service_grouping_list.html",
                servicegroupingPagination=servicegroupingPagination,
                serviceGroupingList=serviceGroupingList,
                search_element=search_element,
                redirectval=redirectval
                )
    else:
        flash("Staff member does not have given view category permissions!!")
        return redirect(url_for("admin.dashboard"))


################### categories ################

@service_configurations.route("/categories_configurations_list",methods=["POST","GET"])
def categories_configurations_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    categoriesList = []
    serviceGroupingDropdownList = []
    categoryPagination = ""
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"servicesPermissions")
    print(permissionsList,"((((((((permissionsList))))))))")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","ServiceGrouping")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "ServiceGrouping"
            search_element = request.args.get('search_element','')

             ############################################################### categories list ######################################################################

            categories_queryset = Categories.objects(status__in=[0,1]).order_by("sorting")
            if search_element:
                categories_queryset = categories_queryset.filter(Q(categoryName__icontains=search_element))

            categoriespage = request.args.get(get_page_parameter('categoriespage'), type=int, default=1)

            per_page = 20

            total_count = categories_queryset.count()

            start = (categoriespage - 1) * per_page

            end = min(start + per_page, total_count)

            total_categories = categories_queryset[start:end]
            
            snoCount = start
            
            for each_category in total_categories:
                # print(each_category.comingsoon,"(((((((((((?????????)))))))))))")
                snoCount +=1
                category_dict = fetching_category_details(each_category)
                category_dict["snoCount"]=snoCount
                categoriesList.append(category_dict)

            categoryPagination = Pagination(categoriespage=categoriespage, total=total_count,page_parameter="categoriespage", per_page=per_page, alignment="right", record_name="category" )    


            ############################################################ Service Grouping Dropdown List ###############################################################
            service_grouping_queryset = ServiceGrouping.objects(status__in=[0,1]).order_by('sorting')
            for each_service_grouping in service_grouping_queryset:
                service_grouping_dict = fetching_service_grouping_details(each_service_grouping)
                serviceGroupingDropdownList.append(service_grouping_dict)
            
            return render_template("super_admin_templates/categories_configurations_list.html",
                categoryPagination=categoryPagination,
                categoriesList=categoriesList,
                serviceGroupingDropdownList=serviceGroupingDropdownList,
                search_element=search_element,
                redirectval=redirectval
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch categories details!!"
            return render_template("super_admin_templates/categories_configurations_list.html",
                categoryPagination=categoryPagination,
                categoriesList=categoriesList,
                serviceGroupingDropdownList=serviceGroupingDropdownList,
                search_element=search_element,
                redirectval=redirectval
                )
    else:
        flash("Staff member does not have given view services permissions!!")
        return redirect(url_for("admin.dashboard"))



################### services ################
@service_configurations.route("/services_configurations_list",methods=["POST","GET"])
def services_configurations_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    servicesList = []
    serviceGroupingDropdownList = []
    categoriesList = []
    walletsList = []
    servicePagination = ""
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"subservicesPermissions")
    print(permissionsList,"((((((((permissionsList))))))))")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","Services")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Services"
            search_element = request.args.get('search_element','')

             ############################################################### categories list ######################################################################

            services_queryset = Service.objects(status__in=[0,1]).order_by("sorting")
            if search_element:
                services_queryset = services_queryset.filter(Q(serviceName__icontains=search_element))

            servicepage = request.args.get(get_page_parameter('servicepage'), type=int, default=1)
            print(servicepage,"servicepage")

            per_page = 20

            total_count = services_queryset.count()

            start = (servicepage - 1) * per_page

            end = min(start + per_page, total_count)

            total_services = services_queryset[start:end]
            
            snoCount = start
            
            for each_service in total_services:
                snoCount +=1
                service_dict = fetching_service_details(each_service)
                service_dict["snoCount"]=snoCount
                servicesList.append(service_dict)

            servicePagination = Pagination(servicepage=servicepage, total=total_count,page_parameter="servicepage", per_page=per_page, alignment="right", record_name="Services")    

            ############ wallets list ############

            
            ############ wallets list ############
           
            walletsList = fetching_wallet_details()
            ############################################################ Service Grouping Dropdown List ###############################################################
            service_grouping_queryset = ServiceGrouping.objects(status__in=[0,1]).order_by('sorting')
            for each_service_grouping in service_grouping_queryset:
                service_grouping_dict = fetching_service_grouping_details(each_service_grouping)
                serviceGroupingDropdownList.append(service_grouping_dict)
          
            ############################################################ Categories Dropdown List ###############################################################
            categories_queryset = Categories.objects(status__in=[0,1]).order_by("sorting")
            for each_category in categories_queryset:
                category_dict = fetching_category_details(each_category)
                categoriesList.append(category_dict)

            
            return render_template("super_admin_templates/service_list.html",
                servicePagination=servicePagination,
                walletsList=walletsList,
                servicesList=servicesList,
                serviceGroupingDropdownList=serviceGroupingDropdownList,
                categoriesList=categoriesList,
                search_element=search_element,
                redirectval=redirectval
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch services details!!"
            return render_template("super_admin_templates/service_list.html",
                servicePagination=servicePagination,
                walletsList=walletsList,
                servicesList=servicesList,
                serviceGroupingDropdownList=serviceGroupingDropdownList,
                categoriesList=categoriesList,
                search_element=search_element,
                redirectval=redirectval
                )
    else:
        flash("Staff member does not have given view sub services permissions!!")
        return redirect(url_for("admin.dashboard"))

################### operators ################
@service_configurations.route("/operators_configurations_list",methods=["POST","GET"])
def operators_configurations_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    operatorsList = []
    transactionAPIsList = []
    servicesDropdownList =[]
    taxTypesList = []
    serviceGroupingDropdownList =[]
    statesList = []
    
    operatorPagination = ""
    
    adminId = session.get("adminId")
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"operatorPermissions")
    print(permissionsList,"((((((((permissionsList))))))))")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","Operators")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Operators"
            search_element = request.args.get('search_element','')

            ############################################################### operators list ######################################################################

            operators_queryset = Operators.objects(status__in=[0,1]).order_by('sorting')
            if search_element:
                operators_queryset = operators_queryset.filter(Q(operatorName__icontains=search_element))

            operatorpage = request.args.get(get_page_parameter('operatorpage'), type=int, default=1)
            print(operatorpage,"operatorpage")

            per_page = 20

            total_count = operators_queryset.count()

            start = (operatorpage - 1) * per_page

            end = min(start + per_page, total_count)

            total_operators = operators_queryset[start:end]
            
            snoCount = start
            
            for each_operator in total_operators:
                snoCount +=1
                operator_dict = fetching_operator_details(each_operator)
                operator_dict["snoCount"]=snoCount
                operatorsList.append(operator_dict)

            operatorPagination = Pagination(operatorpage=operatorpage, total=total_count, page_parameter="operatorpage",per_page=per_page, alignment="right", record_name="operators")   

            ############### Tax Type List##################
            taxTypesList = fetching_tax_type_details()

            ############### states List##################
            statesList = fetching_state_details()

            ############ Transaction API DropDownList##################

            transaction_API_queryset = TransactionAPI.objects(status__in=[0,1]).order_by('-id')
            for each_transaction_api in transaction_API_queryset:
                transaction_api_dict = {
                "id":str(each_transaction_api.id),
                "apiName":each_transaction_api.apiName
                }
                transactionAPIsList.append(transaction_api_dict)
            

            ############## Service DropdownList #############
            services_queryset = Service.objects(status__in=[0,1]).order_by("sorting")

            for each_service in services_queryset:
                service_dict = fetching_service_details(each_service)
                servicesDropdownList.append(service_dict)

            ############## Service Grouping DropdownList #############    

            service_grouping_queryset = ServiceGrouping.objects(status__in=[0,1]).order_by('sorting')  
            
            for each_service_grouping in service_grouping_queryset:
                service_grouping_dict = fetching_service_grouping_details(each_service_grouping)
                serviceGroupingDropdownList.append(service_grouping_dict)  

            
            return render_template("super_admin_templates/operators_configurations_list.html",
                operatorPagination=operatorPagination,
                statesList =statesList,
                operatorsList=operatorsList,
                transactionAPIsList=transactionAPIsList,
                servicesDropdownList=servicesDropdownList,
                taxTypesList=taxTypesList,
                serviceGroupingDropdownList=serviceGroupingDropdownList,
                search_element=search_element,
                redirectval=redirectval
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch services details!!"
            return render_template("super_admin_templates/operators_configurations_list.html",
                operatorPagination=operatorPagination,
                statesList =statesList,
                operatorsList=operatorsList,
                transactionAPIsList=transactionAPIsList,
                servicesDropdownList=servicesDropdownList,
                taxTypesList=taxTypesList,
                serviceGroupingDropdownList=serviceGroupingDropdownList,
                search_element=search_element,
                redirectval=redirectval
                )    
    else:
        flash("Staff member does not have given view operator permissions!!")
        return redirect(url_for("admin.dashboard"))    



################### operators Grouping ################
@service_configurations.route("/operator_grouping_list",methods=["POST","GET"])
def operator_grouping_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    operatorGroupingList = []    
    operatorsDropdownList = []
    activeOperatorParametersList = []

    operatorgroupingPagination = ""
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"operatorgroupingPermissions")
    print(permissionsList,"((((((((permissionsList))))))))")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","Operatorgrouping")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Operatorgrouping"
            search_element = request.args.get('search_element','')

            ############################################################### operatorgrouping list ######################################################################

            operators_grouping_queryset = OperatorGrouping.objects(status__in=[0,1]).order_by('-id')
            if search_element:
                operators_grouping_queryset = OperatorGrouping.filter(Q(name__icontains=search_element))

            operatorgrouping = request.args.get(get_page_parameter('operatorgrouping'), type=int, default=1)
            print(operatorgrouping,"operatorgrouping")

            per_page = 20

            total_count = operators_grouping_queryset.count()

            start = (operatorgrouping - 1) * per_page

            end = min(start + per_page, total_count)

            total_operatorgrouping = operators_grouping_queryset[start:end]
            
            snoCount = start
            
            for each_operator_grouping in total_operatorgrouping:
                snoCount +=1
                operator_grouping_dict = fetching_operator_grouping_details(each_operator_grouping)
                operator_grouping_dict["snoCount"]=snoCount
                operatorGroupingList.append(operator_grouping_dict)

            operatorgroupingPagination = Pagination(operatorgrouping=operatorgrouping, total=total_count, page_parameter="operatorgrouping",per_page=per_page, alignment="right", record_name="operatorgrouping")   

            ############### activeOperatorParametersList##################

            activeOperatorParametersList=fetching_has_grouping_operator_parameter_details()

            ############ Operators DropDownList##################
            operators_queryset = Operators.objects(status__in=[0,1]).order_by('sorting')

            for each_operator in operators_queryset:
                operator_dict = fetching_operator_details(each_operator)
                operatorsDropdownList.append(operator_dict)
            

            
            
            return render_template("super_admin_templates/operator_grouping_list.html",
                operatorgroupingPagination=operatorgroupingPagination,
                operatorGroupingList=operatorGroupingList,
                operatorsDropdownList=operatorsDropdownList,
                activeOperatorParametersList=activeOperatorParametersList,
                search_element=search_element,
                redirectval=redirectval
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch services details!!"
            return render_template("super_admin_templates/operator_grouping_list.html",
                operatorgroupingPagination=operatorgroupingPagination,
                operatorGroupingList=operatorGroupingList,
                operatorsDropdownList=operatorsDropdownList,
                activeOperatorParametersList=activeOperatorParametersList,
                search_element=search_element,
                redirectval=redirectval
                )   
    else:
        flash("Staff member does not have given view operator grouping permissions!!")
        return redirect(url_for("admin.dashboard"))        






################### operator Update ################
@service_configurations.route("/operator_update_list",methods=["POST","GET"])
def operator_update_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    operatorUpdateList = []    
    operatorsDropdownList = []

    operatorupdatePagination = ""
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"operatorupdatePermissions")
    print(permissionsList,"((((((((permissionsList))))))))")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","Operatorupdate")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Operatorupdate"
            search_element = request.args.get('search_element','')

             ############################################################### operator update list ######################################################################

            operators_update_queryset = OperatorUpdate.objects(status__in=[0,1]).order_by('-id')
            # if search_element:
            #     operators_update_queryset = OperatorUpdate.filter(Q(apiOperatorCode1__icontains=search_element))

            operatorupdatepage = request.args.get(get_page_parameter('operatorupdatepage'), type=int, default=1)
            print(operatorupdatepage,"operatorupdatepage")

            per_page = 20

            total_count = operators_update_queryset.count()

            start = (operatorupdatepage - 1) * per_page

            end = min(start + per_page, total_count)

            total_operatorsupdate = operators_update_queryset[start:end]
            
            snoCount = start
            
            for each_operator_update in total_operatorsupdate:
                snoCount +=1
                operator_update_dict = fetching_operator_update_details(each_operator_update)
                operator_update_dict["snoCount"]=snoCount
                operatorUpdateList.append(operator_update_dict)

            operatorupdatePagination = Pagination(operatorupdatepage=operatorupdatepage, total=total_count, page_parameter="operatorupdatepage", per_page=per_page, alignment="right", record_name="operatorsupdate")        

            ############ Operators DropDownList##################
            operators_queryset = Operators.objects(status__in=[0,1]).order_by('sorting')

            for each_operator in operators_queryset:
                operator_dict = fetching_operator_details(each_operator)
                operatorsDropdownList.append(operator_dict)
            

            
            return render_template("super_admin_templates/operators_update_list.html",
                operatorupdatePagination=operatorupdatePagination,
                operatorUpdateList=operatorUpdateList,
                operatorsDropdownList=operatorsDropdownList,
                search_element=search_element,
                redirectval=redirectval
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch services details!!"
            return render_template("super_admin_templates/operators_update_list.html",
                operatorupdatePagination=operatorupdatePagination,
                operatorUpdateList=operatorUpdateList,
                operatorsDropdownList=operatorsDropdownList,
                search_element=search_element,
                redirectval=redirectval
                )        
    else:
        flash("Staff member does not have given view operator update permissions!!")
        return redirect(url_for("admin.dashboard"))



################### operator parameter ################
@service_configurations.route("/operator_parameter_list",methods=["POST","GET"])
def operator_parameter_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    operatorParametersList = []    
    operatorsDropdownList = []
    transactionAPIsList = []

    operatorparameterPagination = ""
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"operatorparameterPermissions")
    print(permissionsList,"((((((((permissionsList))))))))")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","Operatorparameter")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Operatorparameter"
            search_element = request.args.get('search_element','')

             ############################################################### operator parameter list ######################################################################

            operator_parameters_queryset = OperatorParameter.objects(status__in=[0,1]).order_by('sort')
            # if search_element:
            #     operators_update_queryset = OperatorUpdate.filter(Q(apiOperatorCode1__icontains=search_element))

            operatorparameter = request.args.get(get_page_parameter('operatorparameter'), type=int, default=1)
            print(operatorparameter,"operatorparameter")

            per_page = 20

            total_count = operator_parameters_queryset.count()

            start = (operatorparameter - 1) * per_page

            end = min(start + per_page, total_count)

            total_operatorparameter = operator_parameters_queryset[start:end]
            
            snoCount = start
            
            for each_operator_parameter in total_operatorparameter:
                snoCount +=1
                operator_parameter_dict = fetching_operator_parameter_details(each_operator_parameter)
                operator_parameter_dict["snoCount"]=snoCount
                operatorParametersList.append(operator_parameter_dict)

            operatorparameterPagination = Pagination(operatorparameter=operatorparameter, total=total_count, page_parameter="operatorparameter", per_page=per_page, alignment="right", record_name="operatorparameter")        

            ############ Operators DropDownList##################
            operators_queryset = Operators.objects(status__in=[0,1]).order_by('sorting')

            for each_operator in operators_queryset:
                operator_dict = fetching_operator_details(each_operator)
                operatorsDropdownList.append(operator_dict)

            ############ Transaction API DropDownList##################

            transaction_API_queryset = TransactionAPI.objects(status__in=[0,1]).order_by('-id')
            for each_transaction_api in transaction_API_queryset:
                transaction_api_dict = {
                "id":str(each_transaction_api.id),
                "apiName":each_transaction_api.apiName
                }
                transactionAPIsList.append(transaction_api_dict)
                
            return render_template("super_admin_templates/operator_parameter_list.html",
                operatorparameterPagination=operatorparameterPagination,
                operatorParametersList=operatorParametersList,
                operatorsDropdownList=operatorsDropdownList,
                transactionAPIsList=transactionAPIsList,
                search_element=search_element,
                redirectval=redirectval
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch services details!!"
            return render_template("super_admin_templates/operator_parameter_list.html",
                operatorparameterPagination=operatorparameterPagination,
                operatorParametersList=operatorParametersList,
                operatorsDropdownList=operatorsDropdownList,
                transactionAPIsList=transactionAPIsList,
                search_element=search_element,
                redirectval=redirectval
                )   
    else:
        flash("Staff member does not have given view operator parameter permissions!!")
        return redirect(url_for("admin.dashboard"))     


################### sub parameter ################
@service_configurations.route("/sub_parameter_list",methods=["POST","GET"])
def sub_parameter_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    subParametersList = []    
    hasSubOperatorParametersList = []    
    operatorsDropdownList = []
    transactionAPIsList = []

    subparameterPagination = ""
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"subparameterPermissions")
    print(permissionsList,"((((((((permissionsList))))))))")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","Subparameter")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Subparameter"
            search_element = request.args.get('search_element','')

            ############################################################### sub parameter list ######################################################################

            sub_parameters_queryset = SubParameters.objects(status__in=[0,1]).order_by('sort')
            # if search_element:
            #     operators_update_queryset = OperatorUpdate.filter(Q(apiOperatorCode1__icontains=search_element))

            subparameterpage = request.args.get(get_page_parameter('subparameterpage'), type=int, default=1)
            print(subparameterpage,"subparameterpage")

            per_page = 20

            total_count = sub_parameters_queryset.count()

            start = (subparameterpage - 1) * per_page

            end = min(start + per_page, total_count)

            total_subparameter = sub_parameters_queryset[start:end]
            
            snoCount = start
            
            for each_sub_parameter in total_subparameter:
                snoCount +=1
                sub_parameter_dict = fetching_sub_parameter_details(each_sub_parameter)
                sub_parameter_dict["snoCount"]=snoCount
                subParametersList.append(sub_parameter_dict)

            subparameterPagination = Pagination(subparameterpage=subparameterpage, total=total_count,page_parameter="subparameterpage",  per_page=per_page, alignment="right", record_name="subparameter")  

            ############ Operators DropDownList##################
            hasSubOperatorParametersList=fetching_has_sub_operator_parameter_details()

            operators_queryset = Operators.objects(status__in=[0,1]).order_by('sorting')

            for each_operator in operators_queryset:
                operator_dict = fetching_operator_details(each_operator)
                operatorsDropdownList.append(operator_dict)

            ############ Transaction API DropDownList##################

            transaction_API_queryset = TransactionAPI.objects(status__in=[0,1]).order_by('-id')
            for each_transaction_api in transaction_API_queryset:
                transaction_api_dict = {
                "id":str(each_transaction_api.id),
                "apiName":each_transaction_api.apiName
                }
                transactionAPIsList.append(transaction_api_dict)
                
            return render_template("super_admin_templates/sub_parameters_list.html",
                subparameterPagination=subparameterPagination,
                subParametersList=subParametersList,
                hasSubOperatorParametersList=hasSubOperatorParametersList,
                operatorsDropdownList=operatorsDropdownList,
                transactionAPIsList=transactionAPIsList,
                search_element=search_element,
                redirectval=redirectval
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch services details!!"
            return render_template("super_admin_templates/sub_parameters_list.html",
                subparameterPagination=subparameterPagination,
                subParametersList=subParametersList,
                hasSubOperatorParametersList=hasSubOperatorParametersList,
                operatorsDropdownList=operatorsDropdownList,
                transactionAPIsList=transactionAPIsList,
                search_element=search_element,
                redirectval=redirectval
                )   
    else:
        flash("Staff member does not have given view sub parameter permissions!!")
        return redirect(url_for("admin.dashboard")) 


################### sub parameter Grouping ################
@service_configurations.route("/sub_parameter_grouping_list",methods=["POST","GET"])
def sub_parameter_grouping_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    subParameterGroupingsList = []    
    operatorsDropdownList = []    
    

    subparameterPagination = ""
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"subparametergroupingPermissions")
    print(permissionsList,"((((((((permissionsList))))))))")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","Subparametergrouping")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Subparametergrouping"
            search_element = request.args.get('search_element','')

             ############################################################### sub parameter grouping list ######################################################################

            sub_parameter_grouping_queryset = SubParameterGrouping.objects(status__in=[0,1]).order_by("-id").all()
            # if search_element:
            #     operators_update_queryset = OperatorUpdate.filter(Q(apiOperatorCode1__icontains=search_element))

            subparametergroupingpage = request.args.get(get_page_parameter('subparametergroupingpage'), type=int, default=1)
            print(subparametergroupingpage,"subparametergroupingpage")

            per_page = 20

            total_count = sub_parameter_grouping_queryset.count()

            start = (subparametergroupingpage - 1) * per_page

            end = min(start + per_page, total_count)

            total_subparametergrouping = sub_parameter_grouping_queryset[start:end]
            
            snoCount = start
            
            for each_sub_parameter_grouping in total_subparametergrouping:
                snoCount +=1
                sub_parameter_grouping_dict = fetching_sub_parameter_grouping_details(each_sub_parameter_grouping)
                sub_parameter_grouping_dict["snoCount"]=snoCount
                subParameterGroupingsList.append(sub_parameter_grouping_dict)

            subparametergroupingPagination = Pagination(page=subparametergroupingpage, total=total_count,page_parameter="subparametergroupingpage", per_page=per_page, alignment="right", record_name="subparametergrouping") 

            ############ Operators DropDownList##################

            operators_queryset = Operators.objects(status__in=[0,1]).order_by('sorting')

            for each_operator in operators_queryset:
                operator_dict = fetching_operator_details(each_operator)
                operatorsDropdownList.append(operator_dict)
                
            return render_template("super_admin_templates/sub_parameter_grouping_list.html",
                subparametergroupingPagination=subparametergroupingPagination,
                subParameterGroupingsList=subParameterGroupingsList,
                operatorsDropdownList=operatorsDropdownList,
                search_element=search_element,
                redirectval=redirectval
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch services details!!"
            return render_template("super_admin_templates/sub_parameter_grouping_list.html",
                subparametergroupingPagination=subparametergroupingPagination,
                subParameterGroupingsList=subParameterGroupingsList,
                operatorsDropdownList=operatorsDropdownList,
                search_element=search_element,
                redirectval=redirectval
                )   
    else:
        flash("Staff member does not have given view sub parameter grouping permissions!!")
        return redirect(url_for("admin.dashboard"))     


###################category################
# Add category
@service_configurations.route("/add_category",methods=["POST","GET"])
def add_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")

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

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

        actionDate=datetime.datetime.now()
        permissionsList = check_permissions(adminId,"servicesPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                categoryName = request.form.get("categoryName","")
                serviceGroupingId = request.form.get("serviceGroupingId","")
                # transactionAPIId = request.form.get("transactionAPIId","")
                sorting = request.form.get("sorting","")
                displayInDashboard = request.form.get("displayInDashboard")
                comingsoon = request.form.get("comingsoon")
                isTpin = request.form.get("isTpin")
                image = request.files.get("image","")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if categoryName:
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+categoryName+" Category created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_category","create",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                        category_table = Categories(
                            adminId=adminId,
                            categoryName = categoryName,
                            serviceGroupingId = serviceGroupingId,
                            transactionAPIId = None,
                            sorting = sorting,
                            # displayInDashboard = displayInDashboard,
                            # isTpin = isTpin,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = category_table.save()
                        categoryId = str(save_table.id)

                        if isTpin == None:
                            save_table.update(isTpin=False)
                        else:
                            save_table.update(isTpin=True)

                        if displayInDashboard == None:
                            save_table.update(displayInDashboard=False)
                        else:
                            save_table.update(displayInDashboard=True)

                        if comingsoon == None:
                            save_table.update(comingsoon=False)
                        else:
                            save_table.update(comingsoon=True)

                        if image:       
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/categories/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/categories/"))
                            save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/categories/"+categoryId+".png"))
                            save_table.update(image="media/categories/"+categoryId+".png")

                        flash("Category saved successfully!")
                        return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))
                    except Exception as e:
                        flash("Unable to save fee distribution setting!!")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))
        else:
            flash("Staff member does not have given create category permissions!!")
            return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save category!!"
        return render_template("super_admin_templates/service_configurations_list.html",error=error)


# View All Categories
@service_configurations.route("/service_configurations_list",methods=["POST","GET"])
def service_configurations_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    categoriesList = []
    servicesDropdownList = []
    servicesList = []
    walletsList = []
    taxTypesList = []
    statesList = []
    operatorsList = []
    operatorUpdateList = []
    operatorParametersList = []
    subParametersList = []
    operatorGroupingList = []
    serviceGroupingList = []
    serviceGroupingDropdownList = []
    transactionAPIsList = []
    activeOperatorParametersList = []
    hasSubOperatorParametersList = []
    subParameterGroupingsList = []
    operatorsDropdownList = []
    servicePagination = ""
    categoryPagination = ""
    operatorPagination = ""
    operatorparameterPagination = ""
    operatorupdatePagination = ""
    operatorgroupingPagination = ""
    servicegroupingPagination = ""
    subparameterPagination =""
    subparametergroupingPagination = ""
    
    adminId = session.get("adminId")
    try:
        redirectTo = request.args.get("redirectTo","ServiceGrouping")
        if redirectTo:
            redirectval = redirectTo
        else:
            redirectval = "ServiceGrouping" 
        search = False  
        search_element = request.args.get('search_element','')
        if search_element:
            search = True

         ######### categories list ############

        categories_queryset = Categories.objects(status__in=[0,1]).order_by("sorting")
        if search_element:
            categories_queryset = Categories.filter(Q(categoryName__icontains=search_element))
        # length = categories_queryset.count()
        # categories_queryset=categories_queryset[page_start:page_end]


        #page = request.args.get(get_page_parameter(), type=int, default=1)
        categoriespage = request.args.get(get_page_parameter('categoriespage'), type=int, default=1)
        print(categoriespage,"categoriespage")

        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = categories_queryset.count()

        start = (categoriespage - 1) * per_page

        end = min(start + per_page, total_count)

        total_categories = categories_queryset[start:end]
        
        snoCount = start
        

        for each_category in total_categories:
            snoCount +=1
            category_dict = fetching_category_details(each_category)
            category_dict["snoCount"]=snoCount
            categoriesList.append(category_dict)

        categoryPagination = Pagination(categoriespage=categoriespage, total=total_count,page_parameter="categoriespage", per_page=per_page, alignment="right", record_name="category",href=domain+"api/super_admin/service_configurations_list?redirectTo=Category&categoriespage={0}")    

        ########### fetching services ############

        services_queryset = Service.objects(status__in=[0,1]).order_by("sorting")
        if search_element:
            services_queryset = Service.filter(Q(serviceName__icontains=search_element))
        # length = services_queryset.count()
        # services_queryset=services_queryset[page_start:page_end]

        # Get the current page from the query parameters
        #page = request.args.get(get_page_parameter(), type=int, default=1)
        servicepage = request.args.get(get_page_parameter('servicepage'), type=int, default=1)
        print(servicepage,"servicepage")
        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = services_queryset.count()

        start = (servicepage - 1) * per_page

        end = min(start + per_page, total_count)

        total_services = services_queryset[start:end]
        
        snoCount = start
        for each_service in total_services:
            snoCount +=1
            service_dict = fetching_service_details(each_service)
            service_dict["snoCount"]=snoCount
            servicesList.append(service_dict)

        for each_service in services_queryset:
            service_dict = fetching_service_details(each_service)
            servicesDropdownList.append(service_dict)

        # Pagination object for rendering pagination controls in the template
        # servicePagination = Pagination(page=servicepage, total=total_count, page_parameter="servicepage",per_page=per_page, alignment="right", record_name="Services")
        servicePagination = Pagination(servicepage=servicepage, total=total_count,page_parameter="servicepage",per_page=per_page, alignment="right", record_name="Services",href=domain+"api/super_admin/service_configurations_list?redirectTo=Service&servicepage={0}")
        

        ######### Operators list #############

        operators_queryset = Operators.objects(status__in=[0,1]).order_by('sorting')
        #if search_element:
        #    operators_queryset = Operators.filter(Q(operatorName__icontains=search_element))
        # length = operators_queryset.count()
        # operators_queryset=operators_queryset[page_start:page_end]

        #page = request.args.get(get_page_parameter(), type=int, default=1)
        operatorpage = request.args.get(get_page_parameter('operatorpage'), type=int, default=1)
        print(operatorpage,"operatorpage")

        operatorper_page = 20 # Number of items per page

        # Query the database for the current page's data
        total_operators_count = operators_queryset.count()

        operatorstart = (operatorpage - 1) * operatorper_page

        operatorend = min(operatorstart + operatorper_page, total_operators_count)

        total_operators = operators_queryset[operatorstart:operatorend]
        
        operatorSnoCount = operatorstart

        for each_operator in total_operators:
            operatorSnoCount +=1
            operator_dict = fetching_operator_details(each_operator)
            operator_dict["operatorSnoCount"]=operatorSnoCount
            operatorsList.append(operator_dict)

        for each_operator in operators_queryset:
            operator_dict = fetching_operator_details(each_operator)
            operatorsDropdownList.append(operator_dict)

        operatorPagination = Pagination(operatorpage=operatorpage, total=total_operators_count, page_parameter="operatorpage",per_page=operatorper_page, alignment="right", record_name="operators",href=domain+"api/super_admin/service_configurations_list?redirectTo=Operator&operatorpage={0}")    

        ############ Operator update list ##########

        operators_update_queryset = OperatorUpdate.objects(status__in=[0,1]).order_by('-id')
        # if search_element:
        #     operators_update_queryset = OperatorUpdate.filter(Q(apiOperatorCode1__icontains=search_element))
        # length = operators_update_queryset.count()
        # operators_update_queryset=operators_update_queryset[page_start:page_end]

        #page = request.args.get(get_page_parameter(), type=int, default=1)
        operatorupdatepage = request.args.get(get_page_parameter('operatorupdatepage'), type=int, default=1)
        print(operatorupdatepage,"operatorupdatepage")

        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = operators_update_queryset.count()

        start = (operatorupdatepage - 1) * per_page

        end = min(start + per_page, total_count)

        total_operatorsupdate = operators_update_queryset[start:end]
        
        snoCount = start

        for each_operator_update in total_operatorsupdate:
            snoCount +=1
            operator_update_dict = fetching_operator_update_details(each_operator_update)
            operator_update_dict["snoCount"]=snoCount
            operatorUpdateList.append(operator_update_dict)

        operatorupdatePagination = Pagination(operatorupdatepage=operatorupdatepage, total=total_count, page_parameter="operatorupdatepage", per_page=per_page, alignment="right", record_name="operatorsupdate",href=domain+"api/super_admin/service_configurations_list?redirectTo=OperatorUpdate&operatorupdatepage={0}")        

        ############# Operator Parameters list ############
        operator_parameters_queryset = OperatorParameter.objects(status__in=[0,1]).order_by('sort')
        #if search_element:
        #    operator_parameters_queryset = OperatorParameter.filter(Q(parameterName__icontains=search_element))
        # length = operator_parameters_queryset.count()
        # operator_parameters_queryset=operator_parameters_queryset[page_start:page_end]

        #page = request.args.get(get_page_parameter(), type=int, default=1)
        operatorparameter = request.args.get(get_page_parameter('operatorparameter'), type=int, default=1)
        print(operatorparameter,"operatorparameter")

        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = operator_parameters_queryset.count()

        start = (operatorparameter - 1) * per_page

        end = min(start + per_page, total_count)

        total_operatorparameter = operator_parameters_queryset[start:end]
        
        snoCount = start

        for each_operator_parameter in total_operatorparameter:
            snoCount +=1
            operator_parameter_dict = fetching_operator_parameter_details(each_operator_parameter)
            operator_parameter_dict["snoCount"]=snoCount
            operatorParametersList.append(operator_parameter_dict)

        operatorparameterPagination = Pagination(operatorparameter=operatorparameter, total=total_count,page_parameter="operatorparameter", per_page=per_page, alignment="right", record_name="operatorparameter",href=domain+"api/super_admin/service_configurations_list?redirectTo=OperatorParameter&operatorparameter={0}")     

        ########## Operator Grouping list ##############
        activeOperatorParametersList=fetching_has_grouping_operator_parameter_details()
        operators_grouping_queryset = OperatorGrouping.objects(status__in=[0,1]).order_by('-id')
        if search_element:
            operators_grouping_queryset = OperatorGrouping.filter(Q(name__icontains=search_element))
        # length = operators_grouping_queryset.count()
        # operators_grouping_queryset=operators_grouping_queryset[page_start:page_end]


        #page = request.args.get(get_page_parameter(), type=int, default=1)
        operatorgrouping = request.args.get(get_page_parameter('operatorgrouping'), type=int, default=1)
        print(operatorgrouping,"operatorgrouping")


        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = operators_grouping_queryset.count()

        start = (operatorgrouping - 1) * per_page

        end = min(start + per_page, total_count)

        total_operatorgrouping = operators_grouping_queryset[start:end]
        
        snoCount = start

        for each_operator_grouping in total_operatorgrouping:
            snoCount +=1
            operator_grouping_dict = fetching_operator_grouping_details(each_operator_grouping)
            operator_grouping_dict["snoCount"]=snoCount
            operatorGroupingList.append(operator_grouping_dict)

        operatorgroupingPagination = Pagination(operatorgrouping=operatorgrouping, total=total_count,page_parameter="operatorgrouping", per_page=per_page, alignment="right", record_name="operatorgrouping",href=domain+"api/super_admin/service_configurations_list?redirectTo=OperatorGrouping&operatorgrouping={0}")

        ########## Service Grouping list ##############
        service_grouping_queryset = ServiceGrouping.objects(status__in=[0,1]).order_by('sorting')
        if search_element:
            service_grouping_queryset = ServiceGrouping.filter(Q(name__icontains=search_element))
        # length = service_grouping_queryset.count()
        # service_grouping_queryset=service_grouping_queryset[page_start:page_end]

       # page = request.args.get(get_page_parameter(), type=int, default=1)
        servicegrouping = request.args.get(get_page_parameter('servicegrouping'), type=int, default=1)
        print(servicegrouping,"servicegrouping")

        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = service_grouping_queryset.count()

        start = (servicegrouping - 1) * per_page

        end = min(start + per_page, total_count)

        total_servicegrouping = service_grouping_queryset[start:end]
        
        snoCount = start

        for each_service_grouping in total_servicegrouping:
            snoCount +=1
            service_grouping_dict = fetching_service_grouping_details(each_service_grouping)
            service_grouping_dict["snoCount"]=snoCount
            serviceGroupingList.append(service_grouping_dict)

        for each_service_grouping in service_grouping_queryset:
            service_grouping_dict = fetching_service_grouping_details(each_service_grouping)
            serviceGroupingDropdownList.append(service_grouping_dict)

        servicegroupingPagination = Pagination(servicegrouping=servicegrouping, total=total_count,page_parameter="servicegrouping", per_page=per_page, alignment="right", record_name="servicegrouping",href=domain+"api/super_admin/service_configurations_list?redirectTo=ServiceGrouping&servicegrouping={0}")    

        ############# Sub Parameters list ############
        hasSubOperatorParametersList=fetching_has_sub_operator_parameter_details()
        sub_parameters_queryset = SubParameters.objects(status__in=[0,1]).order_by('sort')
        # if search_element:
        #     operator_parameters_queryset = OperatorParameter.filter(Q(parameterName__icontains=search_element))
        # # length = operator_parameters_queryset.count()
        # # operator_parameters_queryset=operator_parameters_queryset[page_start:page_end]


        #page = request.args.get(get_page_parameter(), type=int, default=1)
        subparameterpage = request.args.get(get_page_parameter('subparameterpage'), type=int, default=1)
        print(subparameterpage,"subparameterpage")

        per_page = 5 # Number of items per page

        # Query the database for the current page's data
        total_count = sub_parameters_queryset.count()

        start = (subparameterpage - 1) * per_page

        end = min(start + per_page, total_count)

        total_subparameter = sub_parameters_queryset[start:end]
        
        snoCount = start

        for each_sub_parameter in total_subparameter:
            snoCount +=1
            sub_parameter_dict = fetching_sub_parameter_details(each_sub_parameter)
            sub_parameter_dict["snoCount"]=snoCount
            subParametersList.append(sub_parameter_dict)

        subparameterPagination = Pagination(subparameterpage=subparameterpage, total=total_count,page_parameter="subparameterpage",  per_page=per_page, alignment="right", record_name="subparameter",href=domain+"api/super_admin/service_configurations_list?redirectTo=SubParameter&subparameterpage={0}")  

         ############# Sub Parameters Grouping list ############  

        sub_parameter_grouping_queryset = SubParameterGrouping.objects(status__in=[0,1]).order_by("-id").all()


        #page = request.args.get(get_page_parameter(), type=int, default=1)
        subparametergroupingpage = request.args.get(get_page_parameter('subparametergroupingpage'), type=int, default=1)
        print(subparametergroupingpage,"subparametergroupingpage")

        subparametergroupingper_page = 20 # Number of items per page

        # Query the database for the current page's data
        total_subparametergrouping_count = sub_parameter_grouping_queryset.count()

        start_subparametergrouping = (subparametergroupingpage - 1) * subparametergroupingper_page

        end_subparametergrouping = min(start_subparametergrouping + subparametergroupingper_page, total_subparametergrouping_count)

        total_subparametergrouping = sub_parameter_grouping_queryset[start_subparametergrouping:end_subparametergrouping]
        
        subparametergroupingsnoCount = start_subparametergrouping

        for each_sub_parameter_grouping in total_subparametergrouping:
            subparametergroupingsnoCount +=1
            sub_parameter_grouping_dict = fetching_sub_parameter_grouping_details(each_sub_parameter_grouping)
            sub_parameter_grouping_dict["snoCount"]=subparametergroupingsnoCount
            subParameterGroupingsList.append(sub_parameter_grouping_dict)


        subparametergroupingPagination = Pagination(page=subparametergroupingpage, total=total_subparametergrouping_count,page_parameter="subparametergroupingpage", per_page=subparametergroupingper_page, alignment="right", record_name="subparametergrouping",href=domain+"api/super_admin/service_configurations_list?redirectTo=SubParameterGrouping&subparametergroupingpage={0}") 

        ############ wallets list ############
        ############ tax types list ############
        ############ states list ############
        ############ transactionAPI list ############
        walletsList = fetching_wallet_details()
        taxTypesList = fetching_tax_type_details()
        statesList = fetching_state_details()

        transaction_API_queryset = TransactionAPI.objects(status__in=[0,1]).order_by('-id')
        for each_transaction_api in transaction_API_queryset:
            transaction_api_dict = {
            "id":str(each_transaction_api.id),
            "apiName":each_transaction_api.apiName
            }
            transactionAPIsList.append(transaction_api_dict)

        print(transactionAPIsList,"((((((((((transactionAPIsList))))))))))")
        # pagination = Pagination(
        #     page=page,
        #     total=length,
        #     found=length,
        #     record_name='categories',
        #     per_page=10,
        #     alignment="right"
        #     )


        return render_template("super_admin_templates/service_configurations_list.html",
            subparametergroupingPagination =subparametergroupingPagination,
            subparameterPagination = subparameterPagination,
            servicegroupingPagination=servicegroupingPagination,
            operatorgroupingPagination=operatorgroupingPagination,
            operatorupdatePagination=operatorupdatePagination,
            operatorparameterPagination=operatorparameterPagination,
            operatorPagination=operatorPagination,
            categoryPagination=categoryPagination,
            servicePagination=servicePagination,
            categoriesList=categoriesList,
            servicesList=servicesList,
            servicesDropdownList=servicesDropdownList,
            taxTypesList=taxTypesList,
            operatorsList=operatorsList,
            operatorUpdateList=operatorUpdateList,
            operatorParametersList=operatorParametersList,
            subParametersList=subParametersList,
            operatorGroupingList=operatorGroupingList,
            serviceGroupingList=serviceGroupingList,
            serviceGroupingDropdownList=serviceGroupingDropdownList,
            transactionAPIsList=transactionAPIsList,
            activeOperatorParametersList=activeOperatorParametersList,
            hasSubOperatorParametersList=hasSubOperatorParametersList,
            subParameterGroupingsList=subParameterGroupingsList,
            statesList=statesList,
            walletsList=walletsList,
            search_element=search_element,
            redirectval=redirectval,
            operatorsDropdownList=operatorsDropdownList,
            # pagination=pagination,
            )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch categories details!!"
        return render_template("super_admin_templates/service_configurations_list.html",
            subparametergroupingPagination = subparametergroupingPagination,
            subparameterPagination = subparameterPagination,
            servicegroupingPagination=servicegroupingPagination,
            operatorgroupingPagination=operatorgroupingPagination,
            operatorupdatePagination=operatorupdatePagination,
            operatorparameterPagination=operatorparameterPagination,
            operatorPagination=operatorPagination,
            categoryPagination=categoryPagination,
            servicePagination=servicePagination,
            categoriesList=categoriesList,
            servicesList=servicesList,
            servicesDropdownList=servicesDropdownList,
            taxTypesList=taxTypesList,
            operatorsList=operatorsList,
            operatorUpdateList=operatorUpdateList,
            operatorParametersList=operatorParametersList,
            subParametersList=subParametersList,
            operatorGroupingList=operatorGroupingList,
            serviceGroupingList=serviceGroupingList,
            serviceGroupingDropdownList=serviceGroupingDropdownList,
            transactionAPIsList=transactionAPIsList,
            activeOperatorParametersList=activeOperatorParametersList,
            hasSubOperatorParametersList=hasSubOperatorParametersList,
            statesList=statesList,
            walletsList=walletsList,
            search_element=search_element,
            redirectval = redirectval,
            operatorsDropdownList = operatorsDropdownList,
            # pagination=pagination,
            )

# Update category status
@service_configurations.route("/update_category_status",methods=["POST","GET"])
def update_category_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

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

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    permissionsList = check_permissions(session.get("adminId"),"servicesPermissions")
    if "edit" in permissionsList:
        categoryId = request.args.get("categoryId","")

        if categoryId:
            try:
                category_queryset = Categories.objects(id=categoryId,status__nin=[2]).first()
                existing_record = category_queryset.to_json()
                requestData = [existing_record]
                if category_queryset:
                    if category_queryset.status == 0:
                        category_queryset.update(status=1)
                        flash("Category activated successfully!")
                        message=category_queryset.adminId.userName+" "+category_queryset.categoryName+" Category activated successfully!"
                    elif category_queryset.status == 1:
                        category_queryset.update(status=0)
                        flash("Category deactivated successfully!")
                        message=category_queryset.adminId.userName+" "+category_queryset.categoryName+" Category deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_category_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))
        else:
            return redirect(url_for("service_configurations.categories_configurations_list"))
    else:
        flash("Staff member does not have given update status category permissions!!")
        return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))



# Update category
@service_configurations.route("/update_category",methods=["POST","GET"])
def update_category():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")   
     
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record = ""
    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()
    permissionsList = check_permissions(session.get("adminId"),"servicesPermissions")
    if "edit" in permissionsList:
        try:
            categoryId = request.args.get("categoryId","")
            if request.method == "POST":
                categoryName = request.form.get("categoryName","")
                serviceGroupingId = request.form.get("serviceGroupingId","")
                # transactionAPIId = request.form.get("transactionAPIId","")
                sorting = request.form.get("sorting","")
                displayInDashboard = request.form.get("displayInDashboard")
                comingsoon = request.form.get("comingsoon")
                isTpin = request.form.get("isTpin")
                image = request.files.get("image","")
                jsonData = request.form.to_dict(flat=True)

                print(comingsoon,"(((((((comingsoon)))))))")
                print(type(comingsoon),"(((((((comingsoon)))))))")
                print(request.form)
                print(displayInDashboard)
                print("((((((((((((((((((((((((displayInDashboard))))))))))))))))))))))))")
                category_queryset = Categories.objects(id=categoryId).first()
                existing_record = category_queryset.to_json()
                message=category_queryset.adminId.userName+" "+categoryName+" Category updated successfully!"
                requestData=[existing_record]
                updatedrequestData=[jsonData]
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_category","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                if category_queryset:
                    category_queryset.update(
                        categoryName=categoryName,
                        sorting=sorting,
                        serviceGroupingId=ObjectId(serviceGroupingId),
                        transactionAPIId=None
                        )
                    if isTpin == None:
                        category_queryset.update(isTpin=False)
                    else:
                        category_queryset.update(isTpin=True)

                    if displayInDashboard == None:
                        category_queryset.update(displayInDashboard=False)
                    else:
                        category_queryset.update(displayInDashboard=True)

                    if comingsoon == None:
                        category_queryset.update(comingsoon=False)
                    else:
                        category_queryset.update(comingsoon=True)  

                    if image:       
                        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/categories/")):
                            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/categories/"))
                        save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/categories/"+str(categoryId)+".png"))
                        category_queryset.update(image="media/categories/"+str(categoryId)+".png")
                    flash("Category updated successfully!")
                    return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to update category!!"
            return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))
    else:
        flash("Staff member does not have given update category permissions!!")
        return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))


# Delete Category
@service_configurations.route("/delete_category",methods=["GET"])
def delete_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()

        jsonData = request.form.to_dict(flat=True)

        existing_record = ""
        updatedrequestData = [jsonData]
        permissionsList = check_permissions(session.get("adminId"),"servicesPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                categoryId = request.args.get("categoryId","")
                category_queryset = Categories.objects(id=categoryId,status__in=[0,1]).first()
                existing_record = category_queryset.to_json()
                requestData = [existing_record]
                category_queryset.update(status=2)
                flash("Category deleted successfully!")
                message=category_queryset.adminId.userName+" "+category_queryset.categoryName+" Category deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_category","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))
        else:
            flash("Staff member does not have given delete category permissions!!")
            return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete category!!")
        return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category"))


############# Service API's ################

# Add Service
@service_configurations.route("/add_service",methods=["POST","GET"])
def add_service():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()
        permissionsList = check_permissions(adminId,"subservicesPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                serviceName = request.form.get("serviceName","")
                serviceType = request.form.get("serviceType","")
                walletId = request.form.get("walletId","")
                categoryId = request.form.get("categoryId","")
                serviceGroupingId = request.form.get("serviceGroupingId","")
                # transactionAPIId = request.form.get("transactionAPIId","")
                code = request.form.get("code","")
                sorting = request.form.get("sorting","")
                displayInDashboard = request.form.get("displayInDashboard")
                isService = request.form.get("isService")
                isbbps = request.form.get("isbbps")
                isOperatorWise = request.form.get("isOperatorWise")
                file = request.files.get("file","")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if serviceName and serviceType and walletId and categoryId and code :
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+serviceName+" service created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_service","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                        service_table = Service(
                            adminId = adminId,
                            serviceName = serviceName,
                            serviceType = serviceType,
                            walletId = walletId,
                            categoryId = categoryId,
                            serviceGroupingId = serviceGroupingId,
                            transactionAPIId = None,
                            code = code,
                            sorting = sorting,
                            # displayInDashboard = displayInDashboard,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = service_table.save()
                        serviceId = str(save_table.id)

                        if isService == None:
                            save_table.update(isService=False)
                        else:
                            save_table.update(isService=True)
                        if isbbps == None:
                            save_table.update(isbbps=False)
                        else:
                            save_table.update(isbbps=True)
                        if isOperatorWise == None:
                            save_table.update(isOperatorWise=False)
                        else:
                            save_table.update(isOperatorWise=True)

                        if displayInDashboard == None:
                            save_table.update(displayInDashboard=False)
                        else:
                            save_table.update(displayInDashboard=True)

                        if file:       
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/services/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/services/"))
                            save_file = file.save(os.path.join(app.config['SITE_ROOT'], "media/services/"+serviceId+".png"))
                            save_table.update(file="media/services/"+serviceId+".png")

                        flash("New service saved successfully!")
                        return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
                    except Exception as e:
                        flash("Unable to save service!!")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
        else:
            flash("Staff member does not have given create sub services permissions!!")
            return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save service!!"
        return render_template("super_admin_templates/services_configurations_list.html",error=error)

#Update Service
@service_configurations.route("/update_service",methods=["POST","GET"])
def update_service():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record =""
    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()
    permissionsList = check_permissions(session.get("adminId"),"subservicesPermissions")
    if "edit" in permissionsList:
        try:
            serviceId = request.args.get("serviceId","")
            if request.method == "POST":
                serviceName = request.form.get("serviceName","")
                serviceType = request.form.get("serviceType","")
                walletId = request.form.get("walletId","")
                categoryId = request.form.get("categoryId","")
                serviceGroupingId = request.form.get("serviceGroupingId","")
                # transactionAPIId = request.form.get("transactionAPIId","")
                code = request.form.get("code","")
                sorting = request.form.get("sorting")
                displayInDashboard = request.form.get("displayInDashboard")
                isService = request.form.get("isService")
                isbbps = request.form.get("isbbps")
                isOperatorWise = request.form.get("isOperatorWise")
                file = request.files.get("file","")
                jsonData = request.form.to_dict(flat=True)

                if serviceName and serviceType and categoryId and code :
                    try:

                        service_queryset = Service.objects(id=serviceId).first()
                        existing_record = service_queryset.to_json()
                        message=service_queryset.adminId.userName+" "+serviceName+" Service updated successfully!"
                        requestData=[existing_record]
                        updatedrequestData=[jsonData]
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_service","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                        if service_queryset:
                            service_queryset.update(
                                serviceName = serviceName,
                                serviceType = serviceType,
                                # walletId = ObjectId(walletId),
                                categoryId = ObjectId(categoryId),
                                serviceGroupingId = ObjectId(serviceGroupingId),
                                transactionAPIId = None,
                                code = code,
                                sorting = sorting,
                                # displayInDashboard = displayInDashboard,
                                )
                            if isService == None:
                                service_queryset.update(isService=False)
                            else:
                                service_queryset.update(isService=True)

                            if isbbps == None:
                                service_queryset.update(isbbps=False)
                            else:
                                service_queryset.update(isbbps=True)

                            if isOperatorWise == None:
                                service_queryset.update(isOperatorWise=False)
                            else:
                                service_queryset.update(isOperatorWise=True)

                            if displayInDashboard == None:
                                service_queryset.update(displayInDashboard=False)
                            else:
                                service_queryset.update(displayInDashboard=True)

                            if file:
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/services/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/services/"))
                                save_file = file.save(os.path.join(app.config['SITE_ROOT'], "media/services/"+serviceId+".png"))
                                service_queryset.update(file="media/services/"+serviceId+".png")
                            flash("Service updated successfully!")
                            return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
                        else:
                            flash("Invaild id!!")
                            return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
                    except Exception as e:
                        app.logger.error(traceback.format_exc())
                        flash("Unable to update service!!")
                        return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to update service!!")
            return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
    else:
        flash("Staff member does not have given update sub service permissions!!")
        return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))

# Update service status
@service_configurations.route("/update_service_status",methods=["POST","GET"])
def update_service_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

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

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    permissionsList = check_permissions(session.get("adminId"),"subservicesPermissions")
    if "edit" in permissionsList:
        serviceId = request.args.get("serviceId","")
        if serviceId:
            try:
                service_queryset = Service.objects(id=serviceId,status__nin=[2]).first()
                existing_record = service_queryset.to_json()
                requestData = [existing_record]
                if service_queryset:
                    if service_queryset.status == 0:
                        service_queryset.update(status=1)
                        flash("Service activated successfully!")
                        message=service_queryset.adminId.userName+" "+service_queryset.serviceName+" Service activated successfully!"
                    elif service_queryset.status == 1:
                        service_queryset.update(status=0)
                        flash("Service deactivated successfully!")
                        message=service_queryset.adminId.userName+" "+service_queryset.serviceName+" Service deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_service_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
        else:
            return redirect(url_for("service_configurations.services_configurations_list"))
    else:
        flash("Staff member does not have given update status sub services permissions!!")
        return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))

# Delete service
@service_configurations.route("/delete_service",methods=["GET","POST"])
def delete_service():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()

        jsonData = request.form.to_dict(flat=True)

        existing_record = ""
        updatedrequestData = [jsonData]
        permissionsList = check_permissions(session.get("adminId"),"subservicesPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                serviceId = request.args.get("serviceId","")
                service_queryset = Service.objects(id=serviceId,status__in=[0,1]).first()
                existing_record = service_queryset.to_json()
                requestData = [existing_record]
                service_queryset.update(status=2)
                flash("Service deleted successfully!")
                message=service_queryset.adminId.userName+" "+service_queryset.serviceName+" Service deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_service","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
        else:
            flash("Staff member does not have given delete sub services permissions!!")
            return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete service!!")
        return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))




############# Operator API's ################

# Add operator
@service_configurations.route("/add_operator",methods=["POST","GET"])
def add_operator():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()
        permissionsList = check_permissions(adminId,"operatorPermissions")
        if "add" in permissionsList:        
            if request.method == "POST":
                operatorName = request.form.get("operatorName","")
                serviceId = request.form.get("serviceId","")
                allowType = request.form.get("allowType","")
                taxTypeId = request.form.get("taxTypeId","")
                serviceGroupingId = request.form.get("serviceGroupingId","")
                transactionAPIId = request.form.get("transactionAPIId","")
                amountPlans = request.form.get("amountPlans","")
                rejectedAmount = request.form.get("rejectedAmount","")
                minLength = request.form.get("minLength","")
                maxLength = request.form.get("maxLength","")
                minAmount = request.form.get("minAmount","")
                maxAmount = request.form.get("maxAmount","")
                apiType = request.form.get("apiType","")
                apiCode = request.form.get("apiCode","")
                stateId = request.form.get("stateId","")
                sorting = request.form.get("sorting",0)
                image = request.files.get("image","")
                displayInDashboard = request.form.get("displayInDashboard")
                isBbps = request.form.get("isBbps")
                isValidate = request.form.get("isValidate")
                isPortial = request.form.get("isPortial")
                isRandom = request.form.get("isRandom")
                payWithoutFetchAllowed = request.form.get("payWithoutFetchAllowed")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if operatorName and taxTypeId:
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+operatorName+" Operator created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_operator","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                                
                        operator_table = Operators(
                            adminId = adminId,
                            operatorName = operatorName,
                            serviceId = serviceId,
                            allowType = allowType,
                            taxTypeId = taxTypeId,
                            serviceGroupingId = serviceGroupingId,
                            transactionAPIId = transactionAPIId,
                            amountPlans = amountPlans,
                            rejectedAmount = rejectedAmount,
                            minLength = minLength,
                            maxLength = maxLength,
                            minAmount = minAmount,
                            maxAmount = maxAmount,
                            apiType = apiType,
                            apiCode = apiCode,
                            stateId = stateId,
                            sorting = sorting,
                            # displayInDashboard = displayInDashboard,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = operator_table.save()
                        operatorId = str(save_table.id)

                        if isBbps == None:
                            save_table.update(isBbps=False)
                        else:
                            save_table.update(isBbps=True)
                        if isValidate == None:
                            save_table.update(isValidate=False)
                        else:
                            save_table.update(isValidate=True)
                        if isPortial == None:
                            save_table.update(isPortial=False)
                        else:
                            save_table.update(isPortial=True)
                        if isRandom == None:
                            save_table.update(isRandom=False)
                        else:
                            save_table.update(isRandom=True)

                        if displayInDashboard == None:
                            save_table.update(displayInDashboard=False)
                        else:
                            save_table.update(displayInDashboard=True)

                        if payWithoutFetchAllowed == None:
                            save_table.update(payWithoutFetchAllowed=False)
                        else:
                            save_table.update(payWithoutFetchAllowed=True)

                        if image:       
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/operators/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/operators/"))
                            save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/operators/"+operatorId+".png"))
                            save_table.update(image="media/operators/"+operatorId+".png")
                        flash("Operator added successfully!")
                        return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
                    except Exception as e:
                        app.logger.error(traceback.format_exc())
                        flash("Unable to add operator!!")
                        return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
        else:
            flash("Staff member does not have given create operator permissions!!")
            return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add operator!!"
        return render_template("super_admin_templates/operators_configurations_list.html",error=error)

# Update operator
@service_configurations.route("/update_operator",methods=["POST","GET"])
def update_operator():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")    
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record = ""
    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()
    permissionsList = check_permissions(session.get("adminId"),"operatorPermissions")
    if "edit" in permissionsList:
        try:
            operatorId = request.args.get("operatorId","")
            if request.method == "POST":
                operatorName = request.form.get("operatorName","")
                serviceId = request.form.get("serviceId","")
                allowType = request.form.get("allowType","")
                taxTypeId = request.form.get("taxTypeId","")
                serviceGroupingId = request.form.get("serviceGroupingId","")
                transactionAPIId = request.form.get("transactionAPIId","")
                amountPlans = request.form.get("amountPlans","")
                rejectedAmount = request.form.get("rejectedAmount")
                minLength = request.form.get("minLength")
                maxLength = request.form.get("maxLength")
                minAmount = request.form.get("minAmount")
                maxAmount = request.form.get("maxAmount")
                apiType = request.form.get("apiType","")
                apiCode = request.form.get("apiCode","")
                stateId = request.form.get("stateId","")
                sorting = request.form.get("sorting")
                image = request.files.get("image","")
                displayInDashboard = request.form.get("displayInDashboard")
                isBbps = request.form.get("isBbps")
                isValidate = request.form.get("isValidate")
                isPortial = request.form.get("isPortial")
                isRandom = request.form.get("isRandom")
                payWithoutFetchAllowed = request.form.get("payWithoutFetchAllowed")
                print(allowType,"((((((((((allowType))))))))))")

                jsonData = request.form.to_dict(flat=True)

                if operatorId and operatorName and taxTypeId:
                    operator_queryset = Operators.objects(id=operatorId).first()
                    existing_record = operator_queryset.to_json()
                    message=operator_queryset.adminId.userName+" "+operatorName+" operator updated successfully!"
                    requestData=[existing_record]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_operator","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                    if operator_queryset:
                        operator_queryset.update(
                            operatorName = operatorName,
                            serviceId = ObjectId(serviceId),
                            allowType = allowType,
                            taxTypeId = ObjectId(taxTypeId),
                            serviceGroupingId = ObjectId(serviceGroupingId),
                            transactionAPIId = ObjectId(transactionAPIId),
                            amountPlans = amountPlans,
                            rejectedAmount = rejectedAmount,
                            minLength = minLength,
                            maxLength = maxLength,
                            minAmount = minAmount,
                            maxAmount = maxAmount,
                            apiCode = apiCode,
                            apiType = apiType,
                            sorting = sorting,
                            # displayInDashboard = displayInDashboard,
                            # stateId = ObjectId(stateId),
                            )
                        if isBbps == None:
                            operator_queryset.update(isBbps=False)
                        else:
                            operator_queryset.update(isBbps=True)
                        if isValidate == None:
                            operator_queryset.update(isValidate=False)
                        else:
                            operator_queryset.update(isValidate=True)
                        if isPortial == None:
                            operator_queryset.update(isPortial=False)
                        else:
                            operator_queryset.update(isPortial=True)
                        if isRandom == None:
                            operator_queryset.update(isRandom=False)
                        else:
                            operator_queryset.update(isRandom=True)

                        if displayInDashboard == None:
                            operator_queryset.update(displayInDashboard=False)
                        else:
                            operator_queryset.update(displayInDashboard=True)

                        if payWithoutFetchAllowed == None:
                            operator_queryset.update(payWithoutFetchAllowed=False)
                        else:
                            operator_queryset.update(payWithoutFetchAllowed=True)

                        if image:       
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/operators/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/operators/"))
                            save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/operators/"+operatorId+".png"))
                            operator_queryset.update(image="media/operators/"+operatorId+".png")
                        flash("Operator updated successfully!")
                        return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
                    else:
                        flash("Invaild operator id !!")
                        return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))

        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to update operator!!")
            return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
    else:
        flash("Staff member does not have given update operator permissions!!")
        return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
    

# Update operator status
@service_configurations.route("/update_operator_status",methods=["POST","GET"])
def update_operator_status():
    print("its calling")
    if not session.get("adminId"):
        return redirect("admin_login")
    print(session.get("adminId"))
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

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

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    permissionsList = check_permissions(session.get("adminId"),"operatorPermissions")
    if "edit" in permissionsList:
        operatorId = request.args.get("operatorId","")
        if operatorId:
            print(operatorId)
            try:
                operator_queryset = Operators.objects(id=operatorId,status__nin=[2]).first()
                existing_record = operator_queryset.to_json()
                requestData = [existing_record]
                if operator_queryset:
                    print(operator_queryset.status)
                    if operator_queryset.status == 0:
                        operator_queryset.update(status=1)
                        flash("Operator activated successfully!")
                        message=operator_queryset.adminId.userName+" "+operator_queryset.operatorName+" Operator activated successfully!"
                        print(operator_queryset.status)
                    elif operator_queryset.status == 1:
                        operator_queryset.update(status=0)
                        print(operator_queryset.status)
                        flash("Operator deactivated successfully!")
                        message=operator_queryset.adminId.userName+" "+operator_queryset.operatorName+" Operator deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_operator_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
        else:
            return redirect(url_for("service_configurations.operators_configurations_list"))
    else:
        flash("Staff member does not have given update status operator permissions!!")
        return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))

# Delete operator
@service_configurations.route("/delete_operator",methods=["GET","POST"])
def delete_operator():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()

        jsonData = request.form.to_dict(flat=True)

        existing_record = ""
        updatedrequestData = [jsonData]
        permissionsList = check_permissions(session.get("adminId"),"operatorPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                operatorId = request.args.get("operatorId","")
                operator_queryset = Operators.objects(id=operatorId,status__in=[0,1]).first()
                existing_record = operator_queryset.to_json()
                requestData = [existing_record]
                operator_queryset.update(status=2)
                flash("Operator deleted successfully!")
                message=operator_queryset.adminId.userName+" "+operator_queryset.operatorName+" Operator deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_operator","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
        else:
            flash("Staff member does not have given delete operator permissions!!")
            return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete operator!!")
        return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))



########### Operator Update ##############
# Add operator
@service_configurations.route("/add_operator_update",methods=["POST","GET"])
def add_operator_update():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()
        permissionsList = check_permissions(adminId,"operatorupdatePermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                operatorId = request.form.get("operatorId","")
                apiOperatorCode1 = request.form.get("apiOperatorCode1","")
                apiOperatorCode2 = request.form.get("apiOperatorCode2","")
                apiOperatorCode3 = request.form.get("apiOperatorCode3","")
                apiOperatorCode4 = request.form.get("apiOperatorCode4","")
                apiOperatorCode5 = request.form.get("apiOperatorCode5","")
                apiOperatorCode6 = request.form.get("apiOperatorCode6","")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if operatorId and apiOperatorCode1:
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+operatorId+" Operator update created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_operator_update","create",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                        operator_update_table = OperatorUpdate(
                            adminId = adminId,
                            operatorId = operatorId,
                            apiOperatorCode1 = apiOperatorCode1,
                            apiOperatorCode2 = apiOperatorCode2,
                            apiOperatorCode3 = apiOperatorCode3,
                            apiOperatorCode4 = apiOperatorCode4,
                            apiOperatorCode5 = apiOperatorCode5,
                            apiOperatorCode6 = apiOperatorCode6,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = operator_update_table.save()
                        operatorUpdateId = str(save_table.id)

                        flash("Operator update added successfully!")
                        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
                    except Exception as e:
                        app.logger.error(traceback.format_exc())
                        flash("Unable to add operator update!!")
                        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
        else:
            flash("Staff member does not have given create operator update permissions!!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add operator update!!"
        return render_template("super_admin_templates/service_configurations_list.html",error=error)


def fetching_operator_update_details(operator_update_queryset):
    operator_update_dict = {}
    try:
        operator_update_dict={
        "id":str(operator_update_queryset.id),
        "operatorId":str(operator_update_queryset.operatorId.id),
        "operatorName":operator_update_queryset.operatorId.operatorName,
        "apiOperatorCode1":operator_update_queryset.apiOperatorCode1,
        "apiOperatorCode2":operator_update_queryset.apiOperatorCode2,
        "apiOperatorCode3":operator_update_queryset.apiOperatorCode3,
        "apiOperatorCode4":operator_update_queryset.apiOperatorCode4,
        "apiOperatorCode5":operator_update_queryset.apiOperatorCode5,
        "apiOperatorCode6":operator_update_queryset.apiOperatorCode6,
        "status":operator_update_queryset.status,
        }

        if operator_update_queryset.status==1:
            operator_update_dict["actionText"] = "Active"
        else:
            operator_update_dict["actionText"] = "Deactive"

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


# Update operator update
@service_configurations.route("/update_operator_update",methods=["POST","GET"])
def update_operator_update():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")    
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record = ""
    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()
    permissionsList = check_permissions(session.get("adminId"),"operatorupdatePermissions")
    if "edit" in permissionsList:
        try:
            operatorUpdateId = request.args.get("operatorUpdateId","")
            if request.method == "POST":
                operatorId = request.form.get("operatorId","")
                apiOperatorCode1 = request.form.get("apiOperatorCode1","")
                apiOperatorCode2 = request.form.get("apiOperatorCode2","")
                apiOperatorCode3 = request.form.get("apiOperatorCode3","")
                apiOperatorCode4 = request.form.get("apiOperatorCode4","")
                apiOperatorCode5 = request.form.get("apiOperatorCode5","")
                apiOperatorCode6 = request.form.get("apiOperatorCode6","")

                jsonData = request.form.to_dict(flat=True)

                if operatorUpdateId and operatorId and apiOperatorCode1:
                    operator_update_queryset = OperatorUpdate.objects(id=operatorUpdateId).first()
                    existing_record = operator_update_queryset.to_json()
                    message=operator_update_queryset.adminId.userName+" "+operatorId+" Operator update updated successfully!"
                    requestData=[existing_record]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_operator_update","update",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    if operator_update_queryset:
                            operator_update_queryset.update(
                                operatorId = ObjectId(operatorId),
                                apiOperatorCode1 = apiOperatorCode1,
                                apiOperatorCode2 = apiOperatorCode2,
                                apiOperatorCode3 = apiOperatorCode3,
                                apiOperatorCode4 = apiOperatorCode4,
                                apiOperatorCode5 = apiOperatorCode5,
                                apiOperatorCode6 = apiOperatorCode6,
                                )
                            flash("Operator update updated successfully!")
                            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
                    else:
                        flash("Invaild operator update id !!")
                        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to update operator update!!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
    else:
        flash("Staff member does not have given update operator update permissions!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))



# Update operator update status
@service_configurations.route("/update_operator_update_status",methods=["POST","GET"])
def update_operator_update_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

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

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    permissionsList = check_permissions(session.get("adminId"),"operatorupdatePermissions")
    if "edit" in permissionsList:
        operatorUpdateId = request.args.get("operatorUpdateId","")

        if operatorUpdateId:
            try:
                operator_update_queryset = OperatorUpdate.objects(id=operatorUpdateId,status__nin=[2]).first()
                existing_record = operator_update_queryset.to_json()
                requestData = [existing_record]
                if operator_update_queryset:
                    print(operator_update_queryset.status)
                    if operator_update_queryset.status == 0:
                        operator_update_queryset.update(status=1)
                        flash("Operator update activated successfully!")
                        message=operator_update_queryset.adminId.userName+" "+str(operator_update_queryset.operatorId)+" Operator update activated successfully!"
                        print(operator_update_queryset.status)
                    elif operator_update_queryset.status == 1:
                        operator_update_queryset.update(status=0)
                        print(operator_update_queryset.status)
                        flash("Operator update deactivated successfully!")
                        message=operator_update_queryset.adminId.userName+" "+str(operator_update_queryset.operatorId)+" Operator update deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_operator_update_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
        else:
            return redirect(url_for("service_configurations.service_configurations_list"))
    else:
        flash("Staff member does not have given update status operator update permissions!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))

# Delete operator
@service_configurations.route("/delete_operator_update",methods=["GET","POST"])
def delete_operator_update():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()

        jsonData = request.form.to_dict(flat=True)

        existing_record = ""
        updatedrequestData = [jsonData]
        permissionsList = check_permissions(session.get("adminId"),"operatorupdatePermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                operatorUpdateId = request.args.get("operatorUpdateId","")
                operator_update_queryset = OperatorUpdate.objects(id=operatorUpdateId,status__in=[0,1]).first()
                existing_record = operator_update_queryset.to_json()
                requestData = [existing_record]
                operator_update_queryset.update(status=2)
                flash("Operator update deleted successfully!")
                message=operator_update_queryset.adminId.userName+" "+operator_update_queryset.operatorId+" Operator update deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_operator_update","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
        else:
            flash("Staff member does not have given delete operator update permissions!!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete operator!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))


########### Operator Parameter ##############
# Add operator parameter
@service_configurations.route("/add_operator_parameter",methods=["POST","GET"])
def add_operator_parameter():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()
        permissionsList = check_permissions(adminId,"operatorparameterPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                parameterName = request.form.get("parameterName","")
                displayName = request.form.get("displayName","")
                operatorId = request.form.get("operatorId","")
                minLength = request.form.get("minLength")
                maxLength = request.form.get("maxLength")
                sort = request.form.get("sort")
                # manualSort = request.form.get("manualSort")
                fieldType = request.form.get("fieldType","")
                pattern = request.form.get("pattern","")
                apiCode = request.form.get("apiCode","")
                transactionAPIId = request.form.get("transactionAPIId","")
                isActive = request.form.get("isActive")
                isReferenceKey = request.form.get("isReferenceKey")
                isMandatory = request.form.get("isMandatory")
                hasGrouping = request.form.get("hasGrouping")
                hasApiCall = request.form.get("hasApiCall")
                hasSubParameters = request.form.get("hasSubParameters")
                hasIncludeApiCall = request.form.get("hasIncludeApiCall")
                apiCall = request.form.get("apiCall","")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if parameterName and operatorId and minLength and maxLength and sort and fieldType:
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+parameterName+" Operator parameter created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_operator_parameter","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                        operator_parameter_table = OperatorParameter(
                            adminId = adminId,
                            parameterName = parameterName,
                            displayName = displayName,
                            operatorId = operatorId,
                            minLength = minLength,
                            maxLength = maxLength,
                            sort = sort,
                            # manualSort = manualSort,
                            fieldType = fieldType,
                            pattern = pattern,
                            apiCode = apiCode,
                            apiCall =apiCall,
                            transactionAPIId = transactionAPIId,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = operator_parameter_table.save()
                        operatorParameterId = str(save_table.id)


                        if isActive == None:
                            save_table.update(isActive=False)
                        else:
                            save_table.update(isActive=True)

                        if hasIncludeApiCall == None:
                            save_table.update(hasIncludeApiCall=False)
                        else:
                            save_table.update(hasIncludeApiCall=True)

                        if isMandatory == None:
                            save_table.update(isMandatory=False)
                        else:
                            save_table.update(isMandatory=True)

                        if isReferenceKey == None:
                            save_table.update(isReferenceKey=False)
                        else:
                            save_table.update(isReferenceKey=True)

                        if hasGrouping == None:
                            save_table.update(hasGrouping=False)
                        else:
                            save_table.update(hasGrouping=True)

                        if hasApiCall == None:
                            save_table.update(hasApiCall=False)
                        else:
                            save_table.update(hasApiCall=True)

                        if hasSubParameters == None:
                            save_table.update(hasSubParameters=False)
                        else:
                            save_table.update(hasSubParameters=True)

                        flash("Operator parameter added successfully!")
                        return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
                    except Exception as e:
                        app.logger.error(traceback.format_exc())
                        flash("Unable to add operator parameter!!")
                        return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
        else:
            flash("Staff member does not have given create operator parameter permissions!!")
            return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add operator parameter!!"
        return render_template("super_admin_templates/operator_parameter_list.html",error=error)



# Update operator parameter
@service_configurations.route("/update_operator_parameter",methods=["POST","GET"])
def update_operator_parameter():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")    
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record = ""
    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()
    permissionsList = check_permissions(session.get("adminId"),"operatorparameterPermissions")
    if "edit" in permissionsList:
        try:
            operatorParameterId = request.args.get("operatorParameterId","")
            if request.method == "POST":
                parameterName = request.form.get("parameterName","")
                displayName = request.form.get("displayName","")
                operatorId = request.form.get("operatorId","")
                minLength = request.form.get("minLength")
                maxLength = request.form.get("maxLength")
                sort = request.form.get("sort")
                # manualSort = request.form.get("manualSort")
                fieldType = request.form.get("fieldType","")
                pattern = request.form.get("pattern","")
                apiCode = request.form.get("apiCode","")
                transactionAPIId = request.form.get("transactionAPIId","")
                isActive = request.form.get("isActive")
                isMandatory = request.form.get("isMandatory")
                isReferenceKey = request.form.get("isReferenceKey")
                hasGrouping = request.form.get("hasGrouping")
                hasApiCall = request.form.get("hasApiCall")
                hasIncludeApiCall = request.form.get("hasIncludeApiCall")
                hasSubParameters = request.form.get("hasSubParameters")
                apiCall = request.form.get("apiCall","")
                jsonData = request.form.to_dict(flat=True)

                if operatorParameterId and parameterName and displayName and operatorId and minLength and maxLength and sort and fieldType:
                    operator_parameter_queryset = OperatorParameter.objects(id=operatorParameterId,status__nin=[2]).first()
                    existing_record = operator_parameter_queryset.to_json()
                    message=operator_parameter_queryset.adminId.userName+" "+parameterName+" Operator parameter updated successfully!"
                    requestData=[existing_record]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_master_ifsc_bank","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                    if operator_parameter_queryset:
                        operator_parameter_queryset.update(
                            parameterName = parameterName,
                            displayName = displayName,
                            operatorId = ObjectId(operatorId),
                            minLength = minLength,
                            maxLength = maxLength,
                            sort = sort,
                            # manualSort = manualSort,
                            fieldType = fieldType,
                            pattern = pattern,
                            apiCode = apiCode,
                            transactionAPIId = ObjectId(transactionAPIId),
                            apiCall = apiCall,
                            )
                        if isActive == None:
                            operator_parameter_queryset.update(isActive=False)
                        else:
                            operator_parameter_queryset.update(isActive=True)

                        if hasIncludeApiCall == None:
                            operator_parameter_queryset.update(hasIncludeApiCall=False)
                        else:
                            operator_parameter_queryset.update(hasIncludeApiCall=True)

                        if isMandatory == None:
                            operator_parameter_queryset.update(isMandatory=False)
                        else:
                            operator_parameter_queryset.update(isMandatory=True)

                        if isReferenceKey == None:
                            operator_parameter_queryset.update(isReferenceKey=False)
                        else:
                            operator_parameter_queryset.update(isReferenceKey=True)

                        if hasGrouping == None:
                            operator_parameter_queryset.update(hasGrouping=False)
                        else:
                            operator_parameter_queryset.update(hasGrouping=True)
                        if hasApiCall == None:
                            operator_parameter_queryset.update(hasApiCall=False)
                        else:
                            operator_parameter_queryset.update(hasApiCall=True)
                        if hasSubParameters == None:
                            operator_parameter_queryset.update(hasSubParameters=False)
                        else:
                            operator_parameter_queryset.update(hasSubParameters=True)

                        flash("Operator parameter updated successfully!")
                        return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
                    else:
                        flash("Invaild operator parameter id !!")
                        return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to update operator parameter!!")
            return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
    else:
        flash("Staff member does not have given update operator parameter permissions!!")
        return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))

# Update operator parameter status
@service_configurations.route("/update_operator_parameter_status",methods=["POST","GET"])
def update_operator_parameter_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

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

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    permissionsList = check_permissions(session.get("adminId"),"operatorparameterPermissions")
    if "edit" in permissionsList:
        operatorParameterId = request.args.get("operatorParameterId","")
        if operatorParameterId:
            try:
                operator_parameter_queryset = OperatorParameter.objects(id=operatorParameterId,status__nin=[2]).first()
                existing_record = operator_parameter_queryset.to_json()
                requestData = [existing_record]
                if operator_parameter_queryset:
                    if operator_parameter_queryset.status == 0:
                        operator_parameter_queryset.update(status=1)
                        flash("Operator parameter activated successfully!")
                        message=operator_parameter_queryset.adminId.userName+" "+operator_parameter_queryset.parameterName+" Operator parameter activated successfully!"
                    elif operator_parameter_queryset.status == 1:
                        operator_parameter_queryset.update(status=0)
                        flash("Operator parameter deactivated successfully!")
                        message=operator_parameter_queryset.adminId.userName+" "+operator_parameter_queryset.parameterName+" Operator parameter deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_operator_parameter_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                flash("Unable to update operator parameter status!!")
                return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
        else:
            flash("Required fields are missing!!")
            return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
    else:
        flash("Staff member does not have given update status operator parameter permissions!!")
        return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))


# Delete operator parameter
@service_configurations.route("/delete_operator_parameter",methods=["GET","POST"])
def delete_operator_parameter():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()

        jsonData = request.form.to_dict(flat=True)

        existing_record = ""
        updatedrequestData = [jsonData]
        permissionsList = check_permissions(session.get("adminId"),"operatorparameterPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                operatorParameterId = request.args.get("operatorParameterId","")
                operator_parameter_queryset = OperatorParameter.objects(id=operatorParameterId,status__in=[0,1]).first()
                existing_record = operator_parameter_queryset.to_json()
                requestData = [existing_record]
                operator_parameter_queryset.update(status=2)
                flash("Operator parameter deleted successfully!")
                message=operator_parameter_queryset.adminId.userName+" "+operator_parameter_queryset.parameterName+" Operator parameter deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_operator_parameter","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
        else:
            flash("Staff member does not have given delete operator parameter permissions!!")
            return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete operator parameter!!")
        return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))


########## Operator Grouping ############
#Add operator grouping
@service_configurations.route("/add_operator_grouping",methods=["POST","GET"])
def add_operator_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")

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

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

        actionDate=datetime.datetime.now()
        permissionsList = check_permissions(adminId,"operatorgroupingPermissions")
        if "add" in permissionsList:        
            if request.method == "POST":
                groupName = request.form.get("groupName","")
                operatorId = request.form.get("operatorId","")
                operatorParameterId = request.form.get("operatorParameterId","")
                value = request.form.get("value","")
                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]
                if groupName and operatorId and operatorParameterId:
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+groupName+" Operator grouping created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_operator_grouping","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                        operator_grouping_table = OperatorGrouping(
                            adminId = adminId,
                            groupName = groupName,
                            operatorId = operatorId,
                            operatorParameterId = operatorParameterId,
                            value = value,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = operator_grouping_table.save()
                        operatorGroupingId = str(save_table.id)
                        flash("Operator grouping added successfully!")
                        return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
                    except Exception as e:
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
        else:
            flash("Staff member does not have given operator grouping permissions!!")
            return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add operator grouping!!"
        return render_template("super_admin_templates/operator_grouping_list.html",error=error)

def fetching_operator_grouping_details(grouping_queryset):
    grouping_dict = {}
    try:
        grouping_dict = {
        "id":str(grouping_queryset.id),
        "groupName":grouping_queryset.groupName,
        "value":grouping_queryset.value
        }
        try:
            if grouping_queryset.operatorId:
                grouping_dict["operatorId"]=str(grouping_queryset.operatorId.id)
                grouping_dict["operatorName"]=grouping_queryset.operatorId.operatorName
            else:
                grouping_dict["operatorId"]=""
                grouping_dict["operatorName"]=""
        except Exception as e:
            grouping_dict["operatorId"]=""
            grouping_dict["operatorName"]=""

        try:
            if grouping_queryset.operatorParameterId:
                grouping_dict["operatorParameterId"]=str(grouping_queryset.operatorParameterId.id)
                grouping_dict["parameterName"]=grouping_queryset.operatorParameterId.parameterName
            else:
                grouping_dict["operatorParameterId"]=""
                grouping_dict["parameterName"]=""
        except Exception as e:
            grouping_dict["operatorParameterId"]=""
            grouping_dict["parameterName"]=""

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

# update operator grouping
@service_configurations.route("/update_operator_grouping",methods=["POST","GET"])
def update_operator_grouping():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")    
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

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

    actionDate=datetime.datetime.now()
    permissionsList = check_permissions(session.get("adminId"),"operatorgroupingPermissions")
    if "edit" in permissionsList:
        try:
            operatorGroupingId = request.args.get("operatorGroupingId","")
            if request.method == "POST":
                groupName = request.form.get("groupName","")
                operatorId = request.form.get("operatorId","")
                operatorParameterId = request.form.get("operatorParameterId","")
                value = request.form.get("value","")
                jsonData = request.form.to_dict(flat=True)
                if operatorGroupingId and groupName and operatorId and operatorParameterId:
                    operator_grouping_queryset = OperatorGrouping.objects(id=operatorGroupingId,status__nin=[2]).first()
                    existing_record = operator_grouping_queryset.to_json()
                    message=operator_grouping_queryset.adminId.userName+" "+groupName+" Operator grouping updated successfully!"
                    requestData=[existing_record]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_operator_grouping","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                    if operator_grouping_queryset:
                        operator_grouping_queryset.update(
                            groupName = groupName,
                            operatorId = ObjectId(operatorId),
                            operatorParameterId = ObjectId(operatorParameterId),
                            value = value,
                            )
                        flash("Operator grouping updated successfully!")
                        return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
                    else:
                        flash("Invaild operator grouping id !!")
                        return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error="Unable to update operator grouping!!"
            return redirect(url_for("service_configurations.operator_grouping_list",error=error))
    else:
        flash("Staff member does not have given update operator grouping permissions!!")
        return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))

# Update operator grouping status
@service_configurations.route("/update_operator_grouping_status",methods=["POST","GET"])
def update_operator_grouping_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

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

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    permissionsList = check_permissions(session.get("adminId"),"operatorgroupingPermissions")
    if "edit" in permissionsList:
        operatorGroupingId = request.args.get("operatorGroupingId","")
        if operatorGroupingId:
            try:
                operator_grouping_queryset = OperatorGrouping.objects(id=operatorGroupingId,status__nin=[2]).first()
                existing_record = operator_grouping_queryset.to_json()
                requestData = [existing_record]
                if operator_grouping_queryset:
                    if operator_grouping_queryset.status == 0:
                        operator_grouping_queryset.update(status=1)
                        flash("Operator grouping activated successfully!")
                        message=operator_grouping_queryset.adminId.userName+" "+operator_grouping_queryset.groupName+" Operator grouping activated successfully!"
                    elif operator_grouping_queryset.status == 1:
                        operator_grouping_queryset.update(status=0)
                        flash("Operator grouping deactivated successfully!")
                        message=operator_grouping_queryset.adminId.userName+" "+operator_grouping_queryset.groupName+" Operator grouping deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_operator_grouping_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                flash("Unable to update operator grouping status!!",redirectTo="OperatorGrouping")
        else:
            flash("Required fields are missing!!")
            return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
    else:
        flash("Staff member does not have given update status operator grouping permissions!!")
        return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))


# Delete operator grouping
@service_configurations.route("/delete_operator_grouping",methods=["GET","POST"])
def delete_operator_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()

        jsonData = request.form.to_dict(flat=True)

        existing_record = ""
        updatedrequestData = [jsonData]
        permissionsList = check_permissions(session.get("adminId"),"operatorgroupingPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                operatorGroupingId = request.args.get("operatorGroupingId","")
                operator_grouping_queryset = OperatorGrouping.objects(id=operatorGroupingId,status__in=[0,1]).first()
                existing_record = operator_grouping_queryset.to_json()
                requestData = [existing_record]
                operator_grouping_queryset.update(status=2)
                flash("Operator grouping deleted successfully!")
                message=operator_grouping_queryset.adminId.userName+" "+operator_grouping_queryset.groupName+" Operator grouping deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_operator_grouping","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
        else:
            flash("Staff member does not have given delete operator grouping permissions!!")
            return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete operator grouping!!")
        return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))

# Add category
@service_configurations.route("/add_service_grouping",methods=["POST","GET"])
def add_service_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")

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

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

        actionDate=datetime.datetime.now()
        permissionsList = check_permissions(adminId,"categoriesPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                name = request.form.get("name","")
                sorting = request.form.get("sorting")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if name:
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+name+" Service grouping created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_service_grouping","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                        service_grouping_table = ServiceGrouping(
                            adminId=adminId,
                            name = name,
                            sorting = sorting,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = service_grouping_table.save()
                        serviceGroupingId = str(save_table.id)

                        flash("Service grouping saved successfully!")
                        return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))
                    except Exception as e:
                        flash("Unable to save service grouping!!")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))
        else:
            flash("Staff member does not have given create service grouping permissions!!")
            return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save service grouping!!"
        return render_template("super_admin_templates/service_grouping_list.html",error=error)


# Update category status
@service_configurations.route("/update_service_grouping_status",methods=["POST","GET"])
def update_service_grouping_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

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

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    permissionsList = check_permissions(session.get("adminId"),"categoriesPermissions")
    if "edit" in permissionsList:
        serviceGroupingId = request.args.get("serviceGroupingId","")

        if serviceGroupingId:
            try:
                service_grouping_queryset = ServiceGrouping.objects(id=serviceGroupingId,status__nin=[2]).first()
                existing_record = service_grouping_queryset.to_json()
                requestData = [existing_record]
                if service_grouping_queryset:
                    if service_grouping_queryset.status == 0:
                        service_grouping_queryset.update(status=1)
                        flash("Service grouping activated successfully!")
                        message=service_grouping_queryset.adminId.userName+" "+service_grouping_queryset.name+" Service grouping activated successfully!"
                    elif service_grouping_queryset.status == 1:
                        service_grouping_queryset.update(status=0)
                        flash("Service grouping deactivated successfully!")
                        message=service_grouping_queryset.adminId.userName+" "+service_grouping_queryset.name+" Service grouping deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_service_grouping_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))
        else:
            return redirect(url_for("service_configurations.service_grouping_list"))
    else:
        flash("Staff member does not have given update status service grouping permissions!!")
        return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))



# Update Service grouping
@service_configurations.route("/update_service_grouping",methods=["POST","GET"])
def update_service_grouping():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

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

    actionDate=datetime.datetime.now()
    permissionsList = check_permissions(session.get("adminId"),"categoriesPermissions")
    if "edit" in permissionsList:
        try:
            serviceGroupingId = request.args.get("serviceGroupingId","")
            if request.method == "POST":
                name = request.form.get("name","")
                sorting = request.form.get("sorting")
                jsonData = request.form.to_dict(flat=True)
                service_grouping_queryset = ServiceGrouping.objects(id=serviceGroupingId,status__nin=[2]).first()
                existing_record = service_grouping_queryset.to_json()
                message=service_grouping_queryset.adminId.userName+" "+name+" Service grouping updated successfully!"
                requestData=[existing_record]
                updatedrequestData=[jsonData]
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_service_grouping","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                if service_grouping_queryset:
                    service_grouping_queryset.update(
                        name=name,
                        sorting=sorting,
                        )
                    flash("Service grouping updated successfully!")
                    return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to update category!!"
            return redirect(url_for("service_configurations.service_grouping_list",error=error,redirectTo="ServiceGrouping"))
    else:
        flash("Staff member does not have given update service grouping permissions!!")
        return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))


# Delete Service grouping
@service_configurations.route("/delete_service_grouping",methods=["GET"])
def delete_service_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()

        jsonData = request.form.to_dict(flat=True)

        existing_record = ""
        updatedrequestData = [jsonData]
        permissionsList = check_permissions(session.get("adminId"),"categoriesPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                serviceGroupingId = request.args.get("serviceGroupingId","")
                service_grouping_queryset = ServiceGrouping.objects(id=serviceGroupingId,status__nin=[2]).first()
                existing_record = service_grouping_queryset.to_json()
                requestData = [existing_record]
                service_grouping_queryset.update(status=2)
                flash("Service grouping deleted successfully!")
                message=service_grouping_queryset.adminId.userName+" "+service_grouping_queryset.name+" Service grouping deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_service_grouping","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))
        else:
            flash("Staff member does not have given  delete permissions!!")
            return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete service grouping!!")
        return redirect(url_for("service_configurations.service_grouping_list",redirectTo="ServiceGrouping"))




@service_configurations.route("/transaction_based_services_list",methods=["POST"])
def transaction_based_services_list():
    data_status = {"responseStatus":0,"result":""}
    try:
        transactionId = request.form.get("transactionId","")
        if not transactionId:
            data_status["result"]="Required fields are missing!!"
            return data_status
        transaction_queryset = TransactionAPI.objects(id=transactionId,status__in=[1]).first()
        if not transaction_queryset:
            data_status["result"]="Invalid transaction id!!"
            return data_status
        servicesList = []
        services_queryset = Service.objects(transactionAPIId=str(transaction_queryset.id),status__in=[1]).order_by("-id").all()
        for each_service in services_queryset:
            service_dict = fetching_service_details(each_service)
            servicesList.append(service_dict)
        data_status["responseStatus"]=1
        data_status["result"]="Services fetched data successfully!"
        data_status["servicesList"]=servicesList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch services data!!"
        return data_status

@service_configurations.route("/operator_based_operator_parameters_list",methods=["POST"])
def operator_based_operator_parameters_list():
    data_status = {"responseStatus": 0, "result": ""}
    operatorId = request.form.get("operatorId","")

    if not operatorId:
        data_status["result"] = "Required fields are missing!!"
        return data_status
    try:
        operator_queryset = Operators.objects(id=operatorId,status__in=[1]).first()
        if not operator_queryset:
            data_status["result"]="Invalid operator id!!"
            return data_status

        operatorParametersList = []
        operator_parameters_queryset = OperatorParameter.objects(
            hasGrouping=True,
            operatorId=str(operator_queryset.id),status__in=[1]).order_by("-id").all()
        for each_operator_parameter in operator_parameters_queryset:
            operator_parameter_dict = fetching_operator_based_parameter_details(each_operator_parameter)
            operatorParametersList.append(operator_parameter_dict)

        data_status["responseStatus"] = 1
        data_status["result"] = "Operator based operator parameters data fetched successfully!"
        data_status["operatorParametersList"] = operatorParametersList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to fetch operator parameters data!!"
        return data_status

@service_configurations.route("/operator_based_operator_sub_parameters_list",methods=["POST"])
def operator_based_operator_sub_parameters_list():
    data_status = {"responseStatus": 0, "result": ""}
    operatorId = request.form.get("operatorId","")

    if not operatorId:
        data_status["result"] = "Required fields are missing!!"
        return data_status
    try:
        operator_queryset = Operators.objects(id=operatorId,status__in=[1]).first()
        if not operator_queryset:
            data_status["result"]="Invalid operator id!!"
            return data_status

        operatorSubParametersList = []
        sub_parameters_queryset = SubParameters.objects(
            hasGrouping=True,
            operatorId=str(operator_queryset.id),status__in=[1]).order_by("-id").all()
        for each_sub_parameter in sub_parameters_queryset:
            sub_parameter_dict = fetching_operator_based_sub_parameter_details(each_sub_parameter)
            operatorSubParametersList.append(sub_parameter_dict)

        data_status["responseStatus"] = 1
        data_status["result"] = "Operator based sub parameters data fetched successfully!"
        data_status["operatorSubParametersList"] = operatorSubParametersList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to fetch sub parameters data!!"
        return data_status


########### Sub Parameters ##############
# Add Sub parameter
@service_configurations.route("/add_sub_parameter",methods=["POST","GET"])
def add_sub_parameter():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()
        permissionsList = check_permissions(adminId,"subparameterPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                operatorParameterId = request.form.get("operatorParameterId","")
                operatorGroupingId = request.form.get("operatorGroupingId","")
                parameterName = request.form.get("parameterName","")
                displayName = request.form.get("displayName","")
                operatorId = request.form.get("operatorId","")
                minLength = request.form.get("minLength")
                maxLength = request.form.get("maxLength")
                sort = request.form.get("sort")
                # manualSort = request.form.get("manualSort")
                fieldType = request.form.get("fieldType","")
                pattern = request.form.get("pattern","")
                apiCode = request.form.get("apiCode","")
                transactionAPIId = request.form.get("transactionAPIId","")
                isActive = request.form.get("isActive")
                isReferenceKey = request.form.get("isReferenceKey")
                isMandatory = request.form.get("isMandatory")
                hasGrouping = request.form.get("hasGrouping")
                hasApiCall = request.form.get("hasApiCall")
                hasSubParameters = request.form.get("hasSubParameters")
                hasIncludeApiCall = request.form.get("hasIncludeApiCall")
                apiCall = request.form.get("apiCall","")
                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if parameterName:
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+parameterName+" Sub parameter created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_sub_parameter","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                        sub_parameter_table = SubParameters(
                            adminId = adminId,
                            operatorParameterId = operatorParameterId,
                            operatorGroupingId = operatorGroupingId,
                            parameterName = parameterName,
                            displayName = displayName,
                            operatorId = operatorId,
                            minLength = minLength,
                            maxLength = maxLength,
                            sort = sort,
                            fieldType = fieldType,
                            pattern = pattern,
                            apiCode = apiCode,
                            apiCall =apiCall,
                            transactionAPIId = transactionAPIId,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = sub_parameter_table.save()
                        subParameterId = str(save_table.id)


                        if isActive == None:
                            save_table.update(isActive=False)
                        else:
                            save_table.update(isActive=True)

                        if hasIncludeApiCall == None:
                            save_table.update(hasIncludeApiCall=False)
                        else:
                            save_table.update(hasIncludeApiCall=True)

                        if isMandatory == None:
                            save_table.update(isMandatory=False)
                        else:
                            save_table.update(isMandatory=True)

                        if isReferenceKey == None:
                            save_table.update(isReferenceKey=False)
                        else:
                            save_table.update(isReferenceKey=True)

                        if hasGrouping == None:
                            save_table.update(hasGrouping=False)
                        else:
                            save_table.update(hasGrouping=True)

                        if hasApiCall == None:
                            save_table.update(hasApiCall=False)
                        else:
                            save_table.update(hasApiCall=True)

                        flash("Sub parameter added successfully!")
                        return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))
                    except Exception as e:
                        app.logger.error(traceback.format_exc())
                        flash("Unable to add sub parameter!!")
                        return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))
        else:
            flash("Staff member does not have given create sub parameter permissions!!")
            return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add sub parameter!!"
        return render_template("super_admin_templates/sub_parameters_list.html",error=error)

# Update Sub parameter
@service_configurations.route("/update_sub_parameter",methods=["POST","GET"])
def update_sub_parameter():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")    
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record = ""        
    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()
    permissionsList = check_permissions(session.get("adminId"),"subparameterPermissions")
    if "edit" in permissionsList:
        try:  
            subParameterId = request.args.get("subParameterId","")
            if request.method == "POST":
                operatorParameterId = request.form.get("operatorParameterId","")
                operatorGroupingId = request.form.get("operatorGroupingId","")
                parameterName = request.form.get("parameterName","")
                displayName = request.form.get("displayName","")
                operatorId = request.form.get("operatorId","")
                minLength = request.form.get("minLength")
                maxLength = request.form.get("maxLength")
                sort = request.form.get("sort")
                fieldType = request.form.get("fieldType","")
                pattern = request.form.get("pattern","")
                apiCode = request.form.get("apiCode","")
                transactionAPIId = request.form.get("transactionAPIId","")
                isActive = request.form.get("isActive")
                isMandatory = request.form.get("isMandatory")
                isReferenceKey = request.form.get("isReferenceKey")
                hasGrouping = request.form.get("hasGrouping")
                hasApiCall = request.form.get("hasApiCall")
                hasIncludeApiCall = request.form.get("hasIncludeApiCall")
                apiCall = request.form.get("apiCall","")

                jsonData = request.form.to_dict(flat=True)

                if subParameterId:
                    sub_parameter_queryset = SubParameters.objects(id=subParameterId,status__nin=[2]).first()
                    existing_record = sub_parameter_queryset.to_json()
                    message=sub_parameter_queryset.adminId.userName+" "+parameterName+" Sub parameter updated successfully!"
                    requestData=[existing_record]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sub_parameter","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                    if sub_parameter_queryset:
                        sub_parameter_queryset.update(
                            operatorParameterId = ObjectId(operatorParameterId),
                            operatorGroupingId = ObjectId(operatorGroupingId),
                            parameterName = parameterName,
                            displayName = displayName,
                            operatorId = ObjectId(operatorId),
                            minLength = minLength,
                            maxLength = maxLength,
                            sort = sort,
                            fieldType = fieldType,
                            pattern = pattern,
                            apiCode = apiCode,
                            transactionAPIId = ObjectId(transactionAPIId),
                            apiCall = apiCall,
                            )
                        if isActive == None:
                            sub_parameter_queryset.update(isActive=False)
                        else:
                            sub_parameter_queryset.update(isActive=True)

                        if hasIncludeApiCall == None:
                            sub_parameter_queryset.update(hasIncludeApiCall=False)
                        else:
                            sub_parameter_queryset.update(hasIncludeApiCall=True)

                        if isMandatory == None:
                            sub_parameter_queryset.update(isMandatory=False)
                        else:
                            sub_parameter_queryset.update(isMandatory=True)

                        if isReferenceKey == None:
                            sub_parameter_queryset.update(isReferenceKey=False)
                        else:
                            sub_parameter_queryset.update(isReferenceKey=True)

                        if hasGrouping == None:
                            sub_parameter_queryset.update(hasGrouping=False)
                        else:
                            sub_parameter_queryset.update(hasGrouping=True)
                        if hasApiCall == None:
                            sub_parameter_queryset.update(hasApiCall=False)
                        else:
                            sub_parameter_queryset.update(hasApiCall=True)

                        flash("Sub parameter updated successfully!")
                        return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))
                    else:
                        flash("Invaild operator sub id !!")
                        return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to update sub parameter!!")
            return redirect(url_for("service_configurations.sub_parameters_list",redirectTo="SubParameter"))
    else:
        flash("Staff member does not have given update sub parameter permissions!!")
        return redirect(url_for("service_configurations.sub_parameters_list",redirectTo="SubParameter"))

# Delete Sub parameter
@service_configurations.route("/delete_sub_parameter",methods=["POST","GET"])
def delete_sub_parameter():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

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

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    permissionsList = check_permissions(session.get("adminId"),"subparameterPermissions")
    if "delete" in permissionsList:
        try:
            subParameterId = request.args.get("subParameterId","")
            if subParameterId:
                sub_parameter_queryset = SubParameters.objects(id=subParameterId,status__nin=[2]).first()
                existing_record = sub_parameter_queryset.to_json()
                requestData = [existing_record]
                if sub_parameter_queryset:
                    sub_parameter_queryset.update(status=2)
                    flash("Sub parameter deleted successfully!")
                    message=sub_parameter_queryset.adminId.userName+" "+sub_parameter_queryset.parameterName+" Sub parameter status deleted successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_sub_parameter","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))
                else:
                    flash("Invaild sub parameter id !!")
                    return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to delete sub parameter!!")
            return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))
    else:
        flash("Staff member does not have given delete sub parameter permissions!!")
        return redirect(url_for("service_configurations.sub_parameters_list",redirectTo="SubParameter"))

# Update Sub parameter status
@service_configurations.route("/update_sub_parameter_status",methods=["POST","GET"])
def update_sub_parameter_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

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

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    permissionsList = check_permissions(session.get("adminId"),"subparameterPermissions")
    if "edit" in permissionsList:
        try:
            subParameterId = request.args.get("subParameterId","")
            if subParameterId:
                sub_parameter_queryset = SubParameters.objects(id=subParameterId,status__nin=[2]).first()
                existing_record = sub_parameter_queryset.to_json()
                requestData = [existing_record]
                if sub_parameter_queryset:
                    if sub_parameter_queryset.status == 0:
                        sub_parameter_queryset.update(status=1)
                        flash("Sub parameter status activated successfully!")
                        message=sub_parameter_queryset.adminId.userName+" "+sub_parameter_queryset.parameterName+" Sub parameter status activated successfully!"
                    elif sub_parameter_queryset.status == 1:
                        sub_parameter_queryset.update(status=0)
                        flash("Sub parameter status deactivated successfully!")
                        message=sub_parameter_queryset.adminId.userName+" "+sub_parameter_queryset.parameterName+" Sub parameter status deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sub_parameter_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
                else:
                    flash("Invaild sub parameter id !!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to update sub parameter status!!")
    else:
        flash("Staff member does not have given update sub parameter permissions!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))

###################### Sub Parameter Grouping ##########################
@service_configurations.route("/add_sub_parameter_grouping",methods=["POST","GET"])
def add_sub_parameter_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")

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

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

        actionDate=datetime.datetime.now()
        permissionsList = check_permissions(adminId,"subparametergroupingPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                groupName = request.form.get("groupName","")
                subParameterId = request.form.get("subParameterId","")
                operatorId = request.form.get("operatorId","")
                value = request.form.get("value","")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if groupName and subParameterId and operatorId:
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+groupName+" Sub parameter grouping created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_sub_parameter_grouping","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                        sub_parameter_grouping_table = SubParameterGrouping(
                            adminId = adminId,
                            groupName = groupName,
                            subParameterId = subParameterId,
                            operatorId = operatorId,
                            value = value,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = sub_parameter_grouping_table.save()
                        subParameterGroupingId = str(save_table.id)
                        flash("Sub parameter grouping added successfully!")
                        return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))
                    except Exception as e:
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))
        else:
            flash("Staff member does not have given sub parameter grouping  permissions!!")
            return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add sub parameter grouping!!"
        return render_template("super_admin_templates/sub_parameter_grouping_list.html",error=error)

def fetching_sub_parameter_grouping_details(sub_parameter_grouping_queryset):
    subGroupingDict = {}
    try:
        subGroupingDict = {
        "id":str(sub_parameter_grouping_queryset.id),
        "groupName":sub_parameter_grouping_queryset.groupName,
        "subParameterId":str(sub_parameter_grouping_queryset.subParameterId.id),
        "subParameterName":sub_parameter_grouping_queryset.subParameterId.parameterName,
        "operatorId":str(sub_parameter_grouping_queryset.operatorId.id),
        "operatorName":sub_parameter_grouping_queryset.operatorId.operatorName,
        "value":sub_parameter_grouping_queryset.value,
        }
        if sub_parameter_grouping_queryset.status==1:
            subGroupingDict["actionText"] = "Active"
        else:
            subGroupingDict["actionText"] = "Deactive"
        if sub_parameter_grouping_queryset.createdOn:
            subGroupingDict["createdOn"] = sub_parameter_grouping_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            subGroupingDict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return subGroupingDict


@service_configurations.route("/update_sub_parameter_grouping",methods=["POST","GET"])
def update_sub_parameter_grouping():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")    
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record = ""
    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()
    permissionsList = check_permissions(session.get("adminId"),"subparametergroupingPermissions")
    if "edit" in permissionsList:
        try:
            subParameterGroupingId = request.args.get("subParameterGroupingId","")
            if request.method == "POST":
                groupName = request.form.get("groupName","")
                subParameterId = request.form.get("subParameterId","")
                operatorId = request.form.get("operatorId","")
                value = request.form.get("value","")
                jsonData = request.form.to_dict(flat=True)
                if subParameterGroupingId and groupName and subParameterId and operatorId:
                    sub_parameter_grouping_queryset = SubParameterGrouping.objects(id=subParameterGroupingId,status__nin=[2]).first()
                    existing_record = sub_parameter_grouping_queryset.to_json()
                    message=sub_parameter_grouping_queryset.adminId.userName+" "+groupName+" Sub parameter grouping updated successfully!"
                    requestData=[existing_record]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sub_parameter_grouping","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                    if sub_parameter_grouping_queryset:
                        sub_parameter_grouping_queryset.update(
                            groupName = groupName,
                            subParameterId = ObjectId(subParameterId),
                            operatorId = ObjectId(operatorId),
                            value = value,
                            )
                        flash("Sub parameter grouping updated successfully!")
                        return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))
                    else:
                        flash("Invaild sub parameter grouping id !!")
                        return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error="Unable to update sub parameter grouping!!"
            return redirect(url_for("service_configurations.sub_parameter_grouping_list",error=error))
    else:
        flash("Staff member does not have given update sub parameter grouping permissions!!")
        return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))


@service_configurations.route("/update_sub_parameter_grouping_status",methods=["POST","GET"])
def update_sub_parameter_grouping_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

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

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    permissionsList = check_permissions(session.get("adminId"),"subparametergroupingPermissions")
    if "edit" in permissionsList:
        subParameterGroupingId = request.args.get("subParameterGroupingId","")

        if subParameterGroupingId:
            try:
                sub_parameter_grouping_queryset = SubParameterGrouping.objects(id=subParameterGroupingId,status__nin=[2]).first()
                existing_record = sub_parameter_grouping_queryset.to_json()
                requestData = [existing_record]
                if sub_parameter_grouping_queryset:
                    if sub_parameter_grouping_queryset.status == 0:
                        sub_parameter_grouping_queryset.update(status=1)
                        flash("Sub parameter grouping activated successfully!")
                        message=sub_parameter_grouping_queryset.adminId.userName+" "+sub_parameter_grouping_queryset.groupName+" Sub parameter grouping activated successfully!"
                    elif sub_parameter_grouping_queryset.status == 1:
                        sub_parameter_grouping_queryset.update(status=0)
                        flash("Sub parameter grouping deactivated successfully!")
                        message=sub_parameter_grouping_queryset.adminId.userName+" "+sub_parameter_grouping_queryset.groupName+" Sub parameter grouping deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sub_parameter_grouping_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                flash("Unable to update sub parameter grouping status!!",redirectTo="SubParameterGrouping")
        else:
            flash("Required fields are missing!!")
            return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))
    else:
        flash("Staff member does not have given update status sub parameter grouping permissions!!")
        return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))



@service_configurations.route("/delete_sub_parameter_grouping",methods=["GET","POST"])
def delete_sub_parameter_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

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

        actionDate=datetime.datetime.now()

        jsonData = request.form.to_dict(flat=True)

        existing_record = ""
        updatedrequestData = [jsonData]
        permissionsList = check_permissions(session.get("adminId"),"subparametergroupingPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                subParameterGroupingId = request.args.get("subParameterGroupingId","")
                sub_parameter_grouping_queryset = SubParameterGrouping.objects(id=subParameterGroupingId,status__in=[0,1]).first()
                existing_record = sub_parameter_grouping_queryset.to_json()
                requestData = [existing_record]
                sub_parameter_grouping_queryset.update(status=2)
                flash("Sub parameter grouping deleted successfully!")
                message=sub_parameter_grouping_queryset.adminId.userName+" "+sub_parameter_grouping_queryset.groupName+" Sub parameter grouping deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_sub_parameter_grouping","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))
        else:
            flash("Staff member does not have given delete sub parameter grouping permissions!!")
            return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete sub parameter grouping!!")
        return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))


@service_configurations.route("/operator_parameter_based_operator_grouping_list",methods=["POST"])
def operator_parameter_based_operator_grouping_list():
    data_status = {"responseStatus": 0, "result": ""}
    operatorParameterId = request.form.get("operatorParameterId","")

    if not operatorParameterId:
        data_status["result"] = "Required fields are missing!!"
        return data_status
    try:
        parameter_queryset = OperatorParameter.objects(id=operatorParameterId,status__in=[1]).first()
        if not parameter_queryset:
            data_status["result"]="Invalid operator id!!"
            return data_status

        operatorGroupingList = []
        operators_grouping_queryset = OperatorGrouping.objects(
            operatorParameterId=str(parameter_queryset.id),status__in=[1]).order_by("-id").all()
        for each_operator_grouping in operators_grouping_queryset:
            operator_grouping_dict = fetching_operator_grouping_details(each_operator_grouping)
            operatorGroupingList.append(operator_grouping_dict)

        data_status["responseStatus"] = 1
        data_status["result"] = "Operator parameter based sub grouping data fetched successfully!"
        data_status["operatorGroupingList"] = operatorGroupingList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to fetch sub parameter grouping data!!"
        return data_status


@service_configurations.route("/create_bbps_services",methods=["GET"])
def create_bbps_services():
    data_status = {"responseStatus": 0, "result": ""} 
    try:
        
        servicesNamesList = [
        "LOAN",
        "INSURANCE",
        "GAS",
        "ELECTRICITY",
        "MOBILE PREPAID",
        "FASTAG",
        "EDUCATION",
        "WATER",
        "ENTERTAINMENT",
        "LANDLINE POSTPAID",
        "MOBILE POSTPAID",
        "CABLE",
        "DTH",
        "BROADBAND POSTPAID",
        "LPG GAS",
        "MUNICIPAL TAXES",
        "HOUSING SOCIETY",
        "MUNICIPAL SERVICES",
        "HOSPITAL",
        "SUBSCRIPTION",
        "TRAVEL-SUB",
        "CREDIT CARD",
        "TRANSIT CARD",
        "CLUBS AND ASSOCIATIONS",
        "APARTMENT",
        "RECURRING DEPOSIT",
        "RENTAL",
        "DONATION",
        "PREPAID METER"
        ]
        sorting = 0
        for each_service_name in servicesNamesList:
            sorting = sorting+1
            service_table = Service(
                adminId = "6582f0b60f2b1fb508ce05a4",
                serviceName = each_service_name,
                serviceType = "Debit",
                walletId = "658e7a8f6d7f0f9a8730cd25",
                categoryId = "658c09d7c4dd70a5860c863d",
                serviceGroupingId = "65b8d07bfe293ad4e39ed90a",
                transactionAPIId = None,
                code = each_service_name,
                sorting = sorting,
                isService = True,
                isbbps = True,
                isOperatorWise=False,
                displayInDashboard=False,
                createdOn = datetime.datetime.now(),
                status = 1,
                )
            save_table = service_table.save()

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


def recurssion_process_group(group,separator,group_list):
    try:
        joinParamString = separator.join(group.get("param"))
        group_dict = {
            "groupName": joinParamString,
            "parameters": group.get("param")
        }
        group_list.append(group_dict)
        for subgroup in group.get("group", []):
            subgroup_dict = process_group(subgroup, separator,group_list)
        return group_list
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return group_list

@service_configurations.route("/create_payu_bbps_operators",methods=["GET"])
def create_payu_bbps_operators():
    data_status = {"responseStatus": 0, "result": ""} 
    try:
        servicesNamesList = [
        # "LOAN",
        # "INSURANCE",
        # "GAS",
        # "ELECTRICITY",
        # "MOBILE PREPAID",
        # "FASTAG",
        "EDUCATION",
        # "WATER",
        # "ENTERTAINMENT",
        # "LANDLINE POSTPAID",
        # "MOBILE POSTPAID",
        # "CABLE",
        # "DTH",
        # "BROADBAND POSTPAID",
        # "LPG GAS",
        # "MUNICIPAL TAXES",
        # "HOUSING SOCIETY",
        # "MUNICIPAL SERVICES",
        # "HOSPITAL",
        # "SUBSCRIPTION",
        # "TRAVEL-SUB",
        # "CREDIT CARD",
        # "TRANSIT CARD",
        # "CLUBS AND ASSOCIATIONS",
        # "APARTMENT",
        # "RECURRING DEPOSIT",
        # "RENTAL",
        # "DONATION",
        # "PREPAID METER"
        ]
        sorting = 0
        
        for each_service_name in servicesNamesList:
            
            url = "https://nbc.payu.in/payu-nbc/v1/nbc/getBillerByBillerCategory?billerCategoryName="+str(each_service_name)

            headers = {"authorization": "Bearer 894e0b0b71e794faea091a8eceea370e48adabcbb3e82a16d952739821b1906d"}

            response = requests.get(url, headers=headers)

            jsonResponseData = json.loads(response.text)

            # print(jsonResponseData,"jsonResponseData")
            # return jsonResponseData

            billersList = jsonResponseData.get("payload",{}).get("billers",[])
            # print(billersList,"billersList")

            if billersList:
                # print("HII")
                service_queryset = Service.objects(serviceName__iexact=each_service_name).first()
                if service_queryset:
                    # print("Helloo")
                    for each_biller in billersList:
                        customerParamGroupsList = []
                        group_list = []
                        # print("Welcome")
                        sorting = sorting+1
                        if each_biller.get("fetchOption") == "MANDATORY":
                            payWithoutFetchAllowed = False
                        else:
                            payWithoutFetchAllowed = True

                        # print(each_biller.get("customerParamGroups"),"??????????????")
                        hascustomerParamGroups = False
                        if each_biller.get("customerParamGroups") == None:
                            hascustomerParamGroups = False
                        else:
                            json_data = json.loads(each_biller.get("customerParamGroups"))

                            if json_data.get("customerParamGroups") == []:
                                hascustomerParamGroups = False
                            else:
                                hascustomerParamGroups = True
                                separator = ' and '
                                
                                for each_customer_parameter_group in json_data.get("customerParamGroups"):
                                    joinParamString = separator.join(each_customer_parameter_group.get("param"))
                                    customer_parameter_group_dict = {
                                    "groupName":joinParamString,
                                    "parameters":each_customer_parameter_group.get("param")
                                    }
                                    group_list.append(customer_parameter_group_dict)
                                    for each_group in each_customer_parameter_group.get("group"):
                                        customerParamGroupsList=recurssion_process_group(each_group,separator,group_list)
                                # data_status["customerParamGroupsList"]=customerParamGroupsList

                        if each_biller.get("paymentChannelsAllowed"):
                            paymentChannelsAllowedList = each_biller.get("paymentChannelsAllowed")
                        else:
                            paymentChannelsAllowedList = []

                        if each_biller.get("paymentModesAllowed"):
                            paymentModesAllowedList = each_biller.get("paymentModesAllowed")
                        else:
                            paymentModesAllowedList = []

                        if each_biller.get("paymentAmountExactness"):
                            paymentAmountExactness = each_biller.get("paymentAmountExactness")
                        else:
                            paymentAmountExactness = ""

                        operator_table = Operators(
                            adminId = "6582f0b60f2b1fb508ce05a4",
                            operatorName = each_biller.get("billerName"),
                            serviceId = str(service_queryset.id),
                            allowType = "",
                            taxTypeId = "6593bea20d9792b77af5df60",
                            serviceGroupingId = "65b8d07bfe293ad4e39ed90a",
                            transactionAPIId = "66b7062f7ffbd317514548eb",
                            amountPlans = "0",
                            rejectedAmount = 0,
                            minLength = 0,
                            maxLength = 0,
                            minAmount = 0,
                            maxAmount = 0,
                            apiType = "Bbps",
                            apiCode = each_biller.get("billerId"),
                            stateId = None,
                            sorting = sorting,
                            isBbps = True,
                            isValidate = True,
                            displayInDashboard = False,
                            isPortial = False,
                            isRandom = False,
                            payWithoutFetchAllowed = payWithoutFetchAllowed,
                            createdOn = datetime.datetime.now(),
                            customerParamGroupsList=customerParamGroupsList,
                            hascustomerParamGroups=hascustomerParamGroups,
                            paymentChannelsAllowedList=paymentChannelsAllowedList,
                            paymentModesAllowedList=paymentModesAllowedList,
                            paymentAmountExactness=paymentAmountExactness,
                            status = 1,
                            )
                        save_table = operator_table.save()
                        operatorId = str(save_table.id)

                        if operatorId:
                            print("OPERATOR")
                            if each_biller.get("customerParams") == None:
                                pass
                            else:
                                for each_operator_parameter in each_biller.get("customerParams"):
                                    print("PARMETER")
                                    if each_operator_parameter.get("optional") == False:
                                        isMandatory= True
                                    else:
                                        isMandatory= False

                                    minLength_value = each_operator_parameter.get("minLength", "")
                                    # Ensure minLength_value is treated as a string
                                    if isinstance(minLength_value, int):
                                        minLength = minLength_value
                                    else:
                                        minLength_str = str(minLength_value).strip()  # Convert to string and strip whitespace
                                        if minLength_str.isdigit():
                                            minLength = int(minLength_str)
                                        else:
                                            minLength = 0  # or some other default value if not a valid number

                                    maxLength_str = each_operator_parameter.get("maxLength", "")
                                    # Ensure maxLength_str is treated as a string
                                    if isinstance(maxLength_str, int):
                                        maxLength = maxLength_str
                                    else:
                                        minLength_str = str(maxLength_str).strip()  # Convert to string and strip whitespace
                                        if maxLength_str.isdigit():
                                            maxLength = int(maxLength_str)
                                        else:
                                            maxLength = 0  # or some other default value if not a valid number


                                    operator_parameter_table = OperatorParameter(
                                        adminId = "6582f0b60f2b1fb508ce05a4",
                                        parameterName = each_operator_parameter.get("paramName"),
                                        displayName = each_operator_parameter.get("paramName"),
                                        operatorId = operatorId,
                                        minLength = minLength,
                                        maxLength = maxLength,
                                        sort = sorting,
                                        fieldType = each_operator_parameter.get("dataType"),
                                        pattern = each_operator_parameter.get("regex"),
                                        apiCode = each_biller.get("billerId"),
                                        apiCall ="apiCall",
                                        transactionAPIId = "66b7062f7ffbd317514548eb",
                                        createdOn = datetime.datetime.now(),
                                        status = 1,
                                        isActive= True,
                                        hasIncludeApiCall= True,
                                        isMandatory= isMandatory,
                                        isReferenceKey= False,
                                        hasGrouping= False,
                                        hasApiCall= False,
                                        hasSubParameters= False,
                                        )
                                    save_table = operator_parameter_table.save()
                                    operatorParameterId = str(save_table.id)

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

