from appservices.common.util import *
from appservices.common.form_schemas import *

service_configurations = Blueprint("service_configurations",__name__)

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

@service_configurations.route("/service_grouping_list",methods=["POST","GET"])
@adminid_access_token_required
def service_grouping_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    serviceGroupingList = []
    servicegroupingPagination = ""
    search_element=""
    snoCount=0
    page = ""
    error = ""
    redirectval = ""
    adminId = session.get("adminId")
    form = ServiceFormSearch(request.args)
    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','')
            servicePage = request.args.get(get_page_parameter("servicePage"), type=int, default=1)
            ############################################################### service grouping list ######################################################################

            per_page = 20
            start = (servicePage - 1) * per_page
            total_count=0
            filters = Q(status__in=[0, 1])
            print(per_page,"((((((((((((((per_page))))))))))))))")
   
            if form.validate():
                if search_element:
                    filters &= Q(name__icontains=search_element)
                total_count = ServiceGrouping.objects(filters).count()
            
                service_grouping_queryset = (
                    ServiceGrouping.objects(filters)
                    .only("id","name","sorting","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )
                serviceGroupingList=list(service_grouping_queryset)
                print("((((((((((((((((((((((((((((((((repoets))))))))))))))))))))))))))))))))",adminId)
            else:
                serviceGroupingList=[]
                
            snoCount = start
            # service_grouping_queryset = ServiceGrouping.objects(status__in=[0,1]).order_by('sorting')
            # if search_element:
            # 	service_grouping_queryset = service_grouping_queryset.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(servicePage=servicePage, total=total_count,page_parameter="servicePage", per_page=per_page, alignment="right", record_name="servicegrouping",href=f"?search_element={search_element}&servicePage={{0}}")                     
            
            return render_template("super_admin_templates/service_grouping_list.html",
                servicegroupingPagination=servicegroupingPagination,
                serviceGroupingList=serviceGroupingList,
                search_element=search_element,
                redirectval=redirectval,
                snoCount=snoCount,
                form=form,
                servicePage=servicePage
                )
        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",
                error=error,
                servicegroupingPagination=servicegroupingPagination,
                serviceGroupingList=serviceGroupingList,
                search_element=search_element,
                redirectval=redirectval,
                snoCount=snoCount,
                form=form,
                servicePage=servicePage
                )
    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"])
@adminid_access_token_required
def categories_configurations_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    categoriesList = []
    serviceGroupingDropdownList = []
    categoryPagination = ""
    search_element=""
    snoCount=0
    page = ""
    error = ""
    redirectval = ""
    adminId = session.get("adminId")
    form = ServiceFormSearch(request.args)
    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","")

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

             ############################################################### categories list ######################################################################
            per_page = 20
            start = (categoriespage - 1) * per_page
            total_count=0
            filters = Q(status__in=[0, 1])
            print(per_page,"((((((((((((((per_page))))))))))))))")
            
            if form.validate():
                if search_element:
                    filters &= Q(categoryName__icontains=search_element)
                total_count = Categories.objects(filters).count()
            
                categories_queryset = (
                    Categories.objects(filters)
                    .only("id", "categoryName", "isTpin", "serviceGroupingId","sorting","displayInDashboard","comingsoon","image","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )
                categoriesList=list(categories_queryset)
                print("((((((((((((((((((((((((((((((((repoets))))))))))))))))))))))))))))))))",adminId)
            else:
                categoriesList=[]
                
            snoCount = start
            # 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 categories_queryset:
            # 	# print(each_category.comingsoon,"(((((((((((?????????)))))))))))")
            # 	snoCount +=1
            # 	category_dict = fetching_category_details(each_category)
            # 	print("(((((((((((((((((((((((((id)))))))))))))))))))))))))",each_category.serviceGroupingId.id)
            # 	category_dict["snoCount"]=snoCount
            # 	categoriesList.append(category_dict)
            # # print("((((((((((((((((((((((((((((((service))))))))))))))))))))))))))))))",categoriesList)

            categoryPagination = Pagination(categoriespage=categoriespage, total=total_count,page_parameter="categoriespage", per_page=per_page, alignment="right", record_name="category",href=f"?search_element={search_element}&categoriespage={{0}}")    


            ############################################################ 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",
                domain=domain,
                categoryPagination=categoryPagination,
                categoriesList=categoriesList,
                serviceGroupingDropdownList=serviceGroupingDropdownList,
                search_element=search_element,
                redirectval=redirectval,
                snoCount=snoCount,
                categoriespage = categoriespage,
                form=form,
                )
        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",
                error=error,
                domain=domain,
                categoryPagination=categoryPagination,
                categoriesList=categoriesList,
                serviceGroupingDropdownList=serviceGroupingDropdownList,
                search_element=search_element,
                redirectval=redirectval,
                snoCount=snoCount,
                categoriespage = categoriespage,
                form=form,
                )
    else:
        flash("The staff member does not have permission to view Services.","danger")
        return redirect(url_for("admin.dashboard"))



################### services ################


@service_configurations.route("/services_configurations_list",methods=["POST","GET"])
@adminid_access_token_required
def services_configurations_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    servicesList = []
    serviceGroupingDropdownList = []
    categoriesList = []
    walletsList = []
    servicePagination = ""

    search_element=""
    redirectval=""
    snoCount=0
    SubServicePage=1
    serviceType =""

    form = SearchSubServiceList(request.args)
    
    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','')
            SubServicePage = request.args.get(get_page_parameter("SubServicePage"), type=int, default=1)
            serviceType = request.args.get("serviceType", "")

            if form.validate():

                filters = Q(status__in=[0, 1])
                if search_element and search_element.strip():
                    filters &= Q(serviceName__icontains=search_element.strip())
                if serviceType:
                    filters &= Q(serviceType = serviceType)

                per_page = 20
                start = (SubServicePage - 1) * per_page

                total_count=0

                total_count = Service.objects(filters).count()

                services_queryset = ( 
                    Service.objects(filters)
                    .only("serviceName","serviceType","categoryId","categoryIdsList","serviceGroupingIdsList","transactionAPIId","code","sorting","displayInDashboard","isService","isbbps","isOperatorWise","file","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )
                
                snoCount = start

                servicesList = list(services_queryset)

                walletsList = fetching_wallet_details()

                service_grouping_queryset = ServiceGrouping.objects(status__in=[0,1]).only("id","name").order_by('sorting')

                serviceGroupingDropdownList = list(service_grouping_queryset)

                categories_queryset = Categories.objects(status__in=[0,1]).only("id","categoryName").order_by("sorting")

                categoriesList = list(categories_queryset)

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




            #  ############################################################### 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",
                domain=domain,
                servicePagination=servicePagination,
                walletsList=walletsList,
                servicesList=servicesList,
                serviceGroupingDropdownList=serviceGroupingDropdownList,
                categoriesList=categoriesList,
                search_element=search_element,
                redirectval=redirectval,
                snoCount = snoCount,
                form = form,
                SubServicePage = SubServicePage,
                serviceType = serviceType
                )
        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",
                domain=domain,
                servicePagination=servicePagination,
                walletsList=walletsList,
                servicesList=servicesList,
                serviceGroupingDropdownList=serviceGroupingDropdownList,
                categoriesList=categoriesList,
                search_element=search_element,
                redirectval=redirectval,
                snoCount = snoCount,
                form = form,
                SubServicePage = SubServicePage,
                serviceType=serviceType
                )
    else:
        flash("The staff member does not have permission to view Sub services.","danger")
        return redirect(url_for("admin.dashboard"))

################### operators ################
@service_configurations.route("/operators_configurations_list",methods=["POST","GET"])
@adminid_access_token_required
def operators_configurations_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    operatorsList = []
    transactionAPIsList = []
    servicesDropdownList =[]
    taxTypesList = []
    serviceGroupingDropdownList =[]
    statesList = []
    
    operatorPagination = ""
    search_element=""
    redirectval=""
    snoCount=0
    operatorPage=1
    form = SearchOperatorConfigurationsList(request.args)
    
    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','')
            operatorPage = request.args.get(get_page_parameter('operatorPage'), type=int, default=1)

            if form.validate():
                filters = Q(status__in=[0, 1])

                if search_element and search_element.strip():
                    filters &= Q(operatorName__icontains=search_element.strip())

                per_page = 20
                start = (operatorPage - 1) * per_page
                total_count=0
                total_count = Operators.objects(filters).count()

                operators_queryset = ( 
                    Operators.objects(filters)
                    .only("id","operatorName","serviceId","allowType","transactionAPIId","apiCode","apiType","image","taxTypeId","serviceGroupingId","minLength","maxLength","sorting","displayInDashboard","payWithoutFetchAllowed","stateId","isBbps","isValidate","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )

                snoCount = start

                operatorsList = list(operators_queryset)

                taxTypesList = fetching_tax_type_details()

                statesList = fetching_state_details()

                transaction_API_queryset = TransactionAPI.objects(status__in=[0,1]).only("id","apiName").order_by('-id')
                transactionAPIsList = list(transaction_API_queryset)

                services_queryset = Service.objects(status__in=[0,1]).only("id","serviceName").order_by("sorting")
                servicesDropdownList = list(services_queryset)

                service_grouping_queryset = ServiceGrouping.objects(status__in=[0,1]).only("id","name").order_by('sorting')
                serviceGroupingDropdownList = list(service_grouping_queryset)

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

            # ############################################################### 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,
                domain=domain,
                statesList =statesList,
                operatorsList=operatorsList,
                transactionAPIsList=transactionAPIsList,
                servicesDropdownList=servicesDropdownList,
                taxTypesList=taxTypesList,
                serviceGroupingDropdownList=serviceGroupingDropdownList,
                search_element=search_element,
                redirectval=redirectval,
                snoCount = snoCount,
                form = form,
                operatorPage = operatorPage
                )
        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,
                domain=domain,
                statesList =statesList,
                operatorsList=operatorsList,
                transactionAPIsList=transactionAPIsList,
                servicesDropdownList=servicesDropdownList,
                taxTypesList=taxTypesList,
                serviceGroupingDropdownList=serviceGroupingDropdownList,
                search_element=search_element,
                redirectval=redirectval,
                snoCount = snoCount,
                form = form,
                operatorPage = operatorPage
                )    
    else:
        flash("The staff member does not have permission to view Operator.", "danger")
        return redirect(url_for("admin.dashboard"))    


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

    search_element=""
    redirectval=""
    snoCount=0
    operatorGroupingPage=None

    operatorgroupingPagination = ""

    form =SearchOperatorGrouping(request.args)
    
    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 ######################################################################

            if form.validate():
                if search_element:
                    search_element = form.search_element.data
                operatorGroupingPage = request.args.get(get_page_parameter("operatorGroupingPage"), type=int, default=1)

                per_page = 20
                start = (operatorGroupingPage - 1) * per_page

                total_count=0
                filters = Q(status__in=[0, 1])

                if search_element and search_element.strip():
                    filters &= Q(groupName__icontains=search_element.strip())

                total_count = OperatorGrouping.objects(filters).count()

                operators_grouping_queryset = (
                    OperatorGrouping.objects(filters)
                    .only("id","groupName","operatorId","operatorParameterId","value","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )

                snoCount = start

                operatorGroupingList = list(operators_grouping_queryset)

                operator_parameters_queryset = OperatorParameter.objects(status__in=[0,1]).only("id","parameterName").order_by('sorting')
                activeOperatorParametersList = list(operator_parameters_queryset)

                operators_queryset = Operators.objects(status__in=[0,1]).only("id","operatorName").order_by('sorting')
                operatorsDropdownList= list(operators_queryset)

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


            # operators_grouping_queryset = OperatorGrouping.objects(status__in=[0,1]).order_by('-id')
            # if search_element:
            #     operators_grouping_queryset = operators_grouping_queryset.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##################
            # operator_parameters_queryset = OperatorParameter.objects(status__in=[0,1]).order_by('sorting')
            # for each_operator_parameter in operator_parameters_queryset:
            #     operator_parameter_dict = {
            #     "id":str(each_operator_parameter.id),
            #     "parameterName":each_operator_parameter.parameterName,
            #     }
            #     activeOperatorParametersList.append(operator_parameter_dict)

            # ############ 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,
                snoCount = snoCount,
                operatorGroupingPage=operatorGroupingPage,
                form = form,
                )
        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,
                snoCount = snoCount,
                operatorGroupingPage=operatorGroupingPage,
                form = form,
                )   
    else:
        flash("The staff member does not have permission to view Operator grouping.", "danger")
        return redirect(url_for("admin.dashboard"))        


################### operator Update ################
@service_configurations.route("/operator_update_list",methods=["POST","GET"])
@adminid_access_token_required
def operator_update_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    operatorUpdateList = []    
    operatorsDropdownList = []
    operatorUpdatePagination =""
    search_element=""
    redirectval=""
    snoCount=0
    operatorUpdatePage=None

    adminId = session.get("adminId")
    form = BusinessFormSearch(request.args)
    
    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','')

            if form.validate():
                if search_element:
                    search_element = form.search_element.data

                operatorUpdatePage = request.args.get(get_page_parameter("operatorUpdatePage"), type=int, default=1)


                per_page = 20
                start = (operatorUpdatePage - 1) * per_page

                total_count=0
                filters = Q(status__in=[0, 1])

                if search_element and search_element.strip():
                    matching_operators = Operators.objects(operatorName__icontains=search_element.strip()).only("id")
                    operator_ids = [op.id for op in matching_operators]
                    filters &= Q(operatorId__in=operator_ids)

                total_count = OperatorUpdate.objects(filters).count()

                operators_update_queryset = (
                    OperatorUpdate.objects(filters)
                        .order_by("-id")
                        .only("id","operatorId","apiOperatorCode1","apiOperatorCode2","apiOperatorCode3","apiOperatorCode4","apiOperatorCode5","apiOperatorCode6")
                        .skip(start)
                        .limit(per_page)
                )
                snoCount = start

                operatorUpdateList = list(operators_update_queryset)

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

                operatorsDropdownList = list(operators_queryset)

                operatorUpdatePagination = Pagination(operatorUpdatePage=operatorUpdatePage, total=total_count, per_page=per_page, page_parameter ="operatorUpdatePage", alignment="right", record_name="operatorUpdate")


                


            #  ############################################################### 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,
                snoCount = snoCount,
                form = form,
                operatorUpdatePage = operatorUpdatePage
                )
        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,
                snoCount = snoCount,
                form = form,
                operatorUpdatePage = operatorUpdatePage
                )        
    else:
        flash("The staff member does not have permission to view Operator update.", "danger")
        return redirect(url_for("admin.dashboard"))
	

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

    operatorparameterPagination = ""
    search_element=""
    redirectval=""
    snoCount=0
    OperatorParameterPage=1

    form = SearchOperatorParameterList(request.args)
    
    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','')
            OperatorParameterPage = request.args.get(get_page_parameter("OperatorParameterPage"), type=int, default=1)

            if form.validate():
                filters = Q(status__in=[0, 1])
                if search_element and search_element.strip():
                    filters &= Q(displayName__icontains=search_element.strip())

                per_page = 20
                start = (OperatorParameterPage - 1) * per_page

                total_count=0

                total_count = OperatorParameter.objects(filters).count()

                operator_parameters_queryset = ( 
                    OperatorParameter.objects(filters)
                    .only("id","displayName","parameterName","operatorId","transactionAPIId","apiCode","sort","fieldType","minLength","maxLength","pattern","isActive","isMandatory","hasGrouping","hasIncludeApiCall","isReferenceKey","hasApiCall","hasSubParameters","apiCall","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )

                snoCount = start

                operatorParametersList = list(operator_parameters_queryset)

                operators_queryset = Operators.objects(status__in=[0,1]).only("id","operatorName").order_by('sorting')
                operatorsDropdownList = list(operators_queryset)

                transaction_API_queryset = TransactionAPI.objects(status__in=[0,1]).only("id","apiName").order_by('-id')
                transactionAPIsList = list(transaction_API_queryset)

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






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

            # operator_parameters_queryset = OperatorParameter.objects(status__in=[0,1]).order_by('sort')
            # if search_element:
            #     operator_parameters_queryset = operator_parameters_queryset.filter(Q(displayName__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,
                snoCount = snoCount,
                form = form,
                OperatorParameterPage = OperatorParameterPage
                )
        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,
                snoCount = snoCount,
                form = form,
                OperatorParameterPage = OperatorParameterPage
                )   
    else:
        flash("The staff member does not have permission to view Operator parameter.", "danger")
        return redirect(url_for("admin.dashboard"))     


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

    subparameterPagination = ""
    search_element=""
    redirectval=""
    snoCount=0
    SubParameterPage=None
    form = SearchSubParameter(request.args)
    
    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','')

            if form.validate():
                if search_element:
                    search_element = form.search_element.data

                SubParameterPage = request.args.get(get_page_parameter("SubParameterPage"), type=int, default=1)

                per_page = 20
                start = (SubParameterPage - 1) * per_page

                total_count=0
                filters = Q(status__in=[0, 1])
                
                if search_element and search_element.strip():
                    filters &= Q(displayName__icontains=search_element.strip())

                total_count = SubParameters.objects(filters).count()
                sub_parameters_queryset= ( 
                    SubParameters.objects(filters)
                    .only("id","displayName","parameterName","operatorParameterId","operatorGroupingId","operatorId","transactionAPIId","apiCode","sort","fieldType","minLength","maxLength","pattern","isActive","isMandatory","hasGrouping","hasIncludeApiCall","isReferenceKey","hasApiCall","hasSubParameters","apiCall","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )

                snoCount = start
                subParametersList = list(sub_parameters_queryset)

                suboperator_parameters_queryset = OperatorParameter.objects(status__in=[0,1]).only("id","displayName").order_by('sorting')
                hasSubOperatorParametersList = list(suboperator_parameters_queryset)

                operators_queryset = Operators.objects(status__in=[0,1]).only("id","operatorName").order_by('sorting')
                operatorsDropdownList = list(operators_queryset)

                transaction_API_queryset = TransactionAPI.objects(status__in=[0,1]).only("id","apiName").order_by('-id')
                transactionAPIsList = list(transaction_API_queryset)

                operators_grouping_queryset = OperatorGrouping.objects(status__in=[0,1]).only("id","groupName").order_by('-id')
                operatorGroupingList = list(operators_grouping_queryset)
                
                subparameterPagination = Pagination(SubParameterPage=SubParameterPage, total=total_count,page_parameter="SubParameterPage",  per_page=per_page, alignment="right", record_name="SubParameter")
            ############################################################### 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()
            
            # suboperator_parameters_queryset = OperatorParameter.objects(status__in=[0,1]).order_by('sorting')
            # for each_operator_parameter in suboperator_parameters_queryset:
            #     suboperator_parameter_dict = {
            #     "id":str(each_operator_parameter.id),
            #     "parameterName":each_operator_parameter.parameterName,
            #     "displayName":each_operator_parameter.displayName,
            #     }
            #     hasSubOperatorParametersList.append(suboperator_parameter_dict)
                
            # 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)
                
            # operators_grouping_queryset = OperatorGrouping.objects(status__in=[0,1]).order_by('-id')
            # for each_operator_grouping in operators_grouping_queryset:
            #     operatorgrouping_dict = {
            #     "id":str(each_operator_grouping.id),
            #     "groupName":each_operator_grouping.groupName
            #     }
            #     operatorGroupingList.append(operatorgrouping_dict)
                
            return render_template("super_admin_templates/sub_parameters_list.html",
                subparameterPagination=subparameterPagination,
                subParametersList=subParametersList,
                hasSubOperatorParametersList=hasSubOperatorParametersList,
                operatorsDropdownList=operatorsDropdownList,
                transactionAPIsList=transactionAPIsList,
                operatorGroupingList=operatorGroupingList,
                search_element=search_element,
                redirectval=redirectval,
                snoCount = snoCount,
                form = form,
                SubParameterPage = SubParameterPage
                )
        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,
                operatorGroupingList=operatorGroupingList,
                search_element=search_element,
                redirectval=redirectval,
                snoCount = snoCount,
                form = form,
                SubParameterPage = SubParameterPage
                )   
    else:
        flash("The staff member does not have permission to view Sub parameter.", "danger")
        return redirect(url_for("admin.dashboard")) 


################### sub parameter Grouping ################



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

    subparameterPagination = ""
    search_element=""
    redirectval=""
    snoCount=0
    SubParameterGroupingPage=1
    form = SearchSubParameterGouping(request.args)

    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','')
            SubParameterGroupingPage = request.args.get(get_page_parameter("SubParameterGroupingPage"), type=int, default=1)

            if form.validate():
                filters = Q(status__in=[0, 1])
                if search_element and search_element.strip():
                    filters &= Q(groupName__icontains=search_element.strip())

                per_page = 20
                start = (SubParameterGroupingPage - 1) * per_page

                total_count=0

                total_count = SubParameterGrouping.objects(filters).count()

                sub_parameter_grouping_queryset = ( 
                    SubParameterGrouping.objects(filters)
                    .only("id","groupName","subParameterId","operatorId","value","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )

                snoCount = start
                subParameterGroupingsList = list(sub_parameter_grouping_queryset)

                operators_queryset = Operators.objects(status__in=[0,1]).only("id","operatorName").order_by('sorting')
                operatorsDropdownList = list(operators_queryset)

                sub_parameters_queryset = SubParameters.objects(status__in=[0,1]).only("id","parameterName").order_by('-id')
                subParametersList = list(sub_parameters_queryset)

                subparameterPagination = Pagination(SubParameterGroupingPage=SubParameterGroupingPage, total=total_count,page_parameter="SubParameterGroupingPage", per_page=per_page, alignment="right", record_name="SubParameterGrouping")




             ############################################################### 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)
                
            # sub_parameters_queryset = SubParameters.objects(status__in=[0,1]).order_by('-id')
            # for each_sub_parameter in sub_parameters_queryset:
            #     suboperator_parameter_dict = {
            #     "id":str(each_sub_parameter.id),
            #     "parameterName":each_sub_parameter.parameterName
            #     }
            #     subParametersList.append(suboperator_parameter_dict)
                
            return render_template("super_admin_templates/sub_parameter_grouping_list.html",
                subparameterPagination=subparameterPagination,
                subParameterGroupingsList=subParameterGroupingsList,
                operatorsDropdownList=operatorsDropdownList,
                subParametersList=subParametersList,
                search_element=search_element,
                redirectval=redirectval,
                snoCount = snoCount,
                form = form,
                SubParameterGroupingPage = SubParameterGroupingPage
                )
        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",
                subparameterPagination=subparameterPagination,
                subParameterGroupingsList=subParameterGroupingsList,
                operatorsDropdownList=operatorsDropdownList,
                subParametersList=subParametersList,
                search_element=search_element,
                redirectval=redirectval,
                snoCount = snoCount,
                form = form,
                SubParameterGroupingPage = SubParameterGroupingPage
                )   
    else:
        flash("The staff member does not have permission to view Sub parameter grouping.", "danger")
        return redirect(url_for("admin.dashboard"))     


###################category################
# Add category
@service_configurations.route("/add_category",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_category():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            flash("session expired.Please login again.")
            data_status["responseStatus"]=4
            return data_status
        adminId = session.get("adminId")
  
        csrf_token = request.form.get("csrf_token")
        print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        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","")
                print(image,"(((((((((((image@@@@@@@@@@@@)))))))))))")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]
                form = ServiceListForm()
                if form.validate_on_submit():
                    
                    
                    
                    # if categoryName and not is_valid_alphanumeric(categoryName):
                    # 	flash("Services Name must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
                    # 	return redirect(url_for("service_configurations.categories_configurations_list"))

                    # if sorting and not is_valid_numeric(sorting):
                    # 	flash("sorting must contain only numeric characters")
                    # 	return redirect(url_for("service_configurations.categories_configurations_list"))


                    if categoryName:
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message=admin_queryset.userName+" "+categoryName+" Services created successfully!"
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_category","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                            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 is_allowed_image(image.filename):
                            # 		flash("Invalid image format! Only JPG, JPEG, and PNG are allowed.")
                            # 		return redirect(url_for("service_configurations.categories_configurations_list"))  

                                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("Services saved successfully!","success")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                            flash("Unable to save service category.")
                            app.logger.error(traceback.format_exc())
                            data_status['responseStatus']=4
                            return data_status
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status
                else:
                    data_status['result']=form.errors
                    return data_status
            else:
                flash("Invalid request.")
                data_status['responseStatus']=4
                return data_status
        else:
            flash("The staff member does not have permission to create Services.", "danger")
            data_status['responseStatus']=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save Services!!"
        flash(error)
        data_status['responseStatus']=4
        return data_status


# View All Categories
@service_configurations.route("/service_configurations_list",methods=["POST","GET"])
@adminid_access_token_required
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 Services status
@service_configurations.route("/update_category_status",methods=["POST","GET"])
@adminid_access_token_required
def update_category_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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]
    categoriespage = request.args.get("categoriespage")
    search_element = request.args.get("search_element", "")
 
    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("Services activated successfully!","success")
                        message=category_queryset.adminId.userName+" "+category_queryset.categoryName+" Services activated successfully!"
                    elif category_queryset.status == 1:
                        category_queryset.update(status=0)
                        flash("Services deactivated successfully!","success")
                        message=category_queryset.adminId.userName+" "+category_queryset.categoryName+" Services deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_category_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                    return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category",categoriespage=categoriespage,search_element=search_element))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category",categoriespage=categoriespage,search_element=search_element))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category",categoriespage=categoriespage,search_element=search_element))
        else:
            return redirect(url_for("service_configurations.categories_configurations_list",categoriespage=categoriespage,search_element=search_element))
    else:
        flash("The staff member does not have permission to update Services status.","danger")
        return redirect(url_for("service_configurations.categories_configurations_list",redirectTo="Category",categoriespage=categoriespage,search_element=search_element))



