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

user_managements = Blueprint("user_managements",__name__)

@user_managements.route("/add_new_user",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_new_user():
	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")
		
		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:
			userAgent = request.headers.get("User-Agent")
			loginBrowseData = userAgent.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,"userManagementPermissions")
		form = AddNewUserForm(request.form)
		if "add" in permissionsList:
			if request.method == "POST":


				otp_check_id = request.form.get("otpLogid", "")
				defaultVerificationId = request.form.get("defaultVerificationId", "")
			  
				if not otp_check_id:
					flash("Invalid Request.")
					return redirect(url_for("user_managements.manage_users_list"))
				
				if form.validate_on_submit():
					otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()
					if not otpcheck_queryset:
						flash("Invalid Request.")
						return redirect(url_for("user_managements.manage_users_list"))

					# Update OTP status to 2 after verification
					otpcheck_queryset.update(status=2)
	
					fullName = request.form.get("fullName","")
					phoneNumber = request.form.get("phoneNumber","")


					email = request.form.get("email","")
					address = request.form.get("address","")
					patternId = request.form.get("patternId","")
					entityTypeId = request.form.get("entityTypeId","")
					stateId = request.form.get("stateId","")
					cityId = request.form.get("cityId","")
					blockPoId = request.form.get("blockPoId","")
					pincodeId = request.form.get("pincodeId","")
					password = request.form.get("password","")
					businessName = request.form.get("businessName","")
					businessAddress = request.form.get("businessAddress","")
					businessRemark = request.form.get("businessRemark","")
					documentRemark = request.form.get("documentRemark","")
					videoVerificationRemark = request.form.get("videoVerificationRemark","")
					parentId = request.form.get("parentId","")
					siteTitle = request.form.get("siteTitle","")
					# categoryId = request.form.get("categoryId","")
					# subCategoryId = request.form.get("subCategoryId","")
					# panNumber = request.form.get("panNumber","")
					merchantType = request.form.get("merchantType","")
					maxPayinLimit = request.form.get("maxPayinLimit", 0)
					maxPayoutLimit = request.form.get("maxPayoutLimit",0)
					try:
						if maxPayinLimit:
							maxPayinLimit = float(maxPayinLimit)
						else:
							maxPayinLimit = 0
					except Exception as e:
						maxPayinLimit = 0
					
					try:
						if maxPayoutLimit:
							maxPayoutLimit = float(maxPayoutLimit)
						else:
							maxPayoutLimit = 0
					except Exception as e:
						maxPayoutLimit = 0

					print("(((((((((((((add form validate)))))))))))))", form.validate())


					# if fullName and not is_valid_alphabets(fullName):
					#     flash("FullName must contain only alphabetic characters (letters) and spaces")
					#     return redirect(url_for("user_managements.manage_users_list"))

					# if phoneNumber and not is_valid_phone(phoneNumber):
					#     flash("Phone number must be exactly 10 digits")
					#     return redirect(url_for("user_managements.manage_users_list"))

					# if email and  not validate_email(email):
					#     flash("Invalid email format!")
					#     return redirect(url_for("user_managements.manage_users_list"))

					# if password and  not validate_password(password):
					#     flash("Password must be 8-30 characters long, include at least one uppercase letter, one lowercase letter, one number, and one special character.")
					#     return redirect(url_for("user_managements.manage_users_list"))

					# if address and not is_valid_alphanumeric(address):
					#     flash("Address must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
					#     return redirect(url_for("user_managements.manage_users_list"))
					
					# if maxPayinLimit and not is_valid_txn_limit(maxPayinLimit):
					#     flash(" Invalid maximum payin limit")
					#     return redirect(url_for("user_managements.manage_users_list"))
					
					# if maxPayoutLimit and not is_valid_txn_limit(maxPayoutLimit):
					#     flash(" Invalid maximum payout limit")
					#     return redirect(url_for("user_managements.manage_users_list"))

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

					if patternId and entityTypeId and merchantType:
						try:
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							if admin_queryset:
								message=admin_queryset.userName+" "+fullName+" Merchant created successfully!"
								save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_new_user","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
							merchant_queryset = Users.objects(phoneNumber__iexact=phoneNumber).first()
							if merchant_queryset:
								flash("This phone number is already in use.")
								return redirect(url_for("user_managements.manage_users_list"))
							print(f"Saving user with siteTitle: {siteTitle}")
							# check_pan_number = validate_pan(panNumber)
							# if check_pan_number == True:
							user_table = Users(
								fullName = fullName,
								phoneNumber  = phoneNumber,
								email  = email,
								password  = generate_password_hash(password), 
								address = address,
								patternId = patternId,
								entityTypeId = entityTypeId,
								createdOn =datetime.datetime.now(),
								stateId = stateId,
								cityId = cityId,
								blockPoId = blockPoId,
								pincodeId = pincodeId,
								parentId = parentId,
								businessName = businessName,
								siteTitle =siteTitle,
								businessAddress = businessAddress,
								businessRemark=businessRemark,
								documentRemark=documentRemark,
								videoVerificationRemark=videoVerificationRemark,
								# categoryId = categoryId,
								# subCategoryId = subCategoryId,
								merchantType = merchantType,
								merchantUniqueNumber = generate_next_serial_number(),
								channel="admin",
								payoutBalance = 0,
								walletBalance = 0,
								maxPayinLimit = float(maxPayinLimit),
								maxPayoutLimit = float(maxPayoutLimit),
								status = 0
								)
							save_table = user_table.save()
							userId = str(save_table.id)
							str2hash = userId+str(random_digit_generate(9))
							result = hashlib.md5(str2hash.encode())
							convertMd5String = result.hexdigest()

							save_table.update(merchantPaymentLink=convertMd5String)
							
							print(f"User saved successfully with siteTitle: {save_table.siteTitle}")

							if userId:
								userId = userId
								# panName = request.form.get("panName","")
								# panStatus = request.form.get("panStatus","")
								# panDocument = request.files.get("panDocument","")
								# bankId = request.form.get("bankId","")
								# bankAccountNumber = request.form.get("bankAccountNumber","")
								# bankStatus = request.form.get("bankStatus","")
								# ifscCode = request.form.get("ifscCode","")
								# aadharName = request.form.get("aadharName","")
								# aadharNumber = request.form.get("aadharNumber","")
								# aadharStatus = request.form.get("aadharStatus","")
								# aadharDocument = request.files.get("aadharDocument","")

								user_kyc_table = UserKYC(
									userId=userId,
									panName = "",
									panNumber  = "",
									panStatus  = "Pending",
									bankId  = None,
									bankAccountNumber  = "",
									bankStatus  = "Pending",
									ifscCode  = "",
									channel="admin",
									aadharName  = "",
									aadharNumber  = "",
									aadharStatus  = "Pending",
									siteTitle=siteTitle,
									createdOn =datetime.datetime.now(),
									status = 1
									)
								save_table = user_kyc_table.save()

								flash("Merchant created successfully!")
								data_status["responseStatus"] =1
								return data_status
							# else:
							#     flash("Please give valid pan number!!")
							#     return redirect(url_for("user_managements.manage_users_list"))
						except Exception as e:
							flash("Unable to create merchant!!")
							app.logger.error(traceback.format_exc())
							data_status["responseStatus"]=4
							return data_status
					else:
						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 a Merchant.", "danger")
			return redirect(url_for("admin.dashboard"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to create merchant!!"
		flash(error,'danger')
		data_status["responseStatus"]=4
		return data_status

@user_managements.route("/manage_users_list",methods=["POST","GET"])
@adminid_access_token_required
def manage_users_list():
	snoCount=0
	pagination = None
	merchantName=""
	merchantEmail=""
	merchantPhone=""
	merchantId=""
	subCategorysList=[]
	categorysList=[]
	statesList=[]
	citiesList=[]
	blocksList=[]
	pincodesList=[]
	tenantslList=[]
	usersList=[]
	userEntityList=[]
	allUsersCommissionsList=[]
	patternsList=[]
	merchantDashboardUrl=""
	masterIfscBanksList=[]
	commissionsList=[]
	matchultipleAppSitesList=[]
	rejected_count = 0
	pending_count = 0
	processing_count=0
	submitted_count=0
	approved_count=0
	total_merchants_count = 0
	blocked_merchants_count=0
	locked_merchants_count=0
	parentsList = []
	siteTitleList = []
	parentId = None
	patternId = None
	merchantType = ""
	siteTitle = ""
	stateId = ""
	snoCount=0
	
	form=MerchantManagementSearchForm(request.args)
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId = session.get("adminId")

		permissionsList = check_permissions(adminId,"userManagementPermissions")
		if "view" in permissionsList:

			manage_users_list = []
			userEntityList = []
			profilelList = []
			statesList = []
			citiesList = []
			blocksList = []
			pincodesList = []
			tenantslList = []
			usersList = []
			commissionsList = []
			allUsersCommissionsList = []
			patternsList = []
			categorysList = []
			subCategorysList = []
			masterIfscBanksList = []
			approvedUsers = []
			parentsList = []
			siteTitleList = []
			matchultipleAppSitesList = []


			blocked_merchants_count = Users.objects(status=3).count()
			locked_merchants_count = Users.objects(status=5).count()
			total_merchants_count = Users.objects(status__nin=[2,6]).count()

			merchantEmail = request.args.get('merchantEmail', '')
			merchantName = request.args.get('merchantName', '')
			merchantPhone = request.args.get('merchantPhone', '')
			merchantId = request.args.get('merchantId', '')
			merchantType = request.args.get('merchantType','')
			patternId = request.args.get('patternId','')
			parentId = request.args.get('parentId','')
			siteTitle = request.args.get("siteTitle",'')
			stateId = request.args.get("stateId",'')

			print("requrest.form",request.form)
			print("requrest.args",request.args)
			
			page = request.args.get(get_page_parameter(), type=int, default=1)
			per_page = 20
			start = (page - 1) * per_page
			snoCount = int(start)
			total_count=0

			if form.validate():
			
				users_queryset = Users.objects(status__nin=[2,6,3])

				kycUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId != None) and (each_user.entityTypeId.isIndividual == False)]
				trueUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId == None) or (each_user.entityTypeId.isIndividual == True)]

				# Base query for UserKYC
				kyc_initial_query = Q(panStatus="Approved") & Q(bankStatus="Approved") & Q(aadharStatus="Approved") & Q(agreementVerificationStatus="Approved") & Q(videoVerificationStatus="Approved") & Q(status__nin=[2, 6])

				complex_kyc_query = (
					Q(userId__in=kycUsersList) &
					Q(businessStatus="Approved") &
					Q(shopVideoStatus="Approved") &
					Q(documentsList__ne=[]) &
					Q(shopImagesList__ne=None) &
					Q(shopImagesList__ne=[]) &
					Q(shopImagesList__elemMatch={"shopImageStatus": "Approved"}) &
					Q(documentsList__elemMatch={"documentStatus": "Approved"})
				) | Q(userId__in=trueUsersList)

				# Apply final query
				user_parent_kycs_queryset = UserKYC.objects(kyc_initial_query & complex_kyc_query).order_by("-submittedDate")

				parents_queryset = user_parent_kycs_queryset

				query = Q()

				if merchantName:
				 
					query &= Q(fullName__icontains=merchantName)

				if merchantId:
				
					query &= Q(merchantUniqueNumber__icontains=merchantId)

				if merchantEmail:
				  
					query &= Q(email__icontains=merchantEmail)

				if merchantPhone:
				 
					query &= Q(phoneNumber__icontains=merchantPhone)

				if merchantType:
				 
					query &= Q(merchantType__icontains=merchantType)

				if patternId:
				
					query &= Q(patternId__icontains=patternId)

				if parentId:
			 
					query &= Q(parentId=parentId)

				if siteTitle:
			  
					query &= Q(siteTitle__icontains=siteTitle)

			   
				if stateId:
				 
					query &= Q(stateId=stateId)
					
				user_ids = Users.objects(query).values_list('id')
			

				# Filter the user_kycs_queryset with the combined query
				# user_kycs_queryset = user_kycs_queryset.filter(Q(userId__in=Users.objects(query).values_list('id')))
				final_kyc_query =  Q(userId__in=user_ids) &  (
					(
						Q(userId__in=kycUsersList) 
						& Q(businessStatus="Approved")
						& Q(shopVideoStatus="Approved") 
						& Q(documentsList__ne=[]) 
						& Q(shopImagesList__ne=[]) 
						& Q(shopImagesList__ne=None) 
						& Q(shopImagesList__ne=[]) 
						& Q(shopImagesList__elemMatch={"shopImageStatus": "Approved"}) 
						& Q(documentsList__elemMatch={"documentStatus": "Approved"})) |  (
						Q(userId__in=trueUsersList)
					)
				) & Q(status__nin=[2,3,6]) & Q(panStatus="Approved") & Q(bankStatus="Approved") & Q(aadharStatus="Approved") &Q(agreementVerificationStatus="Approved") & Q(videoVerificationStatus="Approved")

				total_count = UserKYC.objects(final_kyc_query).count()
			  
				user_kycs_queryset = UserKYC.objects(final_kyc_query).order_by("-submittedDate").limit(per_page).skip(start)
			  
				for each_user_entity in user_kycs_queryset:
					userKycDict = fetching_user_details_by_kyc(each_user_entity)
					
					# snoCount += 1
					# userKycDict["snoCount"] = snoCount
					usersList.append(userKycDict)

				for each_parent in parents_queryset:
					parent_dict = fetching_user_details_by_kyc(each_parent)
					parentsList.append(parent_dict)

						
				patterns_queryset = Patterns.objects(status__in=[0,1]).only('id', 'name').order_by("-id").all()
			  
				patternsList = list(patterns_queryset)

				user_entities_queryset = UserEntity.objects(status__in=[1]).only('id', 'entityType').order_by("-id")
				userEntityList = list(user_entities_queryset)

				states_queryset = States.objects(status__in=[1]).only('id', 'stateName').order_by("stateName")
				statesList =  list(states_queryset)

				multiple_app_sites_queryset = MultipleAppSites.objects(status__in=[0,1]).only('siteTitle', 'siteCode').order_by("-id").all()
				siteTitleList =  list(multiple_app_sites_queryset)
				
				# matchultiple_app_sites_queryset = MultipleAppSites.objects(status__in=[0,1]).only('id', 'siteCode').order_by('-id')
				matchultiple_app_sites_queryset = MultipleAppSites.objects(status__in=[0,1]).order_by('-id')
				for each_matchultiple_app_sites in matchultiple_app_sites_queryset:
					matchultiple_app_sites_dict = {
					"id":str(each_matchultiple_app_sites.id),
					"siteCode":each_matchultiple_app_sites.siteCode,
					"siteTitle":each_matchultiple_app_sites.siteTitle
					}
					matchultipleAppSitesList.append(matchultiple_app_sites_dict)
			   
			else:
				bankCodesList=[]
		  
			
			pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="merchants")

			
			users_kyc_queryset = UserKYC.objects(status__in=[0,1]).order_by("-id")
			for each_user_kyc in users_kyc_queryset:
				kycStatusList = []
				kycStatusList = [
				each_user_kyc.panStatus,
				each_user_kyc.aadharStatus,
				each_user_kyc.bankStatus,
				each_user_kyc.videoVerificationStatus,
				each_user_kyc.agreementVerificationStatus
				]
				if each_user_kyc.userId.entityTypeId!=None and each_user_kyc.userId.entityTypeId.isIndividual==False:
					kycStatusList.append(each_user_kyc.shopVideoStatus)
					kycStatusList.append(each_user_kyc.businessStatus)
					if each_user_kyc.documentsList==[]:
						kycStatusList.append('Pending')
					else:
						for each_document in each_user_kyc.documentsList:
							kycStatusList.append(each_document.get('documentStatus'))

					if each_user_kyc.shopImagesList==[]:
						kycStatusList.append('Pending')
					else:
						for each_simg in each_user_kyc.shopImagesList:
							kycStatusList.append(each_simg.get('shopImageStatus'))

				if "Rejected" in kycStatusList:
					rejected_count += 1
				elif "Pending" in kycStatusList or "" in kycStatusList or  None in kycStatusList: ########## new code for count adding "" or none as pending
					pending_count += 1
				elif "Submitted" in kycStatusList:
					submitted_count += 1
				else:
					approved_count += 1

			rejected_count = rejected_count
			pending_count = pending_count
			submitted_count=submitted_count
			approved_count=approved_count

			return render_template("super_admin_templates/user_managements_list.html",
				pagination=pagination,
				snoCount=snoCount,
				merchantName=merchantName,
				merchantEmail=merchantEmail,
				merchantPhone=merchantPhone,
				merchantId=merchantId,
				subCategorysList=subCategorysList,
				categorysList=categorysList,
				statesList=statesList,
				citiesList=citiesList,
				blocksList=blocksList,
				pincodesList=pincodesList,
				tenantslList=tenantslList,
				usersList=usersList,
				userEntityList=userEntityList,
				allUsersCommissionsList=allUsersCommissionsList,
				patternsList=patternsList,
				masterIfscBanksList=masterIfscBanksList,
				merchantDashboardUrl=merchantDashboardUrl,
				commissionsList=commissionsList,
				matchultipleAppSitesList=matchultipleAppSitesList,
				rejected_count = rejected_count,
				pending_count = pending_count,
				submitted_count=submitted_count,
				approved_count=approved_count,
				blocked_merchants_count=blocked_merchants_count,
				locked_merchants_count=locked_merchants_count,
				total_merchants_count=total_merchants_count,
				parentsList = parentsList,
				siteTitleList = siteTitleList,
				parentId = parentId,
				patternId = patternId,
				merchantType = merchantType,
				siteTitle = siteTitle,
				stateId = stateId,
				form=form,
				)
		else:
			flash("The staff member does not have permission to view Merchants.", "danger")
			# return render_template("super_admin_templates/user_managements_list.html")
			return redirect(url_for("admin.dashboard"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to fetched manage user data!!"
		return render_template("super_admin_templates/user_managements_list.html", 
			error=error,
			snoCount=snoCount,
			pagination=pagination,
			merchantName=merchantName,
			merchantEmail=merchantEmail,
			merchantPhone=merchantPhone,
			merchantId=merchantId,
			subCategorysList=subCategorysList,
			categorysList=categorysList,
			statesList=statesList,
			citiesList=citiesList,
			blocksList=blocksList,
			pincodesList=pincodesList,
			tenantslList=tenantslList,
			usersList=usersList,
			userEntityList=userEntityList,
			allUsersCommissionsList=allUsersCommissionsList,
			patternsList=patternsList,
			merchantDashboardUrl=merchantDashboardUrl,
			masterIfscBanksList=masterIfscBanksList,
			commissionsList=commissionsList,
			matchultipleAppSitesList=matchultipleAppSitesList,
			rejected_count = rejected_count,
			pending_count = pending_count,
			submitted_count=submitted_count,
			approved_count=approved_count,
			blocked_merchants_count=blocked_merchants_count,
			locked_merchants_count=locked_merchants_count,
			total_merchants_count=total_merchants_count,
			parentsList = parentsList,
			siteTitleList = siteTitleList,
			parentId = parentId,
			patternId = patternId,
			merchantType = merchantType,
			siteTitle = siteTitle,
			stateId = stateId,
			form=form
			)

def admin_download_merchant_management_excel_reports_data(merchantEmail,user_kycs_queryset):
	relative_temp_excel_file_name = ""
	try:
		fileName = "merchant_management.xlsx"

		merchant_management_data = {
			"MerchantId": [],
			"Site Title":[],
			"Merchant Name": [],
			"Merchant Email": [],
			"Merchant Phone": [],  # Fixed inconsistent key name
			"Parent Name": [],
			"Profile": [],
			"Merchant Type":[],
			"Channel": [],
			"Payin Balance(₹)": [],
			"Payout Balance(₹)": [],
			"Commission Balance(₹)": [],
			"Cap Balance(₹)": [],
			"Registered On": [],
			"State": []
		}

		for each_record in user_kycs_queryset:
		
			merchant_management_data["MerchantId"].append(each_record.userId.merchantUniqueNumber)
			merchant_management_data["Site Title"].append(each_record.userId.siteTitle)
			merchant_management_data["Merchant Name"].append(each_record.userId.fullName)
			merchant_management_data["Merchant Email"].append(each_record.userId.email)
			merchant_management_data["Merchant Phone"].append(each_record.userId.phoneNumber) 
			try:
				if each_record.userId.parentId:
					merchant_management_data["Parent Name"].append(each_record.userId.parentId.fullName)
				else:
					merchant_management_data["Parent Name"].append("N/A")
			except Exception as e:
				merchant_management_data["Parent Name"].append("N/A")

			try:
				if each_record.userId.patternId:
					merchant_management_data["Profile"].append(each_record.userId.patternId.name)
				else:
					merchant_management_data["Profile"].append("N/A")
			except Exception as e:
				merchant_management_data["Profile"].append("N/A")

			merchant_management_data["Merchant Type"].append(each_record.userId.merchantType) 
			merchant_management_data["Channel"].append(each_record.userId.channel)
			merchant_management_data["Payin Balance(₹)"].append(each_record.userId.walletBalance)
			merchant_management_data["Payout Balance(₹)"].append(each_record.userId.payoutBalance)
			merchant_management_data["Commission Balance(₹)"].append(each_record.userId.commissionBalance)
			merchant_management_data["Cap Balance(₹)"].append(each_record.userId.capBalance)
			merchant_management_data["Registered On"].append(each_record.userId.createdOn)
			try:
				if each_record.userId.stateId:
					merchant_management_data["State"].append(each_record.userId.stateId.stateName)
				else:
					merchant_management_data["State"].append("N/A")
			except Exception as e:
				merchant_management_data["State"].append("N/A")

		# Create DataFrame
		df = pd.DataFrame(merchant_management_data)

		# Define file path
		base_dir = os.path.join(app.config['SITE_ROOT'], "media/user_managements", "users")
		os.makedirs(base_dir, exist_ok=True)

		relative_temp_excel_file_name = os.path.join("media/user_managements", "users", fileName)
		full_file_name = os.path.join(app.config['SITE_ROOT'], relative_temp_excel_file_name)

		# Save DataFrame to Excel
		df.to_excel(full_file_name, index=False)

		# Send the file as a downloadable attachment
		response = send_file(
			full_file_name,
			mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
			download_name=fileName,
			as_attachment=True
		)

		return response
	except Exception as e:
		app.logger.error(traceback.format_exc())
		return {"error": "Unable to generate the report"}

@user_managements.route("/admin_download_merchant_management_excel_reports", methods=["POST", "GET"])
@adminid_access_token_required
def admin_download_merchant_management_excel_reports():
	try:
		merchantId = request.args.get("merchantId", "")
		merchantEmail = request.args.get("merchantEmail", "")
		merchantName = request.args.get("merchantName", "")
		merchantPhone = request.args.get("merchantPhone", "")
		parentId = request.args.get("parentId","")
		patternId = request.args.get("patternId","")
		merchantType = request.args.get("merchantType","")
		siteTitle = request.args.get("siteTitle","")
		stateId = request.args.get("stateId","")
		# print("stateId",stateId)
		users_queryset = Users.objects(status__ne=2)
		kycUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId != None) and (each_user.entityTypeId.isIndividual == False)]
		trueUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId == None) or (each_user.entityTypeId.isIndividual == True)]

		print(kycUsersList, "(((((kycUsersList)))))")
		print(trueUsersList, "(((((trueUsersList)))))")

		# Base query for UserKYC
		 # Base query for UserKYC
		# kyc_initial_query = Q(panStatus="Approved") & Q(bankStatus="Approved") & Q(aadharStatus="Approved") & Q(agreementVerificationStatus="Approved") & Q(videoVerificationStatus="Approved") & Q(status__nin=[2, 6])

		# complex_kyc_query = (
		#     Q(userId__in=kycUsersList) &
		#     Q(businessStatus="Approved") &
		#     Q(shopVideoStatus="Approved") &
		#     Q(documentsList__ne=[]) &
		#     Q(shopImagesList__ne=None) &
		#     Q(shopImagesList__ne=[]) &
		#     Q(shopImagesList__elemMatch={"shopImageStatus": "Approved"}) &
		#     Q(documentsList__elemMatch={"documentStatus": "Approved"})
		# ) | Q(userId__in=trueUsersList)

		# # Apply final query
		# user_parent_kycs_queryset = UserKYC.objects(kyc_initial_query & complex_kyc_query).order_by("-submittedDate")

		query = Q()

		if merchantName:
		 
			query &= Q(fullName__icontains=merchantName)

		if merchantId:
		
			query &= Q(merchantUniqueNumber__icontains=merchantId)

		if merchantEmail:
		
			query &= Q(email__icontains=merchantEmail)

		if merchantPhone:
		 
			query &= Q(phoneNumber__icontains=merchantPhone)

		if merchantType:
	 
			query &= Q(merchantType__icontains=merchantType)

		if patternId:
		 
			query &= Q(patternId__icontains=patternId)

		if parentId:
		 
			query &= Q(patternId__icontains=parentId)

		if siteTitle:
		  
			query &= Q(siteTitle__icontains=siteTitle)

		# print("stateId", stateId)
		# print("stateId", type(stateId))
		if stateId:
		   
			query &= Q(stateId__icontains=stateId)
		
		user_ids = Users.objects(query).values_list('id')
	   

		final_kyc_query =  Q(userId__in=user_ids) &  (
					(
						Q(userId__in=kycUsersList) 
						& Q(businessStatus="Approved")
						& Q(shopVideoStatus="Approved") 
						& Q(documentsList__ne=[]) 
						& Q(shopImagesList__ne=[]) 
						& Q(shopImagesList__ne=None) 
						& Q(shopImagesList__ne=[]) 
						& Q(shopImagesList__elemMatch={"shopImageStatus": "Approved"}) 
						& Q(documentsList__elemMatch={"documentStatus": "Approved"})) |  (
						Q(userId__in=trueUsersList)
					)
				) & Q(status__nin=[2,6]) & Q(panStatus="Approved") & Q(bankStatus="Approved") & Q(aadharStatus="Approved") &Q(agreementVerificationStatus="Approved") & Q(videoVerificationStatus="Approved")


		user_kycs_queryset = UserKYC.objects(final_kyc_query).order_by("-submittedDate")
		
		return admin_download_merchant_management_excel_reports_data(merchantEmail,user_kycs_queryset)

	except Exception as e:
		app.logger.error(traceback.format_exc())
		return {"responseStatus": 0, "result": "Unable to download merchant management report data!"}
		
