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


ticket_master = Blueprint("ticket_master",__name__)


    
# Add Tax Type
@ticket_master.route("/add_ticket_category",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_ticket_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,"ticketCategoryPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                name = request.form.get("name","")
                # userTypeId = request.form.get("userTypeId","")
                priority = request.form.get("priority","")
                icon = request.files.get("icon","")
                
                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]
                form = TicketForm()
                if form.validate_on_submit():
                    if name and priority:
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message=admin_queryset.userName+" "+name+" Ticket Category saved successfully!"
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_ticket_category","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
                                print("(((((((((((((save_admin_log_table)))))))))))))",save_admin_log_table)
                            ticket_category_table = TicketCategory(
                                adminId = adminId,
                                name = name,
                                # userTypeId = userTypeId,
                                priority = priority,
                                createdOn = datetime.datetime.now(),
                                status = 1,
                                )
                            save_table = ticket_category_table.save()
                            ticketCategoryId = str(save_table.id)
                            if icon:
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/TicketCategory/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/TicketCategory/"))
                                save_file = icon.save(os.path.join(app.config['SITE_ROOT'], "media/TicketCategory/"+ticketCategoryId+".png"))
                                save_table.update(icon="media/TicketCategory/"+ticketCategoryId+".png")
                            flash("Ticket Category saved successfully!", "Category_success")
                            data_status['responseStatus']=1
                            return data_status

                        except Exception as e:
                            flash("Unable to save ticket category!!", "Category_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("Staff member does not have given create ticket Category permissions!!", "Category_danger")
            data_status['responseStatus']=4
            return data_status
           
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to add ticket category!!", "Category_danger")
        data_status['responseStatus']=4
        return data_status

def fetch_ticket_category_details(ticket_category_queryset):
    ticket_category_dict = {}
    try:
        ticket_category_dict={
        "id":str(ticket_category_queryset.id),
        "name":ticket_category_queryset.name,
        # "userTypeId":str(ticket_category_queryset.userTypeId.id),
        # "userTypeName":ticket_category_queryset.userTypeId.userType,
        "priority":ticket_category_queryset.priority,
        }
        if ticket_category_queryset.status==1:
            ticket_category_dict["actionText"] = "Active"
        else:
            ticket_category_dict["actionText"] = "Deactive"
        if ticket_category_queryset.createdOn:
            ticket_category_dict["createdOn"] = ticket_category_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            ticket_category_dict["createdOn"] = ""
        if ticket_category_queryset.icon:
            ticket_category_dict["icon"] = domain+ticket_category_queryset.icon
        else:
            ticket_category_dict["icon"] = ""

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

# View All Ticket Category
@ticket_master.route("/ticket_masters_list",methods=["POST","GET"])
@adminid_access_token_required
def ticket_masters_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    
    ticketCategoryList = []
    subCategoriesList = []
    childCategoriesList = []
    knowledgeMastersList = []
    userTypesList = []
    
    adminId = session.get("adminId")
    snoCount=0
    ticketSubsnoCount=0
    ticketChildsnoCount=0
    ticketChildsnoCount=0

    page = ""
    ticketSubPage = ""
    ticketChildPage = ""

    error = ""
    redirectval = ""
    pagination = None
    ticketSubpagination = None
    ticketChildpagination = None

    search_element=""
    ticket_sub_search_element=""
    ticket_child_search_element=""

    error = ""
    permissionsList = check_permissions(session.get("adminId"),"ticketCategoryPermissions")
    ticketform = TicketSearchForm(request.args)
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get('redirectTo','TicketCategory')
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "TicketCategory"

            search = False  

            search_element = request.args.get('search_element','')

            if not search_element:
                search_element = request.args.get("search_element","")
            if search_element:
                search = True
            # page = request.args.get(get_page_parameter(), type=int, default=1)
            # page_start,page_end=fetch_limit_length_based_on_page_index(page,20)
            # pagination = Pagination(
            #     page=page,
            #     record_name='ticket_master',
            #     per_page=20,
            #     alignment="right"
            #     )
            
            # ticket_category_queryset = TicketCategory.objects(status__in=[0,1]).order_by("-id").all()
            # if search_element:
            #     ticket_category_queryset = ticket_category_queryset.filter(Q(name__icontains=search_element))
            #     length = ticket_category_queryset.count()
            #     ticket_category_queryset=ticket_category_queryset[page_start:page_end]
            # else:
            #     length = ticket_category_queryset.count()
            #     ticket_category_queryset=ticket_category_queryset[page_start:page_end]
            # for each_ticket_category in ticket_category_queryset:
            #     ticket_category_dict = fetch_ticket_category_details(each_ticket_category)
            #     ticketCategoryList.append(ticket_category_dict)

            Page = request.args.get(get_page_parameter("Page"), type=int, default=1)
            per_page = 20
            start = (Page - 1) * per_page
            total_count = 0
           
            filters = Q(status__in=[0, 1]) 
            if ticketform.validate():
                if search_element:
                    filters &= Q(name__icontains=search_element)

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

                ticket_category_queryset = (
                    TicketCategory.objects(filters)
                    .only("id", "name", "priority", "icon", "status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )
                
                ticketCategoryList = list(ticket_category_queryset)
            else:
                ticketCategoryList=[]
               

            snoCount = start
            pagination = Pagination(Page=Page, total=total_count, per_page=per_page,page_parameter ="Page", alignment="right", record_name="staff",href=f"?search_element={search_element}&Page={{0}}")

            ############ Ticket Sub Categories ################
            # sub_category_queryset = TicketSubCategory.objects(status__in=[0,1]).order_by("-id").all()
            # if search_element:
            #     sub_category_queryset = sub_category_queryset.filter(Q(name__icontains=search_element))
            #     length = sub_category_queryset.count()
            #     sub_category_queryset=sub_category_queryset[page_start:page_end]
            # else:
            #     length = sub_category_queryset.count()
            #     sub_category_queryset=sub_category_queryset[page_start:page_end]
            # for each_sub_category in sub_category_queryset:
            #     sub_category_dict = fetch_sub_category_details(each_sub_category)
            #     subCategoriesList.append(sub_category_dict)

            ticketSubform = TicketSubSearchForm(request.args)
            ticket_sub_search_element = request.args.get('ticket_sub_search_element','')

            ticketSubPage = request.args.get(get_page_parameter("ticketSubPage"), type=int, default=1)
            per_page = 20
            start = (ticketSubPage - 1) * per_page
            total_count = 0
           
            filters = Q(status__in=[0, 1]) 
            if ticketSubform.validate():
                if ticket_sub_search_element:
                    filters &= Q(name__icontains=ticket_sub_search_element)

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

                sub_category_queryset = (
                    TicketSubCategory.objects(filters)
                    .only("id","categoryId", "name", "priority", "icon", "status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )
                
                subCategoriesList = list(sub_category_queryset)
            else:
                subCategoriesList=[]
                

            ticketSubsnoCount = start
            ticketSubpagination = Pagination(ticketSubPage=ticketSubPage, total=total_count, per_page=per_page,page_parameter ="ticketSubPage", alignment="right", record_name="staff",href=f"?redirectto=TicketSubCategory&ticket_sub_search_element={ticket_sub_search_element}&ticketSubPage={{0}}")

            ########## Ticket Child Categories ################
            # child_categories_queryset = TicketChildCategory.objects(status__in=[0,1]).order_by("-id").all()
            # if search_element:
            #     child_categories_queryset = child_categories_queryset.filter(Q(name__icontains=search_element))
            #     length = child_categories_queryset.count()
            #     child_categories_queryset=child_categories_queryset[page_start:page_end]
            # else:
            #     length = child_categories_queryset.count()
            #     child_categories_queryset=child_categories_queryset[page_start:page_end]
            # for each_child_category in child_categories_queryset:
            #     child_category_dict = fetch_child_category_details(each_child_category)
            #     childCategoriesList.append(child_category_dict)

            ticketChildform = TicketChildSearchForm(request.args)
            ticket_child_search_element = request.args.get('ticket_child_search_element','')
            ticketChildPage = request.args.get(get_page_parameter("ticketChildPage"), type=int, default=1)
            per_page = 20
            start = (ticketChildPage - 1) * per_page
            total_count = 0
           
            filters = Q(status__in=[0, 1]) 
            if ticketChildform.validate():
                if ticket_child_search_element:
                    filters &= Q(name__icontains=ticket_child_search_element)

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

                child_categories_queryset = (
                    TicketChildCategory.objects(filters)
                    .only("id","subCategoryId", "name", "priority", "icon", "status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )
                
                childCategoriesList = list(child_categories_queryset)
            else:
                childCategoriesList=[]
                

            ticketChildsnoCount = start
            ticketChildpagination = Pagination(ticketChildPage=ticketChildPage, total=total_count, per_page=per_page,page_parameter ="ticketChildPage", alignment="right", record_name="staff",href=f"?redirectto=ChildCategory&ticket_child_search_element={ticket_child_search_element}&ticketChildPage={{0}}")


            ############## Knowledge Master ###############
            # knowledge_masters_queryset = KnowledgeMaster.objects(status__in=[0,1]).order_by("-id").all()
            # if search_element:
            #   knowledge_masters_queryset = knowledge_masters_queryset.filter(Q(name__icontains=search_element))
            #   length = knowledge_masters_queryset.count()
            #   knowledge_masters_queryset=knowledge_masters_queryset[page_start:page_end]
            # else:
            #   length = knowledge_masters_queryset.count()
            #   knowledge_masters_queryset=knowledge_masters_queryset[page_start:page_end]
            # for each_knowledge_master in knowledge_masters_queryset:
            #   knowledge_master_dict = fetch_knowledge_master_details(each_knowledge_master)
            #   knowledgeMastersList.append(knowledge_master_dict)


            
            return render_template("super_admin_templates/ticket_master_list.html",
                domain=domain,
                ticketCategoryList=ticketCategoryList,
                subCategoriesList=subCategoriesList,
                childCategoriesList=childCategoriesList,
                knowledgeMastersList=knowledgeMastersList,
                userTypesList=userTypesList,
                search_element=search_element,
                ticket_sub_search_element=ticket_sub_search_element,
                ticket_child_search_element=ticket_child_search_element,
                pagination=pagination,
                ticketSubpagination=ticketSubpagination,
                ticketChildpagination=ticketChildpagination,
                redirectval=redirectval,
                page=page,
                ticketSubPage=ticketSubPage,
                ticketChildPage=ticketChildPage,
                snoCount=snoCount,
                ticketSubsnoCount=ticketSubsnoCount,
                ticketChildsnoCount=ticketChildsnoCount,
                ticketform=ticketform,
                ticketSubform=ticketSubform,
                ticketChildform=ticketChildform,
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch ticket category details!!"
            return render_template("super_admin_templates/ticket_master_list.html",
                error=error,
                domain=domain,
                ticketCategoryList=ticketCategoryList,
                subCategoriesList=subCategoriesList,
                childCategoriesList=childCategoriesList,
                knowledgeMastersList=knowledgeMastersList,
                userTypesList=userTypesList,
                search_element=search_element,
                ticket_sub_search_element=ticket_sub_search_element,
                ticket_child_search_element=ticket_child_search_element,
                pagination=pagination,
                ticketSubpagination=ticketSubpagination,
                ticketChildpagination=ticketChildpagination,
                redirectval=redirectval,
                page=page,
                ticketSubPage=ticketSubPage,
                ticketChildPage=ticketChildPage,
                snoCount=snoCount,
                ticketSubsnoCount=ticketSubsnoCount,
                ticketChildsnoCount=ticketChildsnoCount,
                ticketform=ticketform,
                ticketSubform=ticketSubform,
                ticketChildform=ticketChildform,
                )
    else:
        flash("The staff member does not have permission to view ticket category.", "danger")
        return redirect(url_for("admin.dashboard"))
    
#Update Ticket Category API
@ticket_master.route("/update_ticket_category",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_ticket_category():
    data_status={"responseStatus":0,"result":""}
    try:
        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"),"ticketCategoryPermissions")
        if "edit" in permissionsList:
            if request.method == "POST":
                ticketCategoryId = request.args.get("ticketCategoryId","")
                name = request.form.get("name","")
                userTypeId = request.form.get("userTypeId","")
                priority = request.form.get("priority","")
                icon = request.files.get("icon","")
                
                jsonData = request.form.to_dict(flat=True)
                form = TicketForm(request.form, current_id=ticketCategoryId)
                if form.validate_on_submit():
                    if name and priority:
                        try:
                            ticket_category_queryset = TicketCategory.objects(id=ticketCategoryId).first()
                            existing_record = ticket_category_queryset.to_json()
                            message=ticket_category_queryset.adminId.userName+" "+name+" Ticket Category updated successfully!"
                            requestData=[ticket_category_queryset]
                            updatedrequestData=[jsonData]
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_ticket_category","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
                            print("(((((((((((((save_admin_log_table)))))))))))))",save_admin_log_table)
                            if ticket_category_queryset:
                                ticket_category_queryset.update(
                                    name = name,
                                    priority = priority,
                                    )
                                if icon:
                                    randomUniqueId = str(random_digit_generate(15))
                                    if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/TicketCategory/")):
                                        os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/TicketCategory/"))
                                    save_file = icon.save(os.path.join(app.config['SITE_ROOT'], "media/TicketCategory/"+randomUniqueId+".png"))
                                    ticket_category_queryset.update(icon="media/TicketCategory/"+randomUniqueId+".png")
                                flash("Ticket Category updated successfully!", "Category_success")
                                data_status["responseStatus"]=1
                                return data_status
                                
                            else:
                                flash("Ticket Category not found!!", "Category_danger")
                                data_status["responseStatus"]=4
                                return data_status
                                
                        except Exception as e:
                            flash("Unable to update ticket category!!", "Category_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 update ticket category.", "Category_danger")
            data_status["responseStatus"]=4
            return data_status
            
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to update ticket category!!", "Category_danger")
        data_status["responseStatus"]=4
        return data_status
        

#Delete Ticket Category API
@ticket_master.route("/delete_ticket_category",methods=["POST","GET"])
@adminid_access_token_required
def delete_ticket_category():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")

    Page=request.args.get("Page")
    search_element=request.args.get("search_element")
    redirectTo=url_for("ticket_master.ticket_masters_list",Page=Page,search_element=search_element)
    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"),"ticketCategoryPermissions")
    if "delete" in permissionsList:
        ticketCategoryId = request.args.get("ticketCategoryId","")
        if ticketCategoryId:
            try:
                ticket_category_queryset = TicketCategory.objects(id=ticketCategoryId,status__in=[0,1]).first()
                if ticket_category_queryset:
                    existing_record = ticket_category_queryset.to_json()
                    requestData = [existing_record]
                    ticket_category_queryset.update(status=2)
                    flash("Ticket Category deleted successfully!", "Category_success")
                    message=ticket_category_queryset.adminId.userName+" "+ticket_category_queryset.name+" Ticket Category deleted successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_ticket_category","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                    print("((((((((((((save_admin_log_table))))))))))))",save_admin_log_table)
                    return redirect(redirectTo)
                    
                else:
                    flash("Ticket Category not found!!", "Category_danger")
                    return redirect(redirectTo)
                    
            except Exception as e:
                flash("Unable to delete ticket category!!", "Category_danger")
                app.logger.error(traceback.format_exc())
                return redirect(redirectTo)
        else:
            flash("Required fields are missing!!", "Category_danger")
            return redirect(redirectTo)
            
    else:
        flash("The staff member does not have permission to delete ticket category.", "Category_danger")
        return redirect(redirectTo)
        

#Update Ticket Category Status API
@ticket_master.route("/update_ticket_category_status",methods=["POST","GET"])
@adminid_access_token_required
def update_ticket_category_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")

    Page=request.args.get("Page")
    search_element=request.args.get("search_element")
    
    redirectTo=url_for("ticket_master.ticket_masters_list",Page=Page,search_element=search_element)
    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"),"ticketCategoryPermissions")
    if "edit" in permissionsList:
        ticketCategoryId = request.args.get("ticketCategoryId","")
        if ticketCategoryId:
            try:
                message=""
                ticket_category_queryset = TicketCategory.objects(id=ticketCategoryId,status__nin=[2]).first()
                existing_record = ticket_category_queryset.to_json()
                requestData = [existing_record]
                if ticket_category_queryset:
                    if ticket_category_queryset.status == 0:
                        ticket_category_queryset.update(status=1)
                        flash("Ticket Category  activated successfully!", "Category_success")
                        message=ticket_category_queryset.adminId.userName+" "+ticket_category_queryset.name+" Ticket Category  activated successfully!"
                    elif ticket_category_queryset.status == 1:
                        ticket_category_queryset.update(status=0)
                        flash("Ticket Category  deactivated successfully!", "Category_success")
                        message=ticket_category_queryset.adminId.userName+" "+ticket_category_queryset.name+" Ticket Category  deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_ticket_category_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                    print("((((((((((((((save_admin_log_table))))))))))))))",save_admin_log_table)
                    return redirect(redirectTo)
                    
                else:
                    flash("Ticket Category not found!!", "Category_danger")
                    return redirect(redirectTo)
                    
            except Exception as e:
                flash("Unable to update ticket category status!!", "Category_danger")
                app.logger.error(traceback.format_exc())
                return redirect(redirectTo)
        else:
            flash("Required fields are missing!!", "Category_danger")
            return redirect(redirectTo)

    else:
        flash("The staff member does not have permission to update ticket category status.", "Category_danger")
        return redirect(redirectTo)
       


################# Sub Category ################

@ticket_master.route("/add_sub_category",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_sub_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,"ticketSubCategoryPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                name = request.form.get("name","")
                categoryId = request.form.get("categoryId","")
                priority = request.form.get("priority","")
                icon = request.files.get("icon","")
                
                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]
                
                form = TicketSubForm()
                if form.validate_on_submit():
            
                    if name and categoryId and priority:
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message=admin_queryset.userName+" "+name+" Ticket Sub Category saved successfully!"
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_sub_category","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
                                print("(((((((((((((save_admin_log_table)))))))))))))",save_admin_log_table)
                            sub_category_table = TicketSubCategory(
                                adminId = adminId,
                                name = name,
                                categoryId = categoryId,
                                priority = priority,
                                createdOn = datetime.datetime.now(),
                                status = 1,
                                )
                            save_table = sub_category_table.save()
                            subCategoryId = str(save_table.id)
                            if icon:
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/TicketSubCategory/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/TicketSubCategory/"))
                                save_file = icon.save(os.path.join(app.config['SITE_ROOT'], "media/TicketSubCategory/"+subCategoryId+".png"))
                                save_table.update(icon="media/TicketSubCategory/"+subCategoryId+".png")

                            flash("Ticket Sub Category saved successfully!", "Subcategory_success")
                            data_status['responseStatus']=1
                            return data_status

                        except Exception as e:
                            flash("Unable to save ticket sub category!!", "Subcategory_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:
                flash("Invalid request.", "danger")
                data_status['responseStatus']=4
                return data_status  
        else:
            flash("The staff member does not have permission to create a ticket sub category.", "Subcategory_danger")
            data_status['responseStatus']=4
            return data_status
            
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save ticket sub category!!"
        flash(error)
        data_status['responseStatus']=4
        return data_status
        
def fetch_sub_category_details(sub_category_queryset):
    sub_category_dict = {}
    try:
        sub_category_dict={
        "id":str(sub_category_queryset.id),
        "name":sub_category_queryset.name,
        "categoryId":str(sub_category_queryset.categoryId.id),
        "categoryName":str(sub_category_queryset.categoryId.name),
        "priority":sub_category_queryset.priority,
        }
        if sub_category_queryset.status==1:
            sub_category_dict["actionText"] = "Active"
        else:
            sub_category_dict["actionText"] = "Deactive"
        if sub_category_queryset.createdOn:
            sub_category_dict["createdOn"] = sub_category_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            sub_category_dict["createdOn"] = ""
        if sub_category_queryset.icon:
            sub_category_dict["icon"] = domain+sub_category_queryset.icon
        else:
            sub_category_dict["icon"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return sub_category_dict

#Update ticket sub category API
@ticket_master.route("/update_sub_category",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_sub_category():
    data_status={"responseStatus":0,"result":""}
    try:
        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", "")
        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"),"ticketSubCategoryPermissions")
        if "edit" in permissionsList:
            if request.method == "POST":
                subCategoryId = request.args.get("subCategoryId","")
                name = request.form.get("name","")
                categoryId = request.form.get("categoryId","")
                priority = request.form.get("priority","")
                icon = request.files.get("icon","")
                
                jsonData = request.form.to_dict(flat=True)
                form = TicketSubForm(request.form, current_id=subCategoryId)
                if form.validate_on_submit():
            
                    if name and categoryId and priority:
                        try:
                            sub_category_queryset = TicketSubCategory.objects(id=subCategoryId,status__nin=[2]).first()
                            existing_record = sub_category_queryset.to_json()
                            message=sub_category_queryset.adminId.userName+" "+name+" Ticket Sub Category updated successfully!"
                            requestData=[sub_category_queryset]
                            updatedrequestData=[jsonData]
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sub_category","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
                            print("(((((((((((((save_admin_log_table)))))))))))))",save_admin_log_table)
                            if sub_category_queryset:
                                sub_category_queryset.update(
                                    name = name,
                                    categoryId = ObjectId(categoryId),
                                    priority = priority,
                                    )
                                if icon:
                                    randomUniqueId = str(random_digit_generate(15))
                                    if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/TicketSubCategory/")):
                                        os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/TicketSubCategory/"))
                                    save_file = icon.save(os.path.join(app.config['SITE_ROOT'], "media/TicketSubCategory/"+randomUniqueId+".png"))
                                    sub_category_queryset.update(icon="media/TicketSubCategory/"+randomUniqueId+".png")

                                flash("Ticket Sub Category updated successfully!", "Subcategory_success")
                                data_status["responseStatus"]=1
                                return data_status
                                
                            else:
                                flash("Ticket Sub Category not found!!", "Subcategory_danger")
                                data_status["responseStatus"]=4
                                return data_status
                                
                        except Exception as e:
                            flash("Unable to update ticket sub category!!", "Subcategory_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:
                flash("Invalid request.", "danger")
                data_status["responseStatus"]=4
                return data_status
                        
        else:
            flash("The staff member does not have permission to update ticket sub category.", "Subcategory_danger")
            data_status["responseStatus"]=4
            return data_status
            
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update ticket sub category!!"
        flash(error)
        data_status["responseStatus"]=4
        return data_status
        

#Update ticket sub category status API
@ticket_master.route("/update_sub_category_status",methods=["POST","GET"])
@adminid_access_token_required
def update_sub_category_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")

    ticketSubPage=request.args.get("ticketSubPage")
    ticket_sub_search_element = request.args.get("ticket_sub_search_element")
  
    redirectTo=url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory",ticketSubPage=ticketSubPage,ticket_sub_search_element=ticket_sub_search_element)
    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"),"ticketSubCategoryPermissions")
    if "edit" in permissionsList:
        subCategoryId = request.args.get("subCategoryId","")
        if subCategoryId:
            try:
                message=""
                sub_category_queryset = TicketSubCategory.objects(id=subCategoryId,status__nin=[2]).first()
                existing_record = sub_category_queryset.to_json()
                requestData = [existing_record]
                if sub_category_queryset:
                    if sub_category_queryset.status == 0:
                        sub_category_queryset.update(status=1)
                        flash("Ticket Sub Category  activated successfully!", "Subcategory_success")
                        message=sub_category_queryset.adminId.userName+" "+sub_category_queryset.name+" Ticket Sub Category  activated successfully!"
                    elif sub_category_queryset.status == 1:
                        sub_category_queryset.update(status=0)
                        flash("Ticket Sub Category  deactivated successfully!", "Subcategory_success")
                        message=sub_category_queryset.adminId.userName+" "+sub_category_queryset.name+" Ticket Sub Category  deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sub_category_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                    print("((((((((((((((save_admin_log_table))))))))))))))",save_admin_log_table)
                    return redirect(redirectTo)
                    
                else:
                    flash("Ticket Sub Category not found!!", "Subcategory_danger")
                    return redirect(redirectTo)

            except Exception as e:
                flash("Unable to update ticket sub category status!!", "Subcategory_danger")
                app.logger.error(traceback.format_exc())
                return redirect(redirectTo)
        else:
            flash("Required fields are missing!!", "Subcategory_danger")
            return redirect(redirectTo)
            
    else:
        flash("The staff member does not have permission to ticket sub category status.", "danger")
        return redirect(redirectTo)
        

#Delete ticket sub category API
@ticket_master.route("/delete_sub_category",methods=["POST","GET"])
@adminid_access_token_required
def delete_sub_category():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")

    ticketSubPage=request.args.get("ticketSubPage")
    ticket_sub_search_element = request.args.get("ticket_sub_search_element")
  
    redirectTo=url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory",ticketSubPage=ticketSubPage,ticket_sub_search_element=ticket_sub_search_element)
    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"),"ticketSubCategoryPermissions")
    if "delete" in permissionsList:
        subCategoryId = request.args.get("subCategoryId","")
        if subCategoryId:
            try:
                sub_category_queryset = TicketSubCategory.objects(id=subCategoryId,status__in=[0,1]).first()
                if sub_category_queryset:
                    existing_record = sub_category_queryset.to_json()
                    requestData = [existing_record]
                    sub_category_queryset.update(status=2)
                    flash("Ticket Sub Category deleted successfully!", "Subcategory_success")
                    message=sub_category_queryset.adminId.userName+" "+sub_category_queryset.name+" Ticket Sub Category deleted successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_sub_category","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                    print("((((((((((((save_admin_log_table))))))))))))",save_admin_log_table)
                    return redirect(redirectTo)
                    
                else:
                    flash("Ticket Sub Category not found!!","Subcategory_danger")
                    return redirect(redirectTo)
                    
            except Exception as e:
                flash("Unable to delete ticket sub category!!","Subcategory_danger")
                app.logger.error(traceback.format_exc())
                return redirect(redirectTo)
        else:
            flash("Required fields are missing!!","Subcategory_danger")
            return redirect(redirectTo)
            
    else:
        flash("The staff member does not have permission to delete ticket sub category.", "Subcategory_danger")
        return redirect(redirectTo)
        
######### Child Category ###########
# Add Child category API
@ticket_master.route("/add_child_category",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_child_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,"ticketChildCategoryPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                name = request.form.get("name","")
                subCategoryId = request.form.get("subCategoryId","")
                priority = request.form.get("priority","")
                icon = request.files.get("icon","")
                
                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]
                form = TicketChildForm()
                if form.validate_on_submit():
                    if name and subCategoryId and priority:
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message=admin_queryset.userName+" "+name+" Ticket Child Category saved successfully!"
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_child_category","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
                                print("(((((((((((((save_admin_log_table)))))))))))))",save_admin_log_table)
                            child_category_table = TicketChildCategory(
                                adminId = adminId,
                                name = name,
                                subCategoryId = subCategoryId,
                                priority = priority,
                                createdOn = datetime.datetime.now(),
                                status = 1,
                                )
                            save_table = child_category_table.save()
                            childCategoryId = str(save_table.id)
                            if icon:
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/TicketChildCategory/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/TicketChildCategory/"))
                                save_file = icon.save(os.path.join(app.config['SITE_ROOT'], "media/TicketChildCategory/"+childCategoryId+".png"))
                                save_table.update(icon="media/TicketChildCategory/"+childCategoryId+".png")
                            flash("Ticket Child Category saved successfully!", "Childcategory_success")
                            data_status['responseStatus']=1
                            return data_status

                        except Exception as e:
                            flash("Unable to save ticket child category!!", "Childcategory_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 a ticket child category.", "Childcategory_danger")
            data_status['responseStatus']=4
            return data_status
            
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to add ticket child category!!", "Childcategory_danger")
        data_status['responseStatus']=4
        return data_status
        

def fetch_child_category_details(child_category_queryset):
    child_category_dict = {}
    try:
        child_category_dict={
        "id":str(child_category_queryset.id),
        "name":child_category_queryset.name,
        "subCategoryId":str(child_category_queryset.subCategoryId.id),
        "subCategoryName":str(child_category_queryset.subCategoryId.name),
        "priority":child_category_queryset.priority,
        }
        if child_category_queryset.status==1:
            child_category_dict["actionText"] = "Active"
        else:
            child_category_dict["actionText"] = "Deactive"
        if child_category_queryset.createdOn:
            child_category_dict["createdOn"] = child_category_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            child_category_dict["createdOn"] = ""
        if child_category_queryset.icon:
            child_category_dict["icon"] = domain+child_category_queryset.icon
        else:
            child_category_dict["icon"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return child_category_dict

#Update ticket child category API
@ticket_master.route("/update_child_category",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_child_category():
    data_status={"responseStatus":0,"result":""}
    try:
        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"),"ticketChildCategoryPermissions")
        if "edit" in permissionsList:
            if request.method == "POST":
                childCategoryId = request.args.get("childCategoryId","")
                name = request.form.get("name","")
                subCategoryId = request.form.get("subCategoryId","")
                priority = request.form.get("priority","")
                icon = request.files.get("icon","")
                
                jsonData = request.form.to_dict(flat=True)
                form = TicketChildForm(request.form, current_id=childCategoryId)
                if form.validate_on_submit():
                    
                    if name and subCategoryId and priority:
                        try:
                            child_category_queryset = TicketChildCategory.objects(id=childCategoryId,status__nin=[2]).first()
                            if child_category_queryset:
                                existing_record = child_category_queryset.to_json()
                                message=child_category_queryset.adminId.userName+" "+name+" Ticket child Category updated successfully!"
                                requestData=[child_category_queryset]
                                updatedrequestData=[jsonData]
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_child_category","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
                                print("(((((((((((((save_admin_log_table)))))))))))))",save_admin_log_table)
                                child_category_queryset.update(
                                    name = name,
                                    subCategoryId = ObjectId(subCategoryId),
                                    priority = priority,
                                    )
                                if icon:
                                    randomUniqueId = str(random_digit_generate(15))
                                    if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/TicketChildCategory/")):
                                        os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/TicketChildCategory/"))
                                    save_file = icon.save(os.path.join(app.config['SITE_ROOT'], "media/TicketChildCategory/"+randomUniqueId+".png"))
                                    child_category_queryset.update(icon="media/TicketChildCategory/"+randomUniqueId+".png")
                                flash("Ticket child category updated successfully!", "Childcategory_success")
                                data_status["responseStatus"]=1
                                return data_status
                                
                            else:
                                flash("Ticket child category not found!!", "Childcategory_danger")
                                data_status["responseStatus"]=4
                                return data_status
                                
                        except Exception as e:
                            flash("Unable to update child category!!", "Childcategory_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 update ticket child Category.", "Childcategory_danger")
            data_status['responseStatus']=4
            return data_status
            
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to update child category!!", "Childcategory_danger")
        data_status['responseStatus']=4
        return data_status
        

#Update ticket child category status API
@ticket_master.route("/update_child_category_status",methods=["POST","GET"])
@adminid_access_token_required
def update_child_category_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")

    ticketChildPage=request.args.get("ticketChildPage")
    ticket_child_search_element = request.args.get("ticket_child_search_element")
  
    redirectTo=url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory",ticketChildPage=ticketChildPage,ticket_child_search_element=ticket_child_search_element)
    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"),"ticketChildCategoryPermissions")
    if "edit" in permissionsList:
        childCategoryId = request.args.get("childCategoryId","")
        if childCategoryId:
            try:
                message=""
                child_category_queryset = TicketChildCategory.objects(id=childCategoryId,status__nin=[2]).first()
                xisting_record = child_category_queryset.to_json()
                requestData = [existing_record]
                if child_category_queryset:
                    if child_category_queryset.status == 0:
                        child_category_queryset.update(status=1)
                        flash("Ticket Child Category  activated successfully!", "Childcategory_success")
                        message=child_category_queryset.adminId.userName+" "+child_category_queryset.name+" Ticket Child Category  activated successfully!"
                    elif child_category_queryset.status == 1:
                        child_category_queryset.update(status=0)
                        flash("Ticket child category  deactivated successfully!", "Childcategory_success")
                        message=child_category_queryset.adminId.userName+" "+child_category_queryset.name+" Ticket Category  deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_child_category_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                    print("((((((((((((((save_admin_log_table))))))))))))))",save_admin_log_table)
                    return redirect(redirectTo)
                    
                else:
                    flash("Ticket child category not found!!", "Childcategory_danger")
                    return redirect(redirectTo)
                    
            except Exception as e:
                flash("Unable to update child category status!!", "Childcategory_danger")
                app.logger.error(traceback.format_exc())
                return redirect(redirectTo)
        else:
            flash("Required fields are missing!!", "Childcategory_danger")
            return redirect(redirectTo)
            
    else:
        flash("The staff member does not have permission to update ticket child Category status.", "Childcategory_danger")
        return redirect(redirectTo)
        

#Delete ticket child category API
@ticket_master.route("/delete_child_category",methods=["POST","GET"])
@adminid_access_token_required
def delete_child_category():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")

    ticketChildPage=request.args.get("ticketChildPage")
    ticket_child_search_element = request.args.get("ticket_child_search_element")
  
    redirectTo=url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory",ticketChildPage=ticketChildPage,ticket_child_search_element=ticket_child_search_element)
    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"),"ticketChildCategoryPermissions")
    if "delete" in permissionsList:
        childCategoryId = request.args.get("childCategoryId","")
        if childCategoryId:
            try:
                child_category_queryset = TicketChildCategory.objects(id=childCategoryId,status__in=[0,1]).first()
                if child_category_queryset:
                    existing_record = child_category_queryset.to_json()
                    requestData = [existing_record]
                    child_category_queryset.update(status=2)
                    flash("Ticket child category deleted successfully!", "Childcategory_success")
                    message=child_category_queryset.adminId.userName+" "+child_category_queryset.name+" Ticket child category deleted successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_child_category","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                    print("((((((((((((save_admin_log_table))))))))))))",save_admin_log_table)
                    return redirect(redirectTo)
                    
                else:
                    flash("Ticket child category not found!!", "Childcategory_danger")
                    return redirect(redirectTo)
                    
            except Exception as e:
                flash("Unable to delete child category!!", "Childcategory_danger")
                app.logger.error(traceback.format_exc())
                return redirect(redirectTo)
        else:
            flash("Required fields are missing!!", "Childcategory_danger")
            return redirect(redirectTo)
            
    else:
        flash("The staff member does not have permission to delete ticket child Category.", "Childcategory_danger")
        return redirect(redirectTo)
        


######### Knowledge Master ###########
# Add CKnowledge Master API
# @ticket_master.route("/add_knowledge_master",methods=["POST","GET"])
# @adminid_access_token_required
# @csrf_protect
# def add_knowledge_master():
#     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))))))))))))))")
        
#         if request.method == "POST":
#             name = request.form.get("name","")
#             childCategoryId = request.form.get("childCategoryId","")
#             description = request.form.get("description","")
#             image = request.files.get("image","")
#             if name and childCategoryId:
#                 try:
#                     knowledge_master_table = KnowledgeMaster(
#                         adminId = adminId,
#                         name = name,
#                         childCategoryId = childCategoryId,
#                         description = description,
#                         )
#                     save_table = knowledge_master_table.save()
#                     knowledgeMasterId = str(save_table.id)
#                     if image:
#                         if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/KnowledgeMaster/")):
#                             os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/KnowledgeMaster/"))
#                         save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/KnowledgeMaster/"+knowledgeMasterId+".png"))
#                         save_table.update(image="media/KnowledgeMaster/"+knowledgeMasterId+".png")
#                     flash("Knowledge master saved successfully!")
#                     return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))

#                 except Exception as e:
#                     flash("Unable to save knowledge master")
#                     app.logger.error(traceback.format_exc())
#                     return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
#             else:
#                 flash("Required fields are missing!!")
#                 return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         error = "Unable to save knowledge master"
#         return redirect(url_for("ticket_master.ticket_masters_list",error=error))

# def fetch_knowledge_master_details(knowledge_master_queryset):
#     knowledge_master_dict={}
#     try:
#         knowledge_master_dict={
#         "id":str(knowledge_master_queryset.id),
#         "name":knowledge_master_queryset.name,
#         "childCategoryId":str(knowledge_master_queryset.childCategoryId.id),
#         "childCategoryName":knowledge_master_queryset.childCategoryId.name,
#         "description":knowledge_master_queryset.description,
#         }
#         if knowledge_master_queryset.status==1:
#             knowledge_master_dict["actionText"] = "Active"
#         else:
#             knowledge_master_dict["actionText"] = "Deactive"
#         if knowledge_master_queryset.createdOn:
#             knowledge_master_dict["createdOn"] = knowledge_master_queryset.createdOn.strftime("%m-%d-%Y")
#         else:
#             knowledge_master_dict["createdOn"] = ""
#         if knowledge_master_queryset.image:
#             knowledge_master_dict["image"] = domain+knowledge_master_queryset.image
#         else:
#             knowledge_master_dict["image"] = ""
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#     return knowledge_master_dict



# #Update API
# @ticket_master.route("/update_knowledge_master",methods=["POST","GET"])
# @adminid_access_token_required
# @csrf_protect
# def update_knowledge_master():
#     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))))))))))))))")
        
#         if request.method == "POST":
#             knowledgeMasterId = request.args.get("knowledgeMasterId","")
#             name = request.form.get("name","")
#             childCategoryId = request.form.get("childCategoryId","")
#             description = request.form.get("description","")
#             image = request.files.get("image","")
#             if name and childCategoryId:
#                 try:
#                     knowledge_master_queryset = KnowledgeMaster.objects(id=knowledgeMasterId,status__nin=[2]).first()
#                     if knowledge_master_queryset:
#                         knowledge_master_queryset.update(
#                             name = name,
#                             childCategoryId = ObjectId(childCategoryId),
#                             description = description,
#                             )
#                         if image:
#                             if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/KnowledgeMaster/")):
#                                 os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/KnowledgeMaster/"))
#                             save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/KnowledgeMaster/"+knowledgeMasterId+".png"))
#                             knowledge_master_queryset.update(image="media/KnowledgeMaster/"+knowledgeMasterId+".png")
#                         flash("Knowledge master updated successfully!")
#                         return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
#                     else:
#                         flash("Knowledge master not found!!")
#                         return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
#                 except Exception as e:
#                     flash("Unable to update knowledge master")
#                     app.logger.error(traceback.format_exc())
#                     return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
#             else:
#                 flash("Required fields are missing!!")
#                 return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         error = "Unable to update knowledge master"
#         return redirect(url_for("ticket_master.ticket_masters_list",error=error))


# #Update status API
# @ticket_master.route("/update_knowledge_master_status",methods=["POST","GET"])
# @adminid_access_token_required
# def update_knowledge_master_status():
#     if not session.get("adminId"):
#         return redirect("admin_login")
#     adminId = session.get("adminId")
#     knowledgeMasterId = request.args.get("knowledgeMasterId","")
#     if knowledgeMasterId:
#         try:
#             knowledge_master_queryset = KnowledgeMaster.objects(id=knowledgeMasterId,status__nin=[2]).first()
#             if knowledge_master_queryset:
#                 if knowledge_master_queryset.status == 0:
#                     knowledge_master_queryset.update(status=1)
#                     flash("Knowledge master activated successfully!")
#                 elif knowledge_master_queryset.status == 1:
#                     knowledge_master_queryset.update(status=0)
#                     flash("Knowledge master deactivated successfully!")
#                 return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
#             else:
#                 flash("Knowledge master not found!!")
#                 return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
#         except Exception as e:
#             flash("Unable to update knowledge master status!!")
#     else:
#         flash("Required fields are missing!!")
#         return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))



# #Delete API
# @ticket_master.route("/delete_knowledge_master",methods=["POST","GET"])
# @adminid_access_token_required
# def delete_knowledge_master():
#     if not session.get("adminId"):
#         return redirect("admin_login")
#     adminId = session.get("adminId")
#     knowledgeMasterId = request.args.get("knowledgeMasterId","")
#     if knowledgeMasterId:
#         try:
#             knowledge_master_queryset = KnowledgeMaster.objects(id=knowledgeMasterId,status__nin=[2]).first()
#             if knowledge_master_queryset:
#                 knowledge_master_queryset.update(status=2)
#                 flash("Knowledge master deleted successfully!")
#                 return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
#             else:
#                 flash("Knowledge master not found!!")
#                 return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
#         except Exception as e:
#             flash("Unable to delete knowledge master")
#             app.logger.error(traceback.format_exc())
#     else:
#         flash("Required fields are missing!!")
#         return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))




@ticket_master.route("/view_all_complaints",methods=["POST","GET"])
@adminid_access_token_required
def view_all_complaints():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")

        complaintsList = []
        merchantsList = []

        startDate = request.args.get("startDate","")
        endDate = request.args.get("endDate","")
        searchId=request.args.get("searchId","").strip()

        # Set default date format
        date_format = "%d-%m-%Y"
        pagination = None
        error = ""
        Page = ""
        snoCount=0
        form = ComplaintsSearchForm(request.args)
        permissionsList = check_permissions(session.get("adminId"),"complaintListPermissions")
        if "view" in permissionsList:
            try:
                if startDate:
                    startDate = datetime.datetime.strptime(startDate, date_format)
                    startDate = startDate.replace(hour=0, minute=0, second=0, microsecond=0)
                else:
                    startDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)

                if endDate:
                    endDate = datetime.datetime.strptime(endDate, date_format)
                    endDate = endDate.replace(hour=23, minute=59, second=59, microsecond=999999)
                else:
                    endDate = datetime.datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)
            except Exception as ve:
                app.logger.error("Date parsing error: %s", ve)
                startDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
                endDate = datetime.datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)

            # merchants_queryset = Users.objects(status__nin=[2]).order_by("-createdOn")
            # for each_merchant in merchants_queryset:
            # 	merchantDict = fetching_user_details(each_merchant)
            # 	merchantsList.append(merchantDict)              


            merchants_queryset = (
                Users.objects(status__nin=[2])
                .order_by("-id")
            )
            merchantsList=list(merchants_queryset)



            # complaints_reports_queryset = ComplaintReport.objects(createdOn__gte=startDate,createdOn__lte=endDate)
            # if searchId:
            # 	complaints_reports_queryset = complaints_reports_queryset.filter(Q(merchantReferenceNumber__icontains=searchId) | Q(transactionUniqueId__icontains=searchId))

            # complaints_reports_queryset = complaints_reports_queryset.order_by("-createdOn").all()
            
            
            page = request.args.get(get_page_parameter(), type=int, default=1)

            per_page = 20 
            total_count = 0

            start = (page - 1) * per_page

            filters = Q()
            if form.validate():
                if startDate and endDate:
                    filters &= Q(createdOn__gte=startDate, createdOn__lte=endDate)

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

                complaints_reports_queryset = ComplaintReport.objects(filters).order_by("-id").skip(start).limit(per_page).all()
            
                for each_complaint in complaints_reports_queryset:
                    
                    complaintDict = {
                    "snoCount":snoCount,
                    "priority":each_complaint.priority,
                    "complaintNumber":each_complaint.complaintNumber,
                    "transactionId":each_complaint.transactionId,
                    "message":each_complaint.message,
                    "createdOn":each_complaint.createdOn.strftime("%d-%m-%Y %I:%M:%S %p")
                    }
                    try:
                        if each_complaint.userId:
                            complaintDict["userName"]=each_complaint.userId.fullName
                        else:
                            complaintDict["userName"]=""

                        if each_complaint.categoryId:
                            complaintDict["categoryName"]=each_complaint.categoryId.name
                        else:
                            complaintDict["categoryName"]=""

                        if each_complaint.complaintTypeId:
                            complaintDict["complaintTypeName"]=each_complaint.complaintTypeId.name
                        else:
                            complaintDict["complaintTypeName"]=""

                        if each_complaint.subjectId:
                            complaintDict["subjectName"]=each_complaint.subjectId.name
                        else:
                            complaintDict["subjectName"]=""
                    except DoesNotExist:
                        # If any dereferencing fails, assign blank values
                        complaintDict["userName"] = ""
                        complaintDict["categoryName"] = ""
                        complaintDict["complaintTypeName"] = ""
                        complaintDict["subjectName"] = ""

                    if each_complaint.document:
                        complaintDict["document"]=domain+each_complaint.document
                    else:
                        complaintDict["document"]=""

                    complaintsList.append(complaintDict)
            else:
                complaintsList = []

            snoCount = start
            
            pagination = Pagination(Page=page,total=total_count,per_page=per_page,page_parameter="Page",alignment="right",record_name="complaints",href=f"?startDate={startDate}&endDate={endDate}&Page={{0}}")

            return render_template("super_admin_templates/complaints_list.html",
                pagination=pagination,
                complaintsList=complaintsList,
                startDate=startDate.strftime(date_format),
                endDate=endDate.strftime(date_format),
                searchId=searchId,
                snoCount=snoCount,
                form=form,
                page=page,
                
                )
        else:
            flash("Staff member does not have given view complaints List permissions!!", "danger")
            return redirect(url_for("admin.dashboard"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to fetch complaints data!", "danger")
        return render_template("super_admin_templates/complaints_list.html", 
            error=error,
            complaintsList=complaintsList,
            pagination=pagination,
            startDate=startDate.strftime(date_format),
            endDate=endDate.strftime(date_format),
            searchId=searchId,
            snoCount=snoCount,
            form=form,
            page=page,

            )