# Update Services
@service_configurations.route("/update_category",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_category():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        flash("session Expired.")
        data_status["responseStatus"]=4
        return data_status
    adminId=session.get("adminId") 
 
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))")  
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    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)
    
                form = ServiceListForm(request.form, current_id=categoryId)
                if form.validate_on_submit():
                    if categoryName and sorting:
                # if categoryName and not is_valid_alphanumeric(categoryName):
                # 	flash("Services Name must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
                # 	return redirect(url_for("service_configurations.categories_configurations_list"))

                # if sorting and not is_valid_numeric(sorting):
                # 	flash("sorting must contain only numeric characters")
                # 	return redirect(url_for("service_configurations.categories_configurations_list"))

                        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+" Services 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,latitude,longitude) 

                        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 is_allowed_image(image.filename):
                                # 	flash("Invalid image format! Only JPG, JPEG, and PNG are allowed.")
                                # 	return redirect(url_for("service_configurations.categories_configurations_list"))  
                
                                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("Services updated successfully!","success")
                            data_status["responseStatus"]=1
                            return data_status
                        else:
                            flash("Invaild id!!")
                            data_status["responseStatus"]=4
                            return data_status
                    else:
                        data_status["responseStatus"]=2
                        data_status["result"]="required fields are missing."
                        return data_status
                else:
                    data_status["result"]=form.errors
                    return data_status
            else:
                flash("Invalid request.")
                data_status["responseStatus"]=4
                return data_status
  
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to update Services details!!"
            flash(error,"danger")
            data_status["responseStatus"]=4
            return data_status
    else:
        flash("The staff member does not have permission to update Services.", "danger")
        data_status["responseStatus"]=4
        return data_status