def fetching_user_entity_details(user_entity_queryset):
	userEntityDict = {}
	try:
		userEntityDict={
		"id":str(user_entity_queryset.id),
		"entityType":user_entity_queryset.entityType,
		"isIndividual":user_entity_queryset.isIndividual,
		}
		if user_entity_queryset.status==1:
			userEntityDict["actionText"] = "Active"
		else:
			userEntityDict["actionText"] = "Deactive"
	except Exception as e:
		app.logger.error(traceback.format_exc())
	return userEntityDict

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


@user_managements.route("/update_user_kyc_status",methods=["POST","GET"])
@adminid_access_token_required
def update_user_kyc_status():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")
	
	loginBrowser = request.headers.get("Sec-Ch-Ua")
	if loginBrowser:
		loginBrowseData = loginBrowser.split(";")
		browser = loginBrowseData[0]
	else:
		userAgent = request.headers.get("User-Agent")
		loginBrowseData = userAgent.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]
	userKycId = request.args.get("userKycId","")
	remark = request.form.get("remark")

	if userKycId:
		try:
			user_kyc_queryset = UserKYC.objects(id=userKycId,status__nin=[2]).first()
			existing_record = user_kyc_queryset.to_json()
			requestData = [existing_record]
			if user_kyc_queryset:
				admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
				if user_kyc_queryset.status == 0:
					user_kyc_queryset.update(status=1)
					flash("User KYC approved successfully!")
					message=admin_queryset.userName+" "+user_kyc_queryset.userId.fullName+" User KYC activated successfully!"
				elif user_kyc_queryset.status == 1:
					user_kyc_queryset.update(status=0)
					flash("User KYC status set to pending successfully!")
					message=admin_queryset.userName+" "+user_kyc_queryset.userId.fullName+" User KYC deactivated successfully!"
				save_remarks_data=save_admin_remarks_data(userKycId,adminId,remark,"merchantKyc")
				save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_user_kyc_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
				return redirect(url_for("user_managements.pending_users_list"))
			else:
				flash("Invaild user KYC id!!")
				return redirect(url_for("user_managements.pending_users_list"))
		except Exception as e:
			app.logger.error(traceback.format_exc())
			return redirect(url_for("user_managements.pending_users_list"))
	else:
		return redirect(url_for("user_managements.pending_users_list"))


@user_managements.route("/single_view_user", methods=["POST", "GET"])
@adminid_access_token_required
@csrf_protect
def single_view_user():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")
	
	csrf_token = request.form.get("csrf_token")
	
	
	permissionsList = check_permissions(session.get("adminId"),"userManagementPermissions")
	if "view" in permissionsList:
		try:
			userId = request.args.get("userId", "")
			if request.method == "POST":
				userId = request.form.get("userId", "")

			user_queryset = Users.objects(id=userId, status__in=[0,1]).first()
			if not user_queryset:
				flash("Invalid user id!!")
				return redirect(url_for("user_managements.manage_users_list"))

			userDict = fetching_user_details(user_queryset)
			isIndividual = True
			try:
				if (user_queryset.entityTypeId == None) or (user_queryset.entityTypeId.isIndividual == True):
					isIndividual = True
				else:
					isIndividual = False
			except Exception as e:
				isIndividual = True
				
			return render_template("super_admin_templates/single_view_user_details.html",userDict=userDict,isIndividual=isIndividual)

		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch user data!!"
			return redirect(url_for("user_managements.manage_users_list"))
	else:
		flash("The staff member does not have permission to view Merchant details!", "danger")
		return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/update_user_status",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_user_status():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")
	
	csrf_token = request.form.get("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:
		userAgent = request.headers.get("User-Agent")
		loginBrowseData = userAgent.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"),"userManagementPermissions")
	if "edit" in permissionsList:
		userId = request.args.get("userId","")
		remark = request.form.get("remark","")

		if userId and remark:
			try:
				user_queryset = Users.objects(id=userId,status__nin=[2]).first()
				existing_record = user_queryset.to_json()
				requestData = [existing_record]
				if user_queryset:
					admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
					if user_queryset.status == 0:
						user_queryset.update(status=1)
						flash("User approved successfully!")
						message=admin_queryset.userName+" "+user_queryset.fullName+" User approved successfully!"
						save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
					elif user_queryset.status == 1:
						user_queryset.update(status=0)
						flash("User status set to pending successfully!")
						message=admin_queryset.userName+" "+user_queryset.fullName+" User status set to pending successfully!"
						save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_user_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					return redirect(url_for("user_managements.manage_users_list"))
				else:
					flash("Invaild user id!!")
					return redirect(url_for("user_managements.manage_users_list"))
			except Exception as e:
				app.logger.error(traceback.format_exc())
				return redirect(url_for("user_managements.manage_users_list"))
		else:
			return redirect(url_for("user_managements.manage_users_list"))
	else:
		flash("The staff member does not have permission to update User status.", "danger")
		return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/delete_user",methods=["GET","POST"])
@adminid_access_token_required
@csrf_protect
def delete_user():
	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")
		
		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:
			userAgent = request.headers.get("User-Agent")
			loginBrowseData = userAgent.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]
		requestData = [existing_record]
		remark = request.form.get("remark","")

		# if remark and not is_valid_alphanumeric(remark):
		#     flash("Remark contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
		#     return redirect(url_for("user_managements.manage_users_list"))
		#     print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")

		permissionsList = check_permissions(session.get("adminId"),"userManagementPermissions")
		if "delete" in permissionsList:
			if request.method == "POST":
				otp_check_id = request.form.get("otpLogid", "")
				defaultVerificationId = request.form.get("defaultVerificationId", "")
			   
				if not otp_check_id:
					flash("Invalid Request.")
					data_status["responseStatus"]=4
					return data_status
				   
				otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()
				if not otpcheck_queryset:
					flash("Invalid Request.")
				   
					data_status["responseStatus"]=4
					return data_status
				otpcheck_queryset.update(status=2)
				
			userId = request.args.get("userId","")
			user_queryset = Users.objects(id=userId,status__in=[0,1]).first()
			existing_record = user_queryset.to_json()
			
			admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
			user_queryset.update(status=2)
		  
			flash("User deleted successfully!")

			message=admin_queryset.userName+" "+user_queryset.fullName+" User deleted successfully!"
			save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
			save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_user","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
			data_status["responseStatus"]=1
			return data_status
		else:
			flash("The staff member does not have permission to delete User.", "danger")
			data_status["responseStatus"]=4
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to delete user!!")
		data_status["responseStatus"]=4
		return data_status


@user_managements.route("/user_update",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def user_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")
		
		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:
			userAgent = request.headers.get("User-Agent")
			loginBrowseData = userAgent.split(";")
			browser = loginBrowseData[0]

		client_ip=0
		browser=""
		# 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()

		redirectTo = request.args.get("redirectTo","")
		if redirectTo :
			redirectval=redirectTo
		else :
			redirectval ="personalDetails"

		permissionsList = check_permissions(session.get("adminId"),"userManagementPermissions")
		if "edit" in permissionsList:

			userId = request.args.get("userId","")
			print(userId,"(((((UPDATE MERCHANT)))))")
			if request.method == "GET":
				statesList = []
				userEntityList = []
				citiesList = []
				blocksList = []
				pincodesList = []
				profilelList = []
				tenantslList = []
				patternsList = []
				categorysList = []
				subCategorysList = []
				matchultipleAppSitesList = []
				masterIfscBanksList = []
				userDict = {}

				user_queryset = Users.objects(id=userId,status__in=[0,1]).first()

				if not user_queryset:
					flash("Invalid merchant id!!")
					return redirect(url_for("user_managements.manage_users_list"))

				userDict = fetching_user_details(user_queryset)
				print("(((((((userdict)))))))", userDict)

				isIndividual = True
				try:
					if (user_queryset.entityTypeId == None) or (user_queryset.entityTypeId.isIndividual == True):
						isIndividual = True
					else:
						isIndividual = False
				except Exception as e:
					isIndividual = True

				print(isIndividual,"(((((((((((isIndividual)))))))))))")

				user_entities_queryset = UserEntity.objects(status__in=[1]).order_by("-id")

				for each_user_entity in user_entities_queryset:
					userEntityDict = fetching_user_entity_details(each_user_entity)
					userEntityList.append(userEntityDict)

				states_queryset = States.objects(status__in=[1]).order_by("stateName")
				for each_state in states_queryset:
					state_dict = fetching_states_details(each_state)
					statesList.append(state_dict)

				cities_queryset = Cities.objects(status__in=[1],stateId=str(user_queryset.stateId.id)).order_by("cityName")
				for each_city in cities_queryset:
					city_dict = fetching_cities_details(each_city)
					citiesList.append(city_dict)

				blocks_queryset = BlocksPos.objects(status__in=[1],cityId=str(user_queryset.cityId.id)).order_by("-id")
				for each_block in blocks_queryset:
					block_dict = fetching_blocks_details(each_block)
					blocksList.append(block_dict)

				pincodes_queryset = Pincodes.objects(status__in=[1],blockPoId=str(user_queryset.blockPoId.id)).order_by("-id")
				for each_pincode in pincodes_queryset:
					pincode_dict = fetching_pincode_details(each_pincode)
					pincodesList.append(pincode_dict)


				patterns_queryset = Patterns.objects(status__in=[0,1]).order_by("-id").all()
				for each_pattern in patterns_queryset:
					pattern_dict = fetching_pattern_details(each_pattern)
					patternsList.append(pattern_dict)

				sub_merchant_categorys_queryset = MerchantSubCategories.objects(status__in=[0,1]).order_by("-id").all()
				for each_sub_merchant_category in sub_merchant_categorys_queryset:
					sub_merchant_category_dict = fetching_sub_merchant_category_details(each_sub_merchant_category)
					subCategorysList.append(sub_merchant_category_dict)


				merchant_categorys_queryset = MerchantCategories.objects(status__in=[0,1]).order_by("-id").all()
				for each_merchant_category in merchant_categorys_queryset:
					merchant_category_dict = fetching_merchant_category_details(each_merchant_category)
					categorysList.append(merchant_category_dict)

				master_ifsc_banks_queryset = MasterIFSCBank.objects(status__in=[0,1]).order_by("-id").all()
				for each_master_ifsc_bank in master_ifsc_banks_queryset:
					master_ifsc_bank_dict = fetching_master_ifsc_bank_details(each_master_ifsc_bank)
					masterIfscBanksList.append(master_ifsc_bank_dict)
					
				matchultiple_app_sites_queryset = MultipleAppSites.objects(status__in=[0,1]).order_by('-id')
				for each_matchultiple_app_sites in matchultiple_app_sites_queryset:
					matchultiple_app_sites_dict = {
					"id":str(each_matchultiple_app_sites.id),
					"siteCode":each_matchultiple_app_sites.siteCode,
					"siteTitle":each_matchultiple_app_sites.siteTitle
					}
					matchultipleAppSitesList.append(matchultiple_app_sites_dict)


				return render_template("super_admin_templates/update_user_details.html",
					userDict=userDict,
					isIndividual=isIndividual,
					categorysList=categorysList,
					subCategorysList=subCategorysList,
					patternsList=patternsList,
					masterIfscBanksList=masterIfscBanksList,
					tenantslList=tenantslList,
					matchultipleAppSitesList=matchultipleAppSitesList,
					pincodesList=pincodesList,blocksList=blocksList,
					citiesList=citiesList,statesList=statesList,
					userEntityList=userEntityList,
					redirectval=redirectval
					)

			if request.method == "POST":
				# otp_check_id = request.form.get("otpLogid", "")
				# defaultVerificationId = request.form.get("defaultVerificationId")
				# print("otp_check_id",otp_check_id)
				# if not otp_check_id:
				#   flash("Invalid Request.")
				#   return redirect(url_for("user_managements.manage_users_list"))
				# otpcheck_queryset = OtpChecks.objects(adminId=adminId, id=str(otp_check_id), status=1).first()
				# if not otpcheck_queryset:
				#   flash("Invalid Request.")
				#   return redirect(url_for("user_managements.manage_users_list"))
				# # Update OTP status to 2 after verification
				# otpcheck_queryset.update(status=2)

				subForm = request.form.get("subForm", "")
			 
				personal_details_form = AddNewUserForm(request.form, current_id=userId)
				video_form = VideoVerificationDetailsForm(request.form)
				agreement_form = AgreementDocumentForm(request.form)
				id_proof_form = IdProofForm(request.form)
				aadhaar_proof_form = AadhaarProofForm(request.form)
				bank_form = BankVerificationForm(request.form)
				admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
				user_queryset = Users.objects(id=userId).first()
				print(admin_queryset.userName,"((((((((((((((admin_queryset.userName@@@@@@@@@@@@@@@@@@@@))))))))))))))")
				if redirectval == "personalDetails":
					if personal_details_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated personal details of {user_queryset.fullName} successfully!"
						data_status["responseStatus"] = 1
					   
					else:
					  
						data_status["result"] = personal_details_form.errors
						return data_status

				elif subForm == "idProof":
					if id_proof_form.validate_on_submit():
						message= f"{admin_queryset.userName} updated ID proof of {user_queryset.fullName} successfully!"
						data_status["responseStatus"] = 1
						# print("(((((((((((((idproof form)))))))))))))", request.form)
					else:
					   
						data_status["result"] = id_proof_form.errors
						return data_status
					
				elif subForm == "aadhaarProof":
					if aadhaar_proof_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated Aadhaar proof of {user_queryset.fullName} successfully!"
						data_status["responseStatus"] = 1
					  
					else:
					  
						data_status["result"] = aadhaar_proof_form.errors
						return data_status
					
				elif subForm == "bankVerification" :
					if bank_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated Bank details of {user_queryset.fullName} successfully!"
						data_status["responseStatus"] = 1
					  
					else:
					  
						data_status["result"] = bank_form.errors
						return data_status

				elif  redirectval=="videoVerificationDetails":
					if video_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated video verification of {user_queryset.fullName} successfully!"
						data_status["responseStatus"] = 1
					
					else:
						data_status["result"] = video_form.errors
						return data_status
				elif redirectval=="agreementDetails":
					if agreement_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated agreement details of {user_queryset.fullName} successfully!"
						data_status["responseStatus"] = 1
					  
					else:
						data_status["result"] = agreement_form.errors
						return data_status
				else:
					flash("Invalid Request!")
					data_status["responseStatus"] = 4
					return data_status
					
				fullName = request.form.get("fullName","")
				phoneNumber = request.form.get("phoneNumber","")
				email = request.form.get("email","")
				address = request.form.get("address","")
				# siteTitle = request.form.get("siteTitle", "")
				patternId = request.form.get("patternId","")
				entityTypeId = request.form.get("entityTypeId","")
				stateId = request.form.get("stateId","")
				cityId = request.form.get("cityId","")
				blockPoId = request.form.get("blockPoId","")
				pincodeId = request.form.get("pincodeId","")
				businessName = request.form.get("businessName","")
				businessAddress = request.form.get("businessAddress","")
				businessRemark = request.form.get("businessRemark","")
				documentRemark = request.form.get("documentRemark","")
				videoVerificationRemark = request.form.get("videoVerificationRemark","")
				businessStatus = request.form.get("businessStatus","")
				shopVideoStatus = request.form.get("shopVideoStatus","")
				shopRemark = request.form.get("shopRemark","")
				parentId = request.form.get("parentId","")
				# categoryId = request.form.get("categoryId","")
				# subCategoryId = request.form.get("subCategoryId","")
				merchantType = request.form.get("merchantType","")
				maxPayinLimit = request.form.get("maxPayinLimit")
				maxPayoutLimit = request.form.get("maxPayoutLimit")
				remark = request.form.get("remark")
				jsonData = request.form.to_dict(flat=True)

				# if not validate_password(password):
				#     flash("Password must be 8-30 characters long, include at least one uppercase letter, one lowercase letter, one number, and one special character.")
				#     return redirect(url_for("user_managements.manage_users_list"))


				try:
					existing_record = ""
					user_queryset = Users.objects(id=userId, status__in=[0,1]).first()
					existing_record = user_queryset.to_json()
					
					# message=admin_queryset.userName+" "+fullName+" User updated successfully!"
					requestData=[existing_record]
					updatedrequestData=[jsonData]
					save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"user_update","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
					if not user_queryset:
						flash("Invalid user id!!")
						return redirect(url_for("user_managements.manage_users_list"))

					if fullName:
						user_queryset.update(fullName=fullName)

					if phoneNumber:
						user_queryset.update(phoneNumber=phoneNumber)

					if email:
						user_queryset.update(email=email)

					if address:     
						user_queryset.update(address=address)

					# if siteTitle:
					#     user_queryset.update(siteTitle=siteTitle)
					if merchantType:
						user_queryset.update(merchantType=merchantType)
					if patternId:
						user_queryset.update(patternId = ObjectId(patternId))
					if entityTypeId:
						user_queryset.update(entityTypeId = ObjectId(entityTypeId))
					if stateId:
						user_queryset.update(stateId = ObjectId(stateId))
					if cityId:
						user_queryset.update(cityId = ObjectId(cityId))
					if blockPoId:
						user_queryset.update(blockPoId = ObjectId(blockPoId))
					if pincodeId:
						user_queryset.update(pincodeId = ObjectId(pincodeId))
					if parentId:
						user_queryset.update(parentId = ObjectId(parentId))
					# if categoryId:
					#     user_queryset.update(categoryId = ObjectId(categoryId))
					# if subCategoryId:
					#     user_queryset.update(subCategoryId = ObjectId(subCategoryId))
					if maxPayinLimit:
						user_queryset.update(maxPayinLimit=maxPayinLimit)
					if maxPayoutLimit:
						user_queryset.update(maxPayoutLimit=maxPayoutLimit)

					if remark:
						user_queryset.update(remark=remark)
					

					if userId:
						panName = request.form.get("panName","")
						panNumber = request.form.get("panNumber","")
						panStatus = request.form.get("panStatus","")
						panDocument = request.files.get("panDocument","")
						bankId = request.form.get("bankId","")
						bankAccountNumber = request.form.get("bankAccountNumber","")
						bankStatus = request.form.get("bankStatus","")
						ifscCode = request.form.get("ifscCode","")
						aadharName = request.form.get("aadharName","")
						aadharNumber = request.form.get("aadharNumber","")
						aadharStatus = request.form.get("aadharStatus","")
						aadharDocument = request.files.get("aadharDocument","")
						aadharBackDocument = request.files.get("aadharBackDocument","")
						uploadVideo = request.files.get("uploadVideo","")
						videoVerificationStatus = request.form.get("videoVerificationStatus","")
						panReason = request.form.get("panReason","")
						bankReason = request.form.get("bankReason","")
						aadharReason = request.form.get("aadharReason","")
						videoVerificationReason = request.form.get("videoVerificationReason","")
						agreementVerificationReason = request.form.get("agreementVerificationReason","")
						agreementVerificationStatus = request.form.get("agreementVerificationStatus","")
						remark = request.form.get("remark","")
						shopVideoStatus = request.form.get("shopVideoStatus","")
						shopRemark = request.form.get("shopRemark","")

						companyRegistrationDoc = request.files.get("companyRegistrationDoc","")
						companyRegistrationStatus = request.form.get("companyRegistrationStatus","")
						moaDoc = request.files.get("moaDoc","")
						moaStatus = request.form.get("moaStatus","")
						aoaDoc = request.files.get("aoaDoc","")
						aoaStatus = request.form.get("aoaStatus","")
						companyPanDoc = request.files.get("companyPanDoc","")
						companyPanStatus = request.form.get("companyPanStatus","")

						directorName = request.form.getlist("directorName[]")
						directorPanName = request.form.getlist("directorPanName[]")
						directorPanNumber = request.form.getlist("directorPanNumber[]")
						directorPanStatus = request.form.getlist("directorPanStatus[]")
						directorPanImage = request.form.getlist("directorPanImage[]")
						directorAadharName = request.form.getlist("directorAadharName[]")
						directorAadharNumber = request.form.getlist("directorAadharNumber[]")
						directorAadharStatus = request.form.getlist("directorAadharStatus[]")
						directorAadharImage = request.form.getlist("directorAadharImage[]")

						boardOfDirectors = [
							{
								"directorName": directorName,
								"directorPanName": directorPanName,
								"directorPanNumber": directorPanNumber,
								"directorPanStatus": directorPanStatus,
								"directorPanImage": directorPanImage,
								"directorAadharName": directorAadharName,
								"directorAadharNumber": directorAadharNumber,
								"directorAadharStatus": directorAadharStatus,
								"directorAadharImage": directorAadharImage
							} 
							for directorName, directorPanName, directorPanNumber, directorPanStatus, directorPanImage, directorAadharName, directorAadharNumber, directorAadharStatus, directorAadharImage 
							in zip(directorName, directorPanName, directorPanNumber, directorPanStatus, directorPanImage, directorAadharName, directorAadharNumber, directorAadharStatus, directorAadharImage)
						]

						print(boardOfDirectors, "((((((((((((((((boardOfDirectors))))))))))))))))")

						user_kyc_queryset = UserKYC.objects(userId=userId, status__in=[0,1]).first()
						if user_kyc_queryset:
							save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,remark,"merchantKyc")
							if panName:
								user_kyc_queryset.update(panName=panName)
							if panNumber:
								user_kyc_queryset.update(panNumber=panNumber)
							# if siteTitle:
							#     user_kyc_queryset.update(siteTitle=siteTitle)

							if panStatus:
								if panReason:
									save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,panReason,"merchantKyc")
								user_kyc_queryset.update(panStatus=panStatus,panReason=panReason)

							if bankId:
								user_kyc_queryset.update(bankId=ObjectId(bankId))
							if bankAccountNumber:
								user_kyc_queryset.update(bankAccountNumber=bankAccountNumber)

							if bankStatus:
								if bankReason:
									save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,bankReason,"merchantKyc")
								user_kyc_queryset.update(bankStatus=bankStatus,bankReason=bankReason)

							if businessName:
								user_kyc_queryset.update(businessName=businessName)

							if businessAddress:
								user_kyc_queryset.update(businessAddress=businessAddress)

							# if businessRemark:
							#     user_kyc_queryset.update(businessRemark=businessRemark)

							if documentRemark:
								user_kyc_queryset.update(documentRemark=documentRemark)

							# if videoVerificationRemark:
							#     user_kyc_queryset.update(videoVerificationRemark=videoVerificationRemark)

							if businessStatus:
								if businessRemark:
									user_kyc_queryset.update(businessStatus=businessStatus,businessRemark=businessRemark)
								
							if aadharName:
								user_kyc_queryset.update(aadharName=aadharName)
							if ifscCode:
								user_kyc_queryset.update(ifscCode=ifscCode)
							if aadharNumber:
								user_kyc_queryset.update(aadharNumber=aadharNumber)

							if aadharStatus:
								if aadharReason:
									save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,aadharReason,"merchantKyc")
								user_kyc_queryset.update(aadharStatus=aadharStatus,aadharReason=aadharReason)

							if videoVerificationStatus:
								if videoVerificationRemark:
									user_kyc_queryset.update(videoVerificationStatus=videoVerificationStatus,videoVerificationRemark=videoVerificationRemark)

							# if panReason:
							#     user_kyc_queryset.update(panReason=panReason)
							#     save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,panReason,"merchantKyc")

							# if bankReason:
							#     user_kyc_queryset.update(bankReason=bankReason)
							#     save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,bankReason,"merchantKyc")

							# if aadharReason:
							#     user_kyc_queryset.update(aadharReason=aadharReason)
							#     save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,aadharReason,"merchantKyc")

							if videoVerificationReason:
								user_kyc_queryset.update(videoVerificationReason=videoVerificationReason)
								save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,videoVerificationReason,"merchantKyc")

							# if agreementVerificationReason:
							#     user_kyc_queryset.update(agreementVerificationReason=agreementVerificationReason)
							#     save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,agreementVerificationReason,"merchantKyc")

							if agreementVerificationStatus:
								if agreementVerificationReason:
									save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,agreementVerificationReason,"merchantKyc")
									
								user_kyc_queryset.update(agreementVerificationStatus=agreementVerificationStatus,agreementVerificationReason=agreementVerificationReason)

							if companyRegistrationStatus:
								user_kyc_queryset.update(companyRegistrationStatus=companyRegistrationStatus)

							if moaStatus:
								user_kyc_queryset.update(moaStatus=moaStatus)

							if aoaStatus:
								user_kyc_queryset.update(aoaStatus=aoaStatus)

							if companyPanStatus:
								user_kyc_queryset.update(companyPanStatus=companyPanStatus)

							if shopVideoStatus:
								if shopVideoStatus == "Rejected":
									user_kyc_queryset.update(shopVideo=None)
								user_kyc_queryset.update(shopVideoStatus=shopVideoStatus)

							if shopRemark:
								user_kyc_queryset.update(shopRemark=shopRemark)

							if companyRegistrationDoc:
								randomNumber = str(random_digit_generate(6))
								pdfFile = upload_pdf_file("companyRegistrationDocs", randomNumber, ".pdf", companyRegistrationDoc)
								if pdfFile:
									user_kyc_queryset.update(companyRegistrationDoc=pdfFile)

							if moaDoc:
								randomNumber = str(random_digit_generate(6))
								pdfFile = upload_pdf_file("moaDocs", randomNumber, ".pdf", moaDoc)
								if pdfFile:
									user_kyc_queryset.update(moaDoc=pdfFile)


							if aoaDoc:
								randomNumber = str(random_digit_generate(6))
								pdfFile = upload_pdf_file("aoaDocs", randomNumber, ".pdf", aoaDoc)
								if pdfFile:
									user_kyc_queryset.update(aoaDoc=pdfFile)

							if companyPanDoc:
								randomNumber = str(random_digit_generate(6))
								if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/")):
									os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/"))
								save_file = companyPanDoc.save(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/"+str(randomNumber)+".png"))
								user_kyc_queryset.update(companyPanDoc="media/companyPanDocs/"+str(randomNumber)+".png")

							if panDocument:
								randomNumber = str(random_digit_generate(6))
								if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/")):
									os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/"))
								save_file = panDocument.save(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/"+str(randomNumber)+".png"))
								user_kyc_queryset.update(panDocument="media/panDocuments/"+str(randomNumber)+".png")

							if aadharDocument:
								randomNumber = str(random_digit_generate(6))
								if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/")):
									os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"))
								save_file = aadharDocument.save(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"+str(randomNumber)+".png"))
								user_kyc_queryset.update(aadharDocument="media/aadharDocuments/"+str(randomNumber)+".png")

							if aadharBackDocument:
								randomNumber = str(random_digit_generate(6))
								if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/")):
									os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"))
								save_file = aadharBackDocument.save(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"+str(randomNumber)+".png"))
								user_kyc_queryset.update(aadharBackDocument="media/aadharDocuments/"+str(randomNumber)+".png")
						
							if uploadVideo:
								randomNumber = str(random_digit_generate(6))
								video_file = upload_file_video("uploadKYCVideos", str(randomNumber), ".mp4", uploadVideo)
								if video_file:
									user_kyc_queryset.update(uploadVideo=video_file)
						else:
							user_kyc_table = UserKYC(
								userId=userId,
								panName = panName,
								panNumber  = panNumber,
								panStatus  = panStatus,
								bankId  = bankId,
								bankAccountNumber  = bankAccountNumber,
								bankStatus  = bankStatus,
								ifscCode  = ifscCode,
								aadharName  = aadharName,
								aadharNumber  = aadharNumber,
								aadharStatus  = aadharStatus,
								videoVerificationStatus  = videoVerificationStatus,
								panReason = panReason,
								bankReason = bankReason,
								aadharReason = aadharReason,
								videoVerificationReason = videoVerificationReason,
								agreementVerificationReason=agreementVerificationReason,
								agreementVerificationStatus = agreementVerificationStatus,
								companyRegistrationStatus = companyRegistrationStatus,
								moaStatus = moaStatus,
								aoaStatus = aoaStatus,
								businessName = businessName,
								businessAddress = businessAddress,
								businessRemark = businessRemark,
								documentRemark=documentRemark,
								videoVerificationRemark=videoVerificationRemark,
								businessStatus = businessStatus,
								companyPanStatus = companyPanStatus,
								shopVideoStatus = shopVideoStatus,
								shopRemark = shopRemark,
								createdOn =datetime.datetime.now(),
								status = 1
								)
							save_table = user_kyc_table.save()

							if panReason:
								save_remarks_data=save_admin_remarks_data(str(save_table.id),adminId,panReason,"merchantKyc")
							if bankReason:
								save_remarks_data=save_admin_remarks_data(str(save_table.id),adminId,bankReason,"merchantKyc")
							if aadharReason:
								save_remarks_data=save_admin_remarks_data(str(save_table.id),adminId,aadharReason,"merchantKyc")
							if videoVerificationReason:
								save_remarks_data=save_admin_remarks_data(str(save_table.id),adminId,videoVerificationReason,"merchantKyc")
							if agreementVerificationReason:
								save_remarks_data=save_admin_remarks_data(str(save_table.id),adminId,agreementVerificationReason,"merchantKyc")

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

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

							if aadharBackDocument:
								if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/")):
									os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"))
								save_file = aadharBackDocument.save(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"+str(get_epoch_milli_time())+".png"))
								save_table.update(aadharBackDocument="media/aadharDocuments/"+str(get_epoch_milli_time())+".png")
							if uploadVideo:
								video_file = upload_file_video("uploadKYCVideos", str(get_epoch_milli_time()), ".mp4", uploadVideo)
								if video_file:
									save_table.update(uploadVideo=video_file)

							if companyRegistrationDoc:
								randomNumber = str(random_digit_generate(6))
								pdfFile = upload_pdf_file("companyRegistrationDocs", randomNumber, ".pdf", companyRegistrationDoc)
								if pdfFile:
									save_table.update(companyRegistrationDoc=pdfFile)

							if moaDoc:
								randomNumber = str(random_digit_generate(6))
								pdfFile = upload_pdf_file("moaDocs", randomNumber, ".pdf", moaDoc)
								if pdfFile:
									save_table.update(moaDoc=pdfFile)


							if aoaDoc:
								randomNumber = str(random_digit_generate(6))
								pdfFile = upload_pdf_file("aoaDocs", randomNumber, ".pdf", aoaDoc)
								if pdfFile:
									save_table.update(aoaDoc=pdfFile)

							if companyPanDoc:
								randomNumber = str(random_digit_generate(6))
								if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/")):
									os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/"))
								save_file = companyPanDoc.save(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/"+str(randomNumber)+".png"))
								save_table.update(companyPanDoc="media/companyPanDocs/"+str(randomNumber)+".png")

					flash("Merchant details updated successfully!")
					data_status["responseStatus"] = 1
					return data_status
				except Exception as e:
					flash("Unable to update merchant details!!")
					app.logger.error(traceback.format_exc())
					return redirect(url_for("user_managements.manage_users_list"))
				# else:
				#     flash("Required fields are missing!!")
				#     return redirect(url_for("user_managements.manage_users_list"))
		else:
			flash("The staff member does not have permission to update Merchant details.", "danger")
			return redirect(url_for("user_managements.manage_users_list"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to update merchant details!!"
		return render_template("super_admin_templates/user_managements_list.html",error=error)

@user_managements.route("/pending_users_list", methods=["POST", "GET"])
@adminid_access_token_required
def pending_users_list():
	pagination = None  # Initialize pagination at the start
	userKycList = []   # Initialize userKycList at the start
	start=0
	parentsList = []
	patternsList = []
	siteTitleList = []
	matchultipleAppSitesList = []
	statesList = []
	stateId=None
	form=PendingKycSearchForm(request.args)
	try:
		print(request.headers,"request.headers")
		if not session.get("adminId"):
			return redirect("admin_login")
		
		permissionsList = check_permissions(session.get("adminId"), "pendingKYCUsersPermissions")
		if "view" in permissionsList:
			adminId = session.get("adminId")
		
			merchantEmail = request.args.get('merchantEmail', '')
			merchantName = request.args.get('merchantName', '')
			merchantPhone = request.args.get('merchantPhone', '')
			merchantId = request.args.get('merchantId', '')
			merchantType = request.args.get('merchantType','')
			patternId = request.args.get('patternId','')
			parentId = request.args.get('parentId','')
			siteTitle = request.args.get('siteTitle','')
   
			kycStatus = request.args.get('kycStatus','All')
			stateId = request.args.get("stateId")
			
			
			page = request.args.get(get_page_parameter(), type=int, default=1)
			per_page = 20
			start = (page - 1) * per_page
			snoCount = int(start)
			users_queryset = Users.objects(status__nin=[2, 6,3])
			total_count=0

			if form.validate():

				kycUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId != None) and (each_user.entityTypeId.isIndividual == False)]
				trueUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId == None) or (each_user.entityTypeId.isIndividual == True)]

				# Step 1: Common status filter
				pending_kyc_initial_query = Q(status__nin=[2, 6,3])

				# Step 2: Main KYC logic
				kyc_filter = (
					Q(userId__in=kycUsersList) & (
						Q(documentsList=[]) |
						Q(documentsList=None) |
						Q(shopImagesList=[]) |
						Q(shopImagesList=None) |
						Q(shopImagesList__elemMatch={"shopImageStatus": {"$ne": "Approved"}}) |
						Q(documentsList__elemMatch={"documentStatus": {"$ne": "Approved"}}) |
						Q(businessStatus__ne="Approved") |
						Q(panStatus__ne="Approved") |
						Q(bankStatus__ne="Approved") |
						Q(aadharStatus__ne="Approved") |
						Q(agreementVerificationStatus__ne="Approved") |
						Q(videoVerificationStatus__ne="Approved") |
						Q(shopVideoStatus__ne="Approved")
					)
				) | (
					Q(userId__in=trueUsersList) & (
						Q(panStatus__ne="Approved") |
						Q(bankStatus__ne="Approved") |
						Q(aadharStatus__ne="Approved") |
						Q(agreementVerificationStatus__ne="Approved") |
						Q(videoVerificationStatus__ne="Approved")
					)
				)
				user_kycs_queryset = UserKYC.objects(pending_kyc_initial_query & kyc_filter).order_by("-submittedDate")

				parents_queryset = user_kycs_queryset

				query = Q()

				if merchantName:
				  
					query &= Q(fullName__icontains=merchantName)

				if merchantId:
				
					query &= Q(merchantUniqueNumber__icontains=merchantId)

				if merchantEmail:
				   
					query &= Q(email__icontains=merchantEmail)

				if merchantPhone:
				  
					query &= Q(phoneNumber__icontains=merchantPhone)

				if merchantType:
				 
					query &= Q(merchantType__icontains=merchantType)

				if parentId:
					query &= Q(patternId__icontains=parentId)

				if siteTitle:
					query &= Q(siteTitle__icontains=siteTitle)

				if stateId:
					query &= Q(stateId__icontains=stateId)
				

				user_ids = Users.objects(query).values_list('id')

				##### to apply above user ids  filter
				users_query_filter = Q(userId__in=user_ids)

				### for total count
				total_count = UserKYC.objects(pending_kyc_initial_query & kyc_filter & users_query_filter).count()

				if kycStatus:
					user_kycs_queryset = UserKYC.objects(pending_kyc_initial_query & kyc_filter & users_query_filter).order_by("-submittedDate")
				else:
					user_kycs_queryset = UserKYC.objects(pending_kyc_initial_query & kyc_filter & users_query_filter).order_by("-submittedDate").limit(per_page).skip(start)

				# total_count=user_kycs_queryset.count()
				# limited_users=user_kycs_queryset.filter().limit(per_page).skip(start)
				
				for each_user_entity in user_kycs_queryset:
					userKycDict = fetching_user_kyc_details(each_user_entity)
					# snoCount += 1
					# userKycDict["snoCount"] = snoCount
					userKycList.append(userKycDict)
				if kycStatus:
					userKycList = sorted(userKycList, key=lambda x: x["kycStatus"] != kycStatus)
					end = min(start + per_page, total_count)
					userKycList = userKycList[start:end]

				multiple_app_sites_queryset = MultipleAppSites.objects(status__in=[0,1]).only('siteTitle', 'siteCode').order_by("-id").all()
				siteTitleList =  list(multiple_app_sites_queryset)
				
				matchultiple_app_sites_queryset = MultipleAppSites.objects(status__in=[0,1]).order_by('-id')
				for each_matchultiple_app_sites in matchultiple_app_sites_queryset:
					matchultiple_app_sites_dict = {
					"id":str(each_matchultiple_app_sites.id),
					"siteTitle":each_matchultiple_app_sites.siteTitle
					}
					matchultipleAppSitesList.append(matchultiple_app_sites_dict)
				
				states_queryset = States.objects(status__in=[1]).only('id', 'stateName').order_by("stateName")
				statesList =  list(states_queryset)

				parentIds = set()
				
				for each_parent in parents_queryset:
					parent_dict = fetching_user_details_by_kyc(each_parent)
					if  parent_dict["parentId"] is not None and parent_dict["parentId"] not in parentIds and  len(parent_dict["parentId"]):
						parentIds.add(parent_dict["parentId"])
						parentsList.append(parent_dict)
			else:
				print("form errors",form.errors)

			pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="UserKYC")

			return render_template("super_admin_templates/pending_user_list.html",
								   pagination=pagination,
								   merchantName=merchantName,
								   merchantEmail=merchantEmail,
								   merchantPhone=merchantPhone,
								   merchantId=merchantId,
								   userKycList=userKycList,
								   start=start,
								   parentsList = parentsList,
								   siteTitleList = siteTitleList,
								   matchultipleAppSitesList = matchultipleAppSitesList,
								   parentId = parentId,
								   patternId = patternId,
								   merchantType = merchantType,
								   siteTitle = siteTitle,
								   kycStatus=kycStatus,
								   statesList = statesList,
								   stateId = stateId,
								   snoCount=snoCount,
								   form=form
								   )
		else:
			flash("The staff member does not have permission to view Pending KYC.", "danger")
			return render_template("super_admin_templates/pending_user_list.html")
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to fetch pending merchants data!!"
		return render_template("super_admin_templates/pending_user_list.html", 
			pagination=pagination,  # This will be None if the try block fails
			error=error,
			start=start,
			userKycList=userKycList,  # Pass the empty list
			statesList = statesList,
			stateId = stateId,
			form=form,
			snoCount=snoCount,
		)


def admin_download_pending_kyc_excel_reports_data(merchantEmail,user_kycs_queryset):
	relative_temp_excel_file_name = ""
	try:
		fileName = "pending_kyc.xlsx"

		pending_kyc_data = {
			"MerchantId": [],
			"Site Title":[],
			"User Name": [],
			"Parent Name": [],  # Fixed inconsistent key name
			"Merchant Type": [],
			"Mobile": [],
			"Email": [],
			"KYC Status": [],
			"Submission Date": [],
			"State":[],
			
		}
		for each_record in user_kycs_queryset:
			pending_kyc_data["MerchantId"].append(each_record.userId.merchantUniqueNumber)
			pending_kyc_data["Site Title"].append(each_record.userId.siteTitle)
			pending_kyc_data["User Name"].append(each_record.userId.fullName)
		   
			try:
				if each_record.userId.parentId:
					pending_kyc_data["Parent Name"].append(each_record.userId.parentId.fullName)
				else:
					pending_kyc_data["Parent Name"].append("N/A")
			except Exception as e:
				pending_kyc_data["Parent Name"].append("N/A")

			pending_kyc_data["Merchant Type"].append(each_record.userId.merchantType)
			pending_kyc_data["Mobile"].append(each_record.userId.phoneNumber)
			pending_kyc_data["Email"].append(each_record.userId.email)
			# pending_kyc_data["KYC Status"].append(each_record.status)
			pending_kyc_data["Submission Date"].append(each_record.createdOn)
			pending_kyc_data["State"].append(each_record.userId.stateId.stateName)

			kycStatusList = []
			kycStatusList = [
			each_record.panStatus,
			each_record.bankStatus,
			each_record.aadharStatus,
			each_record.videoVerificationStatus,
			each_record.agreementVerificationStatus
			]

			if any(status == "Rejected" for status in kycStatusList):
				pending_kyc_data["KYC Status"].append("Rejected")
			elif all(status == "Pending" for status in kycStatusList):
				pending_kyc_data["KYC Status"].append("Pending")
			elif all(status == "Approved" for status in kycStatusList):
				pending_kyc_data["KYC Status"].append("Approved")
			elif any(status == "Pending" for status in kycStatusList):
				pending_kyc_data["KYC Status"].append("Processing")
			else:
				pending_kyc_data["KYC Status"].append("Submitted")

		# Create DataFrame
		df = pd.DataFrame(pending_kyc_data)

		# Define file path
		base_dir = os.path.join(app.config['SITE_ROOT'], "media/pending_kyc_list", "pendingkyc")
		os.makedirs(base_dir, exist_ok=True)

		relative_temp_excel_file_name = os.path.join("media/pending_kyc_list", "pendingkyc", fileName)
		full_file_name = os.path.join(app.config['SITE_ROOT'], relative_temp_excel_file_name)

		# Save DataFrame to Excel
		df.to_excel(full_file_name, index=False)

		# Send the file as a downloadable attachment
		response = send_file(
			full_file_name,
			mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
			download_name=fileName,
			as_attachment=True
		)

		return response
	except Exception as e:
		app.logger.error(traceback.format_exc())
		return {"error": "Unable to generate the report"}
		
@user_managements.route("/admin_download_pending_kyc_excel_reports", methods=["POST", "GET"])
@adminid_access_token_required
def admin_download_pending_kyc_excel_reports():
	try:
		merchantId = request.args.get("merchantId", "")
		merchantEmail = request.args.get("merchantEmail", "")
		merchantName = request.args.get("merchantName", "")
		merchantPhone = request.args.get("merchantPhone", "")
		parentId = request.args.get("parentId","")
		merchantType = request.args.get("merchantType","")
		siteTitle = request.args.get("siteTitle","")
		stateId = request.args.get("stateId","")

		users_queryset = Users.objects(status__ne=2)
		kycUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId != None) and (each_user.entityTypeId.isIndividual == False)]
		trueUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId == None) or (each_user.entityTypeId.isIndividual == True)]

		print(kycUsersList, "(((((kycUsersList)))))")
		print(trueUsersList, "(((((trueUsersList)))))")

		# Base query for UserKYC
		user_kycs_queryset = UserKYC.objects(status__nin=[2]).order_by("-submittedDate")

		 
		user_kycs_queryset = user_kycs_queryset.filter(
			(Q(userId__in=kycUsersList) & (Q(documentsList=[]) | Q(shopImagesList=[]) | Q(documentsList=None) | Q(shopImagesList=None) | Q(shopImagesList__elemMatch={"shopImageStatus": {"$ne": "Approved"}}) | Q(documentsList__elemMatch={"documentStatus": {"$ne": "Approved"}}) | Q(businessStatus__ne="Approved")  | Q(panStatus__ne="Approved") | Q(bankStatus__ne="Approved") | Q(aadharStatus__ne="Approved") | Q(agreementVerificationStatus__ne="Approved") | Q(videoVerificationStatus__ne="Approved") | Q(shopVideoStatus__ne="Approved"))) |
			(Q(userId__in=trueUsersList) & (Q(panStatus__ne="Approved") | Q(bankStatus__ne="Approved") | Q(aadharStatus__ne="Approved") | Q(agreementVerificationStatus__ne="Approved") | Q(videoVerificationStatus__ne="Approved")))
		)

		query = Q()

		if merchantName:
			query &= Q(fullName__icontains=merchantName)

		if merchantId:
	   
			query &= Q(merchantUniqueNumber__icontains=merchantId)

		if merchantEmail:
			query &= Q(email__icontains=merchantEmail)

		if merchantPhone:
			query &= Q(phoneNumber__icontains=merchantPhone)

		if merchantType:
			query &= Q(merchantType__icontains=merchantType)

		if parentId:
			query &= Q(patternId__icontains=parentId)

		if siteTitle:
			query &= Q(siteTitle__icontains=siteTitle)

		if stateId:
			query &= Q(stateId__icontains=stateId)

		pending_kyc_initial_query = Q(status__nin=[2, 6])
		  
		user_ids = Users.objects(query).values_list('id')
	
		kyc_filter = (
					Q(userId__in=kycUsersList) & (
						Q(documentsList=[]) |
						Q(documentsList=None) |
						Q(shopImagesList=[]) |
						Q(shopImagesList=None) |
						Q(shopImagesList__elemMatch={"shopImageStatus": {"$ne": "Approved"}}) |
						Q(documentsList__elemMatch={"documentStatus": {"$ne": "Approved"}}) |
						Q(businessStatus__ne="Approved") |
						Q(panStatus__ne="Approved") |
						Q(bankStatus__ne="Approved") |
						Q(aadharStatus__ne="Approved") |
						Q(agreementVerificationStatus__ne="Approved") |
						Q(videoVerificationStatus__ne="Approved") |
						Q(shopVideoStatus__ne="Approved")
					)
				) | (
					Q(userId__in=trueUsersList) & (
						Q(panStatus__ne="Approved") |
						Q(bankStatus__ne="Approved") |
						Q(aadharStatus__ne="Approved") |
						Q(agreementVerificationStatus__ne="Approved") |
						Q(videoVerificationStatus__ne="Approved")
					)
				)
		user_kycs_queryset = UserKYC.objects(pending_kyc_initial_query & kyc_filter).order_by("-submittedDate")

		users_query_filter = Q(userId__in=user_ids)

		user_kycs_queryset = UserKYC.objects(pending_kyc_initial_query & kyc_filter & users_query_filter).order_by("-submittedDate")

		return admin_download_pending_kyc_excel_reports_data(merchantEmail,user_kycs_queryset)

	except Exception as e:
		app.logger.error(traceback.format_exc())
		return {"responseStatus": 0, "result": "Unable to download pending kyc report data!"}
		