# Delete Services
@service_configurations.route("/delete_category",methods=["GET"])
@adminid_access_token_required
def delete_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        latitude = request.args.get("latitude", "")
        longitude = request.args.get("longitude", "")
        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]
        categoriespage = request.args.get("categoriespage")
        search_element = request.args.get("search_element", "")
        redirectTo=url_for("service_configurations.categories_configurations_list",categoriespage=categoriespage,search_element=search_element)
  
        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("Services deleted successfully!","success")
                message=category_queryset.adminId.userName+" "+category_queryset.categoryName+" Services deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_category","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                return redirect(redirectTo)
        else:
            flash("The staff member does not have permission to delete Services.","danger")
            return redirect(redirectTo)
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete category!!","danger")
        return redirect(redirectTo)


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

# Add Service
@service_configurations.route("/add_service",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_service():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
  
        csrf_token = request.form.get("csrf_token")
        print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        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","")
                serviceGroupingIdsList = request.form.getlist("serviceGroupingIdsList")
                # transactionAPIId = request.form.get("transactionAPIId","")
                code = request.form.get("code","")
                sorting = request.form.get("sorting",0)
                displayInDashboard = request.form.get("displayInDashboard")
                isService = request.form.get("isService")
                isbbps = request.form.get("isbbps")
                isOperatorWise = request.form.get("isOperatorWise")
                image = request.files.get("image","")
                categoryIdsList=request.form.getlist("categoryIdsList")
                print("((((((((service gp list))))))))", serviceGroupingIdsList)

                # if serviceName and not is_valid_alphanumeric(serviceName):
                #     flash(" Sub Service Name must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
                #     return redirect(url_for("service_configurations.services_configurations_list"))

                # if code and not is_valid_alphanumeric_without_specialCharacters(code):
                #     flash("Code must contain only alphanumeric characters (letters, digits) and spaces.")
                #     return redirect(url_for("service_configurations.services_configurations_list"))

                # if sorting and not is_valid_numeric(sorting):
                #     flash("Sorting must contain only contains only numeric characters.")
                #     return redirect(url_for("service_configurations.services_configurations_list"))

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


                form = subserviceListForm()

                if form.validate_on_submit():
                    if serviceName and serviceType and categoryIdsList and code :
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message=admin_queryset.userName+" "+serviceName+" Sub service created successfully!"
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_service","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                                
                            categoryIdsList = [ObjectId(cid) for cid in categoryIdsList]

                            service_table = Service(
                                adminId = adminId,
                                serviceName = serviceName,
                                serviceType = serviceType,
                                walletId = walletId,
                                categoryIdsList = categoryIdsList,
                                # serviceGroupingId = serviceGroupingId,
                                serviceGroupingIdsList = serviceGroupingIdsList,
                                transactionAPIId = None,
                                code = code,
                                sorting = int(sorting) if sorting.strip() else 0,
                                # 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 image:
                            
                                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 = image.save(os.path.join(app.config['SITE_ROOT'], "media/services/"+serviceId+".png"))
                                save_table.update(image="media/services/"+serviceId+".png")


                            flash("New Sub service saved successfully!")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                            flash("Unable to save Sub service!!")
                            app.logger.error(traceback.format_exc())
                            data_status['responseStatus']=4
                            return data_status
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status

                # print(serviceName,"((((((((((((((((serviceName))))))))))))))))")
                # print(serviceType,"((((((((((((((((serviceType))))))))))))))))")
                # print(walletId,"((((((((((((((((walletId))))))))))))))))")
                # print(categoryIdsList,"((((((((((((((((categoryIdsList))))))))))))))))")
                # print(code,"((((((((((((((((code))))))))))))))))")

                # if serviceName and serviceType and categoryIdsList and code :
                #     try:
                #         admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                #         if admin_queryset:
                #             message=admin_queryset.userName+" "+serviceName+"Sub service created successfully!"
                #             save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_service","create",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                             
                #         categoryIdsList = [ObjectId(cid) for cid in categoryIdsList]

                #         service_table = Service(
                #             adminId = adminId,
                #             serviceName = serviceName,
                #             serviceType = serviceType,
                #             walletId = walletId,
                #             categoryIdsList = categoryIdsList,
                #             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 image:
                #             if not is_allowed_image(image.filename):
                #                 flash("Invalid image format! Only JPG, JPEG, and PNG are allowed.")
                #                 return redirect(url_for("service_configurations.categories_configurations_list"))  

                        
                #             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 = image.save(os.path.join(app.config['SITE_ROOT'], "media/services/"+serviceId+".png"))
                #             save_table.update(image="media/services/"+serviceId+".png")


                #         flash("New Sub service saved successfully!")
                #         return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
                #     except Exception as e:
                #         flash("Unable to save Sub service!!")
                #         app.logger.error(traceback.format_exc())
                #         print(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:
                return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service"))
        else:
            flash("The staff member does not permission to create Sub-services.","danger")
            data_status['responseStatus']=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        print(traceback.format_exc())
        error = "Unable to save Sub service!!"
        flash(error)
        data_status['responseStatus']=4
        return data_status

#Update Sub Service
@service_configurations.route("/update_service",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_service():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
 
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    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","")
                serviceGroupingIdsList =request.form.getlist("serviceGroupingIdsList")
                # 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")
                image = request.files.get("image","")
                categoryIdsList=request.form.getlist("categoryIdsList")
                jsonData = request.form.to_dict(flat=True)

                # if serviceName and not is_valid_alphanumeric(serviceName):
                #     flash(" Sub Service Name must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
                #     return redirect(url_for("service_configurations.services_configurations_list"))

                # if code and not is_valid_alphanumeric_without_specialCharacters(code):
                #     flash("Code must contain only alphanumeric characters (letters, digits) and spaces.")
                #     return redirect(url_for("service_configurations.services_configurations_list"))

                # if sorting and not is_valid_numeric(sorting):
                #     flash("Sorting must contain only contains only numeric characters.")
                #     return redirect(url_for("service_configurations.services_configurations_list"))
                

                # print("((((((((((((((((((((categoryIdsList))))))))))))))))))))",categoryIdsList)

                form = subserviceListForm(request.form,current_id=serviceId)

                if form.validate_on_submit():

                    if serviceName and serviceType and categoryIdsList and code :
                        try:

                            service_queryset = Service.objects(id=serviceId).first()
                            existing_record = service_queryset.to_json()
                            message=service_queryset.adminId.userName+" "+serviceName+" Sub 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,latitude,longitude)

                            categoryIdsList = [ObjectId(cid) for cid in categoryIdsList] 
                            serviceGroupingIdsList = [ObjectId(sgid) for sgid in serviceGroupingIdsList] 

                            if service_queryset:
                                service_queryset.update(
                                    serviceName = serviceName,
                                    serviceType = serviceType,
                                    # walletId = ObjectId(walletId),
                                    categoryIdsList = categoryIdsList,
                                    # serviceGroupingId = ObjectId(serviceGroupingId),
                                    serviceGroupingIdsList = serviceGroupingIdsList,
                                    transactionAPIId = None,
                                    code = code,
                                    sorting = int(sorting) if sorting.strip() else 0,
                                    # 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 is_allowed_image(file.filename):
                                # 	    flash("Invalid image format! Only JPG, JPEG, and PNG are allowed.")
                                # 	    return redirect(url_for("service_configurations.services_configurations_list"))  
                        
                                # 	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")
                                print("(((((((((((((((image)))))))))))))))",image)        
                                if image:
                                    print("(((((((((((((((image Save)))))))))))))))",image)
                                    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 = image.save(os.path.join(app.config['SITE_ROOT'], "media/services/"+serviceId+".png"))
                                    service_queryset.update(file="media/services/"+serviceId+".png")

                                flash("Sub Service updated successfully!")
                                data_status["responseStatus"]=1
                                return data_status
                            else:
                                flash("Invaild id!!")
                                data_status["responseStatus"]=4
                                return data_status
                        except Exception as e:
                            app.logger.error(traceback.format_exc())
                            flash("Unable to update Sub service!!")
                            data_status['responseStatus']=4
                            return data_status
                    else:
                        data_status["responseStatus"]=2
                        data_status["result"]="Required fields are missing."
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status



                # if serviceName and serviceType and categoryIdsList and code :
                #     try:

                #         service_queryset = Service.objects(id=serviceId).first()
                #         existing_record = service_queryset.to_json()
                #         message=service_queryset.adminId.userName+" "+serviceName+"Sub 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)

                #         categoryIdsList = [ObjectId(cid) for cid in categoryIdsList] 

                #         if service_queryset:
                #             service_queryset.update(
                #                 serviceName = serviceName,
                #                 serviceType = serviceType,
                #                 # walletId = ObjectId(walletId),
                #                 categoryIdsList = categoryIdsList,
                #                 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 is_allowed_image(file.filename):
                #             # 	    flash("Invalid image format! Only JPG, JPEG, and PNG are allowed.")
                #             # 	    return redirect(url_for("service_configurations.services_configurations_list"))  
                    
                #             # 	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")

                #             if image:
                #                 if not is_allowed_image(image.filename):
                #                     flash("Invalid image format! Only JPG, JPEG, and PNG are allowed.")
                #                     return redirect(url_for("service_configurations.services_configurations_list"))
                #                 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 = image.save(os.path.join(app.config['SITE_ROOT'], "media/services/"+serviceId+".png"))
                #                 save_table.update(image="media/services/"+serviceId+".png")

                #             flash("Sub 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 Sub 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"))
            else:
                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 Sub service!!")
            data_status['responseStatus']=4
            return data_status
    else:
        flash("The staff member does not have permission to update Sub service.", "danger")
        data_status['responseStatus']=4
        return data_status

# Update Sub service status
@service_configurations.route("/update_service_status",methods=["POST","GET"])
@adminid_access_token_required
def update_service_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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]

    SubServicePage = request.args.get("SubServicePage")
    search_element = request.args.get("search_element", "").strip()
 
    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(" Sub Service activated successfully!")
                        message=service_queryset.adminId.userName+" "+service_queryset.serviceName+" Sub Service activated successfully!"
                    elif service_queryset.status == 1:
                        service_queryset.update(status=0)
                        flash(" Sub Service deactivated successfully!")
                        message=service_queryset.adminId.userName+" "+service_queryset.serviceName+" Sub 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,latitude,longitude)
                    return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service",search_element=search_element,SubServicePage=SubServicePage))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service",search_element=search_element,SubServicePage=SubServicePage))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service",search_element=search_element,SubServicePage=SubServicePage))
        else:
            return redirect(url_for("service_configurations.services_configurations_list",search_element=search_element,SubServicePage=SubServicePage))
    else:
        flash("The staff member does not have permission to update Sub Service status.", "danger")
        return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service",search_element=search_element,SubServicePage=SubServicePage))

# Delete Sub service
@service_configurations.route("/delete_service",methods=["GET","POST"])
@adminid_access_token_required
def delete_service():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        latitude = request.args.get("latitude", "")
        longitude = request.args.get("longitude", "")
        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]

        SubServicePage = 1
        search_element = ""
  
        permissionsList = check_permissions(session.get("adminId"),"subservicesPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                serviceId = request.args.get("serviceId","")
                SubServicePage = request.args.get(get_page_parameter("SubServicePage"), type=int, default=1)
                search_element = request.args.get("search_element","")
                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+" Sub Service deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_service","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service",SubServicePage=SubServicePage, search_element = search_element))
        else:
            flash("The staff member does not have permission to delete Sub service.", "danger")
            return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service",SubServicePage=SubServicePage, search_element = search_element))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete Sub service!!")
        return redirect(url_for("service_configurations.services_configurations_list",redirectTo="Service",SubServicePage=SubServicePage, search_element = search_element))




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