# def generate_pendingkyc_otp_helper():
#     response = {"responseStatus": 0, "result": "", "otpCheckId": ""}

#     try:
#         user_email = request.form.get("email") or session.get("user_email")
		
#         if not user_email:
#             return {"responseStatus": 0, "result": "User email not found!"}

#         otp_code = random.randint(100000, 999999)

#         # Save OTP record in the database
#         otp_record = OtpChecks(
#             emailId=user_email,
#             otpCode=str(otp_code),
#             attempts=0,
#             status=0,
#             createdOn=datetime.datetime.now()
#         ).save()

#         # Prepare and send the OTP email
#         mail_subject = "OTP Verification Code"
#         template_name = "emails/generate_verify_otp.html"
#         mail_data = {"otpCode": str(otp_code), "userName": user_email.split("@")[0]}  # Using email prefix as name

#         send_asynchronous_email(mail_subject, [user_email], template_name, mail_data)

#         response.update({
#             "responseStatus": 1,
#             "otpCheckId": str(otp_record.id),
#             "otpCode": otp_code,
#             "result": f"OTP sent to {user_email}."
#         })
#         return response

#     except Exception as e:
#         response["result"] = f"Error generating OTP: {str(e)}"
#         return response


@user_managements.route("/user_kyc_update",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def user_kyc_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")
		
		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:
			userAgent = request.headers.get("User-Agent")
			loginBrowseData = userAgent.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()

		redirectTo = request.args.get("redirectTo","")
		if redirectTo :
			redirectval=redirectTo
		else :
			redirectval ="personalDetails"

		message =""
		permissionsList = check_permissions(session.get("adminId"),"pendingKYCUsersPermissions")
		if "edit" in permissionsList:
			userKycId = request.args.get("userKycId","")
			print(userKycId,"(((((((((((((((((((((userKycId GET)))))))))))))))))))))")
			if request.method == "GET":
				statesList = []
				userEntityList = []
				citiesList = []
				blocksList = []
				pincodesList = []
				profilelList = []
				tenantslList = []
				masterIfscBanksList = []
				matchultipleAppSitesList = []
				userKycDict = {}

				user_kyc_queryset = UserKYC.objects(id=userKycId, status__nin=[2,3]).first()
				if not user_kyc_queryset:
					flash("Invalid merchant kyc id!!")
					return redirect(url_for("user_managements.pending_users_list"))


				master_ifsc_banks_queryset = MasterIFSCBank.objects(status__in=[0,1]).order_by("-id").all()
				for each_master_ifsc_bank in master_ifsc_banks_queryset:
					master_ifsc_bank_dict = fetching_master_ifsc_bank_details(each_master_ifsc_bank)
					masterIfscBanksList.append(master_ifsc_bank_dict)

				userKycDict = fetching_user_kyc_details(user_kyc_queryset)

				try:
					if user_kyc_queryset.userId.agreementDocument:
						userKycDict["agreementDocument"]=domain+user_kyc_queryset.userId.agreementDocument
					else:
						userKycDict["agreementDocument"]=""
				except Exception as e:
					userKycDict["agreementDocument"]=""
				
				# try:
				#     if user_kyc_queryset.documentsList:
				#         userKycDict["documentsList"] =user_kyc_queryset.documentsList
				#     else:
				#         userKycDict["documentsList"] = []
				# except Exception as e:
				#     userKycDict["documentsList"] = []


				# # print(userKycDict["documentsList"],"DOCUMENT LIST FOR API")

				# try:
				#     if user_kyc_queryset.userId.shopImagesList:
				#         userKycDict["shopImagesList"] =user_kyc_queryset.userId.shopImagesList
				#     else:
				#         userKycDict["shopImagesList"] = []
				# except Exception as e:
				#     userKycDict["shopImagesList"] = []
				
				userKycDict["businessName"] = user_kyc_queryset.businessName
				userKycDict["businessAddress"] = user_kyc_queryset.businessAddress
				userKycDict["businessRemark"] = user_kyc_queryset.businessRemark
				userKycDict["businessStatus"] = user_kyc_queryset.businessStatus
				userKycDict["documentRemark"] = user_kyc_queryset.documentRemark
				userKycDict["videoVerificationRemark"] = user_kyc_queryset.videoVerificationRemark
				
				userKycDict["shopVideo"] = user_kyc_queryset.shopVideo
				userKycDict["shopImagesList"] = user_kyc_queryset.shopImagesList
				userKycDict["documentsList"] = user_kyc_queryset.documentsList
				userKycDict["shopRemark"] = user_kyc_queryset.shopRemark
				userKycDict["agreementVerificationReason"] = user_kyc_queryset.agreementVerificationReason


				isIndividual = True
				try:
					if (user_kyc_queryset.userId.entityTypeId == None) or  (user_kyc_queryset.userId.entityTypeId.isIndividual == True):
						isIndividual = True
					else:
						isIndividual = False
				except Exception as e:
					isIndividual = True
				return render_template("super_admin_templates/update_user_kyc_details.html",
					userKycDict=userKycDict,masterIfscBanksList=masterIfscBanksList,isIndividual=isIndividual,redirectval=redirectval
					)

			if request.method == "POST":
				subForm = request.form.get("subForm", "")

				
				personal_details_form = PersonalDetails(request.form)
				bussiness_form = BussinessForm(request.form)
				shop_video_form = ShopVideoForm(request.form)
				id_proof_form = IdProofForm(request.form)
				aadhaar_proof_form = AadhaarProofForm(request.form)
				bank_form = BankVerificationForm(request.form)
				agreement_form = AgreementDocumentForm(request.form)
				video_form = VideoVerificationForm(request.form)

				admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
				user_kyc_queryset = UserKYC.objects(id=userKycId, status__in=[0,1]).first()
				user_queryset = Users.objects(id=str(user_kyc_queryset.userId.id)).first()
				userId=str(user_queryset.id)

				if redirectval == "personalDetails":
					if personal_details_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated kyc personal details of {user_kyc_queryset.userId.fullName} successfully!"
						data_status["responseStatus"] = 1
					else:
						data_status["result"] = personal_details_form.errors
						return data_status
					
				elif subForm == "bussiness":
					if bussiness_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated kyc business details of {user_kyc_queryset.userId.fullName} successfully!"
						data_status["responseStatus"] = 1
					else:
						data_status["result"] = bussiness_form.errors
						return data_status
					
				elif subForm == "shop_video":
					if shop_video_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated kyc shop video of {user_kyc_queryset.userId.fullName} successfully!"
						data_status["responseStatus"] = 1
					else:
						data_status["result"] = shop_video_form.errors
						return data_status

				elif subForm == "idProof":
					if id_proof_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated kyc ID proof of {user_kyc_queryset.userId.fullName} successfully!"
						data_status["responseStatus"] = 1
					else:
						data_status["result"] = id_proof_form.errors
						return data_status
				
				elif subForm == "aadhaarProof":
					if aadhaar_proof_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated kyc Aadhaar proof of {user_kyc_queryset.userId.fullName} successfully!"
						data_status["responseStatus"] = 1
					else:
						data_status["result"] = aadhaar_proof_form.errors
						return data_status
				
				elif subForm == "bankVerification" :
					if bank_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated kyc bank details of {user_kyc_queryset.userId.fullName} successfully!"
						data_status["responseStatus"] = 1
					else:
						data_status["result"] = bank_form.errors
						return data_status
				
				elif redirectval=="agreementDetails":
					if agreement_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated kyc agreement details of {user_kyc_queryset.userId.fullName} successfully!"
						data_status["responseStatus"] = 1
					else:
						data_status["result"] = agreement_form.errors
						return data_status

				elif redirectval=="videoVerificationDetails":
					if video_form.validate_on_submit():
						message = f"{admin_queryset.userName} updated kyc video verification of {user_kyc_queryset.userId.fullName} successfully!"
						data_status["responseStatus"] = 1
					else:
						data_status["result"] = video_form.errors
						return data_status
				else:
					flash("Invalid Request!")
					data_status["responseStatus"] = 4
					return data_status
				
				print(userKycId,"(((((((((((((((POST METHOD CHECK KYC ID)))))))))))))))")
				action = request.form.get("action", "").strip()
				data = request.form.to_dict()
				
				# Step 1: Handle OTP Generation
				# if action == "generate":
				#     return jsonify(generate_pendingkyc_otp_helper())
				# if action == "generate":
				#   mail_type = data.get("mailType", "").strip()
				#   print(mail_type,"((((((((((((((((mail_type))))))))))))))))")
				#   if not mail_type:
				#       return jsonify({"responseStatus": 0, "result": "mailType is required!"}), 400
				#   return jsonify(generate_otp_helper(mail_type))

				# # tep 2: Handle OTP Verification
				# elif action == "verify":
				#   otp_check_id = request.form.get("otpCheckId","")
				#   otp_code = request.form.get("otpCode","")

				#   print(otp_check_id,"((((((((OTP CHECK ID????????????))))))))")
				#   print(otp_code,"((((((((OTP CODE????????????))))))))")

				#   if not otp_check_id or not otp_code:
				#       return jsonify({"responseStatus": 0, "result": "Required fields are missing!"})

				#   return jsonify(verify_otp_helper(otp_check_id, otp_code))

				# elif action == "update":
				# otp_check_id = request.form.get("otpCheckId", "")

				# otpcheck_queryset = OtpChecks.objects(adminId=adminId, id=str(otp_check_id), status=1).first()
				
				# if not otpcheck_queryset:
				#   return jsonify({"responseStatus": 0, "result": "Invalid Request."})
				# Update OTP status to 2 after verification
				# otpcheck_queryset.update(status=2)
				# return jsonify({"responseStatus": 1, "result": "OTP status successfully updated!"})

				fullName = request.form.get("fullName","")
				phoneNumber = request.form.get("phoneNumber","")
				email = request.form.get("email","")
				address = request.form.get("address","")
				# siteTitle = request.form.get("siteTitle","")
				panStatus = request.form.get("panStatus","")
				panDocument = request.files.get("panDocument","")
				bankStatus = request.form.get("bankStatus","")
				aadharStatus = request.form.get("aadharStatus","")
				aadharDocument = request.files.get("aadharDocument","")
				aadharBackDocument = request.files.get("aadharBackDocument","")
				uploadVideo = request.files.get("uploadVideo","")
				shopVideo = request.files.get("shopVideo","")
				print(shopVideo,"shopVideo")
				videoVerificationStatus = request.form.get("videoVerificationStatus","")
				panReason = request.form.get("panReason","")
				bankReason = request.form.get("bankReason","")
				aadharReason = request.form.get("aadharReason","")
				videoVerificationReason = request.form.get("videoVerificationReason","")
				agreementVerificationReason = request.form.get("agreementVerificationReason","")
				agreementVerificationStatus = request.form.get("agreementVerificationStatus","")
				companyRegistrationDoc = request.files.get("companyRegistrationDoc","")
				companyRegistrationStatus = request.files.get("companyRegistrationStatus","")
				moaDoc = request.files.get("moaDoc","")
				moaStatus = request.files.get("moaStatus","")
				aoaDoc = request.files.get("aoaDoc","")
				aoaStatus = request.files.get("aoaStatus","")
				companyPanDoc = request.files.get("companyPanDoc","")
				companyPanStatus = request.files.get("companyPanStatus","")
				remark = request.form.get("remark","")
				businessStatus = request.form.get("businessStatus","")
				shopVideoStatus = request.form.get("shopVideoStatus","")
				documentRemark = request.form.get("documentRemark","")
				videoVerificationRemark = request.form.get("videoVerificationRemark","")
				businessRemark = request.form.get("businessRemark","")
				shopRemark = request.form.get("shopRemark","")
				jsonData = request.form.to_dict(flat=True)

				try:
					existing_record = ""
					print(userKycId,"((((((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@userKycId))))))))))))))))))))))))")
					user_kyc_queryset = UserKYC.objects(id=userKycId, status__in=[0,1]).first()

					user_queryset = Users.objects(id=str(user_kyc_queryset.userId.id)).first()
					userId=str(user_queryset.id)
					existing_record = user_kyc_queryset.to_json()
					admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
					# message=admin_queryset.userName+" "+user_kyc_queryset.userId.fullName+" Merchant KYC details updated successfully!"
					requestData=[existing_record]
					updatedrequestData=[jsonData]
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"user_kyc_update","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					save_remarks_data=save_admin_remarks_data(userKycId,adminId,remark,"merchantKyc")

					if user_kyc_queryset:
						if fullName:
							user_queryset.update(fullName=fullName)

						if phoneNumber:
							user_queryset.update(phoneNumber=phoneNumber)

						if email:
							user_queryset.update(email=email)

						# if siteTitle:
						#     user_queryset.update(siteTitle=siteTitle)

						if address:
							user_queryset.update(address=address)  

						if panStatus:
							if panReason:
								save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,panReason,"merchantKyc")
							user_kyc_queryset.update(panStatus=panStatus,panReason=panReason)

						if bankStatus:
							if bankReason:
								save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,bankReason,"merchantKyc")
							user_kyc_queryset.update(bankStatus=bankStatus,bankReason=bankReason)

						if businessStatus:
							if businessRemark:
								user_kyc_queryset.update(businessStatus=businessStatus,businessRemark=businessRemark)

						if aadharStatus:
							if aadharReason:
								save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,aadharReason,"merchantKyc")
							user_kyc_queryset.update(aadharStatus=aadharStatus,aadharReason=aadharReason)

						if videoVerificationStatus:
							if videoVerificationReason:
								user_kyc_queryset.update(videoVerificationStatus=videoVerificationStatus,videoVerificationReason=videoVerificationReason)

						# if panReason:
						#     user_kyc_queryset.update(panReason=panReason)
						# if panReason:
						#     user_kyc_queryset.update(panReason=panReason)
						#     save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,panReason,"merchantKyc")
						# if bankReason:
						#     user_kyc_queryset.update(bankReason=bankReason)
						#     save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,bankReason,"merchantKyc")
						# if aadharReason:
						#     user_kyc_queryset.update(aadharReason=aadharReason)
						#     save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,aadharReason,"merchantKyc")

						if videoVerificationReason:
							user_kyc_queryset.update(videoVerificationReason=videoVerificationReason)
							save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,videoVerificationReason,"merchantKyc")

						# if agreementVerificationReason:
						#     user_kyc_queryset.update(agreementVerificationReason=agreementVerificationReason)
						#     save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,agreementVerificationReason,"merchantKyc")

						if agreementVerificationStatus:
							if agreementVerificationReason:
								save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,agreementVerificationReason,"merchantKyc")
							   
							user_kyc_queryset.update(agreementVerificationStatus=agreementVerificationStatus,agreementVerificationReason=agreementVerificationReason)


						if companyRegistrationStatus:
							user_kyc_queryset.update(companyRegistrationStatus=companyRegistrationStatus)

						if moaStatus:
							user_kyc_queryset.update(moaStatus=moaStatus)

						if aoaStatus:
							user_kyc_queryset.update(aoaStatus=aoaStatus)

						if companyPanStatus:
							user_kyc_queryset.update(companyPanStatus=companyPanStatus)


						if documentRemark:
							user_kyc_queryset.update(documentRemark=documentRemark)


						if videoVerificationRemark:
							user_kyc_queryset.update(videoVerificationRemark=videoVerificationRemark)

						if shopRemark:
							user_kyc_queryset.update(shopRemark=shopRemark)

						print(shopVideoStatus,"((((((((((shopVideoStatus))))))))))")
						if shopVideoStatus:
							if shopVideoStatus == "Rejected":
								user_kyc_queryset.update(shopVideo=None)
							user_kyc_queryset.update(shopVideoStatus=shopVideoStatus)

						# if businessRemark:
						#     user_kyc_queryset.update(businessRemark=businessRemark)

						if remark:
							user_kyc_queryset.update(remark=remark)


						if panDocument:
							randomNumber = str(random_digit_generate(6))
							if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/")):
								os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/"))
							save_file = panDocument.save(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/"+str(randomNumber)+".png"))
							user_kyc_queryset.update(panDocument="media/panDocuments/"+str(randomNumber)+".png")

						if aadharDocument:
							aadharRandomNumber = str(random_digit_generate(6))
							if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/")):
								os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"))
							save_file = aadharDocument.save(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"+str(aadharRandomNumber)+".png"))
							user_kyc_queryset.update(aadharDocument="media/aadharDocuments/"+str(aadharRandomNumber)+".png")

						if aadharBackDocument:
							aadharRandomNumber = str(random_digit_generate(6))
							if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/")):
								os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"))
							save_file = aadharBackDocument.save(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"+str(aadharRandomNumber)+".png"))
							user_kyc_queryset.update(aadharBackDocument="media/aadharDocuments/"+str(aadharRandomNumber)+".png")


						if companyRegistrationDoc:
							randomNumber = str(random_digit_generate(6))
							pdfFile = upload_pdf_file("companyRegistrationDocs", randomNumber, ".pdf", companyRegistrationDoc)
							if pdfFile:
								user_kyc_queryset.update(companyRegistrationDoc=pdfFile)

						if moaDoc:
							randomNumber = str(random_digit_generate(6))
							pdfFile = upload_pdf_file("moaDocs", randomNumber, ".pdf", moaDoc)
							if pdfFile:
								user_kyc_queryset.update(moaDoc=pdfFile)


						if aoaDoc:
							randomNumber = str(random_digit_generate(6))
							pdfFile = upload_pdf_file("aoaDocs", randomNumber, ".pdf", aoaDoc)
							if pdfFile:
								user_kyc_queryset.update(aoaDoc=pdfFile)

						if companyPanDoc:
							randomNumber = str(random_digit_generate(6))
							if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/")):
								os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/"))
							save_file = companyPanDoc.save(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/"+str(randomNumber)+".png"))
							user_kyc_queryset.update(companyPanDoc="media/companyPanDocs/"+str(randomNumber)+".png")
					
						if uploadVideo:
							video_file = upload_file_video("uploadKYCVideos", str(userId), ".mp4", uploadVideo)
							if video_file:
								user_kyc_queryset.update(uploadVideo=video_file)
						
						if shopVideo:
							shop_video_file = upload_file_video("uploadBussinessVideos", str(userId), ".mp4", shopVideo)
							print(shop_video_file,"shop_video_file")
							if shop_video_file:
								user_kyc_queryset.update(shopVideo=shop_video_file)
							
						flash("Merchant KYC details updated successfully!")
						data_status["responseStatus"] = 1
						return data_status
				except Exception as e:
					flash("Unable to update merchant kyc details!!")
					app.logger.error(traceback.format_exc())
					return redirect(url_for("user_managements.pending_users_list"))

		else:
			flash("The staff member does not have permission to update Merchant KYC.", "danger")
			return redirect(url_for("user_managements.pending_users_list"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to update merchant kyc details!!"
		return render_template("super_admin_templates/pending_user_list.html",error=error)



######################## dropdown functions ########################


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



@user_managements.route("/cities_list",methods=["POST"])
@adminid_access_token_required
@csrf.exempt
def cities_list():
	data_status = {"responseStatus":0,"result":""}
	citiesList = []
	try:
		stateId = request.form.get("stateId","")
		if not stateId:
			data_status["result"]="Required fields are missing!!"
			return data_status
		################# For Cities Data ##################
		cities_queryset = Cities.objects(stateId=stateId,status__in=[0,1]).order_by("-id")
		for each_city in cities_queryset:
			city_dict = fetching_cities_details(each_city)
			citiesList.append(city_dict)

		data_status["responseStatus"]=1
		data_status["result"]="Cities data fetched successfully!"
		data_status["citiesList"]=citiesList
		return data_status   
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch cities data!!"
		return data_status



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

@user_managements.route("/block_po_list",methods=["POST"])
@adminid_access_token_required
@csrf.exempt
def block_po_list():
	data_status = {"responseStatus":0,"result":""}
	blocksList = []
	try:
		cityId = request.form.get("cityId","")
		if not cityId:
			data_status["result"]="Required fields are missing!!"
			return data_status
		blocks_queryset = BlocksPos.objects(cityId=cityId,status__in=[1]).order_by("-id")
		for each_block in blocks_queryset:
			block_dict = fetching_blocks_details(each_block)
			blocksList.append(block_dict)

		data_status["responseStatus"]=1
		data_status["result"]="Blocks data fetched successfully!"
		data_status["blocksList"]=blocksList
		return data_status   
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch blocks data!!"
		return data_status


def fetching_pincode_details(pincode_queryset):
	pincode_dict = {}
	try:
		pincode_dict={
		"id":str(pincode_queryset.id),
		"pincode":pincode_queryset.pincode,
		"blockName":pincode_queryset.blockPoId.name,
		"blockPoId":str(pincode_queryset.blockPoId.id)
		}
		if pincode_queryset.createdOn:
			pincode_dict["createdOn"] = pincode_queryset.createdOn.strftime("%m-%d-%Y")
		else:
			pincode_dict["createdOn"] = ""
	except Exception as e:
		app.logger.error(traceback.format_exc())
	return pincode_dict

@user_managements.route("/pincodes_list",methods=["POST"])
@adminid_access_token_required
@csrf.exempt
def pincodes_list():
	data_status = {"responseStatus":0,"result":""}
	pincodesList = []
	try:
		blockPoId = request.form.get("blockPoId","")
		if not blockPoId:
			data_status["result"]="Required fields are missing!!"
			return data_status
		pincodes_queryset = Pincodes.objects(blockPoId=blockPoId,status__in=[1]).order_by("-id")
		for each_pincode in pincodes_queryset:
			pincode_dict = fetching_pincode_details(each_pincode)
			pincodesList.append(pincode_dict)

		data_status["responseStatus"]=1
		data_status["result"]="Pincodes data fetched successfully!"
		data_status["pincodesList"]=pincodesList
		return data_status   
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch pincodes data!!"
		return data_status

@user_managements.route("/view_parent", methods=['GET', 'POST'])
@adminid_access_token_required
def view_parent():
	userId = request.args.get("userId","")
	parentDict = {}
	parentDropdownList = []
	user_list = []
	userName = ""
	snoCount=0
	page = ""
	error = ""
	redirectval = ""
	parentPagination = ""
	parentviewPage=''
	permissionsList = check_permissions(session.get("adminId"), "userManagementPermissions")
	if "viewparent" in permissionsList:
		try:
			if not userId:
				return redirect(url_for("user_managements.manage_users_list"))
			redirectTo = request.args.get("redirectTo","Users")
			if redirectTo:
				redirectval = redirectTo
			else:
				redirectval = "Users"
			# otp_check_id = request.form.get("otpLogid", "")
			# print("otp_check_id",otp_check_id)
			# if not otp_check_id:
			#   flash("Invalid Request111.")
			#   return render_template('super_admin_templates/view_parent.html')

			# otpcheck_queryset = OtpChecks.objects(adminId=adminId, id=str(otp_check_id), status=1).first()

			# if not otpcheck_queryset:
			#   flash("Invalid Request222.")
			#   return render_template('super_admin_templates/view_parent.html')
			# # Update OTP status to 2 after verification
			# otpcheck_queryset.update(status=2)

			parentviewPage = request.args.get(get_page_parameter("parentviewPage"), type=int, default=1)
			per_page = 20
			start = (parentviewPage - 1) * per_page
			total_count=0
	  
			user_queryset = Users.objects(id=userId,status=1).first()
			if user_queryset:
				userName = user_queryset.fullName
			else:
				userName = ""
			# if user_queryset.parentId:
			#   parent_queryset = (
			#       Users.objects(id=str(user_queryset.parentId.id),status=1).first()
			#       .only("id","parentId","fullName","phoneNumber","email")
			#       .order_by("-id")
			#       .skip(start)
			#       .limit(per_page)
			#   )
			# else:
			#   parent_queryset=[]
			# total_count=parent_queryset.count()
			# user_list=list(parent_queryset)
			# snoCount = start

			# user_queryset = Users.objects(id=userId,status=1).first()
			# if user_queryset:
			#   userName = user_queryset.fullName
			# else:
			#   userName = ""

			if user_queryset.parentId:
				parent_queryset = Users.objects(id=str(user_queryset.parentId.id),status=1).first()
				print(parent_queryset.id)
				parentDict = {
				'parentId': str(parent_queryset.id),
				'fullName': parent_queryset.fullName,
				'email': parent_queryset.email,
				'phoneNumber': parent_queryset.phoneNumber,
				}
			total_count=1
			print(type(total_count), total_count) 
			# user_list=list(parent_queryset)
			snoCount = start
	  
		
			parents_dropdown_queryset = Users.objects(id__ne=userId,parentId__ne=userId,status=1).only("id","fullName").order_by("-id")
			for each_parent in parents_dropdown_queryset:
				dropDownDict = {
				'id': str(each_parent.id),
				'fullName': each_parent.fullName,
				}
				parentDropdownList.append(dropDownDict)
			parentPagination = Pagination(parentviewPage=parentviewPage, total=total_count,page_parameter="parentviewPage", per_page=per_page, alignment="right", record_name="Users")
			return render_template("super_admin_templates/view_parent.html",
					parentPagination=parentPagination,
					parentDropdownList=parentDropdownList,
					user_list=user_list,
					redirectval=redirectval,
					snoCount=snoCount,
					userName=userName,
					parentviewPage=parentviewPage,
					userId=userId,
					parentDict=parentDict,
					)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to Assign Parent Details!!"
			return render_template("super_admin_templates/view_parent.html",
				error=error,
				parentPagination=parentPagination,
				parentDropdownList=parentDropdownList,
				user_list=user_list,
				redirectval=redirectval,
				snoCount=snoCount,
				userName=userName,
				parentviewPage=parentviewPage,
				userId=userId,
				parentDict=parentDict,
			)
	else:
		flash("The staff member does not have permission to view parent details", "danger")
		return redirect(url_for("admin.dashboard"))

@user_managements.route("/assign_parent",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def assign_parent():
	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")
		
		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:
			userAgent = request.headers.get("User-Agent")
			loginBrowseData = userAgent.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()

		if request.method == "POST":
			form = viewparentForm()
			if form.validate_on_submit():
	   
				otp_check_id = request.form.get("otpLogid", "")
				defaultVerificationId = request.form.get("defaultVerificationId", "")
				if not otp_check_id:
					flash("Invalid Request.")
					data_status['responseStatus']=4
					return data_status
				
				otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()
				
				if not otpcheck_queryset:
					flash("Invalid request.")
					data_status['responseStatus']=4
					return data_status
				# Update OTP status to 2 after verification
				otpcheck_queryset.update(status=2)

				userId = request.form.get("userId","")
				print(userId)
				parentId = request.form.get("parentId","")
				print(parentId)
				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]
				remark = request.form.get("remark","")

				# if remark and not is_valid_alphanumeric(remark):
				#   flash("Remark must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
				#   return redirect(url_for("user_managements.view_parent"))

				if userId and remark:
					user_queryset = Users.objects(id=userId,status=1).first()
					parent_queryset = Users.objects(id=parentId,status=1).first()
					try:
						admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
						if admin_queryset:
							message=admin_queryset.userName+" "+user_queryset.fullName+" "+parent_queryset.fullName+" has been successfully assigned as a parent."
							save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_parent","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
							save_remarks_data=save_admin_remarks_data(parentId,adminId,remark,"assignparent") 
						user_queryset.update(
							parentId = ObjectId(parentId),
							)

						flash("Parent Assigned Successfully!","success")
						data_status['responseStatus']=1
						return data_status
					except Exception as e:
						flash("Unable to Assign Parent","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.")
				data_status['responseStatus']=4
				return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to Assign Parent"
		flash(error,"danger")
		data_status['responseStatus']=4
		return data_status


@user_managements.route("/remove_parent",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def remove_parent():
	data_status={"responseStatus":0,"result":""}
	try:
		if not session.get("adminId"):
			flash("Session expired Please login again.","danger")
			data_status["responseStatus"]=4
			return data_status
		adminId = session.get("adminId")
		csrf_token = request.form.get("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:
			userAgent = request.headers.get("User-Agent")
			loginBrowseData = userAgent.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()

		userId = request.args.get("userId","")
		print(userId)
		form=UpdateStatusRemarkForm()
		if request.method == "POST":
			if form.validate_on_submit():
				action = request.form.get("action", "").strip()
				data = request.form.to_dict()
				# Step 1: Handle OTP Generation
			
				otp_check_id = request.form.get("otpLogid", "")
				defaultVerificationId = request.form.get("defaultVerificationId", "")
				if not otp_check_id:
					flash("Invalid Request.")
					data_status['responseStatus']=4
					return data_status

				otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()

				if not otpcheck_queryset:
					flash("Invalid Request.")
					data_status['responseStatus']=4
					return data_status
				# Update OTP status to 2 after verification
				otpcheck_queryset.update(status=2)


				parentId = request.args.get("parentId","")
				print(parentId)
				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]
				remark = request.form.get("remark","")

				# if remark and not is_valid_alphanumeric(remark):
				#   flash("Remark must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
				#   return redirect(url_for("user_managements.view_parent"))

				if userId and remark:
					user_queryset = Users.objects(id=userId,status=1).first()
					parent_queryset = Users.objects(id=parentId,status=1).first()
					try:
						admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
						if admin_queryset:
							message=admin_queryset.userName+" "+user_queryset.fullName+" "+parent_queryset.fullName+" has been successfully removed as a parent."
							save_admin_log_table = save_admin_logs_data(adminId,None,None,"remove_parent","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
							save_remarks_data=save_admin_remarks_data(parentId,adminId,remark,"removeParent") 
						user_queryset.update(
							parentId = None,
							)

						flash("Parent Removed Successfully!","success")
						data_status['responseStatus']=1
						return data_status
					except Exception as e:
						flash("Unable to Remove Parent","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  
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to assign parent"
		flash("Unable to Delete parent Details", "danger")
		data_status['responseStatus']=4
		return data_status


###### OLD CODE #############
# @user_managements.route("/view_child", methods=['GET', 'POST'])
# def view_child():
#     userId = request.args.get("userId","")
#     user_list = []
#     usersList = []
#     userName =""
#     try:
#         users_queryset = Users.objects(parentId=userId,status__nin=[2]).order_by("-id")
#         for each_user in users_queryset:
#             userDict = fetching_user_details(each_user)
#             usersList.append(userDict)

#         users = Users.objects(id__ne=userId,status=1).order_by("-id")
#         for each_user in users:
#             user = {
#             'id': str(each_user.id),
#             'fullName': each_user.fullName,
#             }
#             user_list.append(user)
#         user_queryset = Users.objects(id=userId,status__in=[1]).first()
#         if user_queryset:
#             userName = user_queryset.fullName
#         else:
#             userName = ""
#     except Exception as e:
#         app.logger.error(traceback.format_exc())

#     return render_template('super_admin_templates/view_child.html',
#         usersList=usersList,
#         user_list=user_list,
#         userId=userId,
#         userName=userName
#         )

@user_managements.route("/view_child", methods=['GET', 'POST'])
@adminid_access_token_required
def view_child():
	userId = request.args.get("userId","")
	childsDropdownList = []
	usersList = []
	userName = ""
	snoCount=0
	page = ""
	error = ""
	redirectval = ""
	childPagination = ""
	idsList=[]
	childId=""
	permissionsList = check_permissions(session.get("adminId"), "userManagementPermissions")
	if "viewchild" in permissionsList:
		try:
			if not userId:
				return redirect(url_for("user_managements.manage_users_list"))
			redirectTo = request.args.get("redirectTo","Users")
			if redirectTo:
				redirectval = redirectTo
			else:
				redirectval = "Users"
			servicePage = request.args.get(get_page_parameter("servicePage"), type=int, default=1)
			per_page = 20
			start = (servicePage - 1) * per_page
			total_count=0
		
			print(per_page,"((((((((((((((per_page))))))))))))))")
			# users_queryset = Users.objects(parentId=userId,status=1)
			users_queryset = (
				Users.objects(parentId=userId,status=1)
				.only("id","fullName","phoneNumber","email","walletBalance","parentId")
				.order_by("-id")
				.skip(start)
				.limit(per_page)
			)
			total_count=users_queryset.count()
			usersList=list(users_queryset)
			snoCount = start

			user_queryset = Users.objects(id=userId,status=1).first()
			if user_queryset:
				userNme = user_queryset.fullName
				print(str(user_queryset.id),"userid")
			else:
				userName = ""
			
			# parent_id=""
			# if user_queryset.parentId:
			#     parentId= Q(id__ne=str(user_queryset.parentId.id))
			# childs_dropdown_queryset = Users.objects(Q(id__ne=str(user_queryset.id)) | parentId | Q(parentId__ne=str(user_queryset.id)))

			idsList = [str(user_queryset.id)]
			if user_queryset.parentId:
				idsList.append(str(user_queryset.parentId.id))

			# childs_dropdown_queryset = Users.objects(Q(id__nin=idsList) | Q(parentId__ne=str(user_queryset.id)))
				childs_dropdown_queryset = Users.objects(id__nin=idsList,parentId__ne=str(user_queryset.id),status=1)

				for each_child in childs_dropdown_queryset:
					childDict = {
					"childId":str(each_child.id),
					"childName":each_child.fullName
					}
					childsDropdownList.append(childDict)
				print(childsDropdownList,"(((((((((((((childsDropdownList)))))))))))))")


				# users_queryset = Users.objects(parentId=userId,status=1)
				# for each_user in users_queryset:
				#   userDict = fetching_user_details(each_user)
				#   usersList.append(userDict)
		
				childPagination = Pagination(servicePage=servicePage, total=total_count,page_parameter="servicePage", per_page=per_page, alignment="right", record_name="Users")
				return render_template("super_admin_templates/view_child.html",
						childPagination=childPagination,
						childsDropdownList=childsDropdownList,
						usersList=usersList,
						redirectval=redirectval,
						snoCount=snoCount,
						userName=userName,
						servicePage=servicePage,
						userId=userId,
						childId=childId
						)
			else:
				error = "Assign a parent before creating a child account"
				return render_template("super_admin_templates/view_child.html",
					error=error,
					childPagination=childPagination,
					childsDropdownList=childsDropdownList,
					usersList=usersList,
					redirectval=redirectval,
					snoCount=snoCount,
					userName=userName,
					servicePage=servicePage,
					userId=userId,
					childId=childId
				)
				
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "unable to Fetch Child Details."
			return render_template("super_admin_templates/view_child.html",
				error=error,
				childPagination=childPagination,
				childsDropdownList=childsDropdownList,
				usersList=usersList,
				redirectval=redirectval,
				snoCount=snoCount,
				userName=userName,
				servicePage=servicePage,
				userId=userId
			)

	else:
		flash("The staff member does not have permission to view Child details", "danger")
		return redirect(url_for("admin.dashboard"))

@user_managements.route("/assign_child",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def assign_child():
	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")
		
		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:
			userAgent = request.headers.get("User-Agent")
			loginBrowseData = userAgent.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()
		if request.method == "POST":
			form = viewChildForm()
			if form.validate_on_submit():
		  
				otp_check_id = request.form.get("otpLogid", "")
				defaultVerificationId = request.form.get("defaultVerificationId", "")
				if not otp_check_id:
					flash("Invalid Request.")
					data_status['responseStatus']=4
					return data_status

				otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()

				if not otpcheck_queryset:
					flash("Invalid request.")
					data_status['responseStatus']=4
					return data_status
				# Update OTP status to 2 after verification
				otpcheck_queryset.update(status=2)


				userId = request.form.get("userId","")
				print(userId)
				childId = request.form.get("childId","")
				print(childId)
				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]
				remark = request.form.get("remark","")

				# if remark and not is_valid_alphanumeric(remark):
				#     flash("Remark must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
				#     return redirect(url_for("user_managements.view_child"))
		
				if userId and remark:
					child_queryset = Users.objects(id=childId).first()
					# if not child_queryset.profileId:
					#     flash("This child has not been assigned a profile, so please assign!!")
					#     return redirect(url_for("user_managements.manage_users_list"))

					admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
					if admin_queryset:
						message=admin_queryset.userName+" "+child_queryset.fullName+" Child assigned successfully!"
						save_admin_log_table = save_admin_logs_data(adminId,None,None,"assign_child","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
						save_remarks_data=save_admin_remarks_data(childId,adminId,remark,"assignchild")
					try:
						child_queryset.update(parentId = ObjectId(userId))

						flash("Child Assigned Successfully!","success")
						data_status['responseStatus']=1
						return data_status
					except Exception as e:
						flash("Unable to assign child","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 request33.")
				data_status['responseStatus']=4
				return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to Assign Child!!!"
		flash(error,"danger")
		data_status['responseStatus']=4
		return data_status


@user_managements.route("/remove_child",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def remove_child():
	data_status={"responseStatus":0,"result":""}
	try:
		if not session.get("adminId"):
			flash("Session Expired Please login again.","danger")
			data_status["responseStatus"]=4
			return data_status
		adminId = session.get("adminId")
		
		csrf_token = request.form.get("csrf_token")
		
		servicePage = request.args.get("servicePage")
		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:
			userAgent = request.headers.get("User-Agent")
			loginBrowseData = userAgent.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

		userId = request.args.get("userId","")
		print("requestargs",request.args)
		# fuserId = request.form.get("fuserId","")
		print(userId)
		actionDate=datetime.datetime.now()
		form=UpdateStatusRemarkForm()
		if request.method == "POST":
	  
		
			if form.validate_on_submit():
				otp_check_id = request.form.get("otpLogid", "")
				defaultVerificationId = request.form.get("defaultVerificationId", "")
				if not otp_check_id:
					flash("Invalid Request.")
					return redirect(url_for("user_managements.view_child",userId=userId))

				otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()

				if not otpcheck_queryset:
					flash("Invalid Request.")
					return redirect(url_for("user_managements.view_child",userId=userId))
				# Update OTP status to 2 after verification
				otpcheck_queryset.update(status=2)


				childId = request.args.get("childId","")
				print(childId)
				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]
				remark = request.form.get("remark","")
				

				# if remark and not is_valid_alphanumeric(remark):
				#   flash("Remark must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
				#   return redirect(url_for("user_managements.view_child"))

				if userId:
					child_queryset = Users.objects(id=childId).first()
					if child_queryset:
						pass
					# if not child_queryset.profileId:
						# flash("This child has not been assigned a profile, so please assign!!")
						# data_status['responseStatus']=4
						# return data_status

					admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
					
					try:
						child_queryset.update(parentId = None)
						
						if admin_queryset:
							message=admin_queryset.userName+" "+child_queryset.fullName+" Child removed successfully!"
							save_admin_log_table = save_admin_logs_data(adminId,None,None,"remove_child","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
							save_remarks_data=save_admin_remarks_data(childId,adminId,remark,"removeChild")
	  
						flash("Child Removed Successfully!","success")
						data_status['responseStatus']=1
						return data_status
					except Exception as e:
						flash("Unable to Remove Child!!")
						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  
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to Assign Child!!!"
		flash("Unable to remove child", "danger")
		data_status['responseStatus']=4
		return data_status

# @user_managements.route("/add_child",methods=["POST","GET"])
# def add_child():
#     try:
#         if not session.get("adminId"):
#             return redirect("admin_login")
#         adminId = session.get("adminId")
		
#         loginBrowser = request.headers.get("Sec-Ch-Ua")
#         if loginBrowser:
#             loginBrowseData = loginBrowser.split(";")
#             browser = loginBrowseData[0]
#         else:
#             loginBrowseData = userAgent.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()
#         if request.method == "POST":
#             userId = request.form.get("userId","")
#             print(userId)
#             print("(((((((userId)))))))")
#             childId = request.form.get("childId","")
#             print(childId)
#             print("(((((childId)))))")
#             jsonData = request.form.to_dict(flat=True)
#             requestData = [jsonData]
#             updatedrequestData = [jsonData]
#             remark = request.form.get("remark","")

#             if userId:
#                 child_queryset = Users.objects(id=childId,status=1).first()
#                 if not child_queryset.profileId:
#                     flash("This child has not been assigned a profile, so please assign!!")
#                     return redirect(url_for("user_managements.manage_users_list"))

#                 admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
#                 if admin_queryset:
#                     message=admin_queryset.userName+" "+child_queryset.fullName+" Child assigned successfully!"
#                     save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_child","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
#                     save_remarks_data=save_admin_remarks_data(childId,adminId,remark,"assignchild")
#                 try:
#                     child_queryset.update(parentId = ObjectId(userId))

#                     flash("Child assigned successfully!")
#                     return redirect(url_for("user_managements.view_child",userId=userId))
#                 except Exception as e:
#                     flash("Unable to assign child!!")
#                     app.logger.error(traceback.format_exc())
#                     return redirect(url_for("user_managements.view_child",userId=userId))
#             else:
#                 flash("Required fields are missing!!")
#                 return redirect(url_for("user_managements.view_child",userId=userId))
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         error = "Unable to assign child!!!"
#         return render_template("super_admin_templates/view_child.html",error=error)




@user_managements.route("/add_commission_to_user",methods=["POST","GET"])
@adminid_access_token_required
def add_commission_to_user():
	if not session.get("adminId"):
		return redirect("admin_login")
	userId = request.args.get("userId","")
	commissionId = request.form.get("commissionId","")

	if userId:
		try:
			user_queryset = Users.objects(id=userId,status__nin=[2]).first()
			if user_queryset:
				user_queryset.update(
					commissionId = ObjectId(commissionId),
					)
				flash("Commission added successfully!")
				return redirect(url_for("user_managements.manage_users_list"))
			else:
				flash("Invaild user id!!")
				return redirect(url_for("user_managements.manage_users_list"))
		except Exception as e:
			app.logger.error(traceback.format_exc())
			return redirect(url_for("user_managements.manage_users_list"))
	else:
		return redirect(url_for("user_managements.manage_users_list"))



@user_managements.route("/block_user_status",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def block_user_status():
	data_status = {"responseStatus": 0, "result": ""}
	if not session.get("adminId"):
		flash("Session expired","danger")
		data_status["responseStatus"]=4
		return data_status
	adminId=session.get("adminId")

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

	redirectTo = url_for("user_managements.blocked_users_list",page = page)
	
	csrf_token = request.form.get("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:
		userAgent = request.headers.get("User-Agent")
		loginBrowseData = userAgent.split(";")
		browser = loginBrowseData[0]

	client_ip=0
	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"),"userManagementPermissions")
 
	userId = request.args.get("userId","")
	remark = request.form.get("remark")
	form = UpdateStatusRemarkForm(request.form)
	if "block" in permissionsList:
		if form.validate_on_submit():
			# if remark and not is_valid_alphanumeric(remark):
			#   print("sihasdjasdad",form.errors)

			#   data_status["responseStatus"] = 4
			#   # flash("Remark contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/","danger")
			#   return data_status
		
			if userId:
				try:
					print("(((((((((((((((((((((befire..user_queryset)))))))))))))))))))))")
					user_queryset = Users.objects(id=userId,status__nin=[2,6]).first()
					print("(((((((((((((((((((((after..user_queryset)))))))))))))))))))))",userId)
					if user_queryset:
						print("(((((((((((((((((((((after..user_queryset)))))))))))))))))))))")
						existing_record = user_queryset.to_json()
						requestData = [existing_record]
						admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
						print("(((((((user_queryset.status)))))))",user_queryset.status)
						if (user_queryset.status == 0) or (user_queryset.status == 1):
							user_queryset.update(status=3)
							# data_status["responseStatus"] = 1
							flash("User blocked successfully!","success")
							message=admin_queryset.userName+" "+user_queryset.fullName+" User blocked successfully!"
							# return data_status
						elif user_queryset.status == 3:
							user_queryset.update(status=1)
							flash("User has been successfully unblocked!","success")
							message=admin_queryset.userName+" "+user_queryset.fullName+" User unblocked successfully!"
						
						save_admin_log_table = save_admin_logs_data(adminId,None,None,"block_user_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
						save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
						data_status["responseStatus"] = 1
						
						return data_status
					else:
						data_status["responseStatus"] = 4
						flash("Invaild user id!!")
						return data_status                  

				except Exception as e:
					data_status["responseStatus"] = 4
					flash("Ivalid Request")
					app.logger.error(traceback.format_exc())
					return data_status
			else:
				data_status["responseStatus"] = 2
				flash("Invalid Request")
				return data_status
		else:
			print("((((((((((((((((((((((((((formerrror))))))))))))))))))))))))))",form.errors)
			data_status['result']=form.errors
			return data_status
	else:
		data_status["responseStatus"] = 4
		flash("The staff member does not have permission to unlock user status","danger")
		return data_status

@user_managements.route("/blocked_users_list",methods=["POST","GET"])
@adminid_access_token_required
def blocked_users_list():
	pagination=None
	blockedUsersList=[]
	snoCount =0
	page = None
	form = BlockedUsersForm(request.args)
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId = session.get("adminId")
		blockedUsersList = []
		snoCount = 0
		pagination = ""
		permissionsList = check_permissions(session.get("adminId"),"blockedMerchantPermissions")
		if "view" in permissionsList:
			merchantEmail = request.args.get('merchantEmail', '').strip()
			merchantName = request.args.get('merchantName', '').strip()
			merchantPhone = request.args.get('merchantPhone', '').strip()
			merchantId = request.args.get('merchantId', '').strip()
			print("form  ",request.args)

			page = request.args.get(get_page_parameter(), type=int, default=1)
			per_page = 20
			start = (page - 1) * per_page
			snoCount = int(start)
			users_queryset = Users.objects(status__ne=2)
			total_count=0

			filters=Q(status=3)

			if form.validate():
				
				if merchantName:
					filters &= Q(fullName__icontains=merchantName)

				if merchantId:
				  
					filters &= Q(merchantUniqueNumber__icontains=merchantId)

				if merchantEmail:
					filters &= Q(email__icontains=merchantEmail)

				if merchantPhone:
					filters &= Q(phoneNumber__icontains=merchantPhone)

				blocked_users_queryset = Users.objects(filters).only("id","merchantUniqueNumber","siteTitle","fullName","phoneNumber","patternId","walletBalance","email","status").skip(start).limit(per_page)
				blockedUsersList=list(blocked_users_queryset)
				total_count = blocked_users_queryset.count()

				# for each_user in blocked_users_queryset:
				#     userDict = fetching_user_details(each_user)
				#     blockedUsersList.append(userDict)

				# users_kyc_queryset = UserKYC.objects(status__nin=[2]).order_by("-id").all()
				# for each_user_kyc in users_kyc_queryset:
				#     userKycDict = fetching_user_kyc_details(each_user_kyc)
				#     userKycList.append(userKycDict)
				snoCount = start
				pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right",record_name = "UserKYC")
			else:
				print("form errors", form.errors)
			


			return render_template("super_admin_templates/blocked_users_list.html",
				pagination=pagination,
				blockedUsersList=blockedUsersList,
				merchantName=merchantName,
				merchantEmail=merchantEmail,
				merchantPhone=merchantPhone,
				merchantId=merchantId,
				page = page,
				snoCount = snoCount,
				form = form
				)
		else:
			flash("The staff member does not have permission to view Block merchants", "danger")
			return render_template("super_admin_templates/blocked_users_list.html")
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to fetched blocked user data!!"
		return render_template("super_admin_templates/blocked_users_list.html", 
			error=error,
			pagination=pagination,
			blockedUsersList=blockedUsersList,
			snoCount = snoCount,
			page = page,
			form = form
			)


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

	client_ip=0

	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"),"userManagementPermissions")
	if "block" in permissionsList:
		userId = request.args.get("userId","")
		remark = request.form.get("remark")

		if userId:
			try:
				user_queryset = Users.objects(id=userId,status__nin=[2]).first()
				existing_record = user_queryset.to_json()
				requestData = [existing_record]
				if user_queryset:
					admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
					if user_queryset.status == 5:
						user_queryset.update(status=1)
						flash("User unlocked successfully!")
					save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"unlock_user_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
					return redirect(url_for("user_managements.manage_users_list"))
				else:
					flash("Invaild user id!!")
					return redirect(url_for("user_managements.manage_users_list"))
			except Exception as e:
				app.logger.error(traceback.format_exc())
				return redirect(url_for("user_managements.manage_users_list"))
		else:
			return redirect(url_for("user_managements.manage_users_list"))
	else:
		flash("The staff member does not have permission to unlock user status.","danger")
		return redirect(url_for("user_managements.manage_users_list"))
	


@user_managements.route("/locked_users_list", methods=["POST", "GET"])
@adminid_access_token_required
def locked_users_list():
	pagination=None
	lockedUsersList=[]
	snoCount=0
	page = None
	form = BlockedUsersForm(request.args)
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		pagination = ""  
		lockedUsersList = []  
		snoCount = 0
		permissionsList = check_permissions(session.get("adminId"), "lockedMerchantPermissions")
		if "view" in permissionsList:
			adminId = session.get("adminId")
			merchantEmail = request.args.get('merchantEmail', '').strip()
			merchantName = request.args.get('merchantName', '').strip()
			merchantPhone = request.args.get('merchantPhone', '').strip()
			merchantId = request.args.get('merchantId', '').strip()
			page = request.args.get(get_page_parameter(), type=int, default=1)
			per_page = 20
			start = (page - 1) * per_page
			snoCount = int(start)
			total_count=0
			filters = Q(status=5)

			users_queryset = Users.objects(filters).order_by("-id").all()

			if form.validate():
				if merchantName:
					filters &= Q(fullName__icontains=merchantName)

				if merchantId:
				  
					filters &= Q(merchantUniqueNumber__icontains=merchantId)

				if merchantEmail:
					filters &= Q(email__icontains=merchantEmail)

				if merchantPhone:
					filters &= Q(phoneNumber__icontains=merchantPhone)

				locked_users_queryset = Users.objects(filters).only("id","merchantUniqueNumber","fullName","siteTitle","phoneNumber","patternId","walletBalance","email","status").skip(start).limit(per_page)
				total_count = locked_users_queryset.count()
				# for each_user in locked_users_queryset:
				#     userDict = fetching_user_details(each_user)
				#     lockedUsersList.append(userDict)
				lockedUsersList=list(locked_users_queryset)
				snoCount = start
			# Pagination object for rendering pagination controls in the template
				pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right")
			else: 
					print("form errors", form.errors)

			return render_template("super_admin_templates/locked_users_list.html",
				pagination=pagination,
				merchantName=merchantName,
				merchantEmail=merchantEmail,
				merchantPhone=merchantPhone,
				merchantId=merchantId,
				lockedUsersList=lockedUsersList,
				page = page,
				form = form,
				snoCount = snoCount
			)
		else:
			flash("The staff member does not have permission to view lock merchants", "danger")
			return render_template("super_admin_templates/locked_users_list.html")
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to fetch locked user data!!"
		return render_template("super_admin_templates/locked_users_list.html", 
			error=error,
			pagination=pagination, 
			lockedUsersList=lockedUsersList,
			snoCount = snoCount, 
			page = page, 
			form = form
		)




@user_managements.route("/lock_user_status",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def lock_user_status():
	data_status = {"responseStatus": 0, "result": ""}
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")

	page = request.args.get(get_page_parameter(), type=int, default=1)
	
	csrf_token = request.form.get("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:
		userAgent = request.headers.get("User-Agent")
		loginBrowseData = userAgent.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"),"userManagementPermissions")
	form = BlockedUserListFormRemark(request.form)

	if "block" in permissionsList:
		userId = request.args.get("userId","")
		remark = request.form.get("remark")


		if form.validate_on_submit():
			# if remark and not is_valid_alphanumeric(remark):
			#     print("111111111111111111111111111111111111111111111111111111111",form.errors)

			#     data_status["responseStatus"] = 4
			#     flash("Remark contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/","danger")
			#     return data_status

			if userId:
				try:
					user_queryset = Users.objects(id=userId,status=5).first()
					existing_record = user_queryset.to_json()
					requestData = [existing_record]
					if user_queryset:
						admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
						if user_queryset.status == 5:
							user_queryset.update(status=1)

						message=admin_queryset.userName+" "+user_queryset.fullName+" User unlocked successfully!"
						save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
						save_admin_log_table = save_admin_logs_data(adminId,None,None,"lock_user_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					   
						data_status["responseStatus"] = 1
						flash("User has been successfully unlocked!")
						return data_status
					else:
						data_status["responseStatus"] = 4
						flash("Invaild user id!!")
						return data_status
				except Exception as e:
					data_status["responseStatus"] = 4
					flash("Invalid Request")
					app.logger.error(traceback.format_exc())
					return data_status
			else:
				data_status["responseStatus"] = 2
				flash("Ivalid Request")
				return data_status
		else:
			data_status['result']=form.errors
			return data_status
	else:
		data_status["responseStatus"] = 4
		flash("Staff member does not have permission to unlock user status.","danger")
		return data_status




@user_managements.route("/sub_categories_list",methods=["POST"])
@adminid_access_token_required
@csrf.exempt
def sub_categories_list():
	data_status = {"responseStatus":0,"result":""}
	subCategoriesList = []
	try:
		categoryId = request.form.get("categoryId","")
		if not categoryId:
			data_status["result"]="Required fields are missing!!"
			return data_status
		sub_cat_queryset = MerchantSubCategories.objects(categoryId=categoryId,status__in=[1]).order_by("-id")
		for each_sub_merchant_category in sub_cat_queryset:
			sub_merchant_category_dict = fetching_sub_merchant_category_details(each_sub_merchant_category)
			subCategoriesList.append(sub_merchant_category_dict)

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

@user_managements.route("/assign_payment_gateways",methods=["POST","GET"])
@adminid_access_token_required
def assign_payment_gateways():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId = session.get("adminId")
		userId = request.args.get("userId","")
		userDict = {}
		payoutApisList = []
		payinApisList = []
		if request.method == "GET":

			user_queryset = Users.objects(id=userId, status__in=[0,1]).first()

			if not user_queryset:
				flash("Invalid user id!!")
				return redirect(url_for("user_managements.manage_users_list"))

			userDict = fetching_user_details(user_queryset)

			payout_apis_queryset = TransactionAPI.objects(transactionType="Payout",status=1).order_by('-id')
			for each_payout_api in payout_apis_queryset:
				apiDict = fetching_transaction_api_details(each_payout_api)
				payoutApisList.append(apiDict)

			payin_apis_queryset = TransactionAPI.objects(transactionType="PaymentGateway",status=1).order_by('-id')
			for each_payin_api in payin_apis_queryset:
				apiDict = fetching_transaction_api_details(each_payin_api)
				payinApisList.append(apiDict)
			
			return render_template("super_admin_templates/assign_user_payment_gateway_details.html",
				userDict=userDict,
				payinApisList=payinApisList,
				payoutApisList=payoutApisList
				)

		if request.method == "POST":
			enablePayin = request.form.get("enablePayin",False)
			enablePayout = request.form.get("enablePayout",False)
			payInPaymentGatewayId = request.form.get("payInPaymentGatewayId","")
			payOutPaymentGatewayId = request.form.get("payOutPaymentGatewayId","")

			try:
				user_queryset = Users.objects(id=userId, status__in=[0,1]).first()
				if not user_queryset:
					flash("Invalid user id!!")
					return redirect(url_for("user_managements.manage_users_list"))
				if enablePayin == "True":
					user_queryset.update(enablePayin=True)
				else:
					user_queryset.update(enablePayin=False)
				if enablePayout == "True":
					user_queryset.update(enablePayout=True)
				else:
					user_queryset.update(enablePayout=False)

				if payInPaymentGatewayId:
					user_queryset.update(payInPaymentGatewayId = ObjectId(payInPaymentGatewayId))
					payin_balance_queryset = PayinBalances.objects(userId=str(user_queryset.id),transactionAPIId=payInPaymentGatewayId).first()
					if not payin_balance_queryset:
						payin_balance_table = PayinBalances(
							userId=str(user_queryset.id),
							transactionAPIId=payInPaymentGatewayId,
							previousBalance=0,
							currentBalance=0,
							createdOn=datetime.datetime.now(),
							status=1
							).save()
				else:
					user_queryset.update(payInPaymentGatewayId = None)

				if payOutPaymentGatewayId:
					user_queryset.update(payOutPaymentGatewayId = ObjectId(payOutPaymentGatewayId))
					payout_balance_queryset = PayoutBalances.objects(userId=str(user_queryset.id),transactionAPIId=payOutPaymentGatewayId).first()
					if not payout_balance_queryset:
						payout_balance_table = PayoutBalances(
							userId=str(user_queryset.id),
							transactionAPIId=payOutPaymentGatewayId,
							previousBalance=0,
							currentBalance=0,
							createdOn=datetime.datetime.now(),
							status=1
							).save()
				else:
					user_queryset.update(payOutPaymentGatewayId = None)

				flash("User assigned payment gateway successfully!")
				return redirect(url_for("user_managements.manage_users_list"))
			except Exception as e:
				flash("Unable to assign user payment gateway details!!")
				app.logger.error(traceback.format_exc())
				return redirect(url_for("user_managements.manage_users_list"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to assign user payment gateway details!!"
		return render_template("super_admin_templates/user_managements_list.html",error=error)


@user_managements.route("/testing_for_unique",methods=["GET"])
@adminid_access_token_required
@csrf.exempt
def testing_for_unique():
	try:
		next_serial_number = generate_next_serial_number()
		print(next_serial_number,"****************")
		return next_serial_number
	except Exception as e:
		app.logger.error(traceback.format_exc())
		return False


@user_managements.route("/testing_for_payin",methods=["GET"])
@adminid_access_token_required
def testing_for_payin():
	try:
		if request.method == "GET":
			return render_template("super_admin_templates/testing_payin.html")
	except Exception as e:
		app.logger.error(traceback.format_exc())
		return False

@user_managements.route("/checking_for_phone_number",methods=["POST"])
@adminid_access_token_required
@csrf.exempt
def checking_for_phone_number():
	data_status={"responseStatus":0,"result":""}
	phoneNumber = request.form.get("phoneNumber")
	try:
		user_queryset = Users.objects(phoneNumber=phoneNumber).first()
		if user_queryset:
			data_status["responseStatus"]=1
			data_status["result"]="This phone number is already in use!!"
			return data_status
		else:
			data_status["responseStatus"]=0
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["responseStatus"]=0
		return data_status

@user_managements.route("/checking_for_pan_number",methods=["POST"])
@adminid_access_token_required
@csrf.exempt
def checking_for_pan_number():
	data_status={"responseStatus":0,"result":""}
	panNumber = request.form.get("panNumber")
	try:
		user_kyc_queryset = UserKYC.objects(panNumber=panNumber).first()
		if user_kyc_queryset:
			data_status["responseStatus"]=1
			data_status["result"]="This pan number is already in use!!"
			return data_status
		else:
			data_status["responseStatus"]=0
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["responseStatus"]=0
		return data_status


@user_managements.route("/password_update",methods=["POST"])
@adminid_access_token_required
@csrf.exempt
def password_update():
	userId =request.json.get("userId")
	password =request.json.get("password")
	try:
		user_queryset = Users.objects(id=userId).first()
		if user_queryset:
			user_queryset.update(password=generate_password_hash(password))

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

@user_managements.route("/admin_password_update",methods=["POST"])
@adminid_access_token_required
@csrf.exempt
def admin_password_update():
	adminId =request.json.get("adminId")
	password =request.json.get("password")
	try:
		admin_queryset = SuperAdmin.objects(id=adminId).first()
		if admin_queryset:
			admin_queryset.update(password=generate_password_hash(password))

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


@user_managements.route("/merchant_change_password", methods=["POST", "GET"])
@adminid_access_token_required
@csrf_protect
def merchant_change_password():
	if not session.get("adminId"):
		return redirect(url_for("admin_login"))
	adminId = session.get("adminId")
	
	csrf_token = request.form.get("csrf_token")
	
	
	loginBrowser = request.headers.get("Sec-Ch-Ua")
	if loginBrowser:
		loginBrowseData = loginBrowser.split(";")
		browser = loginBrowseData[0]
	else:
		userAgent = request.headers.get("User-Agent")
		loginBrowseData = userAgent.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]

	userId = request.args.get("userId", "")
	newPassword = request.form.get("newPassword", "")
	confirmNewPassword = request.form.get("confirmNewPassword", "")
	remark = request.form.get("remark")

	if newPassword and not validate_password(newPassword):
		flash("Password must be 8-30 characters long, include at least one uppercase letter, one lowercase letter, one number, and one special character.")
		return redirect(url_for("user_managements.merchant_change_password"))

	if remark and not is_valid_alphanumeric(remark):
		flash("Remark contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/")
		return redirect(url_for("user_managements.merchant_change_password"))

	userDict = {}

	# action = request.form.get("action", "").strip()
	# data = request.form.to_dict()
	# # Step 1: Handle OTP Generation
	# otp_check_id = request.form.get("otpLogid", "")
	# defaultVerificationId = request.form.get("defaultVerificationId", "")
	# print("otp_check_id",otp_check_id)
	# if not otp_check_id:
	#     flash("Invalid Request.")
	#     return redirect(url_for("user_managements.merchant_change_password",userId=userId))

	# otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()

	# if not otpcheck_queryset:
	#     flash("Invalid Request.")
	#     return redirect(url_for("user_managements.merchant_change_password",userId=userId))
	# # Update OTP status to 2 after verification
	# otpcheck_queryset.update(status=2)

		
	try:
		if request.method == "GET":
			merchant_queryset = Users.objects(id=userId, status__in=[0, 1]).first()
			if not merchant_queryset:
				flash("Invalid merchant id!")
				return redirect(url_for("user_managements.manage_users_list"))

			userDict = fetching_user_details(merchant_queryset)
			return render_template("super_admin_templates/merchant_change_password.html", userDict=userDict)

		if request.method == "POST":
			otp_check_id = request.form.get("otpLogid", "")
			defaultVerificationId = request.form.get("defaultVerificationId", "")

			if not otp_check_id:
				flash("Invalid Request.")
				return redirect(url_for("user_managements.merchant_change_password",userId=userId))
			
			otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()
			
			if not otpcheck_queryset:
				flash("Invalid Request.")
				return redirect(url_for("user_managements.merchant_change_password",userId=userId))
			# Update OTP status to 2 after verification
			otpcheck_queryset.update(status=2)
			if not userId or not newPassword or not confirmNewPassword:
				flash("Required fields are missing!")
				return redirect(url_for("user_managements.merchant_change_password",userId=userId))
			if newPassword == confirmNewPassword:
				merchant_queryset = Users.objects(id=userId, status__in=[0, 1]).first()
				existing_record = merchant_queryset.to_json()
				requestData = [existing_record]
				admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
				if merchant_queryset:
					merchant_queryset.update(password=generate_password_hash(newPassword))
					flash("Successfully changed the password!")
					message=admin_queryset.userName+" "+merchant_queryset.fullName+" Successfully changed the password!"
					save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"merchant_change_password","updatepassword",actionDate,client_ip,browser,message,requestData,updatedrequestData)
					return redirect(url_for("user_managements.manage_users_list"))
				else:
					flash("Invalid Merchant Id!")
					return redirect(url_for("user_managements.merchant_change_password",userId=userId))
			else:
				flash("New password and confirm new password do not match!")
				return redirect(url_for("user_managements.merchant_change_password",userId=userId))

	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Server Connection Error.Please try again!")
		return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/merchant_capbalance", methods=["POST", "GET"])
@adminid_access_token_required
@csrf_protect
def merchant_capbalance():
	data_status={"responseStatus":0,"result":""}
	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")
	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()

	userId = request.args.get("userId", "")
	capBalance = request.form.get("capBalance", "").replace(",", "")
	remark = request.form.get("remark","") 

	userDict = {}
	permissionsList = check_permissions(session.get("adminId"), "userManagementPermissions")
	if "capBalance" in permissionsList:
		try:
			save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"capBalance")
			if request.method == "POST":
				# action = request.form.get("action", "").strip()
				# data = request.form.to_dict()
				
				# otp_check_id = request.form.get("otpLogid", "")
				# defaultVerificationId = request.form.get("defaultVerificationId", "")

				# if not otp_check_id:
				# 	flash("Invalid request.", "error")
				# 	data_status['responseStatus']=4
				# 	return data_status

				# otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=userId, id=str(otp_check_id), status=1).first()

				# if not otpcheck_queryset:
				# 	flash("Invalid request.", "error")
				# 	data_status['responseStatus']=4
				# 	return data_status
				# # Update OTP status to 2 after verification
				# otpcheck_queryset.update(status=2)
				form = CapBalanceForm()
				if form.validate_on_submit():

					previousBalance = request.form.get("previousBalance","")
					currentBalance = request.form.get("currentBalance","")
					jsonData = request.form.to_dict(flat=True)
					if userId:
						capbalance_queryset = Users.objects(id=userId, status__in=[0, 1]).first()
						admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
						existing_record = capbalance_queryset.to_json()
						message=admin_queryset.userName+" "+capbalance_queryset.fullName+" CapBalance updated successfully!"
						requestData=[capbalance_queryset]
						updatedrequestData=[jsonData]
						save_admin_log_table = save_admin_logs_data(adminId,None,None,"merchant_capbalance","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
						if capbalance_queryset:
							capbalance_queryset.update(capBalance = capBalance)
							
							capbalance_table = CapBalanceLogs(
								adminId=adminId,
								userId = userId,
								previousBalance = capbalance_queryset.capBalance,
								currentBalance = capBalance,
								createdOn = datetime.datetime.now(),
								status = 1
								)
							save_table = capbalance_table.save()
							flash("CapBalance Updated Successfully","success")
							data_status['responseStatus']=1
							return data_status
						else:
							flash("Invalid Merchant 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("The request is invalid. Please check and try again.", "error")
				data_status['responseStatus']=4
				return data_status
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable To Assign Cap Balance"
			flash(error,"danger")
			data_status['responseStatus']=4
			return data_status

	else:
		flash("The staff member does not have permission to view Cap Balance", "danger")
		return redirect(url_for("admin.dashboard"))

# @user_managements.route("/documents_update_status", methods=["POST"])
# def documents_update_status():
#     if not session.get("adminId"):
#         return redirect(url_for("admin_login"))
	
#     adminId = session.get("adminId")
#     userId = request.args.get("userId", "")
#     documentStatus = request.form.get("documentStatus", "")
#     documentId = request.form.get("documentId", "")
	
#     try:
#         if request.method == "POST":
#             if userId and documentId and documentStatus:
#                 print(userId,"userId")
#                 print(documentId,"documentId")
#                 print(documentStatus,"documentStatus")

#                 user_kyc_queryset = UserKYC.objects(userId=userId, status__in=[0,1]).first()
#                 if not user_kyc_queryset:
#                     flash("Invalid User Id!!")
#                     return redirect(url_for("user_managements.user_update", userId=userId))

#                 existingDocumentsList = user_kyc_queryset.documentsList or []
#                 for each_document in user_kyc_queryset.documentsList:
#                     if each_document.get("documentId") == documentId:
#                         documentDict = {
#                         "documentId":documentId,
#                         "documentName":each_document.get("documentName"),
#                         "image":each_document.get("image"),
#                         "documentStatus":documentStatus
#                         }
#                         existingDocumentsList.append(documentDict)
#                 user_kyc_queryset.update(documentsList=existingDocumentsList)
#                 flash("Document status updated successfully!")
#                 return redirect(url_for("user_managements.user_update", userId=userId))
#             else:
#                 flash("Required fields are missing!")
#                 return redirect(url_for("user_managements.user_update", userId=userId))
	
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         flash("Server Connection Error. Please try again!")
#         return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/documents_update_status", methods=["POST"])
@adminid_access_token_required
@csrf_protect
def documents_update_status():
	data_status ={"responseStatus":0,"result":""}
	if not session.get("adminId"):
		return redirect(url_for("admin_login"))
	
	userKycpage = request.form.get("userKycpage","")
	adminId = session.get("adminId")
	
	csrf_token = request.form.get("csrf_token")
	
	
	if userKycpage!="":
		userId = request.args.get("userKycId", "")
	else:
		userId = request.args.get("userId", "")
	documentStatus = request.form.get("documentStatus", "")
	documentId = request.form.getlist("documentId")
	
	
	print(documentId,"(((((((((((((((documentId)))))))))))))))")
	print(userId,"(((((((((((((((documents_update_status)))))))))))))))")
	try:
		if request.method == "POST":
			form = UploadDocumentForm(request.form)
			if form.validate_on_submit():
				if userId and documentId and documentStatus:

					if userKycpage!="":
						user_kyc_queryset = UserKYC.objects(id=userId, status__in=[0,1]).first()
						if not user_kyc_queryset:
							flash("Invalid User Id!!")
							data_status["responseStatus"] = 4
							return data_status
					else:
						user_kyc_queryset = UserKYC.objects(userId=userId, status__in=[0,1]).first()
						if not user_kyc_queryset:
							flash("Invalid User Id!!")
							return redirect(url_for("user_managements.user_update", userId=userId,redirectTo="businessDetails"))

					

					updated = False
					# Iterate over documents and update the status of the matching document
					for each_document in user_kyc_queryset.documentsList:
						print(each_document.get("documentId"),"@@@@@@@@@@@@@@@@@@@@@")
						print(documentId,"documentId")
						if str(each_document.get("documentId")) in documentId:
							each_document["documentStatus"] = documentStatus  # Update the status
							updated = True
							

					print(updated,"((((((updated))))))")
					if updated:
						user_kyc_queryset.save()  # Save the changes to the database
						flash("Document status updated successfully!")
						data_status["responseStatus"] = 1
						return data_status
					else:
						flash("Document not found!")
						data_status["responseStatus"] = 2
						data_status["result"] = "Document not found!"
						return data_status
					if userKycpage!="":
						return redirect(url_for("user_managements.user_kyc_update", userKycId=userId,documentStatus=documentStatus,redirectTo="businessDetails"))
					else:
						return redirect(url_for("user_managements.user_update", userId=userId,documentStatus=documentStatus,redirectTo="businessDetails"))
				else:
					flash("Required fields are missing!")
					if userKycpage!="":
						data_status["responseStatus"]= 4
						return data_status
					else:
						return redirect(url_for("user_managements.user_update", userId=userId,redirectTo="businessDetails"))
			else:
				data_status["result"] = form.errors
				return data_status
	
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Server Connection Error. Please try again!")
		return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/shop_images_update_status", methods=["POST"])
@adminid_access_token_required
@csrf_protect
def shop_images_update_status():
	data_status={"responseStatus":0,"result":""}
	if not session.get("adminId"):
		return redirect(url_for("admin_login"))
	userKycpage = request.form.get("userKycpage","")
	print(userKycpage,"userKycpage hittttttttttttt")
	adminId = session.get("adminId")
	
	csrf_token = request.form.get("csrf_token")
	
	
	if userKycpage!="":
		userId = request.args.get("userKycId", "")
	else:
		userId = request.args.get("userId", "")

	shopImageStatus = request.form.get("shopImageStatus", "")
	shopImageNumber = request.form.getlist("shopImageNumber")
	shopRemark = request.form.get("shopRemark")

	# if shopRemark and not is_valid_alphanumeric(shopRemark):
	#   flash("Remark contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
	#   return redirect(url_for("user_managements.manage_users_list",redirectTo="businessDetails"))
	

	print(shopImageNumber,"(((((((((((((((shopImageNumber list)))))))))))))))")
	
	try:
		if request.method == "POST":
			form = ShopImagesForm(request.form)
			if form.validate_on_submit():
				if userId and shopImageNumber and shopImageStatus :
					if userKycpage!="":
						user_kyc_queryset = UserKYC.objects(id=userId, status__in=[0,1]).first()
						if not user_kyc_queryset:
							flash("Invalid User Id!!")
							return redirect(url_for("user_managements.user_kyc_update", userKycId=userId,redirectTo="businessDetails"))
					else:
						user_kyc_queryset = UserKYC.objects(userId=userId, status__in=[0,1]).first()
						if not user_kyc_queryset:
							flash("Invalid User Id!!")
							return redirect(url_for("user_managements.user_update", userId=userId,redirectTo="businessDetails"))

					updated = False

					user_kyc_queryset.update(shopRemark=shopRemark)
					
					# Iterate over documents and update the status of the matching document
					for each_shop_image in user_kyc_queryset.shopImagesList:
						if str(each_shop_image.get("shopImageNumber")) in shopImageNumber:
							each_shop_image["shopImageStatus"] = shopImageStatus  # Update the status
							updated = True
							print(updated,"((((((updated))))))")

					print(updated,"((((((updated))))))")
					if updated:
						user_kyc_queryset.save()  # Save the changes to the database
						flash("Shop image status updated successfully!")
						data_status["responseStatus"] = 1
						return data_status
					else:
						flash("Shop image not found!")
					if userKycpage!="":
						data_status["responseStatus"] = 4
						return data_status
					else:
						return redirect(url_for("user_managements.user_update", userId=userId,redirectTo="businessDetails"))
				else:
					flash("Required fields are missing!")
					if userKycpage!="":
						data_status["responseStatus"]= 4
						data_status["result"] = "Required fields are missing!"
						return data_status
					else:
						return redirect(url_for("user_managements.user_update", userId=userId,redirectTo="businessDetails"))
			else:
				data_status["result"] = form.errors
				return data_status
	
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Server Connection Error. Please try again!")
		return redirect(url_for("user_managements.manage_users_list"))


@user_managements.route('/get_merchant_counts', methods=['GET'])
def get_merchant_counts():
   
	rejected_count = 0
	pending_count = 0
	submitted_count = 0
	approved_count = 0
	
	blocked_merchants_count = Users.objects(status=3).count()
	locked_merchants_count = Users.objects(status=5).count()

	users_queryset = Users.objects(status__ne=2)

	kycUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId != None) and (each_user.entityTypeId.isIndividual == False)]
	trueUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId == None) or (each_user.entityTypeId.isIndividual == True)]

	# Base query for UserKYC
	user_kycs_queryset = UserKYC.objects(status__nin=[2]).order_by("-submittedDate")

		
	user_kycs_queryset = user_kycs_queryset.filter(
		(Q(userId__in=kycUsersList) & (Q(documentsList=[]) | Q(shopImagesList=[]) | Q(documentsList=None) | Q(shopImagesList=None) | Q(shopImagesList__elemMatch={"shopImageStatus": {"$ne": "Approved"}}) | Q(documentsList__elemMatch={"documentStatus": {"$ne": "Approved"}}) | Q(businessStatus__ne="Approved")  | Q(panStatus__ne="Approved") | Q(bankStatus__ne="Approved") | Q(aadharStatus__ne="Approved") | Q(agreementVerificationStatus__ne="Approved") | Q(videoVerificationStatus__ne="Approved") | Q(shopVideoStatus__ne="Approved"))) |
		(Q(userId__in=trueUsersList) & (Q(panStatus__ne="Approved") | Q(bankStatus__ne="Approved") | Q(aadharStatus__ne="Approved") | Q(agreementVerificationStatus__ne="Approved") | Q(videoVerificationStatus__ne="Approved")))
	)
	pending_count=user_kycs_queryset.count()

	# Prepare the response data
	response_data = {
		"pending_count": pending_count,
		"blocked_merchants_count": blocked_merchants_count,
		"locked_merchants_count": locked_merchants_count,
	}

	return jsonify(response_data)


@user_managements.route("/userwise_payin_payout_update",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def userwise_payin_payout_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")
	
	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()

	usersList = []
	form=UserPayinPayoutForm(request.form)
	try:
		permissionsList = check_permissions(session.get("adminId"),"userwisePermission")
		if "edit" in permissionsList:
			if request.method =="GET":

				user_queryset = Users.objects(status__nin=[2]).all()
				for each_user in user_queryset:
					userDict = {
						"userId":each_user.id,
						"userName":each_user.fullName,
						"mobileNumber":each_user.phoneNumber
					}
					# if userDict not in userDict:
					usersList.append(userDict)
				return render_template(
						"super_admin_templates/userwise_payin_payout_update.html",
						usersList=usersList,form=form
					)
			elif request.method=="POST":
				if form.validate():
					otp_check_id = request.form.get("otpLogid", "")
					defaultVerificationId = request.form.get("defaultVerificationId", "")

					if not otp_check_id:
						flash("Invalid Request.")
						data_status['responseStatus']=0
						return data_status 
					otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()
					
					if not otpcheck_queryset:
						flash("Invalid Request.")
						data_status['responseStatus']=0
						return data_status 
					# Update OTP status to 2 after verification
					otpcheck_queryset.update(status=2)

					

					usersListType = request.form.get("usersListType")
					walletType = request.form.get("walletType")
					usersList = request.form.getlist("usersList")
					excludeUsersList = request.form.getlist("excludeUsersList[]")
					statusType = request.form.get("statusType")

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

					# print("usersListType",usersListType)
					# print("walletType",walletType)
					# print("usersList",usersList)
					# print("statusType",statusType)


					if statusType == "True":
						statusTypeBoolean = True
					elif statusType == "False":
						statusTypeBoolean = False
					else:
						flash("Invalid Status Type")
						data_status['responseStatus']=4
						return data_status 
					
					
					if walletType and usersListType:
						if usersListType == "All":
							users_queryset=Users.objects(status__nin=[2]).all()

							for each_user in users_queryset:
								if walletType == "Payin" or walletType == "Both":
									each_user.enablePayin = statusTypeBoolean
									each_user.save()
								if walletType == "Payout" or walletType == "Both":
									each_user.enablePayout = statusTypeBoolean
									each_user.save()
								
						elif usersListType == "Specific":
							specific_users_queryset=Users.objects(id__in=usersList,status__nin=[2]).all()
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							existing_record = specific_users_queryset.to_json()
							message=admin_queryset.userName+" "+walletType+" User Type Updated successfully!"
							requestData=[specific_users_queryset]
							updatedrequestData=[jsonData]
							save_admin_log_table = save_admin_logs_data(adminId,None,None,"userwise_payin_payout_update","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
							for each_specific_user in specific_users_queryset:
								if walletType == "Payin" or walletType == "Both":
									each_specific_user.enablePayin = statusTypeBoolean
									each_specific_user.save()
								if walletType == "Payout" or walletType == "Both":
									each_specific_user.enablePayout = statusTypeBoolean
									each_specific_user.save()
						else:
							flash("Invalid User Update Type","danger")
							data_status['responseStatus']=4
							return data_status 
						flash("User Type Updated Successfully","success")
						data_status['responseStatus']=1
						return data_status 
						# admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
						# # existing_record = users_queryset.to_json()
						# message=admin_queryset.userName+" User Payin Payout updated successfully!"
						# requestData=[jsonData]
						# updatedrequestData=[jsonData]
						# save_admin_log_table = save_admin_logs_data(adminId,None,None,"userwise_payin_payout_update","update",actionDate,client_ip,browser,message,requestData,updatedrequestData)

					else:
						data_status['responseStatus']=2
						data_status['result']="Required fields are missing!!"
						return data_status    
				else:
					
					data_status['result']=form.errors
					return data_status
					
			return redirect(url_for("user_managements.userwise_payin_payout_update",form=form))  
		else:
			flash("The staff member does not have permission to update User Wise.", "danger")
			return redirect(url_for("user_managements.userwise_payin_payout_update"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash(f"Error in User Wise Payin Payout Update: {str(e)}", "error")
		return redirect(url_for("user_managements.userwise_payin_payout_update"))
		
		
		

# @user_managements.route("/userwise_payin_payout_update",methods=["POST","GET"])
# @adminid_access_token_required
# @csrf_protect
# def userwise_payin_payout_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")
	

#     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()

#     usersList = []
#     # form=UserPayinPayoutForm(request.args)
#     try:
#         permissionsList = check_permissions(session.get("adminId"),"userwisePermission")
#         # if form.validate():
#         if "edit" in permissionsList:
#             if request.method =="GET":
				

#                 user_queryset = Users.objects(status__nin=[2]).all()
#                 for each_user in user_queryset:
#                     userDict = {
#                         "userId":each_user.id,
#                         "userName":each_user.fullName,
#                         "mobileNumber":each_user.phoneNumber
#                     }
#                     # if userDict not in userDict:
#                     usersList.append(userDict)
#                 return render_template(
#                         "super_admin_templates/userwise_payin_payout_update.html",
#                         usersList=usersList
#                     )
#             elif request.method=="POST":
#                 otp_check_id = request.form.get("otpLogid", "")
#                 print("otp_check_id",otp_check_id)
#                 if not otp_check_id:
#                     flash("Invalid Request.")
#                     return redirect(url_for("user_managements.userwise_payin_payout_update"))
				
#                 otpcheck_queryset = OtpChecks.objects(adminId=adminId, id=str(otp_check_id), status=1).first()
				
#                 if not otpcheck_queryset:
#                     flash("Invalid Request.")
#                     return redirect(url_for("user_managements.userwise_payin_payout_update"))
#                 # Update OTP status to 2 after verification
#                 otpcheck_queryset.update(status=2)

				

#                 usersListType = request.form.get("usersListType")
#                 walletType = request.form.get("walletType")
#                 usersList = request.form.getlist("usersList[]")
#                 # excludeUsersList = request.form.getlist("excludeUsersList[]")
#                 statusType = request.form.get("statusType")

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

#                 print("usersListType",usersListType)
#                 print("walletType",walletType)
#                 print("usersList",usersList)
#                 print("statusType",statusType)


#                 if statusType == "True":
#                     statusTypeBoolean = True
#                 elif statusType == "False":
#                     statusTypeBoolean = False
#                 else:
#                     flash("Invalid Status Type!!!!")
#                     return redirect(url_for("user_managements.userwise_payin_payout_update"))
				
				
#                 if walletType and usersListType:
#                     if usersListType == "All":
#                         users_queryset=Users.objects(status__nin=[2]).all()

#                         for each_user in users_queryset:
#                             if walletType == "Payin" or walletType == "Both":
#                                 each_user.enablePayin = statusTypeBoolean
#                                 each_user.save()
#                             if walletType == "Payout" or walletType == "Both":
#                                 each_user.enablePayout = statusTypeBoolean
#                                 each_user.save()
							
#                     elif usersListType == "Specific":
#                         specific_users_queryset=Users.objects(id__in=usersList,status__nin=[2]).all()
#                         admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
#                         existing_record = specific_users_queryset.to_json()
#                         message=admin_queryset.userName+" User Type Updated successfully!"
#                         requestData=[specific_users_queryset]
#                         updatedrequestData=[jsonData]
#                         save_admin_log_table = save_admin_logs_data(adminId,None,None,"userwise_payin_payout_update","update",actionDate,client_ip,browser,message,requestData,updatedrequestData)
#                         for each_specific_user in specific_users_queryset:
#                             if walletType == "Payin" or walletType == "Both":
#                                 each_specific_user.enablePayin = statusTypeBoolean
#                                 each_specific_user.save()
#                             if walletType == "Payout" or walletType == "Both":
#                                 each_specific_user.enablePayout = statusTypeBoolean
#                                 each_specific_user.save()
#                     else:
#                         flash("Invalid User Update Type!!!!")
#                         return redirect(url_for("user_managements.userwise_payin_payout_update"))
#                     flash("User Type Updated Successfully!!!!")
#                     return redirect(url_for("user_managements.userwise_payin_payout_update"))
#                     # admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
#                     # # existing_record = users_queryset.to_json()
#                     # message=admin_queryset.userName+" User Payin Payout updated successfully!"
#                     # requestData=[jsonData]
#                     # updatedrequestData=[jsonData]
#                     # save_admin_log_table = save_admin_logs_data(adminId,None,None,"userwise_payin_payout_update","update",actionDate,client_ip,browser,message,requestData,updatedrequestData)

#                 else:
#                     flash("Required fields are missing!!")
#                 return redirect(url_for("user_managements.userwise_payin_payout_update"))
#         else:
#             flash("Staff member does not have given update User Wise Payin Payou permissions!!")
#             return redirect(url_for("user_managements.userwise_payin_payout_update"))
#         # else:
#         #     return redirect(url_for("user_managements.userwise_payin_payout_update"))
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         flash(f"Error in User Wise Payin Payout Update: {str(e)}", "error")
#         return redirect(url_for("user_managements.userwise_payin_payout_update"))
		