# Add operator
@service_configurations.route("/add_operator",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_operator():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
  
        csrf_token = request.form.get("csrf_token")
        print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        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",0)
                minLength = request.form.get("minLength",0)
                maxLength = request.form.get("maxLength",0)
                minAmount = request.form.get("minAmount",0)
                maxAmount = request.form.get("maxAmount",0)
                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")

                # if operatorName and not is_valid_alphanumeric(operatorName):
                #     flash("Operator Name must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
                #     return redirect(url_for("service_configurations.operators_configurations_list"))

                # if allowType and not is_valid_alphanumeric(allowType):
                #     flash("Allow Type must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
                #     return redirect(url_for("service_configurations.operators_configurations_list"))

                # if apiCode and not is_valid_alphanumeric_without_specialCharacters(apiCode):
                #     flash("api Code must contain only alphanumeric characters (letters, digits) and spaces.")
                #     return redirect(url_for("service_configurations.operators_configurations_list"))

                # if sorting and not is_valid_numeric(sorting):
                #     flash("Sorting must contain only contains only numeric characters.")
                #     return redirect(url_for("service_configurations.operators_configurations_list"))

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

                form = AddOperatorForm()

                if form.validate_on_submit():
                    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,latitude,longitude) 
                                    
                            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 = int(sorting) if sorting.strip() else 0,
                                # 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 is_allowed_image(image.filename):
                            #         flash("Invalid image format! Only JPG, JPEG, and PNG are allowed.")
                            #         data_status['responseStatus']=4
                            #         return data_status
                
                            #     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/"+str(operatorId)+".png"))
                            #     save_table.update(image="media/operators/"+str(operatorId)+".png")
                            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/"+str(operatorId)+".png"))
                                save_table.update(image="media/operators/"+str(operatorId)+".png")



                            flash("Operator added successfully!")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                            app.logger.error(traceback.format_exc())
                            flash("Unable to add operator!!")
                            data_status['responseStatus']=4
                            return data_status
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status

                # 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 is_allowed_image(image.filename):
                #                 flash("Invalid image format! Only JPG, JPEG, and PNG are allowed.")
                #                 return redirect(url_for("service_configurations.operators_configurations_list")) 
            
                #             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/"+str(operatorId)+".png"))
                #             save_table.update(image="media/operators/"+str(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:
                return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator"))
        else:
            flash("The staff member does not have permission to create a Operator.", "danger")
            data_status['responseStatus']=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add operator!!"
        flash(error)
        data_status['responseStatus']=4
        return data_status

# Update operator
@service_configurations.route("/update_operator",methods=["POST","GET"])
@adminid_access_token_required

def update_operator():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")   
 
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))") 
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    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)

                form = AddOperatorForm(request.form,current_id=operatorId)

                if form.validate_on_submit():
                    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,latitude,longitude) 

                        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 = int(sorting) if sorting.strip() else 0,
                                # 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/"+str(operatorId)+".png"))
                                operator_queryset.update(image="media/operators/"+str(operatorId)+".png")
                            flash("Operator updated successfully!")
                            data_status["responseStatus"]=1
                            return data_status
                        else:
                            flash("Invaild operator id !!")
                            data_status["responseStatus"]=4
                            return data_status
                    else:
                        flash("Required fields are missing!!")
                        data_status["responseStatus"]=2
                        data_status["result"]="required fields are missing."
                        return data_status
                    
                else:
                    data_status["result"]=form.errors
                    return data_status

                # if operatorName and not is_valid_alphanumeric(operatorName):
                #     flash("Operator Name must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
                #     return redirect(url_for("service_configurations.operators_configurations_list"))

                # if allowType and not is_valid_alphanumeric(allowType):
                #     flash("Allow Type must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
                #     return redirect(url_for("service_configurations.operators_configurations_list"))

                # if apiCode and not is_valid_alphanumeric_without_specialCharacters(apiCode):
                #     flash("api Code must contain only alphanumeric characters (letters, digits) and spaces.")
                #     return redirect(url_for("service_configurations.operators_configurations_list"))

                # if sorting and not is_valid_numeric(sorting):
                #     flash("Sorting must contain only contains only numeric characters.")
                #     return redirect(url_for("service_configurations.operators_configurations_list"))

                # 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 is_allowed_image(image.filename):
                #                 flash("Invalid image format! Only JPG, JPEG, and PNG are allowed.")
                #                 return redirect(url_for("service_configurations.operators_configurations_list"))   
                   
                #             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"))
            else:
                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!!")
            data_status["responseStatus"]=4
            return data_status
    else:
        flash("The staff member does not have permission to update Operator", "danger")
        data_status["responseStatus"]=4
        return data_status
    

# Update operator status
@service_configurations.route("/update_operator_status",methods=["POST","GET"])
@adminid_access_token_required
def update_operator_status():
    
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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]

    operatorPage = request.args.get("operatorPage")
    search_element = request.args.get("search_element", "").strip()


 
    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,latitude,longitude)
                    return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator",search_element=search_element,operatorPage=operatorPage))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator",search_element=search_element,operatorPage=operatorPage))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator",search_element=search_element,operatorPage=operatorPage))
        else:
            return redirect(url_for("service_configurations.operators_configurations_list",search_element=search_element,operatorPage=operatorPage))
    else:
        flash("The staff member does not have permission to update Operator status.", "danger")
        return redirect(url_for("service_configurations.operators_configurations_list",redirectTo="Operator",search_element=search_element,operatorPage=operatorPage))

# Delete operator
@service_configurations.route("/delete_operator",methods=["GET","POST"])
@adminid_access_token_required
def delete_operator():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        latitude = request.args.get("latitude", "")
        longitude = request.args.get("longitude", "")
        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]

        operatorPage = 1
        search_element = ""
  
        permissionsList = check_permissions(session.get("adminId"),"operatorPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                operatorId = request.args.get("operatorId","")
                operatorPage = request.args.get(get_page_parameter("operatorPage"), type=int, default=1)
                search_element = request.args.get("search_element","")
                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,latitude,longitude)
                return redirect(url_for("service_configurations.operators_configurations_list",operatorPage=operatorPage, search_element = search_element))
        else:
            flash("The staff member does not have permission to delete Operator.", "danger")
            return redirect(url_for("service_configurations.operators_configurations_list",operatorPage=operatorPage, search_element = search_element))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete operator!!")
        return redirect(url_for("service_configurations.operators_configurations_list",operatorPage=operatorPage, search_element = search_element))


########### Operator Update ##############
# Add operator
@service_configurations.route("/add_operator_update",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_operator_update():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
  
        csrf_token = request.form.get("csrf_token")
        print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        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","")

                # if apiOperatorCode1 and not is_valid_alphanumeric(apiOperatorCode1):
                #     flash("Api operator code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_update_list", redirectTo="OperatorUpdate"))

                # if apiOperatorCode2 and not is_valid_alphanumeric(apiOperatorCode2):
                #     flash("Api operator code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_update_list", redirectTo="OperatorUpdate"))

                # if apiOperatorCode3 and not is_valid_alphanumeric(apiOperatorCode3):
                #     flash("Api operator code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_update_list", redirectTo="OperatorUpdate"))

                # if apiOperatorCode4 and not is_valid_alphanumeric(apiOperatorCode4):
                #     flash("Api operator code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_update_list", redirectTo="OperatorUpdate"))

                # if apiOperatorCode5 and not is_valid_alphanumeric(apiOperatorCode5):
                #     flash("Api operator code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_update_list", redirectTo="OperatorUpdate"))

                # if apiOperatorCode6 and not is_valid_alphanumeric(apiOperatorCode6):
                #     flash("Api operator code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_update_list", redirectTo="OperatorUpdate"))


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

                form = AddOperatorUpdateForm()

                if form.validate_on_submit():
                    if operatorId and apiOperatorCode1:
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message=admin_queryset.userName+" 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,latitude,longitude)
                            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!")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                            app.logger.error(traceback.format_exc())
                            flash("Unable to add operator update!!")
                            data_status['responseStatus']=4
                            return data_status
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status

                # 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.operator_update_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.operator_update_list",redirectTo="OperatorUpdate"))
                # else:
                #     flash("Required fields are missing!!")
                #     return redirect(url_for("service_configurations.operator_update_list",redirectTo="OperatorUpdate"))
            else:
                data_status['responseStatus']=4
                return data_status 
        else:
            flash("The staff member does not have permission to create a Operator update.", "danger")
            data_status['responseStatus']=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add operator update!!"
        flash(error)
        data_status['responseStatus']=4
        return data_status



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"])
@adminid_access_token_required
@csrf_protect
def update_operator_update():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")   
  
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    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)

                form = AddOperatorUpdateForm(request.form,current_id=operatorUpdateId)

                # if apiOperatorCode1 and not is_valid_alphanumeric(apiOperatorCode1):
                #     flash("Api operator code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_update_list", redirectTo="OperatorUpdate"))

                # if apiOperatorCode2 and not is_valid_alphanumeric(apiOperatorCode2):
                #     flash("Api operator code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_update_list", redirectTo="OperatorUpdate"))

                # if apiOperatorCode3 and not is_valid_alphanumeric(apiOperatorCode3):
                #     flash("Api operator code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_update_list", redirectTo="OperatorUpdate"))

                # if apiOperatorCode4 and not is_valid_alphanumeric(apiOperatorCode4):
                #     flash("Api operator code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_update_list", redirectTo="OperatorUpdate"))

                # if apiOperatorCode5 and not is_valid_alphanumeric(apiOperatorCode5):
                #     flash("Api operator code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_update_list", redirectTo="OperatorUpdate"))

                # if apiOperatorCode6 and not is_valid_alphanumeric(apiOperatorCode6):
                #     flash("Api operator code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_update_list", redirectTo="OperatorUpdate"))

                if form.validate_on_submit():
                    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+" 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,latitude,longitude)
                        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!")
                                data_status["responseStatus"]=1
                                return data_status
                        else:
                            flash("Invaild operator update id !!")
                            data_status["responseStatus"]=4
                            return data_status
                    else:
                        data_status["responseStatus"]=2
                        data_status["result"]="Required fields are missing."
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status



                # 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.operator_update_list",redirectTo="OperatorUpdate"))
                #     else:
                #         flash("Invaild operator update id !!")
                #         return redirect(url_for("service_configurations.operator_update_list",redirectTo="OperatorUpdate"))
                # else:
                #     flash("Required fields are missing!!")
                #     return redirect(url_for("service_configurations.operator_update_list",redirectTo="OperatorUpdate"))
            else:
                return redirect(url_for("service_configurations.operator_update_list",redirectTo="OperatorUpdate"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to update operator update!!")
            data_status['responseStatus']=4
            return data_status

    else:
        flash("The staff member does not have permission to update Operator update.", "danger")
        data_status['responseStatus']=4
        return data_status



# Update operator update status
@service_configurations.route("/update_operator_update_status",methods=["POST","GET"])
@adminid_access_token_required
def update_operator_update_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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]

    operatorUpdatePage = request.args.get("productPage");''
    search_element = request.args.get("search_element", "").strip()

    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,latitude,longitude)
                    return redirect(url_for("service_configurations.operator_update_list",redirectTo="OperatorUpdate",search_element=search_element,operatorUpdatePage=operatorUpdatePage))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.operator_update_list",redirectTo="OperatorUpdate",search_element=search_element,operatorUpdatePage=operatorUpdatePage))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("service_configurations.operator_update_list",redirectTo="OperatorUpdate",search_element=search_element,operatorUpdatePage=operatorUpdatePage))
        else:
            return redirect(url_for("service_configurations.operator_update_list",search_element=search_element,operatorUpdatePage=operatorUpdatePage))
    else:
        flash("The staff member does not have permission to update Operator update status.", "danger")
        return redirect(url_for("service_configurations.operator_update_list",redirectTo="OperatorUpdate",search_element=search_element,operatorUpdatePage=operatorUpdatePage))

# Delete operator
@service_configurations.route("/delete_operator_update",methods=["GET","POST"])
@adminid_access_token_required
def delete_operator_update():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        latitude = request.args.get("latitude", "")
        longitude = request.args.get("longitude", "")
        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,latitude,longitude)
                return redirect(url_for("service_configurations.operator_update_list",redirectTo="OperatorUpdate"))
        else:
            flash("The staff member does not have permission to delete Operator update.", "danger")
            return redirect(url_for("service_configurations.operator_update_list",redirectTo="OperatorUpdate"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete operator!!")
        return redirect(url_for("service_configurations.operator_update_list",redirectTo="OperatorUpdate"))


########### Operator Parameter ##############

# Add operator parameter
@service_configurations.route("/add_operator_parameter",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_operator_parameter():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
  
        csrf_token = request.form.get("csrf_token")
        print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        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 not is_valid_alphanumeric(parameterName):
                #     flash("parameter Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))

                # if displayName and not is_valid_alphanumeric(displayName):
                #     flash("Display Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))

                # if minLength and not is_valid_numeric(minLength):
                #     flash("Minimum Length contain only numeric characters")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))

                # if maxLength and not is_valid_numeric(maxLength):
                #     flash("Maximum Length contain only numeric characters")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))

                # if sort and not is_valid_numeric(sort):
                #     flash("sorting contain only numeric characters")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))  

                # if pattern and not is_valid_description(pattern):
                #     flash("pattern contain alphabets, numbers, spaces, special characters, and newlines")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))

                # if apiCode and not is_valid_alphanumeric_without_specialCharacters(apiCode):
                #     flash("pattern contain only alphanumeric characters (letters, digits) and spaces.")
                    # return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))
                
                form = AddOperatorParameter()

                if form.validate_on_submit():
                    if parameterName and operatorId and minLength and maxLength and fieldType and transactionAPIId:
                        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,latitude,longitude) 
                            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!")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                            app.logger.error(traceback.format_exc())
                            flash("Unable to add operator parameter!!")
                            data_status['responseStatus']=4
                            return data_status
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status




                # 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:
                return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter"))
        else:
            flash("The staff member does not have permission to create a Operator parameter.", "danger")
            data_status['responseStatus']=4
            return data_status
    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"])
@adminid_access_token_required
@csrf_protect
def update_operator_parameter():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId") 
  
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))")  
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    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)

                form = AddOperatorParameter(request.form,current_id=operatorParameterId)

                # if parameterName and not is_valid_alphanumeric(parameterName):
                #     flash("parameter Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))

                # if displayName and not is_valid_alphanumeric(displayName):
                #     flash("Display Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))

                # if minLength and not is_valid_numeric(minLength):
                #     flash("Minimum Length contain only numeric characters")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))

                # if maxLength and not is_valid_numeric(maxLength):
                #     flash("Maximum Length contain only numeric characters")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))

                # if sort and not is_valid_numeric(sort):
                #     flash("sorting contain only numeric characters")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))  

                # if pattern and not is_valid_description(pattern):
                #     flash("pattern contain alphabets, numbers, spaces, special characters, and newlines")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))

                # if apiCode and not is_valid_alphanumeric_without_specialCharacters(apiCode):
                #     flash("pattern contain only alphanumeric characters (letters, digits) and spaces.")
                #     return redirect(url_for("service_configurations.operator_parameter_list", redirectTo="OperatorParameter"))

                if form.validate_on_submit():
                    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,latitude,longitude) 
                        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!")
                            data_status["responseStatus"]=1
                            return data_status
                        else:
                            flash("Invaild operator parameter id !!")
                            data_status["responseStatus"]=4
                            return data_status
                    else:
                        data_status["responseStatus"]=2
                        data_status["result"]="Required fields are missing."
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status


                # 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"))
            else:
                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!!")
            data_status['responseStatus']=4
            return data_status
    else:
        flash("The staff member does not have permission to update Operator parameter.", "danger")
        data_status['responseStatus']=4
        return data_status

# Update operator parameter status
@service_configurations.route("/update_operator_parameter_status",methods=["POST","GET"])
@adminid_access_token_required
def update_operator_parameter_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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]

    OperatorParameterPage = request.args.get("OperatorParameterPage")
    search_element = request.args.get("search_element", "").strip()


    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,latitude,longitude)
                    return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter",search_element=search_element,OperatorParameterPage=OperatorParameterPage))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter",search_element=search_element,OperatorParameterPage=OperatorParameterPage))
            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",search_element=search_element,OperatorParameterPage=OperatorParameterPage))
        else:
            flash("Required fields are missing!!")
            return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter",search_element=search_element,OperatorParameterPage=OperatorParameterPage))
    else:
        flash("The staff member does not have permission to update Operator parameter status.", "danger")
        return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter",search_element=search_element,OperatorParameterPage=OperatorParameterPage))


# Delete operator parameter
@service_configurations.route("/delete_operator_parameter",methods=["GET","POST"])
@adminid_access_token_required
def delete_operator_parameter():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        latitude = request.args.get("latitude", "")
        longitude = request.args.get("longitude", "")
        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]

        OperatorParameterPage = 1
        search_element = ""

        permissionsList = check_permissions(session.get("adminId"),"operatorparameterPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                operatorParameterId = request.args.get("operatorParameterId","")
                OperatorParameterPage = request.args.get(get_page_parameter("OperatorParameterPage"), type=int, default=1)
                search_element = request.args.get("search_element","")
                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,latitude,longitude)
                return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter",OperatorParameterPage=OperatorParameterPage, search_element = search_element))
        else:
            flash("The staff member does not have permission to delete Operator parameter.", "danger")
            return redirect(url_for("service_configurations.operator_parameter_list",redirectTo="OperatorParameter",OperatorParameterPage=OperatorParameterPage, search_element = search_element))
    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",OperatorParameterPage=OperatorParameterPage, search_element = search_element))


########## Operator Grouping ############
#Add operator grouping
@service_configurations.route("/add_operator_grouping",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_operator_grouping():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
  
        csrf_token = request.form.get("csrf_token")
        print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        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 not is_valid_alphanumeric(groupName):
                #     flash("Group Name contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_grouping_list", redirectTo="OperatorGrouping"))

                # if value and not is_valid_alphanumeric(value):
                #     flash("Value contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_grouping_list", redirectTo="OperatorGrouping"))

                form = AddOperatorGroupingForm()

                if form.validate_on_submit():
                    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,latitude,longitude) 
                            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!")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                            app.logger.error(traceback.format_exc())
                            data_status['responseStatus']=4
                            return data_status
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status

                # 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:
                return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
        else:
            flash("The staff member does not have permission to create a Operator grouping.", "danger")
            data_status['responseStatus']=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add operator grouping!!"
        flash(error)
        data_status['responseStatus']=4
        return data_status

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"])
@adminid_access_token_required
@csrf_protect
def update_operator_grouping():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")  
  
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))") 
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    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)

                form= AddOperatorGroupingForm(request.form,current_id=operatorGroupingId)

                # if groupName and not is_valid_alphanumeric(groupName):
                #     flash("Group Name contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_grouping_list", redirectTo="OperatorGrouping"))

                # if value and not is_valid_alphanumeric(value):
                #     flash("Value contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.operator_grouping_list", redirectTo="OperatorGrouping"))

                if form.validate_on_submit():
                    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,latitude,longitude) 

                        if operator_grouping_queryset:
                            operator_grouping_queryset.update(
                                groupName = groupName,
                                operatorId = ObjectId(operatorId),
                                operatorParameterId = ObjectId(operatorParameterId),
                                value = value,
                                )
                            flash("Operator grouping updated successfully!")
                            data_status["responseStatus"]=1
                            return data_status
                        else:
                            flash("Invaild operator grouping id !!")
                            data_status["responseStatus"]=4
                            return data_status
                    else:
                        data_status["responseStatus"]=2
                        data_status["result"]="Required fields are missing."
                        return data_status
                

                else:
                    data_status['result']=form.errors
                    return data_status


                # 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"))
            else:
                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!!"
            flash(error)
            data_status['responseStatus']=4
            return data_status
    else:
        flash("The staff member does not have permission to update Operator grouping.", "danger")
        data_status['responseStatus']=4
        return data_status


# Update operator grouping status
@service_configurations.route("/update_operator_grouping_status",methods=["POST","GET"])
@adminid_access_token_required
def update_operator_grouping_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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]

    operatorGroupingPage = request.args.get("operatorGroupingPage")
    search_element = request.args.get("search_element", "").strip()

    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,latitude,longitude)
                    return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping",search_element=search_element,operatorGroupingPage=operatorGroupingPage))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping",search_element=search_element,operatorGroupingPage=operatorGroupingPage))
            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",search_element=search_element,operatorGroupingPage=operatorGroupingPage))
    else:
        flash("The staff member does not have permission to update Operator grouping  status.", "danger")
        return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping",search_element=search_element,operatorGroupingPage=operatorGroupingPage))


# Delete operator grouping
@service_configurations.route("/delete_operator_grouping",methods=["GET","POST"])
@adminid_access_token_required
def delete_operator_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        latitude = request.args.get("latitude", "")
        longitude = request.args.get("longitude", "")
        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,latitude,longitude)
                return redirect(url_for("service_configurations.operator_grouping_list",redirectTo="OperatorGrouping"))
        else:
            flash("The staff member does not have permission to delete Operator grouping.", "danger")
            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"])
@adminid_access_token_required
@csrf_protect
def add_service_grouping():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            flash("session expired.Please login again.")
            data_status["responseStatus"]=4
            return data_status
        adminId = session.get("adminId")
  
        csrf_token = request.form.get("csrf_token")
        print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        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]

    
                form = CategoriesListForm()
                if form.validate_on_submit():
                # if name and not is_valid_alphanumeric(name):
                # 	flash("Name must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
                # 	return redirect(url_for("service_configurations.service_grouping_list"))

                # if sorting and not is_valid_numeric(sorting):
                # 	flash("sorting contains only numeric characters")
                # 	return redirect(url_for("service_configurations.service_grouping_list"))

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

                            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("categories saved successfully!","success")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                            flash("Unable to save categories!!","danger")
                            app.logger.error(traceback.format_exc())
                            data_status['responseStatus']=4
                            return data_status
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status
                else:
                    data_status['result']=form.errors
                    return data_status
            else:
                
                data_status['responseStatus']=4
                return data_status
        else:
            flash("The staff member does not have permission to create Categories.", "danger")
            data_status['responseStatus']=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save categories!2!"
        flash(error,"dander")
        data_status['responseStatus']=4
        return data_status


# Update category status
@service_configurations.route("/update_service_grouping_status",methods=["POST","GET"])
@adminid_access_token_required
def update_service_grouping_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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]
    servicePage = request.args.get("servicePage")
    search_element = request.args.get("search_element", "")
 
    redirectTo=url_for("service_configurations.service_grouping_list",servicePage=servicePage,search_element=search_element)
    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("categories activated successfully!","success")
                        message=service_grouping_queryset.adminId.userName+" "+service_grouping_queryset.name+" categories activated successfully!"
                    elif service_grouping_queryset.status == 1:
                        service_grouping_queryset.update(status=0)
                        flash("categories deactivated successfully!","success")
                        message=service_grouping_queryset.adminId.userName+" "+service_grouping_queryset.name+" categories 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,latitude,longitude)
                    return redirect(redirectTo)
                else:
                    flash("Invaild id!!")
                    return redirect(redirectTo)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(redirectTo)
        else:
            return redirect(redirectTo)
    else:
        flash("The staff member does not have permission to update Categories status.","danger")
        return redirect(redirectTo)



# Update categories
@service_configurations.route("/update_service_grouping",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_service_grouping():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        flash("session Expired.")
        data_status["responseStatus"]=4
        return data_status
    adminId=session.get("adminId")
 
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    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")
                form = CategoriesListForm(request.form, current_id=serviceGroupingId)
                if form.validate_on_submit():
                    if name and sorting:
                # if name and not is_valid_alphanumeric(name):
                # 	flash("Name must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
                # 	return redirect(url_for("service_configurations.service_grouping_list"))

                # if sorting and not is_valid_numeric(sorting):
                # 	flash("sorting contains only numeric characters")
                # 	return redirect(url_for("service_configurations.service_grouping_list"))

                        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+" categories 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,latitude,longitude) 
                        if service_grouping_queryset:
                            service_grouping_queryset.update(
                                name=name,
                                sorting=sorting,
                                )
                            flash("categories updated successfully!","success")
                            data_status["responseStatus"]=1
                            return data_status
                        else:
                            flash("Invaild id","danger")
                            data_status["responseStatus"]=4
                            return data_status
                    else:
                        data_status["responseStatus"]=2
                        data_status["result"]="required fields are missing."
                        return data_status
                else:
                    data_status["result"]=form.errors
                    return data_status
            else:
                flash("Invalid request.")
                data_status["responseStatus"]=4
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to update category"
            flash(error,"danger")
            data_status["responseStatus"]=4
            return data_status
    else:
        flash("The staff member does not have permission to update Categories.","danger")
        data_status["responseStatus"]=4
        return data_status


# Delete categories
@service_configurations.route("/delete_service_grouping",methods=["GET"])
@adminid_access_token_required
def delete_service_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        latitude = request.args.get("latitude", "")
        longitude = request.args.get("longitude", "")
        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]
        servicePage = request.args.get("servicePage")
        search_element = request.args.get("search_element", "")
        redirectTo=url_for("service_configurations.service_grouping_list",servicePage=servicePage,search_element=search_element)
        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("categories deleted successfully","success")
                message=service_grouping_queryset.adminId.userName+" "+service_grouping_queryset.name+" categories deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_service_grouping","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                return redirect(redirectTo)
        else:
            flash("The staff member does not have permission to delete Categories","danger")
            return redirect(redirectTo)
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete categories","danger")
        return redirect(redirectTo)




@service_configurations.route("/transaction_based_services_list",methods=["POST"])
@adminid_access_token_required
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"])
@adminid_access_token_required
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"])
@adminid_access_token_required
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"])
@adminid_access_token_required
@csrf_protect
def add_sub_parameter():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
  
        csrf_token = request.form.get("csrf_token")
        print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        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 and not is_valid_alphanumeric(parameterName):
                #     flash("parameter Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))

                # if displayName and not is_valid_alphanumeric(displayName):
                #     flash("Display Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))

                # if minLength and not is_valid_numeric(minLength):
                #     flash("Minimum Length contain only numeric characters")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))

                # if maxLength and not is_valid_numeric(maxLength):
                #     flash("Maximum Length contain only numeric characters")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))

                # if sort and not is_valid_numeric(sort):
                #     flash("sorting contain only numeric characters")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))  

                # if pattern and not is_valid_description(pattern):
                #     flash("pattern contain alphabets, numbers, spaces, special characters, and newlines")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))

                # if apiCode and not is_valid_alphanumeric_without_specialCharacters(apiCode):
                #     flash("pattern contain only alphanumeric characters (letters, digits) and spaces.")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))

                form = AddSubParameterForm()

                if form.validate_on_submit():
                    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,latitude,longitude) 
                            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!")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                            app.logger.error(traceback.format_exc())
                            flash("Unable to add sub parameter!!")
                            data_status['responseStatus']=4
                            return data_status
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status   

                # 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:
                return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))
        else:
            flash("The staff member does not have permission to create a Sub parameter.", "danger")
            data_status['responseStatus']=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add sub parameter!!"
        flash(error)
        data_status['responseStatus']=4
        return data_status

# Update Sub parameter
@service_configurations.route("/update_sub_parameter",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_sub_parameter():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId") 
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))")  
  
    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)

                form = AddSubParameterForm(request.form,current_id=subParameterId)

                # if parameterName and not is_valid_alphanumeric(parameterName):
                #     flash("parameter Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))

                # if displayName and not is_valid_alphanumeric(displayName):
                #     flash("Display Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))

                # if minLength and not is_valid_numeric(minLength):
                #     flash("Minimum Length contain only numeric characters")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))

                # if maxLength and not is_valid_numeric(maxLength):
                #     flash("Maximum Length contain only numeric characters")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))

                # if sort and not is_valid_numeric(sort):
                #     flash("sorting contain only numeric characters")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))  

                # if pattern and not is_valid_description(pattern):
                #     flash("pattern contain alphabets, numbers, spaces, special characters, and newlines")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))

                # if apiCode and not is_valid_alphanumeric_without_specialCharacters(apiCode):
                #     flash("pattern contain only alphanumeric characters (letters, digits) and spaces.")
                #     return redirect(url_for("service_configurations.sub_parameter_list", redirectTo="SubParameter"))

                if form.validate_on_submit():
                    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,latitude,longitude) 

                        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!")
                            data_status["responseStatus"]=1
                            return data_status
                        else:
                            flash("Invaild operator sub id !!")
                            data_status["responseStatus"]=4
                            return data_status
                    else:
                        data_status["responseStatus"]=2
                        data_status["result"]="Required fields are missing."
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status



                # 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"))
            else:
                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!!")
            data_status['responseStatus']=4
            return data_status
    else:
        flash("The staff member does not have permission to update Sub parameter.", "danger")
        data_status['responseStatus']=4
        return data_status

# Delete Sub parameter
@service_configurations.route("/delete_sub_parameter",methods=["POST","GET"])
@adminid_access_token_required
def delete_sub_parameter():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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,latitude,longitude)
                    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("The staff member does not have permission to delete Sub parameter.", "danger")
        return redirect(url_for("service_configurations.sub_parameter_list",redirectTo="SubParameter"))

# Update Sub parameter status
@service_configurations.route("/update_sub_parameter_status",methods=["POST","GET"])
@adminid_access_token_required
def update_sub_parameter_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    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]

    SubParameterPage = request.args.get("SubParameterPage")
    search_element = request.args.get("search_element", "").strip()

    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,latitude,longitude)
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter",search_element=search_element,SubParameterPage=SubParameterPage))
                else:
                    flash("Invaild sub parameter id !!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter",search_element=search_element,SubParameterPage=SubParameterPage))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter",search_element=search_element,SubParameterPage=SubParameterPage))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to update sub parameter status!!")
    else:
        flash("The staff member does not have permission to update Sub parameter status.", "danger")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter",search_element=search_element,SubParameterPage=SubParameterPage))

###################### Sub Parameter Grouping ##########################

@service_configurations.route("/add_sub_parameter_grouping",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_sub_parameter_grouping():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        csrf_token = request.form.get("csrf_token")
        print(csrf_token,"((((((((((((((csrf_token))))))))))))))")

        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","")

                # if groupName and not is_valid_alphanumeric(groupName):
                #     flash("Group Name contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.sub_parameter_grouping_list", redirectTo="SubParameterGrouping"))

                # if value and not is_valid_numeric(value):
                #     flash("Value contain only numeric characters")
                #     return redirect(url_for("service_configurations.sub_parameter_grouping_list", redirectTo="SubParameterGrouping"))

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

                form = AddSubParameterGrouping()

                if form.validate_on_submit():
                    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,latitude,longitude) 
                            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!")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                            app.logger.error(traceback.format_exc())
                            data_status['responseStatus']=4
                            return data_status
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status  

                # 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:
                return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping"))    
        else:
            flash("The staff member does not have permission to create a Sub parameter grouping", "danger")
            data_status['responseStatus']=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add sub parameter grouping!!"
        flash(error)
        data_status['responseStatus']=4
        return data_status

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"])
@adminid_access_token_required
@csrf_protect
def update_sub_parameter_grouping():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")   
 
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    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","")

                # if groupName and not is_valid_alphanumeric(groupName):
                #     flash("Group Name contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                #     return redirect(url_for("service_configurations.sub_parameter_grouping_list", redirectTo="SubParameterGrouping"))

                # if value and not is_valid_numeric(value):
                #     flash("Value contain only numeric characters")
                #     return redirect(url_for("service_configurations.sub_parameter_grouping_list", redirectTo="SubParameterGrouping"))

                jsonData = request.form.to_dict(flat=True)
                
                form = AddSubParameterGrouping(request.form,current_id=subParameterGroupingId)

                if form.validate_on_submit():
                    if 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,latitude,longitude) 

                        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!")
                            data_status["responseStatus"]=1
                            return data_status
                        else:
                            flash("Invaild sub parameter grouping id !!")
                            data_status["responseStatus"]=4
                            return data_status
                    else:
                        data_status["responseStatus"]=2
                        data_status["result"]="Required fields are missing."
                        return data_status

                else:
                    data_status['result']=form.errors
                    return data_status




                # if 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"))
            else:
                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!!"
            flash(error)
            data_status['responseStatus']=4
            return data_status
    else:
        flash("The staff member does not have permission to update Sub parameter grouping", "danger")
        data_status['responseStatus']=4
        return data_status


@service_configurations.route("/update_sub_parameter_grouping_status",methods=["POST","GET"])
@adminid_access_token_required
def update_sub_parameter_grouping_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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]

    SubParameterGroupingPage = request.args.get("SubParameterGroupingPage")
    search_element = request.args.get("search_element", "").strip()
 
    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,latitude,longitude)
                    return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping",search_element=search_element,SubParameterGroupingPage=SubParameterGroupingPage))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping",search_element=search_element,SubParameterGroupingPage=SubParameterGroupingPage))
            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",search_element=search_element,SubParameterGroupingPage=SubParameterGroupingPage))
    else:
        flash("The staff member does not have permission to update Sub parameter grouping status.", "danger")
        return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping",search_element=search_element,SubParameterGroupingPage=SubParameterGroupingPage))



@service_configurations.route("/delete_sub_parameter_grouping",methods=["GET","POST"])
@adminid_access_token_required
def delete_sub_parameter_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        latitude = request.args.get("latitude", "")
        longitude = request.args.get("longitude", "")
        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]

        SubParameterGroupingPage = 1
        search_element = ""


        permissionsList = check_permissions(session.get("adminId"),"subparametergroupingPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                subParameterGroupingId = request.args.get("subParameterGroupingId","")
                SubParameterGroupingPage = request.args.get("SubParameterGroupingPage")
                search_element = request.args.get("search_element", "").strip()
                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,latitude,longitude)
                return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping",SubParameterGroupingPage=SubParameterGroupingPage, search_element = search_element))
        else:
            flash("The staff member does not have permission to delete Sub parameter grouping.", "danger")
            return redirect(url_for("service_configurations.sub_parameter_grouping_list",redirectTo="SubParameterGrouping",SubParameterGroupingPage=SubParameterGroupingPage, search_element = search_element))
    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",SubParameterGroupingPage=SubParameterGroupingPage, search_element = search_element))


@service_configurations.route("/operator_parameter_based_operator_grouping_list",methods=["POST"])
@adminid_access_token_required
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"])
@adminid_access_token_required
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

