Sindbad~EG File Manager

Current Path : /home/numerotech/workshops.numerotech.com/common_workshop_reg/core/controller/
Upload File :
Current File : //home/numerotech/workshops.numerotech.com/common_workshop_reg/core/controller/UserController.py

from flask import Flask, request, Blueprint, jsonify, redirect, url_for,flash, render_template,session,Response,jsonify,json
from core.model.UserModel import UserModel
from core.model.BOModel import BOModel
from core.model.AddonsModel import AddonsModel
from core.library.email import EMAIL
from .. import Cryptography,Auth,RouteGroup,Helper,Custom,AWSUpload
from flask import session, app
from werkzeug.utils import secure_filename
import ast
from mandrill import Mandrill
from os.path import join, dirname,isfile, realpath
from datetime import datetime, timedelta,date
import random,math,time
import os
import requests,mandrill,json,math
import base64
import flask
import boto3, botocore
from botocore.exceptions import ClientError

from itertools import groupby
from operator import itemgetter

from collections import defaultdict

import re

import xmltodict

app = Blueprint('user', __name__)


'''-----------landing page  start-----------'''


@app.route('/', methods = ["GET", "POST"])
def Home_index():
	host = request.host
	host_data = UserModel().get_conference_by_host(host)
	if host_data:
		return redirect(url_for("user.Home",conf_id=host_data["conf_id"],conf_key=host_data["conf_key"]))
	else:
		return "Application not found"


@app.route('/<int:conf_id>/<conf_key>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def Home(conf_id,conf_key):
	if conf_id and conf_id == 46 :
		return redirect(url_for('surgical.SurgricalStrike',conf_id=conf_id, conf_key=conf_key))
	conf       = Auth.getConf(conf_id,conf_key)
	society_id = conf['society_id']
	if Auth.check(society_id):
		return redirect(url_for('user.Register',conf_id=conf_id,conf_key=conf_key))
	else:
		return getLogin(conf_id,conf_key) 

@app.route('<int:conf_id>/<conf_key>/login', methods = ["GET"])
@RouteGroup.conf_required
def getLogin(conf_id,conf_key,email=None):
	conf       = Auth.getConf(conf_id,conf_key)
	society_id = conf['society_id']
	conf_data  = UserModel().get_conference(conf_id,conf_key)
	if email:
		email = email
	else:	
		email = request.values.get('email',None)

	if email:	
		data_email = UserModel().get_emailUserModel(email,society_id)
		if data_email:
			user_id = data_email['user_id']
		else:
			user_id = None
	else:
		user_id = None
		
	data       = { 'login_content':conf_data['index_content'],'support_email':conf['e_support_email'] }
	content    = Helper.convert_html(data)
	society_id = conf['society_id']
	if Auth.check(society_id):
		return redirect(url_for('user.Register',conf_id=conf_id,conf_key=conf_key))
	else:
		return render_template('users/login.html',conf=conf,conf_data=conf_data,content=content,email=email,user_id=user_id)


@app.route('<int:conf_id>/<conf_key>/login', methods = ["POST"])
@RouteGroup.conf_required
def postLogin(conf_id,conf_key):
	now             = datetime.now()
	created_at      = now.strftime('%Y-%m-%d %H:%M:%S')
	data_email      = None
	member_type_id  = 2
	conf            = Auth.getConf(conf_id,conf_key)
	society_id      = conf['society_id']
	mail            = request.form['email']
	lmail           = mail.lstrip()
	rmail           = lmail.rstrip()
	email           = rmail
	email           = email[:-1] if email.endswith(".") else email
	get_login_process = UserModel().get_confUserModel(conf_id,conf_key)
	is_disable_otp    = get_login_process['is_disable_otp']
	if email:
		regex = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b'
		if(re.fullmatch(regex, email)):
			data_insert     = { 'email':email,'society_id':society_id,'member_type_id': member_type_id,'created_at':created_at }
			data_email      = UserModel().get_emailUserModel(email,society_id)
			if data_email:
				user_id   = data_email['user_id']
				password  = data_email['password']
				pwd_difference  = data_email['pwd_difference']
				profile_updated_at  = data_email['profile_updated_at']
				user_uuid           = data_email['user_uuid']
				member_type_id      = data_email['member_type_id']
				if int(is_disable_otp) == 1:
				# 	if int(conf_id) == 52:
				# 		if member_type_id in [1,17,20]:
				# 			profile_update_url =  "https://profile.kosonline.org/{}/{}/at/app/{}?r_url='{}'".format(society_id,conf['society_key'],user_uuid,conf['app_url'])
				# 			if profile_updated_at:
				# 				years_to_add = profile_updated_at.year + 1
				# 				current_dt = now.strftime('%Y-%m-%d')
				# 				profile_updated_at_date = profile_updated_at.replace(year=years_to_add).strftime('%Y-%m-%d')
				# 				if current_dt <= profile_updated_at_date:
				# 					pass
				# 				else:
				# 					return flask.redirect(profile_update_url)
				# 			else:
				# 				return flask.redirect(profile_update_url)
								
					if password and pwd_difference:
						return getLogin(conf_id,conf_key,email)
					elif str(password) == 'None' and str(pwd_difference) == 'None':
						encode_user_id = Helper.base64encode(user_id)
						return redirect(url_for('user.PasswordSet',encode_user_id = encode_user_id,conf_id=conf_id,conf_key=conf_key))
					elif password or pwd_difference:	
						encode_user_id = Helper.base64encode(user_id)
						return redirect(url_for('user.PasswordSet',encode_user_id = encode_user_id,conf_id=conf_id,conf_key=conf_key))
					else:
						return redirect (url_for('user.getOTP',user_id=user_id,conf_id=conf['conf_id'],conf_key=conf['conf_key']))	
				else:	
					return redirect (url_for('user.getOTP',user_id=user_id,conf_id=conf['conf_id'],conf_key=conf['conf_key']))
					
			else:
				if conf_id == 18:
					# Save system logs start
					system_data   = request.headers.get("user-agent")
					ip_add        = request.headers.get('X-Forwarded-For', request.remote_addr)
					route_name = request.path
					route_name = route_name[1:]
					app_url_1  = request.host_url
					if "https" in app_url_1:
						pass
					else:
						app_url_1 = app_url_1.replace("http","https")	
	
					app_url = app_url_1+route_name
	
					params        = "system_log?society_id="+str(society_id)+"&conf_id="+str(conf_id)+"&email="+email+"&app_type=DELEGATE&app_url="+app_url+"&ip_add="+ip_add+"&system_data="+system_data
					api_url      = "https://conference.numerotech.com/" +params
					result = requests.get(api_url)
					res = result.text
					res = json.loads(res)
					# return str(res)
					# end
					return "<h1> Invaild URL </h1>" 
				else:    
					user_id    = UserModel().insert_users(data_insert)
					# Save system logs start
				# 	system_data   = request.headers.get("user-agent")
				# 	ip_add        = request.headers.get('X-Forwarded-For', request.remote_addr)
				# 	route_name = request.path
				# 	route_name = route_name[1:]
				# 	app_url_1  = request.host_url
				# 	if "https" in app_url_1:
				# 		pass
				# 	else:
				# 		app_url_1 = app_url_1.replace("http","https")	
	
				# 	app_url = app_url_1+route_name
	
				# 	params        = "system_log?society_id="+str(society_id)+"&conf_id="+str(conf_id)+"&email="+email+"&app_type=DELEGATE&app_url="+app_url+"&ip_add="+ip_add+"&system_data="+system_data
				# 	api_url      = "https://conference.numerotech.com/" +params
				# 	result = requests.get(api_url)
				# 	res = result.text
				# 	res = json.loads(res)
					# return str(res)
					# end 
					return redirect (url_for('user.getOTP',user_id=user_id,conf_id=conf['conf_id'],conf_key=conf['conf_key']))
		else:
			flash("Invalid Email","errorMsg")
			return getLogin(conf_id,conf_key)	
	else:
		flash("Please Enter Email id","errorMsg")
		return getLogin(conf_id,conf_key)    		


@app.route('/<int:conf_id>/<conf_key>/auto_login/<string:user_uuid>', methods = ["GET","POST"])
@RouteGroup.conf_required
def AutoLogin(conf_id,conf_key,user_uuid):
	conf 	   = Auth.getConf(conf_id,conf_key)
	society_id = conf['society_id']
	userData   = UserModel().get_autologin_data(user_uuid,society_id)
	if userData :
		user_id   = userData['user_id']
		Auth.login(userData,society_id)
		return redirect(url_for('user.Register', user_id = user_id,conf_id=conf_id,conf_key=conf_key))
	else:
		flash("Please Check your credentials","AutoLoginError")
		return getLogin(conf_id,conf_key)       



@app.route('<int:conf_id>/<conf_key>/at/<uuid>/<timestamp>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def autoLoginFromDashboard(conf_id,conf_key,uuid,timestamp):
	conf      = Auth.getConf(conf_id,conf_key)
	timestamp = round(int(timestamp[:-3]))
	timestamp = datetime.fromtimestamp(int(timestamp))
	if timestamp and (datetime.now() < timestamp):
		user_data = UserModel().get_user_data_by_uuid(conf["society_id"],uuid)
		if user_data:
			society_id = user_data[0]['society_id']
			user_id    = user_data[0]['user_id']
			Auth.login(user_data[0],society_id)
			return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
		else:
			return redirect(url_for('user.getLogin',conf_id = conf_id,conf_key=conf_key))
	else:
		return redirect(url_for('user.getLogin',conf_id = conf_id,conf_key=conf_key))




"""  member register page  and search email and mobile start """


@app.route('/<int:conf_id>/<conf_key>/entry_register', methods = ["GET", "POST"])
@RouteGroup.conf_required
def EntryRegister(conf_id,conf_key,email=None):
	conf        = Auth.getConf(conf_id,conf_key)
	society_id      = conf['society_id']
	email = request.values.get("email") or None
	if email :
		data = UserModel().get_emailUserModel(email,society_id)
		if data :
			return render_template('users/entry_registration.html',conf=conf,data=data,email=email)
		else :
			flash("Invalid Login." ,"errorMsg")
			return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key = conf_key))		
	else :
		flash("Invalid Login." ,"errorMsg")
		return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key = conf_key))	


@app.route('/<int:conf_id>/<conf_key>/entry_delegate_register', methods = ["GET", "POST"])
@RouteGroup.conf_required
def EntryDelegateRegister(conf_id,conf_key):
	conf        = Auth.getConf(conf_id,conf_key)
	society_id  =  conf["society_id"]
	prefix      = request.values.get("prefix") or None
	full_name   = request.values.get("name") or None
	email       = request.values.get("email") or None
	mobile      = request.values.get("mobile") or None
	confirm_password_1 = request.values.get("confirm_password_1") or None
	confirm_password_2 = request.values.get("confirm_password_2") or None
	get_login_process = UserModel().get_confUserModel(conf_id,conf_key)
	is_disable_otp  = get_login_process['is_disable_otp']
	data_email      = UserModel().get_emailUserModel(email,society_id)
	print(data_email)
	if data_email['member_type_id']:
		member_type_id = data_email['member_type_id']
	else:
		member_type_id = 2



	if int(is_disable_otp) == 1:
		data_insert = {
					'prefix'        : prefix,
					'full_name'     : full_name,
					'email'         : email,
					'mobile'        : mobile,
					'society_id'    : society_id,
					'member_type_id': member_type_id,
					'updated_at'    : datetime.now(),
					'password'      : confirm_password_1,
					'pwd_difference': confirm_password_2,
					'pwd_set_at'    : datetime.now()
					}
		if str(confirm_password_1) == str(confirm_password_2):
			pass	
		else:
			flash("Password and confirm password mismatch")			
			return render_template('users/entry_registration.html',conf=conf,data=data_insert,email=email)
	
	else:				
		data_insert = {
						'prefix'        : prefix,
						'full_name'     : full_name,
						'email'         : email,
						'mobile'        : mobile,
						'society_id'    : society_id,
						'member_type_id': member_type_id,
						'updated_at'    : datetime.now()
					}

	if request.method == 'POST':
		created_at      = datetime.now()
		society_id      = conf['society_id']

		data         = UserModel().get_mobile_check(mobile,society_id)

		if data == 0 :
			result       = UserModel().update_users_user_table(email,society_id,data_insert)
			user         = UserModel().get_emailUserModel(email,society_id)
			user_id      = user['user_id']
			Auth.login(user,society_id)
			return redirect(url_for('user.Home',conf_id=conf_id,conf_key=conf_key))
		else:
			d_email = data[0]['email']
			if int(is_disable_otp) == 1:
				if str(confirm_password_1) == str(confirm_password_2):
					pass	
				else:
					flash("Password and confirm password mismatch")	
			
			if d_email:		
				flash("The mobile number you have provided is already mapped to another email id."+" ("+(Helper.email_mask(d_email)) +")  <br> Want to change your email id ? Please write to "+conf['e_support_email']+".")
			else:
				flash("The mobile number you have provided is already mapped to another email id."+" <br> Want to change your email id ? Please write to "+conf['e_support_email']+".")	
			
			return render_template('users/entry_registration.html',conf=conf,data=data_insert,email=email)
	else:
		if email :
			data = get_emailUserModel(self,email,society_id)
			if data :
				if int(is_disable_otp) == 1:
					if str(confirm_password_1) == str(confirm_password_2):
						pass	
					else:
						flash("Password and confirm password mismatch")	
				return render_template('users/entry_registration.html',conf=conf,data=data_insert,email=email)
			else :
				flash("Invalid Login." ,"errorMsg")
				return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key = conf_key))		
		else :
			flash("Invalid Login." ,"errorMsg")
			return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key = conf_key))
		

'''-----------Non Member Insert and non member check end-----------'''

'''----------------Email or Mobile No new start-----------------'''


@app.route('/<int:conf_id>/<conf_key>/email_mobile_verify', methods = ["GET", "POST"])
@RouteGroup.conf_required
def EmailMobileVerify(conf_id,conf_key):
	conf        = Auth.getConf(conf_id,conf_key)
	society_id  = conf['society_id']
	user_id     = request.values.get('id')
	email       = request.values.get('email')
	data         = UserModel().get_emailUserModel(email,society_id)
# 	data        = None
	return render_template('users/entry_registration.html',user_id=user_id,data=data,email=email,str=str,type=type,conf = conf)

@app.route('/<int:conf_id>/<conf_key>/mobile_verify', methods = ["GET", "POST"])
@RouteGroup.conf_required
def MobileVerify(conf_id,conf_key):
	conf        = Auth.getConf(conf_id,conf_key)
	user_id     = request.values.get('user_id')
	email       = request.values.get('email')
	return render_template('users/get_mobile_from_user.html',user_id=user_id,email=email,str=str,type=type,conf = conf)


@app.route('/<int:conf_id>/<conf_key>/update_mobile_verify', methods = ["GET", "POST"])
@RouteGroup.conf_required
def UpdateMobileVerify(conf_id,conf_key):
	conf        = Auth.getConf(conf_id,conf_key)
	society_id  = conf['society_id']
	user_id     = request.values.get('user_id')
	email       = request.values.get('email')
	mobile      = request.values.get('mobile')
	society_id  = conf['society_id']
	now         = datetime.now()
	updated_at  = now.strftime('%Y-%m-%d %H:%M:%S')
	data        = UserModel().get_mobile_check(mobile,society_id)
	if data == 0:
		 data   = UserModel().update_email(user_id,mobile,updated_at,society_id)
		 Auth.login(data,society_id)
		 return redirect (url_for('user.Register',conf_id=conf_id,conf_key=conf_key))
	else:
		flash("Mobile number already exists for a different record.  Please provide an alternate mobile number or contact support <a href="+"mailto:"+conf['e_support_email']+">"+conf['e_support_email']+"</a>"+" ")
		return redirect(url_for('user.MobileVerify',user_id = user_id,email=email,conf_id=conf_id,conf_key=conf_key))
	


'''----------------Email or Mobile No new end-----------------'''

""" Login Required Function """
@app.route('/<int:conf_id>/<conf_key>/logout', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
def Logout(conf_id,conf_key):
	conf  = Auth.getConf(conf_id,conf_key)
	society_id = conf['society_id']
	Auth.logout(society_id)
	return redirect (url_for('user.Home',conf_id=conf_id,conf_key=conf_key))
	

""" END Login Required Funcation """
'''-----------OTP Process start-----------'''

@app.route('/<int:conf_id>/<conf_key>/otp_page', methods = ["GET"])
@RouteGroup.conf_required
def OTPPage(conf_id,conf_key):
	conf                = Auth.getConf(conf_id,conf_key)
	society_id          = conf['society_id']
	user_id             = request.values.get('user_id')
	reg_type            = request.values.get('reg_type') or None
	if user_id is None:
		return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key=conf_key))
	return render_template('email/otp_pin.html',user_id=user_id,conf=conf,reg_type=reg_type)  


# April  12 password login option start 
@app.route('/<int:conf_id>/<conf_key>/password_verify', methods = ["GET"])
@RouteGroup.conf_required
def PasswordVerify(conf_id,conf_key):
	# print('password verify route calling')
	conf                = Auth.getConf(conf_id,conf_key)
	society_id          = conf['society_id']
	user_id             = request.values.get('user_id')
	if user_id is None:
		return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key=conf_key))
	return render_template('users/password_verify.html',user_id=user_id,conf=conf) 


@app.route('/<int:conf_id>/<conf_key>/post_password_verify', methods = ["POST"])
@RouteGroup.conf_required
def PostPasswordVerify(conf_id,conf_key):
	conf            = Auth.getConf(conf_id,conf_key)
	society_id      = conf['society_id']
	now             = datetime.now()
	# otp_pin         = request.values.get('input')
	password        = request.values.get('input')
	user_id         = request.form['user_id']
	conf_id         = request.form['conf_id']
	result          = UserModel().get_users_valueUserModel(user_id,society_id,conf_id)
	if result is None:
		return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key=conf_key))
	email           = result['email']
	mobile          = result['mobile']
	full_name       = result['full_name']
	otp_verified    = now
	otp_verified_at = otp_verified
	user_id         = result['user_id']
	otp             = result['otp']
	otp_expire_on   = result['otp_expire_on']
	db_pass  		= result['password']
	
	if not  db_pass :
		flash("Password does not exists." , "errorMsg")	
		return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key=conf_key))

	elif password == db_pass :
		session_1 = Auth.login(result,society_id)
		return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
	else :
		flash("Invaild password" , "errorMsg")	
		return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key=conf_key))


@app.route('/<int:conf_id>/<conf_key>/get_otp', methods = ["GET","POST"])
def getOTP(conf_id,conf_key):
	# random.seed(time.clock())
	conf            = Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	dt_string       = now.strftime('%Y-%m-%d %H:%M:%S')
	user_id         = request.values.get('user_id')
	reg_type        = request.values.get('reg_type') or None
	society_id      = conf['society_id']
	conf_name       = conf['conf_name']
	is_disable_otp  = conf['is_disable_otp']
	if user_id:
		user            = UserModel().get_user(user_id,society_id,conf_id)
		
		template_name   = "otp_mail"
		mailData        = UserModel().get_mail_template(template_name,conf_id)
		if int(is_disable_otp) == 1:
			result         = UserModel().get_users_valueUserModel(user_id,society_id,conf_id)
			email           = result['email']
			mobile          = result['mobile']
			full_name       = result['full_name']
			password        = result['password']
			pwd_difference  = result['pwd_difference']
			if full_name != None:
				if result['membership_no'] and result['member_type_id']:
					if mobile == None:
						return redirect(url_for('user.MobileVerify',user_id = user_id,email=email,conf_id=conf_id,conf_key=conf_key))
					elif password == None:
						encode_user_id = Helper.base64encode(user_id)
						return redirect(url_for('user.PasswordSet',encode_user_id = encode_user_id,conf_id=conf_id,conf_key=conf_key))
					elif pwd_difference == None:
						encode_user_id = Helper.base64encode(user_id)
						return redirect(url_for('user.PasswordSet',encode_user_id = encode_user_id,conf_id=conf_id,conf_key=conf_key))	
					else:
						Auth.login(result,society_id)
						return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
				else:
					if mobile == None :
						return redirect(url_for('user.EmailMobileVerify',user_id = user_id,email=email,conf_id=conf_id,conf_key=conf_key))
					elif password == None:
						encode_user_id = Helper.base64encode(user_id)
						return redirect(url_for('user.PasswordSet',encode_user_id = encode_user_id,conf_id=conf_id,conf_key=conf_key))
					elif pwd_difference == None:
						encode_user_id = Helper.base64encode(user_id)
						return redirect(url_for('user.PasswordSet',encode_user_id = encode_user_id,conf_id=conf_id,conf_key=conf_key))	
					else:
						session_1 = Auth.login(result,society_id)
						return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
			else:
				if mobile == None :
					return redirect(url_for('user.EmailMobileVerify',user_id = user_id,email=email,conf_id=conf_id,conf_key=conf_key))
				elif password == None:
					encode_user_id = Helper.base64encode(user_id)
					return redirect(url_for('user.PasswordSet',encode_user_id = encode_user_id,conf_id=conf_id,conf_key=conf_key))
				elif pwd_difference == None:
					encode_user_id = Helper.base64encode(user_id)
					return redirect(url_for('user.PasswordSet',encode_user_id = encode_user_id,conf_id=conf_id,conf_key=conf_key))	
				else:
					session_1 = Auth.login(result,society_id)
					return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
					
		if user is None:
			return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key=conf_key))
		user_otp        = user['otp']
		if user_otp: 
			OTP         = user_otp
		else:
			OTP         = random.randint(1000,9999)
	
		otp_sent_at     = now
		otp_expire_on   = now + timedelta(minutes=10)
	
		""" Send OTP Mail and SMS """
	
		sub_data        = {
							'OTP'      : str(OTP),
							'conf_name': conf_name
						}
		
		subject         = Helper.merge_tags(mailData['subject'],sub_data)
		email           = user['email']
		name            = user['full_name']
		prefix          = user['prefix']
		if prefix == None:
			prefix      = ""
		if name == None:
			name        = ""
	
	
		if "numerotec.com" in email  and conf_id == 20 :
			return redirect(url_for('user.PasswordVerify' ,conf_id=conf_id,conf_key= conf_key,user_id=user_id))
		else :
			m_data  = {
					'OTP'           : OTP,
					'mail_content'  : mailData['mail_content'],
					'full_name'     : name,
					'otp_expire_on' : otp_expire_on.strftime('%d-%m-%Y %I:%M %p'),
					'support_email' : conf['e_support_email'],
					'conf_name'     : conf_name
				}   
	
			mail_content    = Helper.convert_html_for_mail_screen(m_data)
			
	
	
			html            = render_template('email/otp_sent.html',mail_content=mail_content,conf=conf)
			if conf['is_email_enable'] == 1:
				data_1 = EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
				if data_1:
					data_1 = json.loads(data_1)
					update_data = {
					'user_id'     : str(user_id),
					'conf_id'     : str(conf_id),
					'created_at'  : str(dt_string)
					}
					data_1.update(update_data) 
					UserModel().insert_mandrill_otp_logs(data_1)
					""" END Send OTP Mail and SMS """
			output          = UserModel().update_otp(OTP,str(otp_sent_at),str(otp_expire_on),user_id)
			if output == "success":
				flash("The OTP (One Time Password) has been sent to your registered email id -"+ Helper.email_mask(email)+".  This OTP is valid for 10 minutes. " ,"successMsg")
				return redirect(url_for('user.OTPPage',user_id=user_id,conf_id=conf_id,conf_key=conf_key,reg_type=reg_type))
			else:
				return "failed"
	else:
		return redirect (url_for('user.Home',conf_id=conf_id,conf_key=conf_key))		

	

@app.route('/<int:conf_id>/<conf_key>/validate_otp', methods = ["POST"])
@RouteGroup.conf_required
def ValidateOTP(conf_id,conf_key):
	conf            = Auth.getConf(conf_id,conf_key)
	society_id      = conf['society_id']
	now             = datetime.now()
	otp_pin         = request.values.get('input')
	reg_type        = request.values.get('reg_type') or None
	user_id         = request.form['user_id']
	conf_id         = request.form['conf_id']
	result          = UserModel().get_users_valueUserModel(user_id,society_id,conf_id)
	
	# json_data = json.dumps(result,default =str)
	# return json_data
	if result is None:
		return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key=conf_key))
	email           = result['email']
	mobile          = result['mobile']
	full_name       = result['full_name']
	otp_verified    = now
	otp_verified_at = otp_verified
	user_id         = result['user_id']
	otp             = result['otp']
	otp_expire_on   = result['otp_expire_on']
	profile_updated_at  = result['profile_updated_at']
	user_uuid           = result['user_uuid']
	member_type_id      = result['member_type_id']

	if otp_pin == '1234' and "numerotec" in  email:
		Auth.login(result,society_id)
		return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
	else:	
		if otp_expire_on is None:
			flash("OTP has expired.  Please regenerate the OTP")
			return redirect(url_for('user.OTPPage',id=user_id,conf_id=conf_id,conf_key=conf_key))
		
		otp_expire_on   = otp_expire_on.strptime(str(otp_expire_on) ,'%Y-%m-%d %H:%M:%S').strftime('%H:%M:%S')
		otp_verified    = otp_verified_at.strptime(str(otp_verified),'%Y-%m-%d %H:%M:%S.%f').strftime('%H:%M:%S')
		if str(otp_pin) == str(otp): 
			if otp_expire_on >= otp_verified:
				output = UserModel().verified_otp(str(otp),str(otp_verified_at),user_id)
				# Add userlogs here ... 
				if email and  "numerotec" not in  email :
					data_for_logs = {"conf_id" : conf_id,"app_type" : "DELEGATE" , "user_id" : user_id, "login_at" :otp_verified_at, "created_at" : otp_verified_at }
					UserModel().insertLoginLogs(data_for_logs)
				# Userlogs code end
				if full_name != None:
					if result['membership_no'] and result['member_type_id']:
						if mobile == None:
							return redirect(url_for('user.MobileVerify',user_id = user_id,email=email,conf_id=conf_id,conf_key=conf_key))
						else:
							Auth.login(result,society_id)
				# 			is_need_profile_update , profile_url =  checkProfileUpdate(society_id,conf_id,conf,member_type_id,profile_updated_at,user_uuid)
				# 			if is_need_profile_update:
				# 				return profile_url


							if reg_type:
								if int(reg_type) == 1: # Past President
									return redirect(url_for('serior_reg.SeniorMemRegUser',user_id = user_id,conf_id=conf_id,conf_key=conf_key,reg_type=reg_type))		
								else: # KSOS Member 70 yrs 	
									return redirect(url_for('serior_reg.SeniorMemRegUser',user_id = user_id,conf_id=conf_id,conf_key=conf_key,reg_type=reg_type))
							else:
								return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
					else:
						if mobile == None :
							return redirect(url_for('user.EmailMobileVerify',user_id = user_id,email=email,conf_id=conf_id,conf_key=conf_key))
						else:
							session_1 = Auth.login(result,society_id)

				# 			is_need_profile_update , profile_url =  checkProfileUpdate(society_id,conf_id,conf,member_type_id,profile_updated_at,user_uuid)
				# 			if is_need_profile_update:
				# 				return profile_url



							if reg_type:
								if int(reg_type) == 1: # Past President
									return redirect(url_for('serior_reg.SeniorMemRegUser',user_id = user_id,conf_id=conf_id,conf_key=conf_key,reg_type=reg_type))		
								else: # KSOS Member 70 yrs 	
									return redirect(url_for('serior_reg.SeniorMemRegUser',user_id = user_id,conf_id=conf_id,conf_key=conf_key,reg_type=reg_type))
							else:
								return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
				else:
					if mobile == None :
						return redirect(url_for('user.EmailMobileVerify',user_id = user_id,email=email,conf_id=conf_id,conf_key=conf_key))
					else:
						session_1 = Auth.login(result,society_id)

				# 		is_need_profile_update , profile_url =  checkProfileUpdate(society_id,conf_id,conf,member_type_id,profile_updated_at,user_uuid)
				# 		if is_need_profile_update:
				# 			return profile_url


						if reg_type:
							if int(reg_type) == 1: # Past President
								return redirect(url_for('serior_reg.SeniorMemRegUser',user_id = user_id,conf_id=conf_id,conf_key=conf_key,reg_type=reg_type))		
							else: # KSOS Member 70 yrs 	
								return redirect(url_for('serior_reg.SeniorMemRegUser',user_id = user_id,conf_id=conf_id,conf_key=conf_key,reg_type=reg_type))
						else:
							return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
			else:
				flash("OTP PIN EXPIRED","errorMsg")
				return redirect(url_for('user.OTPPage',user_id=user_id,conf_id=conf_id,conf_key=conf_key,reg_type=reg_type))
		else:
			flash("Mismatch OTP","errorMsg")
			return redirect(url_for('user.OTPPage',user_id=user_id,conf_id=conf_id,conf_key=conf_key,reg_type=reg_type))


'''-----------OTP Process end-----------'''


def checkProfileUpdate(society_id,conf_id,conf,member_type_id,profile_updated_at,user_uuid):
	now           = datetime.now()
	curr_dt       = now.strftime("%Y-%m-%d %H:%M:%S")
	if int(conf_id) == 52:
		if member_type_id in [1,17,20]:
			profile_update_url =  "https://profile.kosonline.org/{}/{}/at/app/{}?r_url='{}'".format(society_id,conf['society_key'],user_uuid,conf['app_url'])
			if profile_updated_at:
				years_to_add = profile_updated_at.year + 1
				current_dt = now.strftime('%Y-%m-%d')
				profile_updated_at_date = profile_updated_at.replace(year=years_to_add).strftime('%Y-%m-%d')
				if current_dt <= profile_updated_at_date:
					return False,''
					# return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
				else:
					return True, flask.redirect(profile_update_url)
			else:
				return True,flask.redirect(profile_update_url)
		else:
			return False,''		
	else:
		return False,''					


@app.route('/<int:conf_id>/<conf_key>/payment_link_response', methods = ["GET", "POST"])
def PaymentLinkResponse(conf_id,conf_key):
	conf = UserModel().get_confUserModel(conf_id,conf_key)
	return render_template('backoffice_user/delegate_registration/error_msg.html',conf=conf)

@app.route('/<int:conf_id>/<conf_key>/register', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
@RouteGroup.profile_required
def Register(conf_id,conf_key):
	conf_data     = UserModel().get_conference(conf_id,conf_key)
	now           = datetime.now()
	curr_dt       = now.strftime("%Y-%m-%d %H:%M:%S")
	conf          = Auth.getConf(conf_id,conf_key)
	dict_1        = {}
	society_id    = conf['society_id']
	users         = Auth.user(society_id)
	user_id       = users["user_id"]
	membership_no = users["membership_no"]
	prefix        = users["prefix"]
	full_name     = users["full_name"] or ' '

	e_support_email = conf['e_support_email']
	addons_member_list = conf_data['addons_member_list']
	if addons_member_list:
		parent_user_id_count = UserModel().get_parent_user_id_count(conf_id,user_id)
		if parent_user_id_count['parent_user_id'] >= addons_member_list:
			is_show_member_div = 1
		else:
			is_show_member_div = 0	
	else:
		is_show_member_div = 0

	check_addon   = UserModel().get_check_addons_UserModel(user_id,conf_id)
	data          = UserModel().get_state_country_users_type(user_id,society_id,None,conf_id,None,None)
	code          = UserModel().check_appliction_to_close_or_openUserModel(conf_id,curr_dt)
	user_reg_content = UserModel().get_user_register_content(conf_id)
	# membership_no = Auth.user(society_id).get('membership_no')
	full_name =   "Dr. " + full_name if not prefix else prefix + " "  + full_name  
	# prefix        = 'Dr. ' if not Auth.user(society_id).get('prefix') else Auth.user(society_id).get('prefix')
	if conf_id in [18,5,26,49,58] : # BOA 2023
		show_content = "Welcome <b> " + full_name +"<hr/>"
	
	else:
		if membership_no:
			# show_content = "Welcome  <b> "+prefix+" {}.</b> <br/> You are logged in as a member.".format(Auth.user(society_id).get('full_name'))
			show_content = "Welcome  <b> "+full_name+" </b> <hr/> You are logged in as a member."
		else:
			if conf_id in [19,54]:
				# show_content ="Welcome <b> "+prefix+" {}.</b> <br/> You are logged in as a non-member since the email id you have used to login is not associated with any membership record.<br/>Visit <a href='https://asiindia.org/member-application/' target='_blank'>https://asiindia.org/member-application/</a> to apply for ASI membership.<br/><br/>If you are a member, please login with the email id associated with your membership record.<br/><br/> For any assistance, please wrote to <b>{}</b> and get a response in one working day.".format(Auth.user(society_id).get('full_name'),conf['e_support_email'])
				show_content ="Welcome <b> "+full_name+" </b> <hr/> You are logged in as a non-member since the email id you have used to login is not associated with any membership record.<br/>Visit <a href='https://asiindia.org/member-application/' target='_blank'>https://asiindia.org/member-application/</a> to apply for ASI membership.<br/><br/>If you are a member, please login with the email id associated with your membership record.<br/><br/> For any assistance, please wrote to <b> "+e_support_email+" </b> and get a response in one working day."
			else:
				show_content ="Welcome <b> "+full_name+"</b> <hr/> You are logged in as a non-member since the email id you have used to login is not associated with any membership record.<br/>If you are a member, please login with the email id associated with your membership record.<br/><br/> For any assistance, please wrote to <b> "+e_support_email+" </b> and get a response in one working day."
	
	for index,value in enumerate(data):
		if index == 0:
			state_id = value[0]
		if index == 1:
			country_id = value[0]
		if index == 2:
			user = value[0]
			user_data = user
		if index == 3:
			reg_type = value[0]
		if index == 7:
			delegate = value
			if delegate:
				delegate = delegate[0]
			else:
				delegate = None 	


	for value in check_addon:
		status      = value['status']
		msg         = value['msg']
		count       = value['count']

	if count > 0:
		if status == 1:
			flash(msg,"successMsg")
			
	if conf_id == 17:
		display_addons = UserModel().get_wetdrylab_open_close(conf_id)
		display_addon = display_addons.get('display_addon')
	else:
		display_addon = 0		
	
# 	incompleted_template    = get_parent_incompleted_delegates(user_id,conf_id,conf_key)
# 	completed_template      = get_parent_completed_delegates(user_id,conf_id,conf_key)
# 	delegateData            = UserModel().get_completed_delegates_by_parent_user_id_UserModel(user_id,conf_id)
# 	waiting_completed_template = GetParentWaitingCompletedDelegates(user_id,conf_id,conf_key)
# 	rejected_delegate_payment_template = GetParentRejectUpiTransactionDelegates(user_id,conf_id,conf_key)
# 	inprogress_delegate_payment_template = GetParentInprogressPaymentDelegates(user_id,conf_id,conf_key)

# 	# To Get PG Waiting for Approval Data
# 	pg_waiting_approval_template = GetParentPGWaitingApprovalDelegates(user_id,conf_id,conf_key) 
	return render_template('users/registration.html',states=state_id,countries=country_id,user=user,user_data=user_data,reg_type=reg_type,str=str,type=type,conf=conf,code=code,int=int,display_addon=display_addon,user_reg_content=user_reg_content,is_show_member_div=is_show_member_div)
# 	return render_template('users/registration.html',states=state_id,countries=country_id,user=user,user_data=user_data,reg_type=reg_type,str=str,type=type,conf=conf,incompleted_template=incompleted_template,completed_template=completed_template,code=code,delegateData=delegateData,waiting_completed_template=waiting_completed_template,show_content=show_content,rejected_delegate_payment_template=rejected_delegate_payment_template,int=int,display_addon=display_addon,inprogress_delegate_payment_template=inprogress_delegate_payment_template,pg_waiting_approval_template=pg_waiting_approval_template,user_reg_content=user_reg_content,is_show_member_div=is_show_member_div)
		

@app.route('/<int:conf_id>/<conf_key>/error_temp', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.login_required #check if login else automatically redirect to login page
def ErrorTemp(conf_id,conf_key):
	conf_data     = UserModel().get_conference(conf_id,conf_key)
	now           = datetime.now()
	curr_dt       = now.strftime("%Y-%m-%d %H:%M:%S")
	conf          = Auth.getConf(conf_id,conf_key)
	society_id    = conf['society_id']
	delegate_ids  = request.values.get('delegate_ids',0)
	

	users         = Auth.user(society_id)
	user_id       = users["user_id"]
	membership_no = users["membership_no"]
	prefix        = users["prefix"]
	full_name     = users["full_name"] or ' '

	e_support_email = conf['e_support_email']
	addons_member_list = conf_data['addons_member_list']
	if addons_member_list:
		parent_user_id_count = UserModel().get_parent_user_id_count(conf_id,user_id)
		if parent_user_id_count['parent_user_id'] >= addons_member_list:
			is_show_member_div = 1
		else:
			is_show_member_div = 0	
	else:
		is_show_member_div = 0

	full_name =   "Dr. " + full_name if not prefix else prefix + " "  + full_name  

	check_addon   = UserModel().get_check_addons_UserModel(user_id,conf_id)
	data          = UserModel().get_state_country_users_type(user_id,society_id,None,conf_id,None,None)
	code          = UserModel().check_appliction_to_close_or_openUserModel(conf_id,curr_dt)
	
	prefix        = 'Dr. ' if not Auth.user(society_id).get('prefix') else Auth.user(society_id).get('prefix')
	if conf_id in [18,26] :
		show_content = "Welcome <b> " + full_name
	else:
		if membership_no:
			show_content = "Welcome  <b> "+full_name+" </b> <br/> You are logged in as a member."
			# show_content = "Welcome  <b> "+prefix+" {}.</b> <br/> You are logged in as a member.".format(Auth.user(society_id).get('full_name'))
		else:
			# show_content ="Welcome <b> "+prefix+" {}.</b> <br/> You are logged in as a non-member since the email id you have used to login is not associated with any membership record.<br/>If you are a member, please login with the email id associated with your membership record.<br/><br/> For any assistance, please wrote to <b>{}</b> and get a response in one working day.".format(Auth.user(society_id).get('full_name'),conf['e_support_email'])
			show_content ="Welcome <b> "+full_name+"</b> <br/> You are logged in as a non-member since the email id you have used to login is not associated with any membership record.<br/>If you are a member, please login with the email id associated with your membership record.<br/><br/> For any assistance, please wrote to <b> "+e_support_email+" </b> and get a response in one working day."
	for index,value in enumerate(data):
		if index == 0:
			state_id = value[0]
		if index == 1:
			country_id = value[0]
		if index == 2:
			user = value[0]
			user_data = user
		if index == 3:
			reg_type = value[0]
		if index == 7:
			delegate = value
			if delegate:
				delegate = delegate[0]
			else:
				delegate = None	


	for value in check_addon:
		status    = value['status']
		msg       = value['msg']
		count     = value['count']

	if count > 0:
		if status == 1:
			flash(msg,"successMsg")
			
	if conf_id == 17:
		display_addons = UserModel().get_wetdrylab_open_close(conf_id)
		display_addon = display_addons.get('display_addon')
	else:
		display_addon = 0		

# 	incompleted_template    = get_parent_incompleted_delegates(user_id,conf_id,conf_key)
# 	completed_template      = get_parent_completed_delegates(user_id,conf_id,conf_key)
# 	delegateData            = UserModel().get_completed_delegates_by_parent_user_id_UserModel(user_id,conf_id)
# 	waiting_completed_template 		   = GetParentWaitingCompletedDelegates(user_id,conf_id,conf_key)
# 	rejected_delegate_payment_template = GetParentRejectUpiTransactionDelegates(user_id,conf_id,conf_key)
# 	inprogress_delegate_payment_template = GetParentInprogressPaymentDelegates(user_id,conf_id,conf_key)
# 	# To Get PG Waiting for Approval Data
# 	pg_waiting_approval_template = GetParentPGWaitingApprovalDelegates(user_id,conf_id,conf_key)
	return render_template('users/registration.html',states=state_id,countries=country_id,user=user,user_data=user_data,reg_type=reg_type,str=str,type=type,conf=conf,code=code,int=int,display_addon=display_addon,user_reg_content=user_reg_content,is_show_member_div=is_show_member_div)
# 	return render_template('users/registration.html',states=state_id,countries=country_id,user=user,user_data=user_data,reg_type=reg_type,str=str,type=type,conf=conf,incompleted_template=incompleted_template,completed_template=completed_template,code=code,delegate_ids=delegate_ids,delegateData=delegateData,waiting_completed_template=waiting_completed_template,show_content=show_content,rejected_delegate_payment_template=rejected_delegate_payment_template,inprogress_delegate_payment_template=inprogress_delegate_payment_template,int=int,display_addon=display_addon,pg_waiting_approval_template=pg_waiting_approval_template,is_show_member_div=is_show_member_div)



@app.route('/check_self_reg', methods = [ "GET","POST"])
def check_self_reg():
	user_id         = request.values.get('user_id',0)
	conf_id         = request.values.get('conf_id',0)
	conf_key        = request.values.get('conf_key',0)
	conf            = Auth.getConf(conf_id,conf_key)
	society_id      = conf['society_id']
	check_user_del  = UserModel().check_user_delegateUserModel(user_id,society_id,conf_id)
	delegate_dashboard_html =  RegisterDashboard(conf_id,conf_key)
	data = {'check_user_del':check_user_del,'delegate_dashboard_html':delegate_dashboard_html}
	return json.dumps(data,default =str)
	# return str(check_user_del)



@app.route('/<int:conf_id>/<conf_key>/selected_member', methods = [ "POST"])
def SelectedMember(conf_id,conf_key):
	conf            = Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	
	curr_dt         = now.strftime("%Y-%m-%d %H:%M:%S")
	# conf          = UserModel().get_confUserModel(conf_id,conf_key)
	society_id      = conf['society_id']
	user_id         = request.values.get('user_id',0)
	parent_user_id  = request.values.get('parent_user_id',0)
	delegate_id     = request.values.get('delegate_id',0)
	data            = UserModel().get_state_country_users_type(user_id,society_id,delegate_id,conf_id,parent_user_id,now)
	addons          = UserModel().get_addons(delegate_id,curr_dt,conf_id)
	for index,value in enumerate(data):
		if index == 0:
			state_id = value
		if index == 1:
			country_id = value
		if index == 2:
			user = value
		if index == 4:
			reg_types = value
		if index == 6:
			parent_user = value
			
	if int(conf_id) in [36,38,5]:
		limit_for_addons = UserModel().get_addons_limit_for_all(conf_id)
		user_type_id     = UserModel().get_all_addons_data(conf_id)
		user_type_ids    = []
		for u in user_type_id:
			user_type_ids.append(u['user_type_id'])


		limits  = {}
		limit  = {}
		for dd in limit_for_addons :
			key_1 = dd["user_type_id"]
				
			val_1 = dd["limits"]
			val_2 = val_1 if val_1 else None
			limits[str(key_1)] = val_2
			limit[key_1] = val_2
			# ----
			for ut in user_type_ids :
				if ut not in limit:
					limits[str(ut)] = None    

	else:
		limits = None		
	
	if int(str(user_id),0) > 0: #Check user_id greater then 0 
		user        = UserModel().get_user(user_id,society_id,conf_id) # get user details
		if user and user["member_type_id"] == Custom.MemberTypeId or user["member_type_id"] == Custom.AssociateMemberTypeId or user["member_type_id"] in Custom.ASIMemberTypeId or user["member_type_id"] == Custom.NationalMemberTypeId: # check user is member Custom -
			user    = UserModel().get_member_detailsUserModel(user_id,curr_dt,society_id,conf_id)
			html_data = render_template('users/other_member_register.html',user=user,states=state_id,countries=country_id,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,limits=limits,delegate=user)
			data = { "html_data": html_data,"status":1}
			return json.dumps(data,default =str)	
		else:	
			html_data = None
			data = { "html_data": html_data,"status":0}
			return json.dumps(data,default =str)
	else:
		return redirect(url_for('user.Home',conf_id=conf['conf_id'],conf_key=conf['conf_key']))  




@app.route('/<int:conf_id>/<conf_key>/state', methods = ["GET","POST"])
@RouteGroup.conf_required
def State(conf_id,conf_key):
	conf       = Auth.getConf(conf_id,conf_key)
	country_id = request.values['country_id'] or 101
	data       = UserModel().get_states_of_india(country_id)
	return json.dumps(data,default =str)



@app.route('/<int:conf_id>/<conf_key>/add_delegate', methods = [ "GET","POST"])
@RouteGroup.conf_required
def AddDelegate(conf_id,conf_key):
	conf = Auth.getConf(conf_id,conf_key)
	if request.method == 'POST':
		db_addon_id = 0
		now             = datetime.now()
		curr_dt         = now.strftime("%Y-%m-%d %H:%M:%S")
		# now             = '2022-06-14 10:00:00'
		society_id      = conf['society_id']
		user_id         = request.values.get('user_id',0)
		parent_user_id  = request.values.get('parent_user_id',0)
		delegate_id     = request.values.get('delegate_id',0)
		update          = request.values.get('update',0)
		data            = UserModel().get_state_country_users_type(user_id,society_id,delegate_id,conf_id,parent_user_id,now)
		for index,value in enumerate(data):
			if index == 0:
				state_id = value
			if index == 1:
				country_id = value
			if index == 4:
				reg_types = value
			if index == 5:
				addons = value
			if index == 6:
				parent_user = value
			if index == 7:
				addons_1 = value
		
		if addons_1:
			delegate_addon_ids = addons_1[0]['delegate_addon_ids']
			if delegate_addon_ids == None:
				delegate_addon_ids = '0'
			else:
				delegate_addon_ids = delegate_addon_ids	
		else:
			delegate_addon_ids = '0'
			
			
		if int(conf_id) in [36,38,5]:
			limit_for_addons = UserModel().get_addons_limit_for_all(conf_id)
			user_type_id     = UserModel().get_all_addons_data(conf_id)
			user_type_ids    = []
			for u in user_type_id:
				user_type_ids.append(u['user_type_id'])


			limits  = {}
			limit  = {}
			for dd in limit_for_addons :
				key_1 = dd["user_type_id"]
					
				val_1 = dd["limits"]
				val_2 = val_1 if val_1 else None
				limits[str(key_1)] = val_2
				limit[key_1] = val_2
				# ----
				for ut in user_type_ids :
					if ut not in limit:
						limits[str(ut)] = None    

		else:
			limits = None
			
			
		for index,value in enumerate(addons): 
			user_delegate_addon_id = value["delegate_addon_id"]
			if user_delegate_addon_id :
				db_addon_id = value["addon_id"]
				break	

		if int(str(user_id),0) > 0: #Check user_id greater then 0 
			user            = UserModel().get_user(user_id,society_id,conf_id) # get user details
			if user and user["member_type_id"] == Custom.MemberTypeId or user["member_type_id"] == Custom.AssociateMemberTypeId or user["member_type_id"] in Custom.ASIMemberTypeId or user["member_type_id"] == Custom.NationalMemberTypeId: # check user is member Custom -
				user   = UserModel().get_member_detailsUserModel(user_id,curr_dt,society_id,conf_id)
				if int(str(delegate_id),0) >0:  
					delegate = UserModel().get_delegate(delegate_id)
					user     = delegate if delegate else user
				if  user_id == parent_user_id: # if both same then call myself add or edit else add or edit for other 
					if conf_id in [57] and  db_addon_id in [813,820,827,834,841]:
						return render_template('users/member_register_page_for_ksos_mem_70.html',user=user,states=state_id,countries=country_id,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids,limits=limits,delegate=user)
					else:    
						return render_template('users/member_register_page.html',user=user,states=state_id,countries=country_id,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids,limits=limits,delegate=user)
				else:
					return render_template('users/other_member_register.html',user=user,states=state_id,countries=country_id,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids,limits=limits,delegate=user)         
		user = None
		if int(str(user_id),0) > 0:
			user            = UserModel().get_user(user_id,society_id,conf_id)
		delegate = None
		if int(str(delegate_id),0) >0:  
			delegate   = UserModel().get_delegate(delegate_id)

		if delegate is None:
			if user:
				delegate = user

		
		# FOR TNASICON 2024 ACC PERSON
		if db_addon_id in [378,379,781,785,789]:
			return render_template('users/accompany_person_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids,limits=limits)
		
		# For IPA KARPEDICON 23 
		if db_addon_id in [539,604,609]:
			return render_template('users/accompany_person_register_page_pedicon23.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids,limits=limits)
		# FOR TNASICON 2024 NON TN ASI MEMBER
		if 	db_addon_id in [503,504,782,786,790]:
			return render_template('users/non_asi_member_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids,limits=limits)
		
		if conf_id in [19,54]  and db_addon_id in [503,504,782,786,790]: # For NON TNASI Member only
			return render_template('users/non_asi_member_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids,limits=limits)
		
		if conf_id in [54]  and db_addon_id in [799,800,801]: # For TNASICON 2024 PG NON Member only
			return render_template('users/pg_non_member_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids,limits=limits)	
		
		if conf_id in [54]  and db_addon_id in [802,803,804]: # For TNASICON 2024 ACC PERSON CHILDREN only
			return render_template('users/accompany_person_children_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids,limits=limits)
			
		if conf_id in [54]  and db_addon_id in [797,798]: # For NON TNASI Member only
			return render_template('users/tnasi_non_member_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids,limits=limits)	
			
		return render_template('users/non_member_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids,limits=limits)
	else :
		return redirect(url_for('user.Home',conf_id=conf['conf_id'],conf_key=conf['conf_key']))

# June 06,2023 For TNASI
@app.route('/<int:conf_id>/<conf_key>/add_delegate_pg_acc', methods = [ "GET","POST"])
@RouteGroup.conf_required
def AddDelegatePGAcc(conf_id,conf_key):
	conf = Auth.getConf(conf_id,conf_key)
	if request.method == 'POST':
		now             = datetime.now()
		curr_dt         = now.strftime("%Y-%m-%d %H:%M:%S")
		# now             = '2022-06-14 10:00:00'
		society_id      = conf['society_id']
		user_id         = request.values.get('user_id',0)
		parent_user_id  = request.values.get('parent_user_id',0)
		delegate_id     = request.values.get('delegate_id',0)
		update          = request.values.get('update',0)
		is_accompany    = request.values.get("is_accompany") or 0

		data            = UserModel().get_state_country_users_type(user_id,society_id,delegate_id,conf_id,parent_user_id,now)
		for index,value in enumerate(data):
			if index == 0:
				state_id = value
			if index == 1:
				country_id = value
			if index == 4:
				reg_types = value
			if index == 5:
				addons = value
			if index == 6:
				parent_user = value
			if index == 7:
				addons_1 = value
		
		if addons_1:
			delegate_addon_ids = addons_1[0]['delegate_addon_ids']
			if delegate_addon_ids == None:
				delegate_addon_ids = '0'
			else:
				delegate_addon_ids = delegate_addon_ids	
		else:
			delegate_addon_ids = '0'

		
		user = None
		if int(str(user_id),0) > 0:
			user            = UserModel().get_user(user_id,society_id,conf_id)
		delegate = None
		if int(str(delegate_id),0) >0:  
			delegate   = UserModel().get_delegate(delegate_id)

		if delegate is None:
			if user:
				delegate = user
				
		if conf_id == 57:
			user   = UserModel().get_member_detailsUserModel(parent_user_id,curr_dt,society_id,conf_id)		

		if conf_id  in [19,54]  and is_accompany  and int(is_accompany) == 1 :
			return render_template('users/accompany_person_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids)
		elif conf_id  in [19,54]  and is_accompany  and int(is_accompany) == 2 :
			return render_template('users/non_asi_member_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids)
		elif conf_id  in [19,54]  and is_accompany  and int(is_accompany) == 3 :
			return render_template('users/tnasi_non_member_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids)
		elif conf_id  in [19,54]  and is_accompany  and int(is_accompany) == 4 :
			return render_template('users/accompany_person_children_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids)
		elif conf_id  in [19,54]  and is_accompany  and int(is_accompany) == 5 :
			return render_template('users/pg_non_member_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids)
		elif conf_id  == 36  and is_accompany  and int(is_accompany) == 1 :
			return render_template('users/accompany_person_register_page_pedicon23.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids)
		elif conf_id == 57 and is_accompany and int(is_accompany) == 6 :
			return render_template('users/member_register_page_for_ksos_mem_70.html',user=user,states=state_id,countries=country_id,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids,delegate=user)
		else :
			return render_template('users/non_member_register_page.html',user_id=user_id,states=state_id,countries=country_id,delegate=delegate,parent_user_id=parent_user_id,reg_types=reg_types,addons=addons,str=str,type=type,conf=conf,update=update,delegate_addon_ids=delegate_addon_ids)
	else :
		return redirect(url_for('user.Home',conf_id=conf['conf_id'],conf_key=conf['conf_key']))
# END		


@app.route('/<int:conf_id>/<conf_key>/delete_delegate', methods = [ "GET","POST"])
@RouteGroup.conf_required
def DeleteDelegate(conf_id,conf_key):
	conf            = Auth.getConf(conf_id,conf_key)
	delegate_id     = request.values.get('delegate_id',0)
	parent_user_id  = request.values.get('parent_user_id',0)
	society_id      = conf['society_id']
	if int(str(delegate_id)) > 0:
		UserModel().delete_delegateUserModel(delegate_id)
# 		incompleted_template = get_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
# 		completed_template   = get_parent_completed_delegates(parent_user_id,conf_id,conf_key)
# 		waiting_completed_template         = GetParentWaitingCompletedDelegates(parent_user_id,conf_id,conf_key)
# 		rejected_delegate_payment_template = GetParentRejectUpiTransactionDelegates(parent_user_id,conf_id,conf_key)
# 		inprogress_delegate_payment_template = GetParentInprogressPaymentDelegates(parent_user_id,conf_id,conf_key)
		
# 		# To Get PG Waiting for Approval Data
# 		pg_waiting_approval_template = GetParentPGWaitingApprovalDelegates(parent_user_id,conf_id,conf_key) 
# 		delegate_dashboard_html =  RegisterDashboard(conf_id,conf_key)
# 		check_user_del  = UserModel().check_user_delegateUserModel(parent_user_id,society_id,conf_id)

		json={ 'msg':'Deleted Successfully','status' : 1}
	else:
		json={ 'msg':'Error try after some time', 'status' : 0,'incompleted_template' : ''}
	return jsonify(json)



@app.route('/<int:conf_id>/<conf_key>/search_user', methods = ["GET", "POST"])
@RouteGroup.conf_required
def GetSearchUser(conf_id,conf_key):
	conf        = Auth.getConf(conf_id,conf_key)
	conf_data   = UserModel().get_conference(conf_id,conf_key)
	if request.method == 'POST':
		society_id = conf['society_id']
		search     = request.values.get('search')
		user_id    = request.form['user_id']
		addons_member_list = conf_data['addons_member_list']
		if int(user_id) == 10420:
			addons_member_list = 15
		else:
			addons_member_list = addons_member_list
			
		if addons_member_list:
			parent_user_id_count = UserModel().get_parent_user_id_count(conf_id,user_id)
			if parent_user_id_count['parent_user_id'] >= addons_member_list:
				html = f"<h4 style='color:red'>You reached limit, You can't register more then {addons_member_list} members</h4>"
			else:
				user       = UserModel().get_search_user(search,society_id,conf_id)
		
				if user == None:
					html   = None
				else:
					html   = render_template('users/search_table.html' , user_data= user,conf=conf)

			return json.dumps(html ,default=str)	

		else:
			user       = UserModel().get_search_user(search,society_id,conf_id)
	
			if user == None:
				html   = None
			else:
				html   = render_template('users/search_table.html' , user_data= user,conf=conf)

		return json.dumps(html ,default=str)
	else:
		return redirect(url_for('user.Home',conf_id=conf['conf_id'],conf_key=conf['conf_key']))


@app.route('/<int:conf_id>/<conf_key>/post_add_register', methods = ["POST"])
@RouteGroup.conf_required
def PostAddRegister(conf_id,conf_key):
	conf            = Auth.getConf(conf_id,conf_key)
	is_file_upload  = 0
	pg_cert_path    = None
	pg_cert_name    = None	
	file            = None
	file_upload     = None # For upload certificates in delegates table # Added by Ganesan J
	user_type_id    = None
	msg             = ""
	status          = 1
	data            = ""
	delegate_id     = request.form['delegate_id']  
	parent_user_id  = request.form['parent_user_id'] 
	user_id         = request.form['user_id']
	total_amount    = 0
	now             = datetime.now()
	# conf            = UserModel().get_confUserModel(conf_id,conf_key)
	society_id      = conf['society_id']
	dt_string       = now.strftime("%Y-%m-%d %H:%M:%S")
	curr_dt         = now.strftime("%Y-%m-%d %H:%M:%S")
	prefix          = request.form['prefix'] or None
	full_name       = request.form['full_name'] or None
	full_name       = full_name.title() if full_name else full_name   
		
	email           = request.form['email'] 
	mobile          = request.form['mobile']
	date_of_birth   = request.values.get("dob")  or None
	if date_of_birth:
		try:
			dob     = datetime.strptime(date_of_birth, '%d-%m-%Y')
		except Exception as e:
			dob     = None
	else:
		dob         = None
	gender          = request.values.get("gender") or None
	address1        = request.values.get("address1") or None
	address2        = request.values.get("address2") or None
	address3        = request.values.get("address3") or None
	city            = request.values.get("city") or None
	pincode         = request.values.get("pincode") or None
	state_id        = request.values.get("state_id") or None
	country_id      = request.values.get("country_id") or None
	mc_number       = request.values.get("mc_number")  or None

	mc_state_id     = request.values.get("mc_state_id") or None
	membership_no   = request.values.get("membership_no") or None
	# check_in_date   = request.values.get('check_in_date') or None
	# check_out_date  = request.values.get('check_out_date') or None
	# check_in_time   = request.values.get('check_in_time') or None
	# check_out_time  = request.values.get('check_out_time') or None
	aadhaar_number  = request.values.get('aadhaar_number') or None
	if conf_id == 27:
		if aadhaar_number:
			aadhaar_number = aadhaar_number.replace("-","")
		else:
			aadhaar_number = None
	else:
		aadhaar_number = aadhaar_number
	designation     = request.values.get('designation') or None
	institution     = request.values.get('institution') or None
	nationality     = request.values.get('nationality') or None
	mem_applied_at  = request.values.get('mem_applied_at') or None
	place_of_work   = request.values.get('place_of_work') or None

	is_take_part_bpw = request.values.get('is_take_part_bpw') or None
	
	accom_persons   = request.values.get("accom_persons" or None)

	mem_is_applied     = request.values.get('mem_is_applied') or None
	mem_year           = request.values.get('mem_year') or None
	age                = request.values.get('age') or None
	food               = request.values.get('food') or None
	
	district           = request.values.get('district') or None
	role               = request.values.get('role') or "DELEGATE"
	
	year_of_admission  = request.values.get('year_of_admission') or None
	
	
	# Delegate Image
	image_data         = request.values.get('delegate_image_base64') or None
	image_data_ext       = request.values.get('delegate_image_ext') or None
	is_remove_del_img    = request.values.get('is_remove_del_img') or 0
	delegate_image_from_member    = request.values.get('delegate_image_from_member') or 0
	
	if accom_persons:
		guest_list = accom_persons.split(',')
		guest_list = list(filter(None, guest_list))
		guest_list = [i for a,i in enumerate(guest_list) if i!=' ']
		len_guest_list = len(guest_list)
	else:
		len_guest_list = 0
	
	if int(user_id) > 0:
		member_type_id = request.form['member_type_id'] or None
	else:
		member_type_id = 2  
			
	conference_id     = conf_id
	time_set          = request.form['time_set'] or None
	is_custom_addons  = 1
	reg_types         = UserModel().get_addon_reg_typeUserModel(conf_id)
	addons            = UserModel().get_addons(delegate_id,curr_dt,conf_id,None,is_custom_addons)
	reg_addons        = {} 
	insert_del_addons = []
	delete_del_addons = [] 
	reg_Validation    = []
	addons_reg_limit  = {} 

	created_at_date   = {'created_at': dt_string}
	updated_at_date   = {'updated_at': dt_string} 

	for addon in addons:
		reg_addons[addon["addon_id"]] = addon
		#collect all delegate_addon_id for delegate 
		if addon["delegate_addon_id"]  and addon["delegate_addon_id"] > 0:
			delete_del_addons.append(addon["delegate_addon_id"])


	is_mandatory = {}
	addon_id  = None
	for rt in reg_types:
		is_mandatory[rt['addon_type_id']]   =  rt['is_mandatory']
		values = request.values.getlist(rt.get('input_name'))
		addon_ids = None
		for addon_val in values:
			addon_ids = addon_val
			break
		addon_ids       = addon_ids	
		get_addons_data = UserModel().get_addons_data(addon_ids,conf_id,now)
		
		if values:
			is_mandatory[rt['addon_type_id']] = 0
			for index,val in enumerate(values):
				addon        = reg_addons[int(val)]
				# addon_id     = val
				if index == 0:
					if user_type_id == None:
						user_type_id = addon.get("user_type_id",None)
					if addon_id == None:
						addon_id = val		
						
				if  addon.get("delegate_addon_id") and addon.get("delegate_addon_id") > 0:
					#if already have addon and deleate not change the addon then we removed delegate_addon_id in delete_addons variable
					delete_del_addons.remove(addon.get("delegate_addon_id")) 
				else:   
					add_data = {
								 "addon_id"         : val,
								 "amount"           : addon.get("amount",0),
								 "original_amount"  : addon.get("amount",0),
								 "reg_status"       : 0       
					}
					total_amount = addon.get("amount",0) + total_amount
					insert_del_addons.append(add_data)
	
	addon_id = int(addon_id) if addon_id else addon_id			
			
	for key in is_mandatory:
		if is_mandatory[key] == 1:
			reg_Validation.append({'key': key ,'msg': "following field is mandatory."})  
			status = 0;
	if int(user_id) > 0 and int(user_id) != int(parent_user_id):
		user = UserModel().get_user(user_id,society_id,conf_id)
		del_data = {
				'parent_user_id': parent_user_id,
				'prefix'        : prefix if prefix else user["prefix"],
				'user_id'       : user["user_id"] if int(user["user_id"]) > 0 else None ,
				'full_name'     : user["full_name"],  
				'email'         : user["email"],
				'mobile'        : mobile,
				'dob'           : user["dob"],
				'gender'        : user["gender"],
				'address1'      : user["address1"],
				'address2'      : user["address2"],
				'address3'      : user["address3"],
				'city'          : user["city"],
				'pincode'       : user["pincode"],
				'state_id'      : user["state_id"],
				'country_id'    : user["country_id"],
				'mc_number'     : mc_number,
				'mc_state_id'   : mc_state_id,
				'conference_id' : conference_id,
				'membership_no' : user["membership_no"] or None,
				'member_type_id': user["member_type_id"],
				'society_id'    : user['society_id'],
				'designation'	: designation,
				'institution'	: institution,
				'nationality'	: nationality,
				'accom_persons' : accom_persons,
				'aadhaar_number': aadhaar_number,
				'is_take_part_bpw':is_take_part_bpw,
				'mem_is_applied'  : mem_is_applied,
				'mem_applied_at':mem_applied_at,
				'mem_year' 		: mem_year,
				'age'      		: age,
				'food'     		: food,
				'district'      : district,
				'reg_type_id'   : user_type_id,
				'role'          : role,
				'del_status_id'	: 0,
				'place_of_work' :place_of_work,
				'year_of_admission':year_of_admission
			}   

	else:
		del_data = {
					'parent_user_id': parent_user_id,
					'prefix'        : prefix,
					'user_id'       : user_id if int(user_id) >0 else None,
					'full_name'     : full_name,
					'email'         : email,
					'mobile'        : mobile,
					'dob'           : dob,
					'gender'        : gender,
					'address1'      : address1,
					'address2'      : address2,
					'address3'      : address3,
					'city'          : city,
					'pincode'       : pincode,
					'state_id'      : state_id,
					'country_id'    : country_id,
					'mc_number'     : mc_number,
					'mc_state_id'   : mc_state_id,
					'conference_id' : conference_id,
					'membership_no' : membership_no,
					'member_type_id': member_type_id,
					'society_id'    : society_id,
					'designation'	: designation,
					'institution'	: institution,
					'nationality'	: nationality,
					'accom_persons' : accom_persons,
					'aadhaar_number': aadhaar_number,
					'is_take_part_bpw':is_take_part_bpw,
					'mem_is_applied'   : mem_is_applied,
					'mem_applied_at':mem_applied_at,
					'mem_year' 		: mem_year,
					'age'      		: age,
					'food'     		: food,
					'district'      : district,
					'reg_type_id'   : user_type_id,
					'role'          : role,
					'del_status_id'	: 0,
					'place_of_work' : place_of_work,
					'year_of_admission':year_of_admission
				}

	

	if int(time_set) == 0:
		del_data.update(created_at_date)
	else:
		del_data.update(updated_at_date)                

	# Paid registration start
	if total_amount > 0.00 :
		if int(delegate_id) > 0:
			delegate     = UserModel().get_delegate(delegate_id)
			if delegate:
				if delegate['delegate_no'] and delegate['delegate_no'] >0:
					status = 0
					msg    = "Registration Already Completed."
			else:
				status = 0
				msg    = "your request cannot be processed. click here to try after some time"

			if status == 1:
				update        = UserModel().update_delegateUserModel(delegate_id,del_data)
				if image_data:
					AWSUpload().DelegateImageUpload(conf,user_id,delegate_id,full_name,image_data,conf_key,image_data_ext,delegate_image_from_member)
				else : 
					if int(is_remove_del_img) == 1: 
						AWSUpload().DeleteDelegateImage(delegate_id,conf_key)
				UserModel().save_delegates_addonsUserModel(delegate_id,insert_del_addons,delete_del_addons,now)
				# incompleted_template = get_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
				# inprogress_delegate_payment_template = GetParentInprogressPaymentDelegates(parent_user_id,conf_id,conf_key)
			data = { 'msg':'Update completed ...','status':status,'reg_validation' :  reg_Validation}	
			# data = { 'msg':'Update completed ...','status':status,'incompleted_template' : incompleted_template,'reg_validation' :  reg_Validation,'inprogress_delegate_payment_template':inprogress_delegate_payment_template}

			aa = jsonify(data)	
			return jsonify(data)    
		else:
			existing_data = None
			if int(user_id) > 0 :
				existing_data       = UserModel().get_check_exsits_delegate(user_id,parent_user_id,conf_id)
				
			if existing_data:
				delegate_no  = existing_data["delegate_no"]
				ref_no       = existing_data["ref_no_only"]

				if (delegate_no and delegate_no > 0) or (ref_no and ref_no > 0) :
					data={ 'msg':'Registration Already Completed.','status' : 0,'data' : ''}
						
					return jsonify(data)
				else:
					json={ 'msg':'Already added in the cart',
							'status':0,
							'data':''
							# 'reg_validation' :  is_mandatory
							}
					return jsonify(json)		  
			else:   
				if status == 1:
					delegate_id     = UserModel().insert_delegateUserModel(del_data)
					UserModel().save_delegates_addonsUserModel(delegate_id,insert_del_addons,delete_del_addons,now)
					if image_data:
						AWSUpload().DelegateImageUpload(conf,user_id,delegate_id,full_name,image_data,conf_key,image_data_ext,delegate_image_from_member)
					else :
						if int(is_remove_del_img) == 1: 
							AWSUpload().DeleteDelegateImage(delegate_id,conf_key)
							
					data={ 'msg':'Added successfully',
							'status':1,'reg_validation':reg_Validation
							}	

					return jsonify(data)
				else:
					data= { 'msg':'','status' : 0,'data':'','reg_validation':reg_Validation}
					return jsonify(data)
   # Free registration start					
	else:				
		if int(delegate_id) > 0:
			delegate     = UserModel().get_delegate(delegate_id)
			if delegate:
				if (delegate['delegate_no'] and delegate['delegate_no'] >0) or (delegate['ref_no_only'] and delegate['ref_no_only'] >0):
					status = 0
					msg    = "Registration Already Completed."
			else:
				status = 0
				msg    = "your request cannot be processed. click here to try after some time"

			if status == 1:
				update = UserModel().update_delegateUserModel(delegate_id,del_data)
				if image_data:
					AWSUpload().DelegateImageUpload(conf,user_id,delegate_id,full_name,image_data,conf_key,image_data_ext,delegate_image_from_member)
				else :
					if int(is_remove_del_img) == 1: 
						AWSUpload().DeleteDelegateImage(delegate_id,conf_key)
				UserModel().save_delegates_addonsUserModel(delegate_id,insert_del_addons,delete_del_addons,now)
				
			data = { 
					'msg'				   : 'Update completed ...',
					'status'			   : status,
					'reg_validation' 	   : reg_Validation
				}
			return jsonify(data)    
		else:
			existing_data = None
			if int(user_id) > 0 :
				existing_data       = UserModel().get_check_exsits_delegate(user_id,parent_user_id,conf_id)
				
			if existing_data:
				delegate_no  = existing_data["delegate_no"]

				if delegate_no and delegate_no > 0 :
					data={ 'msg':'Registration Already Completed.','status' : 0,'data' : ''}
						
					return jsonify(data)
				else:
					json={ 'msg':'Already added in the cart',
							'status':0,
							'data':''
							# 'reg_validation' :  is_mandatory
							}
					return jsonify(json)   

			else:   
				if status == 1:
					delegate_id     = UserModel().insert_delegateUserModel(del_data)
					if image_data:
						AWSUpload().DelegateImageUpload(conf,user_id,delegate_id,full_name,image_data,conf_key,image_data_ext,delegate_image_from_member)
					else : 
						if int(is_remove_del_img) == 1: 
							AWSUpload().DeleteDelegateImage(delegate_id,conf_key)
					UserModel().save_delegates_addonsUserModel(delegate_id,insert_del_addons,delete_del_addons,now)

					incompleted_template = get_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
					unique_id    = now.strftime('%Y%m%d%H%M%S')
					created_at   = now
					
					url 	= conf['paymentgateway_api_url']
				# 	r 		= requests.get(url)
				# 	apikey 	= json.loads(r.content.decode())
					
					am_id   = conf['paymentgateway_appmaster_id']
					is_test = conf['paymentgateway_is_test']


				# 	for index,value in enumerate(apikey) :
				# 		api_am_id = value['am_id']
				# 		if api_am_id == am_id:
				# 			app_key  = value['app_key']
				# 			app_name = value['app_name']
				# 			break
				# 		else:
				# 			pass
							
					app_name = "MOSCON 2024 Workshop Registration  "
					app_key = "MOSCON24"
					
					Auth_user         = Auth.user(society_id)
					user_id           = Auth_user['user_id']
					payment_for       = app_name
					payment_method    = "free"
					remarks           = "Free Registration"
					txn_id            = None
					if conf_id == 36:
						unique_id     = app_key+unique_id
					else:
						unique_id     = app_key+"_"+unique_id
				# 	unique_id         = app_key+"_"+unique_id
					prefix            = Auth_user['prefix'] or None
					name              = Auth_user['full_name'] or None
					full_name         = prefix + " " + name if prefix else name
					email             = Auth_user['email']
					mobile            = Auth_user['mobile']
					user_id           = Auth_user['user_id']
					delegate_ids      = delegate_id
					is_generate       = None
					app_type          = Helper.AppType
					receipt_mail      = "receipt_mail"
					confimation_mail  = "confimation_mail"
					generate_payement = BOModel().usp_del_generate_free_payement(unique_id,delegate_ids,user_id,payment_for,payment_method,remarks,full_name,email,mobile,is_generate,created_at,txn_id,society_id,app_type,conf_id)
					return redirect(url_for('free_reg.FreeRegUpdates',user_id=user_id,unique_id=unique_id,payment_method=payment_method,email=email,receipt_mail=receipt_mail,confimation_mail=confimation_mail,conf_id=conf_id,conf_key=conf_key))
				else:
					data= { 'msg':'','status' : 0,'data':'','reg_validation':reg_Validation}
					return jsonify(data)

	

# def AwsFileUpload(user_id,file,filename_str,foldername,file_extension):
def AwsFileUpload(user_id,file):
	now             = datetime.now()
	curr_dt         = now.strftime("%Y-%m-%d %H:%M:%S")
	pg_cert_name    = None
	pg_cert_path    = None
	bucket          = "delegateapp"
	# print("The user id is - "+ str(user_id)+" ,  AwsFileUpload function calling on -- " + curr_dt)
	try:
		if file:
			if file.filename:
				filename        = secure_filename(file.filename)
				split_tup       = os.path.splitext(filename)
				file_name       = split_tup[0]
				file_extension  = split_tup[1]
				filename_str    = "certificate_proof_"+ datetime.now().strftime("%Y%m%d-%H%M%S") +file_extension
				if " " in filename_str :
					filename_str = filename_str.replace(" ","")

				user_id      = str(user_id) if user_id else None
				foldername   = ""
				acl          = "public-read"
				s3           = boto3.client("s3",aws_access_key_id='AKIAILLDAQ7NFUMVOYLQ',aws_secret_access_key='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')
				response     = s3.upload_fileobj(file, bucket,foldername + filename_str, ExtraArgs={"ACL": acl,"ContentType": file.content_type})
				data_1       = {'bucketname' : bucket,'foldername':foldername,'file_name':filename_str+"?"+str(Helper.getcurrenttimestamp()),'msg':'Image successfully uploded','file_extension':file_extension,'status':1} 
				file_path    = "https://delegateapp.s3.ap-southeast-1.amazonaws.com/"+foldername
				pg_cert_path = file_path	
				pg_cert_name = filename_str
				
				msg = "success"
				return_data = { "pg_cert_name" : pg_cert_name,"pg_cert_path" : pg_cert_path,  "msg" : msg, "status" : 1 }	

				
			else :
				msg = "File name is not exists."
				return_data = { "pg_cert_name" : pg_cert_name,"pg_cert_path" : pg_cert_path,  "msg" : msg, "status" : 2 }			
				
			return json.dumps(return_data,default =str)
			
				
		else :
			msg = "File not exists. Please try again"
			return_data = { "pg_cert_name" : pg_cert_name,"pg_cert_path" : pg_cert_path,  "msg" : msg, "status" : 3 }	
		
		return json.dumps(return_data,default =str)
	except ClientError as e:
		return_data = { "pg_cert_name" : pg_cert_name,"pg_cert_path" : pg_cert_path,  "msg" : str(e), "status" : 401 }
		return json.dumps(return_data,default =str)


'''-----------landing page  end-----------'''
@app.route('/<int:conf_id>/<conf_key>/<parent_user_id>/get_parent_incompleted_delegates', methods = ["GET", "POST"])
def get_parent_incompleted_delegates(parent_user_id,conf_id,conf_key):
	conf       		= Auth.getConf(conf_id,conf_key)
	unique_id 		= None
	delegateData    = UserModel().get_incompleted_delegates_by_parent_user_idUserModel(parent_user_id,unique_id,conf_id,reg_mode=0)

	if delegateData:
		total_amount = 0
		for index , value in enumerate(delegateData):
			total_amount = total_amount + (value['total_amt'] if value['total_amt'] is not None else 0)
			base_url 	 = request.host_url
			if "https" in base_url :
				pass
			else :
				base_url = base_url.replace("http" ,"https")
				
		del_html_data = render_template('users/incompleted_information.html' ,user_data = delegateData,user_id = parent_user_id,conf_id =conf_id,conf_key=conf_key,total_amount=total_amount,conf=conf,base_url = base_url)
	else:
		del_html_data = ""
	return del_html_data          

@app.route('/<int:conf_id>/<conf_key>/<parent_user_id>/get_parent_completed_delegates', methods = ["GET", "POST"])
def get_parent_completed_delegates(parent_user_id,conf_id,conf_key):
	# usp_del_parent_completed_list
	now             = datetime.now()
	curr_dt         = now.strftime("%Y-%m-%d %H:%M:%S")
	conf        	= Auth.getConf(conf_id,conf_key)
	delegateData    = UserModel().get_completed_course_delegates_by_parent_user_id_UserModel(parent_user_id,conf_id)
	all_data =  UserModel().getDelParentCompletedList(conf_id,curr_dt) # Addod on May 26 2023
	code 		   = None
	addons         = None
	addon_type_ids = None

	for index,value in enumerate(all_data) :
		if index == 0 :
			code = value[0]['count']
		if index == 1 :
			addons = value
		if index == 2 :
			addon_type_ids = value
						

	# code            = UserModel().check_appliction_to_close_or_openUserModel(conf_id,curr_dt)
	# addons         	= UserModel().get_addon_reg_typeUserModel(conf_id)
	# addon_type_ids 	= UserModel().get_addon_types(conf_id)
	if conf_id == 17:
		display_addons = UserModel().get_wetdrylab_open_close(conf_id)
		display_addon = display_addons.get('display_addon')
	else:
		display_addon = 0
	
	show_conf_ids  	= addon_type_ids[0]['show_conf_ids']
	if delegateData:
		del_html_data =   render_template('users/completed_information.html' ,user_data = delegateData,conf_id =conf_id,conf_key=conf_key,conf=conf,addons=addons,addon_type_ids=addon_type_ids,str=str,show_conf_ids=show_conf_ids,code=code,display_addon=display_addon,int=int)
	else:
		del_html_data = ""
	return del_html_data
	 



@app.route('/<int:conf_id>/<conf_key>/<parent_user_id>/get_parent_waiting_completed_delegates', methods = ["GET", "POST"])
def GetParentWaitingCompletedDelegates(parent_user_id,conf_id,conf_key):
	conf          = Auth.getConf(conf_id,conf_key)
	delegateData  = UserModel().get_completed_waiting_delegates_by_parent_user_id(parent_user_id,conf_id)	
	if delegateData:
		del_html_data =   render_template('users/waiting_completed_information.html' ,user_data = delegateData,conf_id =conf_id,conf_key=conf_key,conf=conf,str=str,type=type)
	else:
		del_html_data = ""
	return del_html_data 




@app.route('/<int:conf_id>/<conf_key>/<parent_user_id>/get_parent_rejected_upi_transaction_delegates', methods = ["GET", "POST"])
def GetParentRejectUpiTransactionDelegates(parent_user_id,conf_id,conf_key):
	conf         = Auth.getConf(conf_id,conf_key)
	delegateData = UserModel().get_rejected_upi_transaction_by_parent_user_id(parent_user_id,conf_id)
	if delegateData:
		del_html_data =   render_template('users/upi_transaction_rejected_delegates.html' ,user_data = delegateData,conf_id =conf_id,conf_key=conf_key,conf=conf,str=str,type=type)
	else:
		del_html_data = ""
	return del_html_data 


'''-----------Payment Process Start-----------'''
@app.route('/<int:conf_id>/<conf_key>/post_payment', methods = ["GET","POST"])
@RouteGroup.conf_required
def PostPayment(conf_id,conf_key):
	conf            = Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	society_id      = conf['society_id']
	created_at      = now.strftime("%Y-%m-%d %H:%M:%S")
	curr_dt         = now.strftime("%Y-%m-%d %H:%M:%S")
	allow           = request.values.get('allow')
	user_data 		= Auth.user(society_id)
	if user_data :
		prefix          = user_data['prefix'] or None
		name            = user_data['full_name'] or None
		full_name 		= prefix + " " + name if prefix else name
		email           = user_data['email']
		mobile          = user_data['mobile']
		user_id         = user_data['user_id']
	else:
		flash("Please try after some time","successMsg")
		return redirect(url_for('user.Register',conf_id=conf_id,conf_key=conf_key))	
	
	check_addon       = UserModel().get_check_addons_UserModel(user_id,conf_id)
	code              = UserModel().check_appliction_to_close_or_openUserModel(conf_id,curr_dt)

	for value in check_addon:
		status      = value['status']
		msg         = value['msg']
		count       = value['count']

	if count > 0:
		if status == 1:
			flash(msg,"successMsg")
			return redirect(url_for('user.Register',conf_id=conf_id,conf_key=conf_key))
	if code == 0:	
		return redirect(url_for('user.Register',conf_id=conf_id,conf_key=conf_key))
		
	if allow is None :
		delegate_ids     = request.values.getlist('checklist')
	else:
		delegate_ids     = request.values.getlist('delegate_ids')

	delegate_ids = (",".join(delegate_ids))
	check_duplicate_delegate = UserModel().check_duplicate_delegateUserModel(delegate_ids,conf_id)
	for value in check_duplicate_delegate:
		msg     = value['msg']
		status  = value['status']
	if allow is None :
		if int(status) > 0 :
			flash(msg,"AlertSuccessMsg")
			return redirect(url_for('user.Register',conf_id=conf_id,conf_key=conf_key))
	
			
	if len(delegate_ids)> 0 :
		unique_id      = now.strftime('%Y%m%d%H%M%S')

		url     = conf['paymentgateway_api_url']
# 		r       = requests.get(url)
# 		apikey  = json.loads(r.content.decode())
		am_id   = conf['paymentgateway_appmaster_id']
		is_test = conf['paymentgateway_is_test']
# 		for index,value in enumerate(apikey) :
# 			api_am_id = value['am_id']
# 			if api_am_id == am_id:
# 				app_key  = value['app_key']
# 				app_name = value['app_name']
# 				break
# 			else:
# 				pass

		app_name ="MOSCON24"
		app_key ="MOSCON24"
		payment_for   = app_name
		if conf_id == 36:
			unique_id     = app_key+unique_id
		else:
			unique_id     = app_key+"_"+unique_id
# 		unique_id     = app_key+"_"+unique_id
		app_type      = Helper.AppType
		is_generate   = 0
		is_generate_link_payment  = 0
		payment_types = UserModel().get_payment_method(conf_id)
		payment       = payment_types[0]
		payment_id    = request.values.get('payment_id',0)
		payment_type  = payment['payment_type']

		if len(payment_types) == 1:
			if payment_type == "PAYMENT GATEWAY":
				usp_del_generate_payement = BOModel().usp_del_generate_payement(unique_id,delegate_ids,user_id,am_id,is_test,payment_for,is_generate,full_name,email,mobile,is_generate_link_payment,created_at,society_id,app_type,conf_id)
				return redirect(url_for('user.CallPayment',conf_id = conf_id,conf_key=conf_key,unique_id=unique_id))
			else:
				usp_del_generate_payement = BOModel().usp_del_choose_payment_generate_payement(unique_id,delegate_ids,user_id,am_id,is_test,payment_for,is_generate,full_name,email,mobile,is_generate_link_payment,created_at,society_id,app_type,conf_id)
				getData     = UserModel().getDataforPayments(unique_id)
				getData     = getData[0]
				amount      = getData['amount']
				payment_id  = getData['payment_id']
				delegate_id = delegate_ids
				addon_types_ids = UserModel().getPaymentAddons(conf_id,unique_id)
				return render_template('users/make_payment.html',payment_type=payment_types,user_id=user_id,society_id=society_id,conf_id=conf_id,conf_key=conf_key,amount = amount,payment_id=payment_id,unique_id=unique_id,delegate_id=delegate_id,conf=conf,int=int,float=float,addon_types_ids=addon_types_ids)
				# return render_template('users/make_payment_screen.html',user_id=user_id,payment_id=payment_id,image=image,encrypt_user_id=encrypt_user_id,unique_id=unique_id,payment_content=payment_content,payment_type=payment_type,member=member,society_id=society_id,society_key=society_key,step_no=step_no,utr_number=utr_number,userData=userData,societyData=societyData)
		else:
			usp_del_generate_payement = BOModel().usp_del_choose_payment_generate_payement(unique_id,delegate_ids,user_id,am_id,is_test,payment_for,is_generate,full_name,email,mobile,is_generate_link_payment,created_at,society_id,app_type,conf_id)
			getData     = UserModel().getDataforPayments(unique_id)
			getData     = getData[0]
			amount      = getData['amount']
			payment_id  = getData['payment_id']
			delegate_id = delegate_ids
			addon_types_ids = UserModel().getPaymentAddons(conf_id,unique_id)
			return render_template('users/make_payment.html',payment_type=payment_types,user_id=user_id,society_id=society_id,conf_id=conf_id,conf_key=conf_key,amount = amount,payment_id=payment_id,unique_id=unique_id,delegate_id=delegate_id,conf=conf,int=int,float=float,addon_types_ids=addon_types_ids)

	else :
		flash("Please select atleast one delegate to proceed further","Payerror")
		return redirect(url_for('user.Register',conf_id=conf_id,conf_key=conf_key))


# @app.route('/call_payment/<int:conf_id>/<conf_key>/<unique_id>', methods = ["GET", "POST"])
# @RouteGroup.conf_required
# def CallPayment(conf_id,conf_key,unique_id):
# 	getData     = UserModel().getDataforPayments(unique_id)
# 	conf        = Auth.getConf(conf_id,conf_key)
# 	if getData :
# 		getData             = getData[0]
# 		am_id               = getData['am_id']
# 		# gateway_id = base64.b64encode(bytes(gateway_id, 'utf-8'))
# 		sample_string       = str(am_id)
# 		sample_string_bytes = sample_string.encode("ascii")
# 		base64_bytes        = base64.b64encode(sample_string_bytes)
# 		am_id_base64        = base64_bytes.decode("ascii")
# 		getData['res_url']  = request.host_url+"payment_server_response/"+str(conf_id)+"/"+conf_key
# 		getData['remarks']  = conf["conf_title"]
		
# 		name                 = getData['full_name']
# 		mobile               = getData['mobile']
# 		email                = getData['email']
# 		amount               = getData['amount']

# 		unique_id            = getData['unique_id']
# 		if  conf['conf_id'] == 20 : # iages24
# 			unique_id_sample = unique_id.encode("ascii")
# 			base64_byte      = base64.b64encode(unique_id_sample)
# 			unique_id        = base64_byte.decode("ascii")
# 			getData["res_url"] = "https://delegate.iageschennai.com/ccavResponseHandler"
# 			return render_template('ccavenue_1/dataFrom.html',data= getData,conf_id=conf_id,conf_key=conf_key)
# 			return render_template("users/call_payment_screen_iages24_2.html" ,data= getData,am_id_base64 =am_id_base64,conf=conf,unique_id=unique_id)
# # 			url_1 = "https://iages24payments.iageschennai.com/payment_screen.html?conf_id="+str(conf_id)+"&conf_key="+conf_key+"&name="+str(name)+"&email="+email+"&mobile="+mobile+"&unique_id="+unique_id+"&amount="+str(amount)+"&res_url=https://delegate.iageschennai.com/payment_server_response/"+str(conf_id)+"/"+conf_key
# # 			return  flask.redirect(url_1)
# 		elif conf['conf_id'] == 29 : # ipgs
# 			url_1 = "https://ipgs.org.in/ipgs_payments/pay.php?conf_id="+str(conf_id)+"&conf_key="+conf_key+"&name="+str(name)+"&email="+email+"&mobile="+mobile+"&unique_id="+unique_id+"&amount="+str(amount)+"&res_url=https://delegate.ipgs.org.in/payment_server_response/"+str(conf_id)+"/"+conf_key			
# 			return  flask.redirect(url_1)	
# 		elif conf['conf_id'] == 19 : # tnasi
# 			url_1 = "https://tnasi.com/paymentapi/payment_screen.html?conf_id="+str(conf_id)+"&conf_key="+conf_key+"&name="+str(name)+"&email="+email+"&mobile="+mobile+"&unique_id="+unique_id+"&amount="+str(amount)+"&res_url=https://delegate.tnasi.com/payment_server_response/"+str(conf_id)+"/"+conf_key
# 			return  flask.redirect(url_1)	
# 		elif conf['conf_id'] == 17 :
# 			return render_template("users/call_payment_screen_tnoa23.html" ,data= getData,am_id_base64 =am_id_base64,conf=conf)

# 		else:   
# 			return render_template("users/call_payment_screen.html" ,data= getData,am_id_base64 =am_id_base64,conf=conf)
# 	else: 
# 		return " No data"
@app.route('/call_payment/<int:conf_id>/<conf_key>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def CallPayment(conf_id,conf_key,unique_id):
	getData     = UserModel().getDataforPayments(unique_id)
	conf        = Auth.getConf(conf_id,conf_key)
	if getData :
		getData             = getData[0]
		am_id               = getData['am_id']
		# gateway_id = base64.b64encode(bytes(gateway_id, 'utf-8'))
		sample_string       = str(am_id)
		sample_string_bytes = sample_string.encode("ascii")
		base64_bytes        = base64.b64encode(sample_string_bytes)
		am_id_base64        = base64_bytes.decode("ascii")
		getData['res_url']  = request.host_url+"payment_server_response/"+str(conf_id)+"/"+conf_key
		getData['remarks']  = conf["conf_title"]
		
		name                 = getData['full_name']
		mobile               = getData['mobile']
		email                = getData['email']
		amount               = getData['amount']
		unique_id            = getData['unique_id']
		unique_id_2 = unique_id
		if  conf['conf_id'] == 20 : # iages24
			unique_id_sample = unique_id.encode("ascii")
			base64_byte      = base64.b64encode(unique_id_sample)
			unique_id        = base64_byte.decode("ascii")
			# addond on June 16, 2023
			# getData["res_url"] = "https://delegate.iageschennai.com/20/iages24/ccavResponseHandler"
			# return render_template('ccavenue_1/dataFrom.html',data= getData,conf_id=conf_id,conf_key=conf_key)
			# end
			return render_template("users/call_payment_screen_iages24_2.html" ,data= getData,am_id_base64 =am_id_base64,conf=conf,unique_id=unique_id)
			# url_1 = "https://iages24payments.iageschennai.com/payment_screen.html?conf_id="+str(conf_id)+"&conf_key="+conf_key+"&name="+str(name)+"&email="+email+"&mobile="+mobile+"&unique_id="+unique_id_2+"&amount="+str(amount)+"&res_url=https://delegate.iageschennai.com/payment_server_response/"+str(conf_id)+"/"+conf_key
			# return  flask.redirect(url_1)
		elif conf['conf_id'] == 29 : # ipgs
			url_1 = "https://ipgs.org.in/ipgs_payments/pay.php?conf_id="+str(conf_id)+"&conf_key="+conf_key+"&name="+str(name)+"&email="+email+"&mobile="+mobile+"&unique_id="+unique_id+"&amount="+str(amount)+"&res_url=https://delegate.ipgs.org.in/payment_server_response/"+str(conf_id)+"/"+conf_key			
			return  flask.redirect(url_1)	
		
		elif conf['conf_id'] in [27,57] : # ksos
			url_1 = "https://ksos.in/paymentapi_del/payment_screen_1.html?conf_id="+str(conf_id)+"&conf_key="+conf_key+"&name="+str(name)+"&email="+email+"&mobile="+mobile+"&unique_id="+unique_id+"&amount="+str(amount)+"&res_url=https://delegate.ksos.in/payment_server_response/"+str(conf_id)+"/"+conf_key			
			return  flask.redirect(url_1)	
			
		elif conf['conf_id'] == 19 : # tnasi
			url_1 = "https://tnasi.com/paymentapi/payment_screen.html?conf_id="+str(conf_id)+"&conf_key="+conf_key+"&name="+str(name)+"&email="+email+"&mobile="+mobile+"&unique_id="+unique_id+"&amount="+str(amount)+"&res_url=https://delegate.tnasi.com/payment_server_response/"+str(conf_id)+"/"+conf_key
			return  flask.redirect(url_1)	
		elif conf['conf_id'] in [17,39] :
			return render_template("users/call_payment_screen_tnoa23.html" ,data= getData,am_id_base64 =am_id_base64,conf=conf)
		elif conf['conf_id'] == 36:
			prefix_list = ["Dr. " , "dr." , "Prof. " ,"Prof " , "Mr. ", "Mrs. " ]
			for i in prefix_list :
				prefix = i
				if prefix in name :
					name = name.lstrip(prefix)
					break
				else :
					pass
					
			name = name.replace("." , " ")	if "." in name else name		
			url_1 = "https://www.iapkarnataka.org/airpay_php/transaction.html?conf_id="+str(conf_id)+"&conf_key="+conf_key+"&name="+str(name)+"&email="+email+"&mobile="+mobile+"&unique_id="+unique_id+"&amount="+str(amount)+"&res_url=https://delegate.numerotech.com/payment_server_response/"+str(conf_id)+"/"+conf_key
			return  flask.redirect(url_1)
		else:   
			return render_template("users/call_payment_screen.html" ,data= getData,am_id_base64 =am_id_base64,conf=conf)
	else: 
		return " No data"

	


@app.route('/<int:conf_id>/<conf_key>/generate_post_payment', methods = ["GET","POST"])
@RouteGroup.conf_required
def GeneratePostPayment(conf_id,conf_key):
	now              = datetime.now()
	conf             = Auth.getConf(conf_id,conf_key)
	society_id       = conf['society_id']
	created_at       = now.strftime("%Y-%m-%d %H:%M:%S")
	user_id          = request.values.get('user_id')
	full_name        = request.values.get('full_name')
	email            = request.values.get('email')
	mobile           = request.values.get('mobile')
	delegate_ids     = request.values.getlist('delegate_ids')

	if len(delegate_ids)> 0 :
		# conf_id       = request.values.get('conf_id')
		state_id      = UserModel().get_states()
		output        = UserModel().get_user(user_id,society_id,conf_id)

		unique_id     = now.strftime('%Y%m%d%H%M%S')
		
		# am_id         = Helper.PaymentGatewayAppMasterID # sai sir account techventure3 , 5 for test
		# is_test       = Helper.PaymentGatewayISTest # payumoney work on live mode only so set is_test = 0
		# am_id           = 5 # sai sir account techventure3 , 5 for test
		# is_test         = 1 # payumoney work on live mode only so set is_test = 0

		# url = 'https://paymentapi.urbanedge.co.in/api_key'
		url    = conf['paymentgateway_api_url']
# 		r      = requests.get(url)
# 		apikey = json.loads(r.content.decode())
		
		am_id   = conf['paymentgateway_appmaster_id']
		is_test = conf['paymentgateway_is_test']
# 		for index,value in enumerate(apikey) :
# 			api_am_id = value['am_id']
# 			if api_am_id == am_id:
# 				app_key  = value['app_key']
# 				app_name = value['app_name']
# 				break
# 			else:
# 				pass
				
				
		app_name = "MOSCON24"
		app_key = "MOSCON24"		

		payment_for  = app_name
		if conf_id == 36:
			unique_id     = app_key+unique_id
		else:
			unique_id     = app_key+"_"+unique_id
# 		unique_id    = app_key+"_"+unique_id
		delegate_ids = (",".join(delegate_ids))
		app_type     = Helper.AppType
		is_generate  = 0
		is_generate_link_payment = 1
		usp_del_generate_payement = BOModel().usp_del_generate_payement(unique_id,delegate_ids,user_id,am_id,is_test,payment_for,is_generate,full_name,email,mobile,is_generate_link_payment,created_at)
		if usp_del_generate_payement :
			return redirect(url_for('user.CallPayment',conf_id=conf_id,conf_key=conf_key,unique_id=unique_id))
		else :
			flash("Please select atleast one delegate to proceed further")
			return redirect(url_for('user.Register',conf_id=conf_id,conf_key=conf_key))

	else :
		flash("Please select atleast one delegate to proceed further","Payerror")
		return redirect(url_for('user.Register',conf_id=conf_id,conf_key=conf_key))



@app.route('/payment_server_response/<int:conf_id>/<conf_key>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def PaymentServerResponse(conf_id,conf_key):
	now                 = datetime.now()
	dt_string           = now.strftime('%Y-%m-%d %H:%M:%S')

	conf                = Auth.getConf(conf_id,conf_key)
	if conf_id  and conf_id == 20 :
		order_no            = request.values.get("order_no") or None
		reference_no        = request.values.get("reference_no") or None
		is_already_paid     = request.values.get("is_already_paid") or None

		payment_id = None
		status     = None
		email      = None
		mobile     = None
		unique_id  = None
		tracking_id = ''
		payment_method = ''
		
		if is_already_paid :
			flash("Already paid" ,"errorMsg")
			return redirect(url_for('user.Home',conf_id=conf_id,conf_key=conf_key))

		if (order_no and len(order_no)> 4 ) and (reference_no and len(reference_no) > 5):
			response = requests.get("https://iages24payments.iageschennai.com/order_track.php?order_no="+order_no+"&reference_no="+reference_no+"")
			response = response.text
			response = response.replace('\\' ,"")
			result = response[1:-1]
			res = json.loads(result)
			result_data = res["Order_Status_Result"]
			# json_data = json.dumps(result_data,default=str)
			# return json_data
# 			print("---------result_data -----------------")
# 			print(result_data)
			if result_data :
				if  result_data["error_desc"] and  "No Record Found" in result_data["error_desc"]  :
					flash("Invalid response " , "errorMsg")
					return redirect(url_for('user.Home',conf_id=conf_id,conf_key=conf_key))
				if  result_data["order_status"] == "Aborted" :
					payment_id =result_data["reference_no"]
				else :
					# payment_id = result_data["order_bank_ref_no"] # commented on August 16, 2023 By Ganesan
					payment_id =result_data["reference_no"]
				# status     = result_data["order_status"]
				status     = result_data["order_bank_response"]
				# return status
				email      = result_data["order_bill_email"]
				mobile       = result_data["order_bill_tel"]
				unique_id    = order_no
				
				payment_method = result_data["order_card_name"]
				tracking_id  = result_data["reference_no"]	


			if status and "SUCCESS" in status  :
				status = "success"
			elif status and status == "N":
				status = "failure"
			else :
				if result_data :
					status = result_data["order_status"]
				else :
					status = "failure"
		else :
			return "Invalid Response"				
	else :
		payment_id          = request.values.get('payment_id')
		status              = request.values.get('status') 
		email               = request.values.get('email') or ''
		mobile              = request.values.get('mobile') or ''
		unique_id           = request.values.get('unique_id') 
		amount              = request.values.get('amount') 
		payment_method      = request.values.get('method') 
		tracking_id         = request.values.get('tracking_id') or ''
		
		
	if status and 	 (status =="success" or status == "Y" or status =="Success" or status =="Successful" ):
		status = "success"
		
	data                = {'api_payment_id' : payment_id,'status' : status,'updated_at' :dt_string,'paid_at' :dt_string,'payment_method':'PAYMENT GATEWAY','payment_method_from_gateway':payment_method}
	update_and_get_data = UserModel().UserupdatePayment(unique_id,data,dt_string) # update payment status in your table
	if conf_id == 20 or conf_id == 21:
			ccavenue_data = {'conf_id':conf_id,'unique_id':unique_id,'bank_ref_num':payment_id,'tracking_id':tracking_id,'payment_status':status,'created_at':dt_string,'payment_method':payment_method}
			update_ccavenue = UserModel().insert_ccavenue_payment(ccavenue_data)

	generatedDelegates = None		
	is_generate_link_payment = 0
	if update_and_get_data == "updated" and (status =="success" or status == "Y" or status =="Success" or status =="Successful" ):
		# Normal payment with PG proof verification status update and generate delegate number for delegate registations 
		if conf_id in [19,49,8,48,39,50] :
			status = "success"
			generatedDelegates = UserModel().Userdelegate_no_generate_with_pg(unique_id,conf_id)
			pay_proof_data = UserModel().getTNASIPaymentProof(unique_id,conf_id)
			if pay_proof_data :
				full_name    = pay_proof_data["full_name"] or ' '
				delegate_id  = pay_proof_data["delegate_id"] or ''
				data_for_del_addons = {"reg_status" : 3 , "updated_at" : dt_string, "conference_id" : conf_id}
				# updates_res = UserModel().updateDelegateAddons(data_for_del_addons,unique_id ,conf_id)
				subject   = " Acknowledgement of your delegate registration for {}".format(conf['conf_name'])
				html      = render_template('email/tnasi_pg_ack_mail.html',conf=conf,full_name=full_name)
				data_1    = EMAIL.MailTemplateSendMail(subject,html,email,None,conf)
				if data_1:
					data_1 = json.loads(data_1)
					update_data = {
					'delegate_id' : str(delegate_id),
					'conf_id'     : str(conf_id),
					'created_at'  : str(dt_string)
					}
					data_1.update(update_data) 
					UserModel().insert_mandrill_logs(data_1)
				flash("Thank you for registering for {}.  Your Bonafide certificate shall be verified and the delegate registration number shall be generated after verification of Bonafide Certificate. <br/> For any assistance,  please write to {}.".format(conf['conf_name'],conf['e_support_email']),"successMsg")
					# return redirect(url_for('user.Home',conf_id=conf_id,conf_key=conf_key))
				

		else:
			# Normal payment gateway  and generate delegate numbers 

			generatedDelegates = UserModel().Userdelegate_no_generate(unique_id,conf_id)
			
		flash("Payment successful.","successMsg")
		if generatedDelegates:
			for delegate in generatedDelegates:
				delegate_id  = delegate['delegate_id']
				is_generate_link_payment  = delegate['is_generate_link_payment']
				if delegate['del_status_id'] == 2 :
					ConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,1)
				# ConfirmationDelegateMail(conf_id,conf_key,0,delegate,1)
			# generatedDelegates[0].parent_user_id    
		receipt_datas = UserModel().receipt_no_generate_and_get(unique_id,conf_id);
		if receipt_datas:
			ReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_datas[0],1)
			tricon_workshop = TriconWorkshopUpdates(conf_id,unique_id)
	elif status is not None:
		flash("Your payment has failed. Please try again. <br> If the problem persists ,  please write to {}".format(conf['e_support_email']),"errorMsg")
		reg_status = 0
		UserModel().UpdateInprogressDelegates(unique_id,dt_string,reg_status,conf_id)
		#flash("Your payment is {}. Please try again to make the payment.  If the issue persists,  please write to {}".format(status,conf['e_support_email']),"errorMsg") 
		# flash("Your payment status is {} .Please scroll to try agian Make Payment Or contact to support ".format(status),"errorMsg")    
	if is_generate_link_payment == 1 :
		return redirect(url_for('user.PaymentLinkResponse',conf_id=conf_id,conf_key=conf_key))
	return redirect(url_for('user.Home',conf_id=conf_id,conf_key=conf_key))


def TriconWorkshopUpdates(conf_id,unique_id):
	if conf_id == 17:
		update = UserModel().usp_del_tricon_workshop_update(unique_id,conf_id)
		return "true"
	else:
		return "false"


@app.route('/receipt_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>', methods = ["GET", "POST"])
def ReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_data,is_send,conf=None,is_flash_msg = None):
	conf            = conf if conf else Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	dt_string       = now.strftime('%Y-%m-%d %H:%M:%S')
	template_name   = "receipt_mail"
	mailData        = UserModel().get_mail_template(template_name,conf_id)
	if receipt_data is None :
		receipt_datas   = UserModel().receipt_no_generate_and_get(unique_id,conf_id)
		if receipt_datas:
			receipt_data = receipt_datas[0]
	if receipt_data:
		email                 = receipt_data['email']
		# email                   = 'karthiashokan23@gmail.com' 
		receipt_no            = receipt_data['receipt_no']
		delegate_nos          = receipt_data['delegate_nos']
		delegate_id          = receipt_data['delegate_ids']
		amount                = receipt_data['amount']
		amount                = int(amount)
		amount                = f"{amount:,}"
		amount_with_commas    = amount
		amount_for_convertion = int(receipt_data['amount'])
		amount_in_words       =  Helper.amountTowords(amount_for_convertion)
		amount_in_words       = amount_in_words.title()
		conf_name             = receipt_data['conf_name']
		addon_type_id         = receipt_data['addon_type_id']
		del_status_id         = receipt_data['del_status_id']
		del_nos               = receipt_data['del_nos']
		ref_nos_pg            = receipt_data['ref_nos_pg']
		
		if amount == "Free" :
			amount = "Free"
		else:
			amount = "Rs."+amount+"/-"
		update_data = {
				'amount_with_commas':amount_with_commas,
				'amount_in_words':amount_in_words

		}
		receipt_data.update(update_data)

		ref_nos    = receipt_data['reference_nos']



		sub_data  = {
					 'receipt_no':str(receipt_no),'amount':str(amount)
					}
	
		subject   = Helper.merge_tags(mailData['subject'],sub_data)    
		m_data    = {
					 'mail_content': mailData['mail_content'],'receipt_data': receipt_data,'conf': conf
					}

		mail_content = Helper.convert_html_for_mail_screen(m_data)
		if is_flash_msg == None:
			if conf_id == 17 and  amount_for_convertion in [500,1000,1500,2000]:
				flash("An amount of {} inclusive of GST has been made towards WET & DRY lab registration.<br/>The receipt has been emailed to {}.<br/><br/> Receipt no. {}".format(amount,email,receipt_no),"successMsg")
			elif conf_id == 50 and  amount_for_convertion in [300]:
				flash("An amount of {} inclusive of GST has been made towards session of zumba registration.<br/>The receipt has been emailed to {}.<br/><br/> Receipt no. {}".format(amount,email,receipt_no),"successMsg")
			else:
				if conf['is_gen_number'] == 'ref_number':
					if ref_nos:
						value = f"Reference no(s).{ref_nos}" if ref_nos else ""
						flash(
							f"An amount of {amount} has been made towards {conf_name} registration.<br/>"
							f"The receipt has been emailed to {email}.<br/>"
							f"A delegate registration confirmation email has been sent to the email id of the delegate(s).<br/><br/>"
							f"Receipt no. {receipt_no}.<br/>"
							f"{value}<br/><br/>",
							# f"PG Bonafide certificate Awaiting Reference no(s). {ref_nos_pg}",
							"successMsg")
					else:
						flash("An amount of {} has been made towards {} registration.<br/>The receipt has been emailed to {}.<br/> Receipt no. {} .".format(amount,conf_name,email,receipt_no),"successMsg")

				else:
					if del_nos and int(del_status_id) == 2 :
						if addon_type_id in [2,5]:
							flash("An amount of {} inclusive of GST has been made towards WET & DRY lab registration.<br/>The receipt has been emailed to {}.<br/><br/> Receipt no. {}".format(amount,email,receipt_no),"successMsg")
						else:
							flash("An amount of {} has been made towards {} registration.<br/>The receipt has been emailed to {}.<br/>A delegate registration confirmation email has been sent to the email id of the delegate(s).<br/><br/> Receipt no. {} .Delegate no(s). {}".format(amount,conf_name,email,receipt_no,del_nos),"successMsg")
					else :
						flash("An amount of {} has been made towards {} registration.<br/>The receipt has been emailed to {}.<br/>A delegate registration confirmation email has been sent to the email id of the delegate(s).<br/><br/> Receipt no. {} ".format(amount,conf_name,email,receipt_no),"successMsg")
		html      = render_template('email/receipt_email_v1.html',mail_content=mail_content,conf=conf)
		if is_send == 1:
			if conf['is_email_enable'] == 1:
				data_1 = EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
				if data_1:
					data_1 = json.loads(data_1)
					update_data = {
					'delegate_id' : str(delegate_id),
					'conf_id'     : str(conf_id),
					'created_at'  : str(dt_string)
					}
					data_1.update(update_data) 
					UserModel().insert_mandrill_logs(data_1)
				if conf['backup_email_2']:
					EMAIL.MailTemplateSendMail(subject,html,conf['backup_email_2'],mailData,conf)
		else:   
			return html
	else :
		return None

@app.route('/confirmation_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>', methods = ["GET", "POST"])
def ConfirmationDelegateMail(conf_id,conf_key,delegate_id,delegate,is_send,conf=None):
	conf            = conf if conf else Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	dt_string       = now.strftime('%Y-%m-%d %H:%M:%S')
	template_name   = "confirmation_mail"
	mailData        = UserModel().get_mail_template(template_name,conf_id)
	if delegate is None:
		delegates   = BOModel().usp_del_get_delegates_by_delegate_id(delegate_id)
		if delegates:
			delegate = delegates[0]
			
	if delegate:
		email        = delegate['email']
		# email          = 'karthiashokan23@gmail.com'  
		parent_email = delegate['parent_email']
		# parent_email       = 'karthiashokan23@gmail.com'
		delegate_no  = delegate['delegate_no']
		amount       = delegate['total_amount']
		prefix       = delegate["prefix"]
		conf_name    = delegate['conf_name']
		ref_no       = delegate['ref_no']
		ref_no_only  = delegate['ref_no_only']
		if prefix:
			name = delegate["prefix"] +" "+ delegate["full_name"]
		else:
			name = delegate["full_name"]
		amount   = "Rs."+str(amount) 
		
		is_gen_number = conf['is_gen_number']


		# Reference number added here
		if is_gen_number == 'ref_number':
			subject = "Confirmation of registration - "+str(ref_no)
		else:
			sub_data = {
						  'delegate_no':str(delegate_no)
					}
					   
			subject = Helper.merge_tags(mailData['subject'],sub_data)             
		
		m_data  = {
					'mail_content'  : mailData['mail_content'],
					'delegate'      : delegate,
					'conf'          : conf

				}   
	
		mail_content = Helper.convert_html_for_mail_screen(m_data)
		html     = render_template('email/confirmation_mail_v1.html',mail_content=mail_content,conf=conf)
		if is_send == 1:
			if email :
				if conf['is_email_enable'] == 1:
					data_1 = EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
					if data_1:
						data_1 = json.loads(data_1)
						update_data = {
						'delegate_id' : str(delegate_id),
						'conf_id'     : str(conf_id),
						'created_at'  : str(dt_string)
						}
						data_1.update(update_data) 
						UserModel().insert_mandrill_logs(data_1)
					if conf['backup_email_2']:
						EMAIL.MailTemplateSendMail(subject,html,conf['backup_email_2'],mailData,conf)
			elif not email :
				if conf['is_email_enable'] == 1:
					data_1 = EMAIL.MailTemplateSendMail(subject,html,parent_email,mailData,conf)
					if data_1:
						data_1 = json.loads(data_1)
						update_data = {
						'delegate_id' : str(delegate_id),
						'conf_id'     : str(conf_id),
						'created_at'  : str(dt_string)
						}
						data_1.update(update_data) 
						UserModel().insert_mandrill_logs(data_1)  
			if email != parent_email :
				if conf['is_email_enable'] == 1:
					data_1 = EMAIL.MailTemplateSendMail(subject,html,parent_email,mailData,conf)
					if data_1:
						data_1 = json.loads(data_1)
						update_data = {
						'delegate_id' : str(delegate_id),
						'conf_id'     : str(conf_id),
						'created_at'  : str(dt_string)
						}
						data_1.update(update_data) 
						UserModel().insert_mandrill_logs(data_1)    
		else:   
			return html
	else :
		return None 


@app.route('/Generate_delegate_mail/<int:conf_id>/<conf_key>/<payment_id>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def GenerateDelegateMail(conf_id,conf_key,payment_id,unique_id):
	conf            = Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	dt_string       = now.strftime('%Y-%m-%d %H:%M:%S')
	template_name   = "payment_link_generate"
	mailData        = UserModel().get_mail_template(template_name,conf_id)
	full_name       = request.values.get('full_name')
	parent_user_id  = None
	email           = request.values.get('email')
	show_msg        = request.values.get('show_msg')
	payment_link    = request.host_url+str(conf_id)+"/"+conf_key+"/generate_payement_link/"+payment_id+"/"+unique_id
	delegateData    = UserModel().get_payment_link_incompleted_delegates(parent_user_id,unique_id,conf_id)
	
# 	subject         = conf['conf_name']+" Delegate Registration Payment link"
	sub_data  = {
					 'conf_name':conf['conf_name']
				}
	
	subject   = Helper.merge_tags(mailData['subject'],sub_data)  
	
	m_data  = {
						'mail_content'  : mailData['mail_content'],
						'full_name'     : full_name,
						'payment_link'  : payment_link,
						'conf'          : conf,
						'conf_id'       : conf_id,
						'conf_key'      : conf_key,
						'user_data'     : delegateData
	}   
		
	mail_content    = Helper.convert_html_for_mail_screen(m_data)
	delegate_id     = delegateData[0]['delegate_id']
# 	html            = render_template('email/generate_payment_link_mail.html',conf_id=conf_id,conf_key=conf_key,full_name=full_name,payment_link=payment_link,user_data = delegateData,conf=conf)
	html            = render_template('email/generate_payment_link_mail_v1.html',conf=conf,mail_content=mail_content)
	if conf['is_email_enable'] == 1:
		data_1 = EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
		if data_1:
			data_1 = json.loads(data_1)
			update_data = {
			'delegate_id' : str(delegate_id),
			'conf_id'     : str(conf_id),
			'created_at'  : str(dt_string)
			}
			data_1.update(update_data) 
			UserModel().insert_mandrill_logs(data_1)
	flash("Payment link generated successfully and sent as an email to "+email+"","successMsg")
	if int(show_msg) == 1:
		return redirect(url_for('offline.BoDelegate',conf_id=conf_id,conf_key=conf_key))
	else:
		return redirect(url_for('back_office.Index_user',conf_id=conf_id,conf_key=conf_key))	
@app.route('/<int:conf_id>/<conf_key>/generate_payement_link/<int:payment_ids>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def GeneratePayementLink(conf_id,conf_key,payment_ids,unique_id):
	conf = Auth.getConf(conf_id,conf_key)
	parent_user_id = None
	delegateData    = BOModel().usp_del_generate_payment_link_details(unique_id,payment_ids,conf_id)
	if delegateData:
		total_amount = 0
		for index , value in enumerate(delegateData):
			total_amount   = total_amount + value['total_amt']
			payment_id     = value['payment_id']
			parent_user_id = value['parent_user_id']
			full_name      = value['reg_name']
			email          = value['reg_email']
			mobile         = value['reg_mobile']
		if payment_id == payment_ids:
			del_html_data  = render_template('users/generate_incompleted_information.html' ,user_data = delegateData,user_id = parent_user_id,total_amount=total_amount,conf_id=conf_id,conf_key=conf_key,conf=conf,incompleted_template =delegateData,parent_user_id=parent_user_id,unique_id=unique_id,payment_id=payment_id,full_name=full_name,email=email,mobile=mobile)
		else:
			flash("Invaild Link","Error")
			del_html_data  = render_template('backoffice_user/delegate_registration/error_msg.html',conf_id=conf_id,conf_key=conf_key,conf=conf)
	else:
		flash("This Link Expired","Error")
		del_html_data  = render_template('backoffice_user/delegate_registration/error_msg.html',conf_id=conf_id,conf_key=conf_key,conf=conf)
	return del_html_data




@app.route('/<int:conf_id>/<conf_key>/generate_payement_table/<int:payment_ids>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def GeneratePayementTable(conf_id,conf_key,payment_ids,unique_id):
	conf = Auth.getConf(conf_id,conf_key)
	parent_user_id = None
	delegateData    = UserModel().get_incompleted_delegates_by_parent_user_idUserModel(parent_user_id,unique_id,reg_mode=0)
	if delegateData:
		total_amount = 0
		for index , value in enumerate(delegateData):
			total_amount    = total_amount + value['total_amt']
			payment_id      = value['payment_id']
			parent_user_id  = value['parent_user_id']
			full_name       = value['reg_name']
			email           = value['reg_email']
			mobile          = value['reg_mobile']
		if payment_id == payment_ids:
			del_html_data = render_template('users/generate_incompleted_information_table.html' ,user_data = delegateData,user_id = parent_user_id,total_amount=total_amount,conf_id=conf_id,conf_key=conf_key,conf=conf,incompleted_template =delegateData,parent_user_id=parent_user_id,full_name=full_name,email=email,mobile=mobile)
		else:
			flash("Invaild Link","Error")
			del_html_data = render_template('backoffice_user/delegate_registration/error_msg.html',conf_id=conf_id,conf_key=conf_key,conf=conf)
	else:
		flash("This Link Expired","Error")
		del_html_data = render_template('backoffice_user/delegate_registration/error_msg.html',conf_id=conf_id,conf_key=conf_key,conf=conf)
	return del_html_data


@app.route('/<int:conf_id>/<conf_key>/<delegate_id>/view_confirmation_delegate_mail', methods = ["GET", "POST"])
def ViewConfirmationDelegateMail(conf_id,conf_key,delegate_id):
	return ConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,0)


@app.route('/<int:conf_id>/<conf_key>/<unique_id>/view_receipl_delegate_mail', methods = ["GET", "POST"])
def ViewReceiptDelegagteMail(conf_id,conf_key,unique_id):
	return ShowReceiptDelegagteMail(conf_id,conf_key,unique_id,None,0)

@app.route('/view_receipt_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def ShowReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_data,is_send):
	conf          = Auth.getConf(conf_id,conf_key)
	template_name = "receipt_mail"
	mailData      = UserModel().get_mail_template(template_name,conf_id)
	if receipt_data is None :
		receipt_datas   = UserModel().receipt_no_generate_and_get(unique_id,conf_id)
		if receipt_datas:
			receipt_data = receipt_datas[0]
	if receipt_data:
		email                 = receipt_data['email']
		# email                   = 'karthiashokan23@gmail.com' 
		receipt_no            = receipt_data['receipt_no']
		delegate_nos          = receipt_data['delegate_nos']
		amount                = receipt_data['amount']
		amount                = int(amount)
		amount                = f"{amount:,}"
		amount_with_commas    = amount
		amount_for_convertion = int(receipt_data['amount'])
		amount_in_words       =  Helper.amountTowords(amount_for_convertion)
		amount_in_words       = amount_in_words.title()
		conf_name             = receipt_data['conf_name']
		update_data = {
				'amount_with_commas':amount_with_commas,
				'amount_in_words':amount_in_words

		}
		receipt_data.update(update_data)
		sub_data  = {
					 'receipt_no':str(receipt_no),'amount':str(amount)
					}
		subject   = Helper.merge_tags(mailData['subject'],sub_data)    
		m_data    = {
					 'mail_content': mailData['mail_content'],'receipt_data': receipt_data,'conf': conf
					}
		mail_content = Helper.convert_html_for_mail_screen(m_data)
		html      = render_template('email/receipt_email_v1.html',mail_content=mail_content,conf=conf)
		if is_send == 1:
			if conf['is_email_enable'] == 1:
				EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
	return html



@app.route('/get_pending_addons', methods = [ "GET","POST"])
def GetPendingAddons():
	conf_id         = request.values.get('conf_id',0)
	conf_key        = request.values.get('conf_key',0)
	conf            = Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	total_amount = 0
	delegate_id     = request.values.get('delegate_id',0)
	delegate_addons = BOModel().check_delegate_addons(delegate_id,conf_id) #ToDo: change function name to get_delegate_completed_addons
	addon_ids       = delegate_addons['addon_ids']
	pending_data    = UserModel().get_all_pending_data(conf_id,delegate_id,now,addon_ids)
	for index,value in enumerate(pending_data):
		if index == 0:
			reg_types = value
		if index == 1:
			addons_db = value
		if index == 2:
			get_addon_day_db = value
		if index == 3:
			addons_group = value
	addons = {}
	for a in addons_db:
		addons[a["addon_type_id"]] = (addons.get(a["addon_type_id"],[]) + [a])
		
	total_amount_for_course = AddonsModel().get_total_amount_for_wetlab(delegate_id)
	json_data = json.dumps(total_amount_for_course,default=str)

	total_amount            = total_amount_for_course['total_amount']
	
	total_amount = int(total_amount) if total_amount else 0

	delegate_course    = {}		
	delegate_courses_db = AddonsModel().get_delegate_courses(delegate_id)	
	if delegate_courses_db :
		for item in delegate_courses_db:
			delegate_course[item["addon_type_id"]] = delegate_course.get(item['addon_type_id'],[]) + [item] 

	
	courses    = {}		
	courses_db = AddonsModel().get_courses_wetlab_drylabs(conf_id)
	for item in courses_db:
		courses[item["addon_type_id"]] = courses.get(item['addon_type_id'],[]) + [item]    	
	

	get_addon_day = {}
	for b in get_addon_day_db:
		get_addon_day[b["addon_name"]] = (get_addon_day.get(b["addon_name"],[]) + [b])


	html_data =  render_template('users/addons_modal.html' ,courses=courses,total_amount=total_amount,delegate_course=delegate_course,delegate_addons= delegate_addons,reg_types=reg_types,addons=addons,str=str,conf=conf)
	data  = {"html_data":html_data,'total_amount':total_amount,"msg":"success",'status':1}
# 	total_count_delegates_addons  = AddonsModel().get_count_delegates_addons(delegate_id)
# 	if total_count_delegates_addons == None :
# 		data  = {"html_data":html_data,'total_amount':total_amount,"msg":"success",'status':2}

# 	elif int(total_count_delegates_addons['total_count']) == 4   :
# # 		total_amount = int(total_count_delegates_addons['total_amount'])
# 		data  = {"html_data":html_data,'total_amount':total_amount,"msg":"success",'status':1}

# 	else :
# 		data  = {"html_data":html_data,'total_amount':total_amount,"msg":"success",'status':2}

	json_data = json.dumps(data,default=str)
	return json_data






@app.route('/get_day_for_course_weblab_drylab', methods = [ "GET","POST"])
def GetDayForWetDryLab():
	courses       = request.values.get('courses')
	addon_type_id = request.values.get('addon_type_id')
	conf_id       = request.values.get('conf_id')
	day_data      = AddonsModel().get_day_by_course_for_WetLabDryLab(courses,addon_type_id,conf_id)
	if day_data :
		data = {"day_data":day_data ,"addon_type_id":addon_type_id, "msg":"success", "status" :1}
	else:
		data = {"day_data":'',"addon_type_id":addon_type_id,"msg":"failed","status":0}

	json_data = json.dumps(data,default=str)
	return json_data




@app.route('/get_time_for_course_weblab_drylab', methods = [ "GET","POST"])
def GetTimeForWetDryLab():
	courses       = request.values.get('courses')
	day          = request.values.get('day')
	addon_type_id = request.values.get('addon_type_id')
	conf_id       = request.values.get('conf_id')
	time_data      = AddonsModel().get_time_by_course_for_WetLabDryLab(courses,day,addon_type_id,conf_id)
	if time_data :
		data = {"time_data":time_data ,"addon_type_id":addon_type_id, "msg":"success", "status" :1}
	else:
		data = {"time_data":'',"addon_type_id":addon_type_id,"msg":"failed","status":0}

	json_data = json.dumps(data,default=str)
	return json_data




@app.route('/<int:conf_id>/<conf_key>/<delegate_id>/get_course_for_wetdry_lab', methods = ["GET", "POST"])
def get_course_for_wetdry_lab(conf_id,conf_key,delegate_id):
	conf       		= Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	delegate_addons = BOModel().check_delegate_addons(delegate_id,conf_id) #ToDo: change function name to get_delegate_completed_addons
	addon_ids       = delegate_addons['addon_ids']
	pending_data    = UserModel().get_all_pending_data(conf_id,delegate_id,now,addon_ids)
	for index,value in enumerate(pending_data):
		if index == 0:
			reg_types = value
		if index == 1:
			addons_db = value
		if index == 2:
			get_addon_day_db = value
		if index == 3:
			addons_group = value


	addons = {}
	for a in addons_db:
		addons[a["addon_type_id"]] = (addons.get(a["addon_type_id"],[]) + [a])

	delegate_course    = {}		
	delegate_courses_db = AddonsModel().get_delegate_courses(delegate_id)	
	if delegate_courses_db :
		for item in delegate_courses_db:
			delegate_course[item["addon_type_id"]] = delegate_course.get(item['addon_type_id'],[]) + [item] 

	courses    = {}		
	courses_db = AddonsModel().get_courses_wetlab_drylabs(conf_id)
	for item in courses_db:
		courses[item["addon_type_id"]] = courses.get(item['addon_type_id'],[]) + [item]    	
	

	del_html_data = render_template('users/addons_modal.html' ,courses=courses,delegate_course=delegate_course,delegate_addons= delegate_addons,reg_types=reg_types,addons=addons,str=str,conf=conf)
	return del_html_data  


@app.route('/<int:conf_id>/<conf_key>/post_course_for_wetdry_lab', methods = ["GET","POST"])
def PostCourseforWetDryLab(conf_id,conf_key):
	conf            = Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	delegate_id		= request.values.get('delegate_id')
	courses		    = request.values.get('courses')
	day				= request.values.get('day')
	time		    = request.values.get('time')
	addon_type_id	= request.values.get('addon_type_id')
	user_data	    = AddonsModel().get_wetdry_insert_data(delegate_id,addon_type_id,courses,day,time)
	msg  = user_data['msg']
	status 	= user_data['status']

	
	total_amount_for_course = AddonsModel().get_total_amount_for_wetlab(delegate_id)
	total_amount            = total_amount_for_course['total_amount']
	if total_amount == None :
		total_amount = 0
	elif int(total_amount) > 0 :
		total_amount = total_amount 
	else :
		total_amount = 0

	getData  		=  get_course_for_wetdry_lab(conf_id,conf_key,delegate_id)
	if getData   :
		data  = {"html_data":getData,'total_amount':total_amount,"msg":msg,'status':status}

	else :
		data  = {"html_data":'','total_amount':total_amount,"msg":msg,"status":status}

	json_data = json.dumps(data,default=str)
	return json_data




@app.route('/<int:conf_id>/<conf_key>/delete_course_for_wetdry_lab', methods = ["GET","POST"])
def DeleteCourseforWetDryLab(conf_id,conf_key):
	delegate_addon_id   = request.values.get('delegate_addon_id',0)
	delegate_id 		= request.values.get('delegate_id',0)
	conf            = Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	if int(str(delegate_addon_id)) > 0:
		delete_and_get_data = AddonsModel().delete_delegates_addons(delegate_addon_id)

		total_amount_for_course = AddonsModel().get_total_amount_for_wetlab(delegate_id)
		total_amount            = total_amount_for_course['total_amount']
		if total_amount == None :
			total_amount = 0
		elif int(total_amount) > 0 :
			total_amount = total_amount 
		else :
			total_amount = 0

		getData  		=  get_course_for_wetdry_lab(conf_id,conf_key,delegate_id)
		if getData   :
			data  = {"html_data":getData,'total_amount':total_amount,"msg":"Deleted Successfully",'status':1}

		else :
			data  = {"html_data":'','total_amount':total_amount,"msg":'',"status":0}

		json_data = json.dumps(data,default=str)
		return json_data



@app.route('/<int:conf_id>/<conf_key>/make_payment_wet_dry_lab', methods = ["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
def MakePaymentWetDryLab(conf_id,conf_key):
	conf              = Auth.getConf(conf_id,conf_key)
	now               = datetime.now()
	delegate_id       = request.values.get('delegate_id')
	check_addon_limit = AddonsModel().get_addons_limit(delegate_id)
	msg = ""
	is_valid = 1
	if check_addon_limit :
		for item in check_addon_limit :
			if(item['is_full'] == 1 and item['reg_status'] != 2) :
				is_valid = 0
				msg      = msg + "<br>" + item['display_name'] + "  maximum level reached ."

	if is_valid == 0 :
		data = { 'msg':msg,'status':0,'data':''}	
		return jsonify(data)
		
	



	total_amount      = request.values.get('amount' or None) 
	society_id      = conf['society_id']
	created_at      = now.strftime("%Y-%m-%d %H:%M:%S")
	Auth_user       = Auth.user(society_id)
	prefix          = Auth_user['prefix'] or None
	name            = Auth_user['full_name'] or None
	full_name       = prefix + " " + name if prefix else name
	email           = Auth_user['email']
	mobile          = Auth_user['mobile']
	user_id         = Auth_user['user_id']
	unique_id       = now.strftime('%Y%m%d%H%M%S')
	
	url     = conf['paymentgateway_api_url']
	r       = requests.get(url)
	apikey  = json.loads(r.content.decode())
	
	am_id   = conf['paymentgateway_appmaster_id']
	is_test = conf['paymentgateway_is_test']
	
	for index,value in enumerate(apikey) :
		api_am_id = value['am_id']
		if api_am_id == am_id:
			app_key  = value['app_key']
			app_name = value['app_name']
			break
		else:
			pass

	payment_for     = "Payment for CHEN-EYE CON 2024 Wet and Dry Lab Registration"
	if conf_id == 36:
		unique_id     = app_key+unique_id
	else:
		unique_id     = app_key+"_"+unique_id
# 	unique_id       = app_key+"_"+unique_id
	delegate_ids    = delegate_id
	app_type        = Helper.AppType
	payment_method  = "free"
	remarks         = "Free Registration"
	txn_id          = None
	is_generate     = 0
	is_generate_link_payment  = 0
	
	if total_amount == 0.00:
		generate_payement = BOModel().usp_del_generate_free_payement(unique_id,delegate_ids,user_id,payment_for,payment_method,remarks,full_name,email,mobile,is_generate,created_at,txn_id,society_id,app_type,conf_id)
		return redirect(url_for('free_reg.FreeRegUpdates',user_id=user_id,unique_id=unique_id,payment_method=payment_method,email=email,conf_id=conf_id,conf_key=conf_key))
	else:
		usp_del_generate_payement = BOModel().usp_del_generate_payement(unique_id,delegate_ids,user_id,am_id,is_test,payment_for,is_generate,full_name,email,mobile,is_generate_link_payment,created_at,society_id,app_type,conf_id)

	# usp_del_generate_payement = BOModel().usp_del_generate_payement(unique_id,delegate_ids,user_id,am_id,is_test,payment_for,is_generate,full_name,email,mobile,is_generate_link_payment,created_at,society_id,app_type,conf_id)
	payment_types = UserModel().get_payment_method(conf_id)
	payment       = payment_types[0]
	payment_id    = request.values.get('payment_id',0)
	payment_type  = payment['payment_type']
	if usp_del_generate_payement :
		if len(payment_types) == 1:
			if payment_type == "PAYMENT GATEWAY":
				url  = url_for('user.CallPayment',conf_id=conf_id,conf_key=conf_key,unique_id=unique_id)
				data = { 'msg':'','status':2,'data':'','url':url }
				return jsonify(data)
			else:
				getData     = UserModel().getDataforPayments(unique_id)
				getData     = getData[0]
				amount      = getData['amount']
				payment_id  = getData['payment_id']
				delegate_id = delegate_ids
				url  = url_for('user.getMakePayment',conf_id=conf_id,conf_key=conf_key,unique_id=unique_id)
				data = { 'msg':'','status':2,'data':'','url':url }
				return jsonify(data)
				
		else:
			getData     = UserModel().getDataforPayments(unique_id)
			getData     = getData[0]
			amount      = getData['amount']
			payment_id  = getData['payment_id']
			delegate_id = delegate_ids
			url  = url_for('user.getMakePayment',conf_id=conf_id,conf_key=conf_key,unique_id=unique_id)
			data = { 'msg':'','status':2,'data':'','url':url }
			return jsonify(data)

	else:
		data = { 'msg':'Please select one option','status':0,'data':''}	
		return jsonify(data)
		

@app.route('/<int:conf_id>/<conf_key>/get_addons_total', methods = ["GET","POST"])
def GetAddonsTotal(conf_id,conf_key):
	action 			  = request.form['action']
	conf              = Auth.getConf(conf_id,conf_key)
	now               = datetime.now()
	delegate_id       = request.form['delegate_id']
	reg_types         = BOModel().get_addon_reg_type_for_modal(delegate_id,conf_id)
	total_amount      = 0
	total_count       = 0
	msg               = []
	add_addons_ids    = []
	reg_addons        = {} 
	insert_del_addons = []
	delete_del_addons = []
	addons            = UserModel().get_addons(delegate_id,now,conf_id)
	total_reg_count_data = UserModel().get_total_reg_addon_count(delegate_id,conf_id)
	total_reg_count   = total_reg_count_data.get('total_reg_count')
	addon_for_pay     = []
	addons_reg_limit  = {}
	for addon in addons:
		reg_addons[addon["addon_id"]] = addon
		if  addon.get("delegate_addon_id") and addon.get("delegate_addon_id") > 0 and int(addon.get('reg_status')) not in [2,3] and int(addon.get('addon_type_id')) != 1 :
			delete_del_addons.append(addon["delegate_addon_id"])	
		
		
	for row in reg_types:
		values = request.values.getlist(row['input_name'])
		values = [x for x in values if x or None]
		print("values = ",values)
		max_limit = row['addon_max_limit']
		total_count    = int(len(values)) + int(row['addons_count'] if row['addons_count'] else 0)
		addition_total_count = total_count+total_reg_count
		balance_count = max_limit-total_reg_count
		print("total_count = ",total_count)
		if values:
			for val in values:
				addon = reg_addons[int(val)]
				addon_type_id = row['addon_type_id']
				addons_reg_limit_db = AddonsModel().get_addons_head_reg_limit(conf_id,addon_type_id)
				if addons_reg_limit_db:
					for x in addons_reg_limit_db:
						addons_reg_limit[x.get('addon_id')] = x 
				
				if check_head_reg_count(addons_reg_limit.get(addon.get('addon_id'))):
					
					if  addon.get("delegate_addon_id") and addon.get("delegate_addon_id") > 0 and int(addon.get('reg_status')) not in [2,3]:
						addon_for_pay.append(addon.get("delegate_addon_id"))
						total_amount = addon.get("amount",0) + total_amount
						# addon_for_pay.remove(addon.get("delegate_addon_id"))
					else:  
						add_data = {
									 "addon_id"         : val,
									 "amount"           : addon.get("amount",0),
									 "original_amount"  : addon.get("amount",0),
									 "reg_status"       : 0       
						}
						total_amount = addon.get("amount",0) + total_amount
						insert_del_addons.append(add_data)
	
		
					if total_count > row['addon_max_limit'] :
						addon_msg = {
									'addon_type_id':row['addon_type_id'],
									'msg': 'Please choose  '+str(balance_count)+' course only.',
								# 	'msg': 'addons max limit reached',
									'total_count':total_count,
									'selected_count':row['addon_max_limit']
						}
						msg.append(addon_msg)
	
					else:
						if total_count > row['addon_max_limit'] :
							add_addons_ids = 0
						else:
							add_addons_ids.append(values)
				else:
					addon_msg = {
								'addon_type_id':row['addon_type_id'],
								'msg': 'Course full - '+addon.get("display_name"),
								# 'msg': 'Addons slot max limit reached',
								'total_count':total_count,
								'selected_count':row['addon_max_limit']
					}
					msg.append(addon_msg)			


	if total_amount > 0:
		total_amount = total_amount
	else:
		total_amount = 0.00	
		
	addition_total_count = total_count+total_reg_count
	balance_count = max_limit-total_reg_count
	print("total_reg_count = ",total_reg_count,",addition_total_count = ",addition_total_count,",max_limit = ",max_limit)
	if total_reg_count > 0 and  addition_total_count  > max_limit :

		addon_msg = {
					'addon_type_id':row['addon_type_id'],
					'msg': 'Please choose  '+str(balance_count)+' course only.',
				# 	'msg': 'Addons slot max limit reached',
					'total_count':total_count,
					'selected_count':row['addon_max_limit']
		}
		msg.append(addon_msg)	

	if len(msg) > 0 :
		addons_msg = { 'status': 0 , 'delegate_id':delegate_id  , 'msg':msg, 'total_amount':total_amount }
		return jsonify(addons_msg)		

	delete_del_addons =list( set(delete_del_addons) - set(addon_for_pay))

	addons_msg={ 'status':1,'total_amount':total_amount,'delegate_id':delegate_id}

	if action == '1':	
		return jsonify(addons_msg)
	else:
		# delete_del_addons = list(set(addon_for_pay) - set(delete_del_addons))

		msg             = ""
		status          = 1
		data            = ""  
		society_id      = conf['society_id']
		if len(addon_for_pay) > 0 or  len(insert_del_addons) > 0:
			UserModel().save_delegates_addonsUserModel(delegate_id,insert_del_addons,delete_del_addons,now)
			society_id      = conf['society_id']
			created_at      = now.strftime("%Y-%m-%d %H:%M:%S")
			Auth_user       = Auth.user(society_id)
			prefix          = Auth_user['prefix'] or None
			name            = Auth_user['full_name'] or None
			full_name       = prefix + " " + name if prefix else name
			email           = Auth_user['email']
			mobile          = Auth_user['mobile']
			user_id         = Auth_user['user_id']
			unique_id       = now.strftime('%Y%m%d%H%M%S')
			
			url     = conf['paymentgateway_api_url']
# 			r       = requests.get(url)
# 			apikey  = json.loads(r.content.decode())
			
			am_id   = conf['paymentgateway_appmaster_id']
			is_test = conf['paymentgateway_is_test']
			
# 			for index,value in enumerate(apikey) :
# 				api_am_id = value['am_id']
# 				if api_am_id == am_id:
# 					app_key  = value['app_key']
# 					app_name = value['app_name']
# 					break
# 				else:
# 					pass
					
			app_name = "MOSCON24"
			app_key = "MOSCON24"		

			payment_for     = app_name
			if conf_id == 36:
				unique_id     = app_key+unique_id
			else:
				unique_id     = app_key+"_"+unique_id
# 			unique_id       = app_key+"_"+unique_id
			delegate_ids    = delegate_id
			app_type        = Helper.AppType
			payment_method  = ""
			if conf_id == 39:
				remarks         = "TNOA 2024 T-Shirt"
			else:
				remarks         = conf["conf_name"] + " - FREE "
				
			txn_id          = None
			is_generate     = 0
			is_generate_link_payment  = 0
			
			if total_amount == 0.00:
				generate_payement = BOModel().usp_del_generate_free_payement(unique_id,delegate_ids,user_id,payment_for,payment_method,remarks,full_name,email,mobile,is_generate,created_at,txn_id,society_id,app_type,conf_id)
				return redirect(url_for('free_reg.FreeRegUpdates',user_id=user_id,unique_id=unique_id,payment_method=payment_method,email=email,conf_id=conf_id,conf_key=conf_key))
			else:
				payment_types = UserModel().get_payment_method(conf_id)
				payment       = payment_types[0]
				payment_id    = request.values.get('payment_id',0)
				payment_type  = payment['payment_type']
			
				if len(payment_types) == 1:
					if payment_type == "PAYMENT GATEWAY":
						usp_del_generate_payement = BOModel().usp_del_generate_payement(unique_id,delegate_ids,user_id,am_id,is_test,payment_for,is_generate,full_name,email,mobile,is_generate_link_payment,created_at,society_id,app_type,conf_id)
						url  = url_for('user.CallPayment',conf_id=conf_id,conf_key=conf_key,unique_id=unique_id)
						data = { 'msg':'','status':2,'data':'','url':url }
						return jsonify(data)
					else:
						usp_del_generate_payement = BOModel().usp_del_choose_payment_generate_payement(unique_id,delegate_ids,user_id,am_id,is_test,payment_for,is_generate,full_name,email,mobile,is_generate_link_payment,created_at,society_id,app_type,conf_id)
						getData     = UserModel().getDataforPayments(unique_id)
						getData     = getData[0]
						amount      = getData['amount']
						payment_id  = getData['payment_id']
						delegate_id = delegate_ids
						url  = url_for('user.getMakePayment',conf_id=conf_id,conf_key=conf_key,unique_id=unique_id)
						data = { 'msg':'','status':2,'data':'','url':url }
						return jsonify(data)
						
				else:
					usp_del_generate_payement = BOModel().usp_del_choose_payment_generate_payement(unique_id,delegate_ids,user_id,am_id,is_test,payment_for,is_generate,full_name,email,mobile,is_generate_link_payment,created_at,society_id,app_type,conf_id)
					getData     = UserModel().getDataforPayments(unique_id)
					getData     = getData[0]
					amount      = getData['amount']
					payment_id  = getData['payment_id']
					delegate_id = delegate_ids
					url  = url_for('user.getMakePayment',conf_id=conf_id,conf_key=conf_key,unique_id=unique_id)
					data = { 'msg':'','status':2,'data':'','url':url }
					return jsonify(data)
		else:
			data = { 'msg':'Please select one option','status':0,'data':''}	
			return jsonify(data)
			
			
@app.route('/check_pending_payment_response', methods = ["GET", "POST"])
def CheckPendingPaymentResponse():
	try:
		update_count = 0
		unique_ids_1 = ""
		app_type     = Helper.AppType
		now 		 = datetime.now()
		cur_date 	 = now.strftime("%Y-%m-%d")
		paymentDatas = UserModel().get_unique_id(app_type,cur_date)
		l_unique_ids =[]
		if paymentDatas:
			for paymentData in paymentDatas:
				l_unique_ids.append(paymentData['unique_id'])
				unique_ids = ",".join(l_unique_ids) 

			url 	   = 'https://paymentapi.numerotech.com/payment_response_by_unique_id?unique_ids='+str(unique_ids)
			r 		   = requests.get(url)
			response_1 = json.loads(r.content.decode())
			
			if response_1['status'] == 1 : 
				for payment_data in response_1['payment_data']:
					payment_status = payment_data['payment_status']
					if payment_status and  'success' in payment_status :
						dt_string       = now.strftime('%Y-%m-%d %H:%M:%S')
						api_payment_id  = payment_data['payment_id']
						payment_method  = payment_data['method']
						is_webhook_update = payment_data['is_webhook_update']
						data            = {'api_payment_id' : api_payment_id,'status':payment_status,'updated_at' :dt_string,'paid_at':dt_string,'payment_method':'PAYMENT GATEWAY','is_webhook_update':is_webhook_update,'payment_method_from_gateway':payment_method}
						unique_id       = payment_data['unique_id']
						update_count    = update_count + 1
						unique_ids_1    = unique_ids_1+ " , " + unique_id
						conf         = UserModel().get_conf_id(unique_id)
						conf_id 	 = conf['conf_id']
						conf_key     = conf['conf_key']
						update_and_get_data = UserModel().UserupdatePayment(unique_id,data,dt_string) # update payment status in your table
						
						if update_and_get_data == "updated" and payment_status =="success":
							u = UserModel()
							generatedDelegates = u.Userdelegate_no_generate(unique_id,conf_id)
							flash("Payment successful.","successMsg")
							if generatedDelegates:
								for delegate in generatedDelegates:
									delegate_id  = delegate['delegate_id']
									ConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,1,conf)
							receipt_datas = u.receipt_no_generate_and_get(unique_id,conf_id);
							if receipt_datas:
								ReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_datas[0],1,conf)
						else:
							pass
					else:
						pass
				if update_count >0:
					return str(unique_ids_1)+ " these unique ids records are updated in payment table ."
				else:
					return "Payment success data not exist in PayUMoney"
			else:
				return "no unique id match"
		else:
			return "no payment data"
	except Exception as e:
		return str(e)

"""----------------------------------------------------------------------------------------------------------------"""

# UTR verify start

@app.route('/<int:conf_id>/<conf_key>/upi_scan_payment_server_response', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
def UpiScanPaymentServerResponse(conf_id,conf_key):
	conf 			    = UserModel().get_confUserModel(conf_id,conf_key)
	template_name   	= "payement_acknowledgement_mail"
	mailData        	= UserModel().get_mail_template(template_name,conf_id)
	user_id             = request.values.get('user_id')
	unique_id           = request.values.get('unique_id')
	delegate_id         = request.values.get('delegate_id')
	utr_number          = request.values.get('utr_number') or None
	now                 = datetime.now()
	dt_string           = now.strftime('%Y-%m-%d %H:%M:%S')
	getData     		= UserModel().getDataforPayments(unique_id)
	attachment_data     = UserModel().get_delegate_attchment_details(conf_id,unique_id)
	
	if attachment_data:
		attach_file_name    = attachment_data['attach_file_name']
		attach_path			= attachment_data['attach_path']	
	else:
		attach_file_name    = None
		attach_path			= None

	getData             = getData[0]
	email 				= getData['email']
	full_name			= getData['full_name']
	payment_id          = getData['payment_id']
	amount              = getData['amount']
	payment_method      = getData['payment_method']
	delegate_ids        = getData['delegate_ids'] # add status
	checking_utr_number = UserModel().getDataforPaymentsby_utr_number(conf_id,utr_number,payment_id)

	if checking_utr_number :
		flash("Please check your UPI transaction ID .This UTR already used delegate registred you can not use same UTR number for delegate registration","errorMsg")
		return redirect(url_for('user.getPostMakePayment',conf_id=conf_id,conf_key=conf_key,user_id=user_id,unique_id=unique_id,payment_id=payment_id,payment_type=payment_method,delegate_id=delegate_id,amount=amount))
	else:
		if  attach_file_name and attach_path:
			# return "get data in call payment route"
			status              = "success"
			data                = {'status' : status,'updated_at' :dt_string,'paid_at' :dt_string,'api_payment_id':utr_number,'utr_number':utr_number}
			update_and_get_data = UserModel().updatePaymentData(unique_id,data) # update payment status in your table
			update_reg_status   = UserModel().update_reg_status(unique_id,delegate_ids,conf_id,dt_string) # here newly added parameter
			reject_remarks      = UserModel().get_reject_remarks(unique_id,conf_id)
			addon_types_ids     = UserModel().getPaymentAddons(conf_id,unique_id)
			if reject_remarks:
				reject_remarks_update = UserModel().update_reject_remarks(unique_id,conf_id)
			if update_and_get_data == "updated" and status =="success":             
				
				m_data  = {
							'mail_content'  : mailData['mail_content'],
							'full_name'     : full_name,
							'utr_number'    : utr_number,
							'conf'          : conf

						}   
			
				mail_content = Helper.convert_html_for_mail_screen(m_data)
				tricon_workshop = TriconWorkshopUpdates(conf_id,unique_id)
				
				flash("Thank you for registering for {}.  Your UPI transaction shall be verified and the DSTC, SSTC and TSTC lab registration after shall be confirmed.<br/> For any assistance,  please write to {},".format(conf['conf_name'],conf['e_support_email']),"successMsg")
				subject      = " Acknowledgement of your DSTC, SSTC and TSTC lab registration for {}".format(conf['conf_name'])
		
				html     	 = render_template('email/waiting_confirmation_mail_v1.html',mail_content=mail_content,conf=conf)
				data_1 = EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
				if data_1:
					data_1 = json.loads(data_1)
					update_data = {
					'delegate_id' : str(delegate_id),
					'conf_id'     : str(conf_id),
					'created_at'  : str(dt_string)
					}
					data_1.update(update_data) 
					UserModel().insert_mandrill_logs(data_1)
				if conf['backup_email_2']:
					EMAIL.MailTemplateSendMail(subject,html,conf['backup_email_2'],mailData,conf)
				return redirect(url_for('user.Register',conf_id=conf_id,conf_key=conf_key))
			else:   
				flash("An attempt to make the payment has failed. Please try again to make the payment.  For any assistance, please click here to send an email to support","errorMsg")    
				return redirect(url_for('user.Register',conf_id=conf_id,conf_key=conf_key))
		else:
			flash("Please Scan and pay the amount and payment success screenshot upload ","errorMsg")
			return redirect(url_for('user.getPostMakePayment',conf_id=conf_id,conf_key=conf_key,user_id=user_id,unique_id=unique_id,payment_id=payment_id,payment_type=payment_method,delegate_id=delegate_id,amount=amount))


# UTR verify end



@app.route('/<int:conf_id>/<conf_key>/post_make_payment/<int:user_id>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
# @RouteGroup.login_required
def PostMakePayment(conf_id,conf_key,user_id,unique_id):
	conf 	    = UserModel().get_confUserModel(conf_id,conf_key)
	society_id  = conf['society_id']
	sample_string       = str(user_id)
	sample_string_bytes = sample_string.encode("ascii")
	base64_bytes        = base64.b64encode(sample_string_bytes)
	enc_user_id        = base64_bytes.decode("ascii")
	if request.method == "POST":
		payment_id      = request.values['payment_id']
		delegate_id     = request.values['delegate_id']
		if delegate_id :
			delegate_id     = delegate_id.replace("[" ,"").replace("]","").replace("'","")
		amount   	    = request.values['amount']
		payment_type    = request.form['payment_type']
		data={
				'payment_method':payment_type
			}
		system_data   = request.headers.get("user-agent")
		if 'Android' in system_data or 'iPhone' in system_data:
			show_paynow_btn = 1
		else:
			show_paynow_btn = 0	
	
		if payment_type == "PAYMENT GATEWAY":
			return redirect(url_for('user.Payment_v1',payment_id=payment_id,payment_type=payment_type,conf_id=conf_id,conf_key=conf_key,unique_id=unique_id,delegate_id=delegate_id))
		else:
			update          = UserModel().updatePaymentData(unique_id,data)
			is_delegate     = 1
			payment_content = UserModel().get_payment_content(payment_type,is_delegate,conf_id)
			image           = UserModel().get_image(delegate_id,conf_id,unique_id)
			return render_template('users/make_payment_screen.html',user_id=user_id,payment_id=payment_id,unique_id=unique_id,data=image,payment_content=payment_content,payment_type=payment_type,conf=conf,delegate_id=delegate_id,amount=amount,int=int,float=float,enc_user_id=enc_user_id,show_paynow_btn=show_paynow_btn)
	else :
		flash("Please, Try again.","errorMsg")
		return redirect(url_for('user.getLogin',conf_id = conf_id,conf_key=conf_key,))



@app.route('/<int:conf_id>/<conf_key>/payment_v1/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def Payment_v1(conf_id,conf_key,unique_id):
	conf 	    = UserModel().get_confUserModel(conf_id,conf_key)
	now         = datetime.now()
	dt_string   = now.strftime("%Y-%m-%d %H:%M:%S")
	reg_status  = 1
	UserModel().UpdateInprogressDelegates(unique_id,dt_string,reg_status,conf_id)
	return redirect(url_for('user.CallPayment',conf_id = conf_id,conf_key=conf_key,unique_id=unique_id))



########################## IMAGE UPLOAD ###################################
@app.route('/<int:conf_id>/<conf_key>/post_amzon_upload', methods = ["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
def PostAmazonUpload(conf_id,conf_key,acl="public-read"):
	conf = UserModel().get_confUserModel(conf_id,conf_key)
	if request.method == 'POST':
		user_id         = request.values.get('user_id')
		delegate_id     = request.values.get('delegate_id')
		unique_id       = request.values.get('unique_id')
		attach_data     = UserModel().get_delegate_attchment_details(conf_id,unique_id)
		if attach_data:
			attach_id   = attach_data['attach_id']
		else:
			attach_id   = 0	
		s3              = boto3.client("s3",aws_access_key_id='AKIAILLDAQ7NFUMVOYLQ',aws_secret_access_key='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')
		files           = request.files.getlist("file")
		for file in files:
			if file.filename:
				filename        = secure_filename(file.filename)
				split_tup       = os.path.splitext(filename)
				file_name       = split_tup[0]
				file_extension  = split_tup[1]
				file_str        = "payment_proof_"+ datetime.now().strftime("%Y%m%d-%H%M%S") +file_extension
				if " " in file_str :
					file_str = file_str.replace(" ","")
				try:
					bucket     = "delegateapp"
					user_id    = str(user_id)
					foldername = "delegate_attachment"
					response   = s3.upload_fileobj(file, bucket,foldername+'/'+unique_id+'/'+ file_str, ExtraArgs={"ACL": acl,"ContentType": file.content_type})
					data_1     = {'bucketname' : bucket,'foldername':foldername,'file_name':file_str+"?"+str(Helper.getcurrenttimestamp()),'msg':'Image successfully uploded','file_extension':file_extension,'status':1,'unique_id':unique_id} 
					file_path  = "https://delegateapp.s3.ap-southeast-1.amazonaws.com/"+foldername+"/"+unique_id

					data = {
						'user_id'           : user_id,
						'conf_id'			: conf_id,
						'delegate_id'       : delegate_id,
						'unique_id'         : unique_id,
						'attach_file_name'  : file_str,
						'attach_path'       : file_path,
						'attach_type'		: "payment_proof",	
						'created_at'        : datetime.now(),
						'updated_at'        : datetime.now()  
					}
					if (int(attach_id) != 0):
						data.pop("created_at") 
						data           = UserModel().update_image(attach_id,data)
						d              = {}
						d['attach_id'] = attach_id
						data_1.update(d)
					else :
						attach_id_pk    = UserModel().insert_image(data)
						d               = {}
						d['attach_id']  = attach_id_pk[0]
						data_1.update(d)
					return json.dumps(data_1)
				except ClientError as e:
					logging.error(e)
					data_1      = {'msg':'Image upload failed .Please try again.','status':0}        
					json_data   = json.dumps(data_1)
					return json_data
					# flash('Something Error .Please Try Again')
	else :
		flash("Please, Try again.","errorMsg")
		return redirect(url_for('user.getLogin',society_id=society_id,society_key=society_key))

@app.route('/<int:conf_id>/<conf_key>/delete_amazon_image', methods = ["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
def DeleteAmazonImage(conf_id,conf_key):
	attach_id       = request.values.get('attach_id')
	ua              = UserModel().get_delegate_attach(attach_id)
	if ua is None:
		data = {'msg':'Deleted','status' : 1}
	else:
		filepath        = ua['attach_path']
		filename        = ua['attach_file_name']
		foldername      = filepath+ "/"+filename
		foldername      = foldername.replace("https://delegateapp.s3.ap-southeast-1.amazonaws.com/", "")
		s3              = boto3.resource("s3",aws_access_key_id='AKIAILLDAQ7NFUMVOYLQ',aws_secret_access_key='EEudWCsWeCIt/J9/z5m5htmUdGFJNzWFPvNQBIp/')
		response        = s3.Object("delegateapp", foldername).delete()
		UserModel().delete_image(attach_id)
		data            = {'msg':'Deleted','status' : 1}
	json_data   = json.dumps(data)
	return json_data



@app.route('/<int:conf_id>/<conf_key>/get_make_payment/<unique_id>', methods = ["GET","POST"])
@RouteGroup.conf_required
# @RouteGroup.login_required
def getMakePayment(conf_id,conf_key,unique_id):
	conf        = Auth.getConf(conf_id,conf_key)
	society_id  = conf['society_id']
	Auth_user   = Auth.user(society_id)
	if Auth_user:				
		user_id = Auth_user['user_id']
	else:
		enc_user_id = request.args.get("enc_user_id") or None
		try:
			base64_bytes    = enc_user_id.encode("ascii")
			sample_bytes    = base64.b64decode(base64_bytes) 
			dec_user_id_str = sample_bytes.decode("ascii")
			dec_user_id     = dec_user_id_str
			data            =  UserModel().checking_unique_id_with_user_id(conf_id,unique_id,dec_user_id)
			if data:
				user_id = data['user_id']
			else:
				return "<h1> Invaild URL </h1>"
		except Exception as e:
			return "<h1> Invaild URL </h1>"
	
	getData     = UserModel().getDataforPayments(unique_id)
	getData     = getData[0]
	amount      = getData['amount']
	payment_id  = getData['payment_id']
	delegate_id = getData['delegate_ids']
	payment_types = UserModel().get_payment_method(conf_id)
	payment       = payment_types[0]
	payment_type  = payment['payment_type']
	addon_types_ids = UserModel().getPaymentAddons(conf_id,unique_id)
	return render_template('users/make_payment.html',payment_type=payment_types,user_id=user_id,society_id=society_id,conf_id=conf_id,conf_key=conf_key,amount = amount,payment_id=payment_id,unique_id=unique_id,delegate_id=delegate_id,conf=conf,int=int,float=float,addon_types_ids=addon_types_ids)


@app.route('/<int:conf_id>/<conf_key>/get_post_make_payment/<int:user_id>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
# @RouteGroup.login_required
def getPostMakePayment(conf_id,conf_key,user_id,unique_id):
	conf 	     = UserModel().get_confUserModel(conf_id,conf_key)
	society_id   = conf['society_id']
	userData     = UserModel().get_member(user_id)
	payment_id   = request.values.get('payment_id')
	delegate_id  = request.values.get('delegate_id')
	amount   	 = request.values.get('amount')
	payment_type = request.values.get('payment_type')
	enc_user_id  = Cryptography.encrypt(user_id)
	data={
				'payment_method':payment_type
			}
			
	system_data   = request.headers.get("user-agent")
	if 'Android' in system_data or 'iPhone' in system_data:
		show_paynow_btn = 1
	else:
		show_paynow_btn = 0		
	
	if payment_type == "PAYMENT GATEWAY":
		return redirect(url_for('user.Payment_v1',payment_id=payment_id,payment_type=payment_type,conf_id=conf_id,conf_key=conf_key,unique_id=unique_id,delegate_id=delegate_id))
	else:
# 		update  = UserModel().updatePaymentData(unique_id,data)
		is_delegate   = 1
		payment_content = UserModel().get_payment_content(payment_type,is_delegate,conf_id)
		image      = UserModel().get_image(delegate_id,conf_id,unique_id)
		return render_template('users/make_payment_screen.html',user_id=user_id,payment_id=payment_id,unique_id=unique_id,data=image,payment_content=payment_content,payment_type=payment_type,userData=userData,conf=conf,delegate_id=delegate_id,amount=amount,enc_user_id=enc_user_id,show_paynow_btn=show_paynow_btn)
		
		
@app.route('/<int:conf_id>/<conf_key>/home_page', methods = ["GET", "POST"])
@RouteGroup.conf_required
def AlreadyRegisteredDelegates(conf_id,conf_key):
	conf 	     = UserModel().get_confUserModel(conf_id,conf_key)
	society_id   = conf['society_id']
	userData     = UserModel().get_already_completed_delegates(conf_id)
	return render_template('users/boa_already_registered_delegates_list.html',userData=userData,conf=conf)
	
@app.route('/get_pending_addon', methods = [ "GET","POST"])
def GetPendingAddon():
	conf_id         = request.values.get('conf_id',0)
	conf_key        = request.values.get('conf_key',0)
	conf            = Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	delegate_id     = request.values.get('delegate_id',0)
	delegate_addons = BOModel().check_delegate_addons(delegate_id,conf_id) #ToDo: change function name to get_delegate_completed_addons
	addon_ids       = delegate_addons['addon_ids']
	reg_types       = BOModel().get_addon_reg_type_for_modal(delegate_id,conf_id)
	addons          = BOModel().get_addons_pendings(delegate_id,now,conf_id,addon_ids)
	
	if int(conf_id) in [36,5]:
		limit_for_addons = UserModel().get_addons_limit_for_all(conf_id)
		user_type_id     = UserModel().get_all_addons_data(conf_id)
		user_type_ids    =[]
		for u in user_type_id:
			user_type_ids.append(u['user_type_id'])


		limits  = {}
		limit  = {}
		for dd in limit_for_addons :
			key_1 = dd["user_type_id"]
				
			val_1 = dd["limits"]
			val_2 = val_1 if val_1 else None
			limits[str(key_1)] = val_2
			limit[key_1] = val_2
			# ----
			for ut in user_type_ids :
				if ut not in limit:
					limits[str(ut)] = None
	else:
		limits = None	
	
# 	html_data       =  render_template('users/addons_modal.html' , delegate_addons= delegate_addons,reg_types=reg_types,addons=addons,str=str,conf=conf,limits=limits)
	html_data       =  render_template('users/additional_addons_modal.html' , delegate_addons= delegate_addons,reg_types=reg_types,addons=addons,str=str,conf=conf,limits=limits)
	total_amount    = None
	data  = {"html_data":html_data,'total_amount':total_amount,"msg":"success",'status':1}
	json_data = json.dumps(data,default=str)
	return json_data	


#'''-------------------Diffferent User Page Start------------------'''

# @app.route('/<int:conf_id>/<conf_key>/different_user', methods = ["GET", "POST"])
# @RouteGroup.conf_required
# def DifferentUser(conf_id,conf_key):
# 	conf        = Auth.getConf(conf_id,conf_key)
# 	mobile      = request.values.get('mobile_user_id')
# 	email       = request.values.get('email_user_id')
# 	state_id    = UserModel().get_states()
# 	output      = UserModel().get_users(email,mobile)
# 	return render_template('users/different_user.html',state_id=state_id,output=output,str=str,type=type,conf=conf)

#'''-------------------Diffferent User Page End------------------'''

# '''-----------Support Email and submit  start--------'''

# @app.route('/<int:conf_id>/<conf_key>/support', methods = ["GET", "POST"])
# @RouteGroup.conf_required
# def Support(conf_id,conf_key):
# 	conf        = Auth.getConf(conf_id,conf_key)
# 	return render_template('email/support_email.html',conf=conf)


# @app.route('/<int:conf_id>/<conf_key>/post_support', methods = ["GET", "POST"])
# @RouteGroup.conf_required
# def PostSupport(conf_id,conf_key):
# 	conf            = Auth.getConf(conf_id,conf_key)
# 	conf_id         = request.form['conf_id']
# 	dt_string       = datetime.now()
# 	membership_no   = request.form['membership_no']
# 	full_name       = request.form['name']
# 	email           = request.form['email']
# 	mobile          = request.form['mobile']
# 	remarks         = request.form['remarks']
# 	data            = {
# 						'membership_no' :membership_no,
# 						'full_name'     : full_name,
# 						'email'         : email,
# 						'mobile'        : mobile,
# 						'remarks'       : remarks,
# 						'conf_id'       : conf_id,
# 						'related_to'    : 'member login issue',
# 						'created_at'    : dt_string
# 					  }
# 	query_id        = UserModel().insert_support_queries(data)
# 	subject         = "Support Delegate Registration "
# 	html            = render_template('email/support.html',users=data,conf_id=conf_id,conf_key=conf_key,conf=conf)
# 	if conf['is_email_enable'] == 1:
# 		EMAIL.sendMail(subject,html,email,conf)
# 	flash("Your Query Sent To Support Successfully...","SupportError")       
# 	return redirect(url_for('user.Home',conf_id=conf['conf_id'],conf_key=conf['conf_key']))

# '''-----------Support Email and submit  end-----------'''


@app.route('/<int:conf_id>/<conf_key>/<parent_user_id>/get_parent_inprogress_payment_delegates', methods = ["GET", "POST"])
def GetParentInprogressPaymentDelegates(parent_user_id,conf_id,conf_key):
	conf       		= Auth.getConf(conf_id,conf_key)
	unique_id 		= None
	delegateData    = UserModel().get_inprogress_payment_delegates_by_parent_user_idUserModel(parent_user_id,unique_id,conf_id)
	if delegateData:
		total_amount = 0
		for index , value in enumerate(delegateData):
			total_amount = total_amount + (value['total_amt'] if value['total_amt'] is not None else 0)
			base_url 	 = request.host_url
			if "https" in base_url :
				pass
			else :
				base_url = base_url.replace("http" ,"https")


		del_html_data = render_template('users/inprogress_information.html' ,user_data = delegateData,user_id = parent_user_id,conf_id =conf_id,conf_key=conf_key,total_amount=total_amount,conf=conf,base_url = base_url,str=str,int=int,itemgetter=itemgetter,groupby=groupby)
	else:
		del_html_data = ""
	return del_html_data


@app.route('/delegate_detail_get_unique_id',  methods = ["GET", "POST"])
def DelegateDetailGetUniqueId():
	now               = datetime.now()
	curr_dt           = now.strftime("%Y-%m-%d %H:%M:%S")
	dt_string         = now.strftime("%Y-%m-%d %H:%M:%S")
	pg_data 		  = None
	conf_id           = request.values.get('conf_id') or None 
	conf_key          = request.values.get('conf_key') or None
	conf              = Auth.getConf(conf_id,conf_key) 
	unique_id         = request.values.get('unique_id') or None
	parent_user_id    = request.values.get('parent_user_id') or None
	form_name         = request.values.get('form_name')  or None
	is_show           = "1"
	generate_by_data  = None
	status            = 402
	msg               = ""
	data              = {}
	incompleted_delegate_data_uid   = UserModel().get_incompleted_delegate_data_by_unique_id(conf_id,unique_id)
	for index,value in enumerate(incompleted_delegate_data_uid):
		if index == 0:
			incom_del_data = value
			if value:
				del_data = value[0]
			else:
				del_data = None
		if index == 1:
			del_conf_data = value[0]

	if incom_del_data :
		am_id      = incom_del_data[0]["am_id"]
		unique_id  = incom_del_data[0]["unique_id"]
		created_at = incom_del_data[0]["created_at"]
		amount     = incom_del_data[0]["amount"]
		api_payment_id = incom_del_data[0]["api_payment_id"]
		dt_string   = created_at.strftime("%Y-%m-%d %H:%M:%S")
			
		if created_at :
			from_date_1 = created_at - timedelta(days=2)
			to_date     = created_at +  timedelta(days=2)
			from_date   = from_date_1.strftime("%Y-%m-%d %H:%M:%S")
			to_date     = to_date.strftime("%Y-%m-%d %H:%M:%S")
		else :
			from_date   = now - timedelta(days=2)
			to_date     = curr_dt	

		# PAYUMONEY BLOCK
		if int(conf_id) in [10,32,37,38,26,48,49]:
			try:
				url_1 = "https://conf-payments.numerotech.com/payumoney_trans.php?am_id="+str(am_id)+"&unique_id="+unique_id+"&from_date="+from_date+"&to_date="+to_date+""
				response = requests.get(url_1)
				response = response.text
				# response = response.replace('\\' ,"")
				# result = response[1:-1]
				result = response
				res = json.loads(result)
				if res:
					result_status = res["status"] 
					result_msg    = res["msg"] 
					result_data   = res["Transaction_details"] 
					payment_data  = result_data
					for index,value in enumerate(payment_data):
						unique_id_pg = value["udf2"]
						if unique_id_pg == unique_id:
							status_pg = value["status"]	
							if status_pg == "null" or not status_pg :
								status_pg = value["action"]
								
							amount_pg = value["amount"] 
							created_at_pg = value["addedon"] 
							payment_id_pg = value["id"] 
							
							mode_pg   = value["mode"] 
							name_pg   = value["firstname"] 
							email_pg  = value["email"]  
							mobile_pg = value["phone"]

							if status_pg and status_pg == "SUCCESS":
								status_pg = "success"
							else:
								status_pg = status_pg
								
							pg_data = {"payment_id_pg" : payment_id_pg,"name_pg" : name_pg , "email_pg" :email_pg, "mobile_pg" : mobile_pg,"mode_pg":mode_pg,"created_at_pg":created_at_pg,"amount_pg":amount_pg,"status_pg":status_pg,"unique_id_pg":unique_id_pg}   
							
							
							if status_pg and status_pg == "success":
								return redirect(url_for('user.GeneratePaymentServerResponse',conf_id=conf['conf_id'],conf_key=conf['conf_key'],payment_id_pg = payment_id_pg,name = name_pg , email =email_pg, mobile = mobile_pg,method =mode_pg,created_at = created_at_pg,amount = amount_pg,status = status_pg,unique_id = unique_id_pg,user_id = parent_user_id))
							else:
								status = 2
								msg    = " Your payment has failed. Please try again."
								data   = {"status" : status , "msg" : msg }			
									
				# 		else :
				# 			status = 2
				# 			msg    = "Record not matched......"
				# 			data   = {"status" : status , "msg" : msg }			
				else:
					status = 2
					msg    = "Record not found......"
					data   = {"status" : status , "msg" : msg }
					

			
			except Exception as e:
				return json.dumps(e,default=str)	
			
			
		# Air play block start here	--------------	

		if int(conf_id) in [36]:
			try:
				response  = requests.post(url="https://iapkarnataka.org/airpay_php/airpay_trans_info.php?unique_id="+unique_id+"")
				res       = response.text
				xpars     = xmltodict.parse(res)
				if xpars:
					result_1     = xpars["RESPONSE"]
					result_data  = result_1["TRANSACTION"]
					payment_data = result_data
					unique_id_pg = payment_data["TRANSACTIONID"]
					if unique_id_pg == unique_id:
						amount_pg    = payment_data["AMOUNT"]
						name_pg      = payment_data["CUSTOMER"]
						email_pg     = payment_data["CUSTOMEREMAIL"]

						status_pg     = payment_data["TRANSACTIONPAYMENTSTATUS"]	
						created_at_pg = payment_data["TRANSACTIONTIME"]
						# created_at_pg = created_at_pg.strftime("%Y-%m-%d %H:%M:%S")
						created_at_pg = datetime.strptime(created_at_pg, '%d-%m-%Y %H:%M:%S') if created_at_pg else created_at_pg
						payment_id_pg = payment_data["APTRANSACTIONID"] 
						
						mode_pg   = payment_data["CHMOD"] 
						name_pg   = payment_data["CUSTOMER"] 
						email_pg  = payment_data["CUSTOMEREMAIL"]  
						mobile_pg = payment_data["CUSTOMERPHONE"]

						if status_pg and status_pg == "success":
							status_pg = "success"
						else:
							status_pg = status_pg


						if mode_pg and mode_pg == "pg":	
							mode_pg =  payment_data["CARDTYPE"]
						if mode_pg and mode_pg == "netbank":	
							mode_pg = "NB"	
						else:
							mode_pg= mode_pg

						pg_data = {"payment_id_pg" : payment_id_pg,"name_pg" : name_pg , "email_pg" :email_pg, "mobile_pg" : mobile_pg,"mode_pg":mode_pg,"created_at_pg":created_at_pg,"amount_pg":amount_pg,"status_pg":status_pg,"unique_id_pg":unique_id_pg}   
						
						if status_pg and status_pg == "success":
							return redirect(url_for('user.GeneratePaymentServerResponse',conf_id=conf['conf_id'],conf_key=conf['conf_key'],payment_id_pg = payment_id_pg,name = name_pg , email =email_pg, mobile = mobile_pg,method =mode_pg,created_at = created_at_pg,amount = amount_pg,status = status_pg,unique_id = unique_id_pg,user_id = parent_user_id))
						else:
							status = 2
							msg    = " Your payment has failed. Please try again."
							data   = {"status" : status , "msg" : msg }			
							

					else :
						status = 2
						msg    = "Record not found......"
						data   = {"status" : status , "msg" : msg }			
						

				else:
					status = 2
					msg    = "Record not found......"
					data   = {"status" : status , "msg" : msg }
					
			
			except Exception as e:
				return json.dumps(e,default=str)		
				
		# Air play block end here ---------------------------------	
		
		# Razorpay block ------------------------------------------
		if  int(conf_id) in [29 ,28]:
			if int(conf_id) == 29: #ipgs block php api
				# unique_id =  "IPGSDEL23_20230603123220"
				am_id = 39
				url_1 = "https://ipgs.org.in/ipgs_payments/trans_info_4.php?am_id="+str(am_id)+"&unique_id="+unique_id+"&from_date="+from_date+"&to_date="+to_date+""
				# print("url_1")
				# print(url_1)
			elif int(conf_id) == 28 : #EMINDIA block Python api
				# unique_id =  "EMINDIA23_20230620000916"
				am_id = 37
				url_1 = "https://emindia23payments.abhinavamedtech.in/payment_api/emindia23_api?am_id="+str(am_id)+"&unique_id="+unique_id+"&from_date="+from_date+"&to_date="+to_date+""
				# http://emindia23payments.abhinavamedtech.in/emindia23_api?unique_id=EMINDIA23_20230620000916&from_date=2023-05021%2010:00:00&to_date=2023-06-21%2022:00:00

			response = requests.get(url_1)
			response = response.text
			result = response
			res = json.loads(result)
			
			if res :
				result_status = res["status"]
				result_msg    = res["msg"]
				if result_status == 1 :
					payment_data = res["data"]
					unique_id_pg = payment_data["unique_id"]
					if unique_id_pg and unique_id_pg == unique_id :
						payment_id_pg = payment_data["api_payment_id"]
						name_pg       = "" 
						email_pg      = payment_data["email"]
						mobile_pg     = payment_data["mobile"]
						amount_pg     = payment_data["amount"]
						created_at_pg = payment_data["created_at"]
						mode_pg 	  = payment_data["pg_method"]
						status_pg 	  = payment_data["status"]
						if amount_pg :
							amount_pg = int(amount_pg)/100

						
						if status_pg and status_pg == "success":
							return redirect(url_for('user.GeneratePaymentServerResponse',conf_id=conf['conf_id'],conf_key=conf['conf_key'],payment_id_pg = payment_id_pg,name = name_pg , email =email_pg, mobile = mobile_pg,method =mode_pg,created_at = created_at_pg,amount = amount_pg,status = status_pg,unique_id = unique_id_pg,user_id = parent_user_id))
						else:
							status = 2
							msg    = " Your payment has failed. Please try again."
							data   = {"status" : status , "msg" : msg }			
							
					else:
						status = 2
						msg    = "Records does not match."
						data   = {"status" : status , "msg" : msg }			
							 
				
				else:
					status  = 2
					msg    = result_msg
					data    = {"status" : status , "msg" : msg }			
					

			else:
				status = 2
				msg     = "Records does not match."
				data   = {"status" : status , "msg" : msg }			
							

		
		# TNOA ATOM PAYMENT GATEWAY		
		if int(conf_id) in [17]:
			created_at   = created_at.strftime("%Y-%m-%d")
			url    = "https://payment.atomtech.in/paynetz/vfts?merchantid=391691&merchanttxnid="+unique_id+"&amt="+str(amount)+"&tdate="+created_at+""
			data   = requests.get(url)
			xpars  = xmltodict.parse(data.text)
			result_data = json.dumps(xpars,default=str)
			if result_data:
				payment_data_1 = ast.literal_eval(result_data)
				payment_data   = payment_data_1["VerifyOutput"]
				name_pg        = ""
				email_pg       = ""
				mobile_pg      = ""
				payment_id_pg  = payment_data["@atomtxnId"]
				unique_id_pg   = payment_data["@MerchantTxnID"]
				status_pg      = payment_data["@VERIFIED"]
				amount_pg      = payment_data["@AMT"]
				created_at_pg  = payment_data["@TxnDate"]
				mode_pg 	   = payment_data["@discriminator"]
				
				if status_pg and status_pg == "SUCCESS":
					status_pg = "success"
				else:
					status_pg = status_pg

				if status_pg and status_pg == "success":
					return redirect(url_for('user.GeneratePaymentServerResponse',conf_id=conf['conf_id'],conf_key=conf['conf_key'],payment_id_pg = payment_id_pg,name = name_pg , email =email_pg, mobile = mobile_pg,method =mode_pg,created_at = created_at_pg,amount = amount_pg,status = status_pg,unique_id = unique_id_pg,user_id = parent_user_id))
				else:
					status = 2
					msg    = " Your payment has failed. Please try again."
					data   = {"status" : status , "msg" : msg }			
					


			else:
				status = 2
				msg    = "Records does not match."
				data   = {"status" : status , "msg" : msg }			
				 


		# KSOS CCAVENUE PAYMENT GATEWAY
		if api_payment_id and len(api_payment_id) > 2 :
			params_1 = "order_no="+unique_id+"&reference_no="+api_payment_id
		else :
			params_1 = "order_no="+unique_id+""
		if  int(conf_id) in [27,20,19,21]:
			# unique_id = 'KSOSDEL23_20230620192239'
			if conf_id and int(conf_id) == 27:
				url = "https://ksos.in/paymentapi_del/status_api_new_ksos_del.php?"+params_1+""
			elif conf_id and int(conf_id) == 19:
				url = "https://tnasi.com/paymentapi/status_api_new_tnasi23.php?"+params_1+""
			elif conf_id and int(conf_id) == 21:
				url = "https://indouksurgicon2023.com/indouk_payments/status_api_new_indouk23.php?"+params_1+""
			else:
				url = "https://iages24payments.iageschennai.com/status_api_new_iages24.php?"+params_1+""

			response_1   = requests.get(url)	
			response_1   = response_1.text
			
			if response_1 :
				response_data = ast.literal_eval(response_1)
				response_data = response_data["Order_Status_Result"]
				api_data_status = response_data["status"]
				if int(api_data_status) == 0 :
					name_pg       = response_data["order_bill_name"] 
					unique_id_pg  = response_data["order_no"]
					email_pg      = response_data["order_bill_email"]
					mobile_pg     = response_data["order_bill_tel"]

					amount_pg     = response_data["order_amt"]
					status_pg     = response_data["order_status"]
					payment_id_pg = response_data["reference_no"]
					created_at_pg = response_data["order_status_date_time"]
					mode_pg       = response_data["order_card_name"]

					if mode_pg and mode_pg in ['RuPay','Visa','Master Card']:
						mode_pg = "DC"	

					if status_pg and status_pg == "Shipped":
						status_pg = "success" 
					else:
						status_pg = status_pg
					
					if status_pg and status_pg == "success":
						return redirect(url_for('user.GeneratePaymentServerResponse',conf_id=conf['conf_id'],conf_key=conf['conf_key'],payment_id_pg = payment_id_pg,name = name_pg , email =email_pg, mobile = mobile_pg,method =mode_pg,created_at = created_at_pg,amount = amount_pg,status = status_pg,unique_id = unique_id_pg,user_id = parent_user_id))
					else:
						status = 2
						msg    = " Your payment has failed. Please try again."
						data   = {"status" : status , "msg" : msg }


				else :
					status = 2
					msg    = "No record found. "
					data   = {"status" : status , "msg" : msg }

			else:
				status = 2
				msg    = "Records does not match."
				data   = {"status" : status , "msg" : msg }			
				
		
	reg_status  = 0
	is_count_update = 1
	UserModel().UpdateInprogressDelegates(unique_id,dt_string,reg_status,conf_id,is_count_update)
	if data:
		inprogress_delegate_payment_template = GetParentInprogressPaymentDelegates(parent_user_id,conf_id,conf_key)
		incompleted_template                 = get_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
		data['inprogress_delegate_payment_template'] = inprogress_delegate_payment_template
		data['incompleted_template'] = incompleted_template
	else:
		msg    = "Records does not match."
		data   = {"status" : status , "msg" : msg }
		inprogress_delegate_payment_template = GetParentInprogressPaymentDelegates(parent_user_id,conf_id,conf_key)
		incompleted_template                 = get_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
		data['inprogress_delegate_payment_template'] = inprogress_delegate_payment_template
		data['incompleted_template'] = incompleted_template
	return json.dumps(data,default=str)



@app.route('/confirmation_and_receipt_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def ConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,receipt_data,is_send,email):
	conf           = Auth.getConf(conf_id,conf_key)
	template_name  = "confirmation_and_receipt_mail"
	mailData       = UserModel().get_mail_template(template_name,conf_id)
	del_table_name = None
	otp_1          = None
	if conf :
		del_table_name = conf["del_table_name"]
		
	if receipt_data is None :
		receipt_datas    = BOModel().BOreceipt_no_generate_and_get(unique_id,conf_id)
		if receipt_datas:
			receipt_data = receipt_datas[0]
	if receipt_data:
		if email:
			email = email
		else:
			email        = receipt_data['email']
		
		# email          = 'sai@numerotec.com'  
		receipt_no   = receipt_data['receipt_no']
		r_amount     = receipt_data['amount']
		conf_name    = receipt_data['conf_name']
		delegate_nos = receipt_data['delegate_nos']
		is_kit       = receipt_data['d_is_kit']
		company_name = receipt_data['d_company_name']
		ref_nos      = receipt_data['ref_nos']

		if str(r_amount) == "0.00":
			r_amount = "Free"
		else:
			r_amount = int(r_amount)
			r_amount = f"{r_amount:,}"
		
		amount_with_commas    = r_amount
		amount_for_convertion = int(receipt_data['amount'])
		amount_in_words       =  Helper.amountTowords(amount_for_convertion)
		amount_in_words       = amount_in_words.title()
		if r_amount == "Free" :
			r_amount = r_amount
		else:
			r_amount = "Rs."+r_amount+"/-"

	delegate = None
	if delegate is None:
		delegates    = BOModel().usp_del_get_delegates_by_delegate_id(delegate_id)
		if delegates:
			delegate = delegates[0]
			
	if delegate:
		# email        = delegate['email']
		# parent_email = delegate['parent_email']
		delegate_no  = delegate['delegate_no']
		c_amount     = delegate['total_amount']
		prefix       = delegate["prefix"]
		conf_name    = delegate['conf_name']
		if prefix:
			name = delegate["prefix"] +" "+ delegate["full_name"]
		else:
			name = delegate["full_name"]

		success_msg = "An amount of {} has been made towards {} registration. The receipt has been email to {}.\nA delegate registration confirmation email has been sent to the email id of the delegate(s). Receipt no. {} .Delegate no(s). {} ".format(r_amount,conf_name,email,receipt_no,delegate_no)
		subject      = "Confirmation and Receipt Mail for Delegate Registration."
		html         = render_template('email/confirmation_and_receipt_mail.html',delegate=delegate,delegate_id=delegate_id,receipt_data=receipt_data,conf_id=conf_id,conf_key=conf_key ,amount_in_words=amount_in_words,amount_with_commas=amount_with_commas,conf=conf)
		if is_send == 1:
			if conf['is_email_enable'] == 1:
				EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
				return success_msg
			else:	
				return success_msg
		else:
			return success_msg
	
	return html

@app.route('/<int:conf_id>/<conf_key>/generate_payment_server_response', methods = ["GET", "POST"])
@RouteGroup.conf_required
def GeneratePaymentServerResponse(conf_id,conf_key):
	conf                = Auth.getConf(conf_id,conf_key)
	status            	= request.values.get('status') or None
	unique_id         	= request.values.get('unique_id')  or None
	payment_method    	= request.values.get('method')  or None
	delegate_id       	= request.values.get('delegate_id')  or None
	payment_id        	= request.values.get('payment_id_pg')  or None
	user_id        	    = request.values.get('user_id')  or None
	receipt_mail        = "receipt_mail"
	confimation_mail    = "confimation_mail"
	now                 = datetime.now()
	current_dt_2        = now.strftime("%Y-%m-%d %H:%M:%S")
	dt_string           = request.values.get('create_at')  or current_dt_2
	getData             = BOModel().BOgetDataforPayments(unique_id,conf_id)
	badge_table         = conf['del_table_name']
	# return "get data in call payment route"
	if getData :
		getData_1     = getData[0]
		email         = getData_1['email']
		mobile        = getData_1['mobile']
		delegate_ids  = getData_1['delegate_ids']

		# role          = getData_1['role'] or None
		range_1       = getData_1['range_1'] or 1

	delegate_ids      	= delegate_ids.split(',') 
	data                = {'api_payment_id' : payment_id,'status' : status,'updated_at' :dt_string,'paid_at' :dt_string,'payment_method':'PAYMENT GATEWAY','payment_method_from_gateway':payment_method}
	update_and_get_data = UserModel().UserupdatePayment(unique_id,data,dt_string) # update payment status in your table
	
	is_generate_link_payment = 0
	if update_and_get_data == "updated" and (status =="success" or status == "Y" or status =="Success" or status =="Successful"):
		u                  = UserModel()
		generatedDelegates = u.Userdelegate_no_generate(unique_id,conf_id)
		msg    			   = "Payment successful."
		status 			   = 1
		if generatedDelegates:
			for delegate in generatedDelegates:
				delegate_id  = delegate['delegate_id']
				is_generate_link_payment  = delegate['is_generate_link_payment']
				ConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,1)

		receipt_datas = u.receipt_no_generate_and_get(unique_id,conf_id);
		success_msg   = ConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,0,email)	
		success_msg   = "Payment successful.<br><br> "+success_msg
		if receipt_datas:
			ReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_datas[0],1,is_flash_msg = 1)	
			# tricon_workshop = TriconWorkshopUpdates(conf_id,unique_id)

	elif status is not None:
		status      = 0
		msg         = "Payment has Failed"
		success_msg = "Your payment has failed. Please try again. <br> If the problem persists ,  please write to {}".format(conf['e_support_email']),"errorMsg"
		reg_status  = 0
		UserModel().UpdateInprogressDelegates(unique_id,dt_string,reg_status,conf_id)
		
	incompleted_template       = get_parent_incompleted_delegates(user_id,conf_id,conf_key)
	completed_template         = get_parent_completed_delegates(user_id,conf_id,conf_key)
	delegateData               = UserModel().get_completed_delegates_by_parent_user_id_UserModel(user_id,conf_id)
	waiting_completed_template = GetParentWaitingCompletedDelegates(user_id,conf_id,conf_key)
	rejected_delegate_payment_template   = GetParentRejectUpiTransactionDelegates(user_id,conf_id,conf_key)
	inprogress_delegate_payment_template = GetParentInprogressPaymentDelegates(user_id,conf_id,conf_key)
	# To Get PG Waiting for Approval Data
	pg_waiting_approval_template = GetParentPGWaitingApprovalDelegates(user_id,conf_id,conf_key) 
	payment_data={
			'status'              				  : status,
			'success_msg'         				  : success_msg,
			'msg'                 				  : msg,
			'incompleted_template'				  : incompleted_template,
			'completed_template'  				  : completed_template,
			'delegateData'        				  : delegateData,
			'waiting_completed_template'          : waiting_completed_template,
			'rejected_delegate_payment_template'  : rejected_delegate_payment_template,
			'inprogress_delegate_payment_template': inprogress_delegate_payment_template,
			# To Get PG Waiting for Approval Data
			'pg_waiting_approval_template'        : pg_waiting_approval_template
		}

	return jsonify(payment_data)



# PG Added
# Purpose : To Get PG Waiting for Approval data
#  Created on 2024-01-31 11:35
@app.route('/<int:conf_id>/<conf_key>/<parent_user_id>/get_parent_pg_waiting_approval_delegates', methods = ["GET", "POST"])
def GetParentPGWaitingApprovalDelegates(parent_user_id,conf_id,conf_key):
	conf       		= Auth.getConf(conf_id,conf_key)
	unique_id 		= None
	delegateData    = UserModel().get_pg_waiting_approval_delegates_by_parent_user_idUserModel(parent_user_id,unique_id,conf_id)
	if delegateData:
		total_amount = 0
		for index , value in enumerate(delegateData):
			total_amount = total_amount + (value['total_amt'] if value['total_amt'] is not None else 0)
			base_url 	 = request.host_url
			if "https" in base_url :
				pass
			else :
				base_url = base_url.replace("http" ,"https")


		del_html_data = render_template('users/pg_waiting_for_approval_information.html' ,user_data = delegateData,user_id = parent_user_id,conf_id =conf_id,conf_key=conf_key,total_amount=total_amount,conf=conf,base_url = base_url,str=str,int=int,itemgetter=itemgetter,groupby=groupby)
	else:
		del_html_data = ""
	return del_html_data


@app.route('/get_pg_proof_to_show_modal', methods = [ "GET","POST"])
def GetPGProofToShowModal():
	try:
		delegate_id   = request.values.get('delegate_id')
		
		conf_id       = request.values.get('conf_id')
		conf_key      = request.values.get('conf_key')
		del_status_id = 7
		get_data      = UserModel().get_pg_proof_data(conf_id,delegate_id,del_status_id)
		if int(conf_id) in [49,8]:
			label_name = "Bonafide Certificate"
			span_name  = "( For PG Student )"
		else :
			label_name = "Proof Upload"
			span_name  = ""

		if get_data :
			html_data  = render_template('users/pg_waiting_for_approval_modal.html' ,conf_id=conf_id,conf_key=conf_key,delegate = get_data,label_name=label_name,span_name=span_name)
			data       = {"html_data":html_data, "msg":"success", "status" :1}
		else: 
			html_data  = render_template('users/pg_waiting_for_approval_modal.html' ,delegate = get_data)
			data       = {"html_data":html_data, "msg":str(get_data), "status" :2}


		json_data = json.dumps(data,default=str)
		return json_data

	except Exception as e:
		data = {"msg" : str(e) , "status" :401 }
		json_data= json.dumps(data,default=str)
		return json_data

@app.route('/<int:conf_id>/<conf_key>/post_pg_proof_update',methods=['GET','POST'])
def PostPGProofUpdate(conf_id,conf_key):
	try:
		conf            = Auth.getConf(conf_id,conf_key)
		now             = datetime.now()
		curr_dt         = now.strftime("%Y-%m-%d %H:%M:%S")
		template_name   = "ack_pg_bonafide_certificate_mail"
		mailData        = UserModel().get_mail_template(template_name,conf_id)
		is_file_upload  = 0
		pg_cert_path    = None
		pg_cert_name    = None	
		file            = None
		file_upload     = None
		del_status_id   = 8
		delegate_id     = request.values.get('delegate_id')
		user_id         = request.values.get('user_id')
		unique_id       = request.values.get('unique_id')
		pg_proof        = request.files.get('pg_proof_files',None)
		if pg_proof :
			image_name     = "certificate_proof_"
			foldername     = "certificates/"
			is_file_upload = 1
			file           = pg_proof
		else :
			flash("Please Upload Proof",'errorMsg')
			return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))

		if int(is_file_upload) == 1:
			file_upload = AWSUpload().AwsFileUpload(user_id,file,image_name,foldername)
		else:
			file_upload = ''

		# If  file upload function call then this block will execute					
		if  file_upload :
			file_upload         = ast.literal_eval(file_upload)
			file_upload_msg     = file_upload["msg"]
			file_upload_status  = file_upload["status"]
			if file_upload_status  == 1 :
				pg_cert_path    = file_upload["pg_cert_path"] or None
				pg_cert_name    = file_upload["pg_cert_name"] or None

				reject_remarks      = UserModel().get_reject_remarks(unique_id,conf_id)
				if reject_remarks:
					reject_remarks_update = UserModel().update_reject_remarks(unique_id,conf_id)
					
				update_data = {'pg_cert_path':pg_cert_path,
								'pg_cert_name':pg_cert_name,
								'updated_at':curr_dt
							}
				update_data = UserModel().update_delegateUserModel(delegate_id,update_data)
				if update_data == "success" :

					update_data  = BOModel().bo_update_reg_status_delegates_addons_for_pg_proof_reject(unique_id,delegate_id,curr_dt,del_status_id)
					delegate     = UserModel().get_pg_proof_data(conf_id,delegate_id,del_status_id)
					if delegate:
						prefix   = delegate["prefix"]
						if prefix:
							full_name = delegate["prefix"] +" "+ delegate["full_name"]
						else:
							full_name = delegate["full_name"]
						users = Auth.user(conf['society_id']) 
						if users:
							email = users['email']
						else:
							email = delegate['email']
						
						subject = mailData['subject']
						m_data  = {'mail_content': mailData['mail_content'],'full_name': full_name,'conf': conf}   
					
						mail_content = Helper.convert_html_for_mail_screen(m_data)
						html     = render_template('email/ack_pg_bonafide_certificate_mail.html',mail_content=mail_content,conf=conf)
						if conf['is_email_enable'] == 1:
							EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
					
					flash("Thank you for uploading your Bonafide Certificate.  Your delegate registration number shall be generated after verification of Bonafide Certificate. <br/> For any assistance,  please write to {}.".format(conf['e_support_email']),"successMsg")
					return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
				
				else : 
					flash(str(update_data),'errorMsg')
					return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
			
			else:
				flash(str(file_upload_msg),'errorMsg')
				return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
		
		else :
			flash(str(file_upload),'errorMsg')
			return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))

	except Exception as e:
		raise e

# PG Added

@app.route('/<int:conf_id>/<conf_key>/register_dash', methods = ["GET", "POST"])
def RegisterDashboard(conf_id,conf_key):
	conf_data     = UserModel().get_conference(conf_id,conf_key)
	if conf_data:
		now           = datetime.now()
		curr_dt       = now.strftime("%Y-%m-%d %H:%M:%S")
		conf          = Auth.getConf(conf_id,conf_key)
		dict_1        = {}
		society_id    = conf['society_id']
		users         = Auth.user(society_id)
		if users:
			user_id       = users["user_id"]
			membership_no = users["membership_no"]
			prefix        = users["prefix"]
			full_name     = users["full_name"] or ' '

			e_support_email = conf['e_support_email']
			addons_member_list = conf_data['addons_member_list']
			if user_id == 10420:
				addons_member_list = 15
			else:
				addons_member_list = addons_member_list
				
			if addons_member_list:
				parent_user_id_count = UserModel().get_parent_user_id_count(conf_id,user_id)
				if parent_user_id_count['parent_user_id'] >= addons_member_list:
					is_show_member_div = 1
				else:
					is_show_member_div = 0	
			else:
				is_show_member_div = 0

			check_addon   = UserModel().get_check_addons_UserModel(user_id,conf_id)
		# 	data          = UserModel().get_state_country_users_type(user_id,society_id,None,None,None,None)
			code          = UserModel().check_appliction_to_close_or_openUserModel(conf_id,curr_dt)
			user_reg_content = UserModel().get_user_register_content(conf_id)
			# membership_no = Auth.user(society_id).get('membership_no')
			full_name =   "Dr. " + full_name if not prefix else prefix + " "  + full_name  
			# prefix        = 'Dr. ' if not Auth.user(society_id).get('prefix') else Auth.user(society_id).get('prefix')
			if conf_id in [18,5,26,49,58] : # BOA 2023
				show_content = "Welcome <b> " + full_name +"<hr/>"
			else:
				if membership_no:
					# show_content = "Welcome  <b> "+prefix+" {}.</b> <br/> You are logged in as a member.".format(Auth.user(society_id).get('full_name'))
					show_content = "Welcome  <b> "+full_name+" </b> <hr/> You are logged in as a member."
				else:
					if conf_id in [19,54]:
						# show_content ="Welcome <b> "+prefix+" {}.</b> <br/> You are logged in as a non-member since the email id you have used to login is not associated with any membership record.<br/>Visit <a href='https://asiindia.org/member-application/' target='_blank'>https://asiindia.org/member-application/</a> to apply for ASI membership.<br/><br/>If you are a member, please login with the email id associated with your membership record.<br/><br/> For any assistance, please wrote to <b>{}</b> and get a response in one working day.".format(Auth.user(society_id).get('full_name'),conf['e_support_email'])
						show_content ="Welcome <b> "+full_name+" </b> <hr/> You are logged in as a non-member since the email id you have used to login is not associated with any membership record.<br/>Visit <a href='https://asiindia.org/member-application/' target='_blank'>https://asiindia.org/member-application/</a> to apply for ASI membership.<br/><br/>If you are a member, please login with the email id associated with your membership record.<br/><br/> For any assistance, please wrote to <b> "+e_support_email+" </b> and get a response in one working day."
					else:
						show_content ="Welcome <b> "+full_name+"</b> <hr/> You are logged in as a non-member since the email id you have used to login is not associated with any membership record.<br/>If you are a member, please login with the email id associated with your membership record.<br/><br/> For any assistance, please wrote to <b> "+e_support_email+" </b> and get a response in one working day."
			
		# 	for index,value in enumerate(data):
		# 		if index == 0:
		# 			state_id = value[0]
		# 		if index == 1:
		# 			country_id = value[0]
		# 		if index == 2:
		# 			user = value[0]
		# 			user_data = user
		# 		if index == 3:
		# 			reg_type = value[0]
		# 		if index == 7:
		# 			delegate = value
		# 			if delegate:
		# 				delegate = delegate[0]
		# 			else:
		# 				delegate = None 	
			for value in check_addon:
				status      = value['status']
				msg         = value['msg']
				count       = value['count']

			if count > 0:
				if status == 1:
					flash(msg,"successMsg")
					
			if conf_id == 17:
				display_addons = UserModel().get_wetdrylab_open_close(conf_id)
				display_addon = display_addons.get('display_addon')
			else:
				display_addon = 0		
			
			delegateData            = UserModel().get_completed_delegates_by_parent_user_id_UserModel(user_id,conf_id)
			if delegateData:
				workshop_del_no = delegateData[0].get('delegate_id')
				workshop_del_status = delegateData[0].get('incomplete_additional_addon_types')
			else:
				workshop_del_no = None
				workshop_del_status = "true"
				
			html_data = render_template('users/delegate_dashboard_page.html',str=str,type=type,conf=conf,code=code,delegateData=delegateData,show_content=show_content,int=int,display_addon=display_addon,user_reg_content=user_reg_content,is_show_member_div=is_show_member_div,workshop_del_no=workshop_del_no,workshop_del_status=workshop_del_status)

			return html_data
		else:
			return redirect(url_for('user.Home',conf_id=conf_id,conf_key=conf_key))
	else:
		return redirect(url_for('user.Home',conf_id=conf_id,conf_key=conf_key))



@app.route('/<int:conf_id>/<conf_key>/view_confirmation/<user_uuid>', methods = ["GET"])
@RouteGroup.conf_required
def ViewConfirmation(conf_id,conf_key,user_uuid=None):
	conf            = Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	dt_string       = now.strftime('%Y-%m-%d %H:%M:%S')
	template_name   = "confirmation_mail"
	mailData        = UserModel().get_mail_template(template_name,conf_id)
	if user_uuid:
		delegate_id = UserModel().get_delegate_data_using_user_uuid(user_uuid,conf_id)
		if delegate_id:
			delegate_id = delegate_id.get('delegate_id')
		else:
			delegate_id = None	
	else:
		delegate_id = None


	if delegate_id:
		delegates   = BOModel().usp_del_get_delegates_by_delegate_id(delegate_id)
		if delegates:
			delegate = delegates[0]	

		if delegate:
			email        = delegate['email']
			delegate_no  = delegate['delegate_no']
			prefix       = delegate["prefix"]
			ref_no       = delegate['ref_no']
			ref_no_only  = delegate['ref_no_only']
			if prefix:
				name = delegate["prefix"] +" "+ delegate["full_name"]
			else:
				name = delegate["full_name"]
			
			is_gen_number = conf['is_gen_number']


			# Reference number added here
			if is_gen_number == 'ref_number':
				subject = "Confirmation of registration - "+str(ref_no)
			else:
				sub_data = {
							  'delegate_no':str(delegate_no)
						}
						   
				subject = Helper.merge_tags(mailData['subject'],sub_data)             
			
			m_data  = {
						'mail_content'  : mailData['mail_content'],
						'delegate'      : delegate,
						'conf'          : conf

					}   
		
			mail_content = Helper.convert_html_for_mail_screen(m_data)
			html     = render_template('email/confirmation_mail_v1.html',mail_content=mail_content,conf=conf)    
			return html

		else:
			return ("<html><h1>Invalid URL</h1></html>")	
	else :
		return ("<html><h1>Invalid URL</h1></html>")
		
		
@app.route('<int:conf_id>/<conf_key>/password_login', methods = ["GET","POST"])
@RouteGroup.conf_required
def postPwdLogin(conf_id,conf_key):
	now         = datetime.now()
	conf 	   	= Auth.getConf(conf_id,conf_key)
	society_id 	= conf['society_id']
	email_login = request.values.get('email_login',None)
	password    = request.values.get('password',None)

	if password:
		pass
	else:	
		flash("Please enter password.","errorMsg")
		return getLogin(conf_id,conf_key,email_login)  		

	data_email  = UserModel().getEmailandPasswordUserModel(email_login,password,society_id)

	if data_email:
		user_id  = data_email['user_id']
		email    = data_email['email']
		password = data_email['password']
		result         = UserModel().get_users_valueUserModel(user_id,society_id,conf_id)
		Auth.login(result,society_id)
		profile_updated_at  = data_email['profile_updated_at']
		user_uuid           = data_email['user_uuid']
		member_type_id      = data_email['member_type_id']
		is_disable_otp      = conf['is_disable_otp']
# 		if int(is_disable_otp) == 1:
# 			if int(conf_id) == 52:
# 				if member_type_id in [1,17,20]:
# 					profile_update_url =  "https://profile.kosonline.org/{}/{}/at/app/{}?r_url='{}'".format(society_id,conf['society_key'],user_uuid,conf['app_url'])
# 					if profile_updated_at:
# 						years_to_add = profile_updated_at.year + 1
# 						current_dt = now.strftime('%Y-%m-%d')
# 						profile_updated_at_date = profile_updated_at.replace(year=years_to_add).strftime('%Y-%m-%d')
# 						if current_dt <= profile_updated_at_date:
# 							return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
# 						else:
# 							return flask.redirect(profile_update_url)
# 					else:
# 						return flask.redirect(profile_update_url)
		return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))
	else:
		flash("Passsword invalid. Please check the password.","errorMsg")
		email = email_login
		return getLogin(conf_id,conf_key,email)
		
		
@app.route('/<int:conf_id>/<conf_key>/resend_otp', methods = ["GET","POST"])
@RouteGroup.conf_required
def getResentOTP(conf_id,conf_key):
	# random.seed(time.clock())
	conf            = Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	dt_string       = now.strftime('%Y-%m-%d %H:%M:%S')
	society_id      = conf['society_id']
	encode_user_id  = request.values.get('user_id') or None
	user_id         = Helper.base64decode(encode_user_id)
	reg_type        = request.values.get('reg_type') or None
	conf_name       = conf['conf_name']
	is_disable_otp  = conf['is_disable_otp']
	if user_id:
		user            = UserModel().get_user(user_id,society_id,conf_id)
		template_name   = "otp_mail"
		mailData        = UserModel().get_mail_template(template_name,conf_id)
					
		if user is None:
			return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key=conf_key))
		user_otp        = user['otp']
		if user_otp: 
			OTP         = user_otp
		else:
			OTP         = random.randint(1000,9999)
	
		otp_sent_at     = now
		otp_expire_on   = now + timedelta(minutes=10)
	
		""" Send OTP Mail and SMS """
	
		sub_data        = {
							'OTP'      : str(OTP),
							'conf_name': conf_name
						}
		
		subject         = Helper.merge_tags(mailData['subject'],sub_data)
		email           = user['email']
		name            = user['full_name']
		prefix          = user['prefix']
		if prefix == None:
			prefix      = ""
		if name == None:
			name        = ""
	
	
		if "numerotec.com" in email  and conf_id == 20 :
			return redirect(url_for('user.PasswordVerify' ,conf_id=conf_id,conf_key= conf_key,user_id=user_id))
		else :
			m_data  = {
					'OTP'           : OTP,
					'mail_content'  : mailData['mail_content'],
					'full_name'     : name,
					'otp_expire_on' : otp_expire_on.strftime('%d-%m-%Y %I:%M %p'),
					'support_email' : conf['e_support_email'],
					'conf_name'     : conf_name
				}   
	
			mail_content    = Helper.convert_html_for_mail_screen(m_data)
			
	
	
			html            = render_template('email/otp_sent.html',mail_content=mail_content,conf=conf)
			if conf['is_email_enable'] == 1:
				data_1 = EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
				if data_1:
					data_1 = json.loads(data_1)
					update_data = {
					'user_id'     : str(user_id),
					'conf_id'     : str(conf_id),
					'created_at'  : str(dt_string)
					}
					data_1.update(update_data) 
					UserModel().insert_mandrill_otp_logs(data_1)
					""" END Send OTP Mail and SMS """
			output          = UserModel().update_otp(OTP,str(otp_sent_at),str(otp_expire_on),user_id)
			if output == "success":
				flash("The OTP (One Time Password) has been sent to your registered email id -"+ Helper.email_mask(email)+".  This OTP is valid for 10 minutes. " ,"successMsg")
				return redirect(url_for('user.OTPPage',user_id=user_id,conf_id=conf_id,conf_key=conf_key,reg_type=reg_type))
			else:
				return "failed"
	else:
		return redirect (url_for('user.Home',conf_id=conf_id,conf_key=conf_key))


@app.route('/<conf_id>/<conf_key>/forget_pwd',methods = ["GET", "POST"])
@RouteGroup.conf_required
def ForgetPwd(conf_id,conf_key):
	conf = Auth.getConf(conf_id,conf_key)
	return render_template('users/forget_pwd.html',conf_id=conf_id,conf_key=conf_key,conf=conf)

@app.route('/<conf_id>/<conf_key>/forget_pwd_mail',methods = ["GET", "POST"])
@RouteGroup.conf_required
def ForgetPwdMail(conf_id,conf_key):
	if request.method == "POST" :
		now        = datetime.now()
		conf       = Auth.getConf(conf_id,conf_key)
		society_id = conf['society_id']
		email      = request.values.get('email')
		output     = UserModel().get_emailUserModel(email,society_id)
		reset_pwd_expire_on = now + timedelta(minutes=30)

		if output :
			user_id = output['user_id']
			subject = "Reset Your Password"
			email   = output['email']
			data       = {'reset_pwd_expire_on' : reset_pwd_expire_on,'reset_pwd_sent_at':now}
			output     = UserModel().update_member(user_id,data) 

			html    = render_template('email/reset_password_mail.html',society_id=society_id,conf_id=conf_id,conf_key=conf_key,conf=conf,output=output,user_id=user_id)
			EMAIL.sendMailResetPassword(subject,html,email,conf)
			flash('Reset link sent your registered email id to  '+email,'successMsg')
			return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key=conf_key))
		else :
			flash("Please Enter Registered Email id","errorMsg")
			return redirect (url_for('user.ForgetPwd',society_id=society_id,conf_id=conf_id,conf_key=conf_key))
	else:
		return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key=conf_key))



@app.route('/<int:conf_id>/<conf_key>/password_reset/<encode_user_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def PasswordReset(conf_id,conf_key,encode_user_id=None):
	conf        = Auth.getConf(conf_id,conf_key)
	society_id  =  conf["society_id"]
	if encode_user_id and encode_user_id != 'None':
		user_id     = Helper.base64decode(encode_user_id)
		user        = UserModel().get_user(user_id,society_id,conf_id)
		email       = user['email']	
		if user['reset_pwd_expire_on']:
			now     = datetime.now()
			reset_pwd_expire_on   = datetime.strptime(str(user['reset_pwd_expire_on']),'%Y-%m-%d %H:%M:%S').strftime('%Y-%m-%d %H:%M:%S')
			if str(now)>str(reset_pwd_expire_on): 
				flash("Expired!Link valid for 30 mintue")
				return redirect (url_for('user.ForgetPwd',society_id=user['society_id'],conf_id=conf_id,conf_key=conf_key))
			else:			
				return render_template('users/user_password_reset.html',conf=conf,data=user,email=email)
		
		else:
			return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key = conf_key))			
	else:
		return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key = conf_key))

@app.route('/<int:conf_id>/<conf_key>/password_update', methods = ["GET", "POST"])
@RouteGroup.conf_required
def PasswordUpdateDelegate(conf_id,conf_key):
	now             = datetime.now()
	dt_string       = now.strftime('%Y-%m-%d %H:%M:%S')
	conf           = Auth.getConf(conf_id,conf_key)
	society_id     =  conf["society_id"]
	user_id        = request.values.get("user_id") or None
	encode_user_id = Helper.base64encode(user_id)
	prefix         = request.values.get("prefix") or None
	full_name      = request.values.get("name") or None
	email          = request.values.get("email") or None
	mobile         = request.values.get("mobile") or None
	confirm_password_1 = request.values.get("confirm_password_1") or None
	confirm_password_2 = request.values.get("confirm_password_2") or None

	get_login_process = UserModel().get_confUserModel(conf_id,conf_key)
	is_disable_otp  = get_login_process['is_disable_otp']

	data_email      = UserModel().get_emailUserModel(email,society_id)
	user_uuid        = data_email['user_uuid']
	profile_updated_at  = data_email['profile_updated_at']
	if data_email['member_type_id']:
		member_type_id = data_email['member_type_id']
	else:
		member_type_id = 2


	if int(is_disable_otp) == 1:
		data_insert = {
					'prefix'        : prefix,
					'full_name'     : full_name,
					'email'         : email,
					'mobile'        : mobile,
					'society_id'    : society_id,
					'member_type_id': member_type_id,
					'updated_at'    : datetime.now(),
					'password'      : confirm_password_1,
					'pwd_difference': confirm_password_2,
					'pwd_set_at'   : datetime.now()
					}
		if str(confirm_password_1) == str(confirm_password_2):
			pass	
		else:
			flash("Password and confirm password mismatch")
			additional_data = {'user_id':user_id}
			data_insert.update(additional_data)
			return redirect(url_for('user.PasswordSet',conf_id=conf_id,conf_key=conf_key,encode_user_id=encode_user_id))	
	else:				
		data_insert = {
						'prefix'        : prefix,
						'full_name'     : full_name,
						'email'         : email,
						'mobile'        : mobile,
						'society_id'    : society_id,
						'member_type_id': member_type_id,
						'updated_at'    : datetime.now()
					}

	if request.method == 'POST':
		created_at      = datetime.now()
		society_id      = conf['society_id']

		data = UserModel().get_mobile_check_for_password(mobile,user_id,society_id)
		if data:
			d_email = data[0]['email']
			if int(is_disable_otp) == 1:
				if str(confirm_password_1) == str(confirm_password_2):
					pass	
				else:
					flash("Password and confirm password mismatch")	
			
			if d_email:		
				flash("The mobile number you have provided is already mapped to another email id."+" ("+(Helper.email_mask(d_email)) +")  <br> Want to change your email id ? Please write to "+conf['e_support_email']+".")
			else:
				flash("The mobile number you have provided is already mapped to another email id."+" <br> Want to change your email id ? Please write to "+conf['e_support_email']+".")	
			
			additional_data = {'user_id':user_id}
			data_insert.update(additional_data)
			return redirect(url_for('user.PasswordSet',conf_id=conf_id,conf_key=conf_key,encode_user_id=encode_user_id))
		else:
# 			if int(is_disable_otp) == 1:
# 				if int(conf_id) == 52:
# 					if member_type_id in [1,17,20]:
# 						result  = UserModel().update_users_user_table(email,society_id,data_insert)
# 						result  = UserModel().get_users_valueUserModel(user_id,society_id,conf_id)
# 						Auth.login(result,society_id)
						
# 						profile_update_url =  "https://profile.kosonline.org/{}/{}/at/app/{}?r_url='{}'".format(society_id,conf['society_key'],user_uuid,conf['app_url'])
# 						if profile_updated_at:
							
# 							years_to_add = profile_updated_at.year + 1
# 							current_dt = now.strftime('%Y-%m-%d')
# 							profile_updated_at_date = profile_updated_at.replace(year=years_to_add).strftime('%Y-%m-%d')
# 							if current_dt <= profile_updated_at_date:
# 								result  = UserModel().update_users_user_table(email,society_id,data_insert)
								
# 								return redirect(url_for('user.Register',user_id = user_id,conf_id=conf_id,conf_key=conf_key))

# 							else:
# 								return flask.redirect(profile_update_url)
# 						else:
# 							return flask.redirect(profile_update_url)


# 					else:
						
			result  = UserModel().update_users_user_table(email,society_id,data_insert)
			user    = UserModel().get_emailUserModel(email,society_id)
			user_id = user['user_id']
			Auth.login(user,society_id)
			return redirect(url_for('user.Home',conf_id=conf_id,conf_key=conf_key))
	else:
		if email :
			data = get_emailUserModel(self,email,society_id)
			if data :
				if int(is_disable_otp) == 1:
					if str(confirm_password_1) == str(confirm_password_2):
						pass	
					else:
						flash("Password and confirm password mismatch")
				
				additional_data = {'user_id':user_id}
				data_insert.update(additional_data)
				return redirect(url_for('user.PasswordSet',conf_id=conf_id,conf_key=conf_key,encode_user_id=encode_user_id))
			else :
				flash("Invalid Login." ,"errorMsg")
				return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key = conf_key))		
		else :
			flash("Invalid Login." ,"errorMsg")
			return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key = conf_key))				
	
	
@app.route('/<int:conf_id>/<conf_key>/password_set/<encode_user_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def PasswordSet(conf_id,conf_key,encode_user_id=None):
	conf        = Auth.getConf(conf_id,conf_key)
	society_id  =  conf["society_id"]
	if encode_user_id and encode_user_id != 'None':
		user_id     = Helper.base64decode(encode_user_id)
		user        = UserModel().get_user(user_id,society_id,conf_id)
		email       = user['email']	
		return render_template('users/user_password_reset.html',conf=conf,data=user,email=email)
	else:
		return redirect(url_for('user.getLogin',conf_id=conf_id,conf_key = conf_key))		
		
		
		
@app.route('/<int:conf_id>/<conf_key>/get_session_of_zumba_addon', methods = ["GET", "POST"])
@RouteGroup.conf_required
def getSessionOfZumbaAddon(conf_id,conf_key):
	conf          = Auth.getConf(conf_id,conf_key)
	society_id    =  conf["society_id"]
	user_id       = request.values.get("user_id") or None		
	delegateData  = UserModel().get_completed_delegates_by_parent_user_id_UserModel(user_id,conf_id)
	display_addon = 0					
	html_data     = render_template('users/custom_addons/session_of_zumba.html',str=str,type=type,int=int,conf=conf,delegateData=delegateData,display_addon=display_addon)
	data          = {"html_data":html_data,"msg":"success",'status':1}
	json_data     = json.dumps(data,default=str)
	return json_data		


@app.route('/<int:conf_id>/<conf_key>/get_wetlab_and_drylab_addon', methods = ["GET", "POST"])
@RouteGroup.conf_required
def getWetlabAndDrylabAddon(conf_id,conf_key):
	conf          = Auth.getConf(conf_id,conf_key)
	society_id    =  conf["society_id"]
	user_id       = request.values.get("user_id") or None		
	delegateData  = UserModel().get_completed_delegates_by_parent_user_id_UserModel(user_id,conf_id)
	display_addon = 0					
	html_data     = render_template('users/custom_addons/wetlab_and_drylab_del_no.html',str=str,type=type,int=int,conf=conf,delegateData=delegateData,display_addon=display_addon)
	data          = {"html_data":html_data,"msg":"success",'status':1}
	json_data     = json.dumps(data,default=str)
	return json_data		
	
@app.route('/<int:conf_id>/<conf_key>/get_breakfast_session_addon', methods = ["GET", "POST"])
@RouteGroup.conf_required
def getBreakfastSessionAddon(conf_id,conf_key):
# 	print("inside")
	conf          = Auth.getConf(conf_id,conf_key)
	society_id    =  conf["society_id"]
	user_id       = request.values.get("user_id") or None		
	delegateData  = UserModel().get_completed_delegates_by_parent_user_id_UserModel(user_id,conf_id)
	if conf_id in [49,50]:
		addon_details  = UserModel().get_additional_addon_count(conf_id)
	else:
		addon_details  = None
	display_addon = 0					
	html_data     = render_template('users/custom_addons/breakfast_session.html',str=str,type=type,int=int,conf=conf,delegateData=delegateData,display_addon=display_addon,addon_details=addon_details)
	print(html_data)
	data          = {"html_data":html_data,"msg":"success",'status':1}
	json_data     = json.dumps(data,default=str)
	return json_data



@app.route('/get_breakfast_pending_addon', methods = [ "GET","POST"])
def GetBreakfastPendingAddon():
	conf_id         = request.values.get('conf_id',0)
	conf_key        = request.values.get('conf_key',0)
	conf            = Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	delegate_id     = request.values.get('delegate_id',0)
	delegate_addons = BOModel().check_delegate_addons(delegate_id,conf_id) #ToDo: change function name to get_delegate_completed_addons
	addon_ids       = delegate_addons['addon_ids']
	addon_ids_lst 	= addon_ids.split(",")
	# print("addon_ids_lst - ",addon_ids_lst)
	reg_types       = BOModel().get_addon_reg_type_for_modal(delegate_id,conf_id)
	addons          = BOModel().get_addons_pendings(delegate_id,now,conf_id,'0')
	
	addons_reg_limit_db = AddonsModel().get_addons_head_reg_limit(conf_id,24)
	# print("addons_reg_limit_db",addons_reg_limit_db)
	day_addons 		= []
	days 			= {}
	addons_reg_limit = {}
	if addons_reg_limit:
		for x in addons_reg_limit_db:
			addons_reg_limit[x.get('addon_id')] = x 
	
	skip_days = []	
	for a in addons:
		if int(a.get('addon_type_id') or 0) == 24:
			if str(a.get('addon_id')) in addon_ids_lst:
				skip_days.append(a.get('day'))
			elif check_head_reg_count(addons_reg_limit.get(a.get('addon_id'))):
				day_addons.append(a)
				days[a.get('day')] = a.get('day')  


	short_days = {}
	for k in sorted(days.keys()):
		short_days[k] = days[k]
	# print("short_days - ",short_days)
	days 		= short_days
	for d in skip_days:
		del days[d]

	# print("days - ",days)		
	day_addons = json.dumps(day_addons, indent=4, sort_keys=True, default=str)
	if int(conf_id) in [36,5]:
		limit_for_addons = UserModel().get_addons_limit_for_all(conf_id)
		user_type_id     = UserModel().get_all_addons_data(conf_id)
		user_type_ids    =[]
		for u in user_type_id:
			user_type_ids.append(u['user_type_id'])


		limits  = {}
		limit  = {}
		for dd in limit_for_addons :
			key_1 = dd["user_type_id"]
				
			val_1 = dd["limits"]
			val_2 = val_1 if val_1 else None
			limits[str(key_1)] = val_2
			limit[key_1] = val_2
			# ----
			for ut in user_type_ids :
				if ut not in limit:
					limits[str(ut)] = None
	else:
		limits = None	
	
# 	html_data       =  render_template('users/addons_modal.html' , delegate_addons= delegate_addons,reg_types=reg_types,addons=addons,str=str,conf=conf,limits=limits)
	html_data       =  render_template('users/breakfast_additonal_addons.html' , delegate_addons= delegate_addons,reg_types=reg_types,addons=addons,str=str,conf=conf,limits=limits,days=days,day_addons=day_addons)
	total_amount    = None
	data  = {"html_data":html_data,'total_amount':total_amount,"msg":"success",'status':1}
	json_data = json.dumps(data,default=str)
	return json_data		
	
	
def check_head_reg_count(addon):
# 	print("addon check limit -",addon)
	if addon:
		if int(addon.get('head_count')) > int(addon.get('reg_count')):
			return True
		else:
			return False
	else:
		return True	


@app.route('/<int:conf_id>/<conf_key>/view_all_receipt_delegate_mail', methods = ["GET", "POST"])
def ViewAllReceiptDelegateMail(conf_id,conf_key):
	conf            = UserModel().get_confUserModel(conf_id,conf_key)
	now             = datetime.now()
	dt_string       = now.strftime('%Y-%m-%d %H:%M:%S')
	template_name   = "receipt_mail"
	mailData        = UserModel().get_mail_template(template_name,conf_id)
	html            = []
	is_view         = 1 
	receipt_datas   = BOModel().all_receipt_no_generate_and_get(conf_id)
	if int(is_view) == 1 :
		for receipt_data in receipt_datas :
			amount                = receipt_data['amount']
			amount                = int(amount)
			amount                = f"{amount:,}"
			amount_with_commas    = amount
			amount_for_convertion = int(receipt_data['amount'])
			amount_in_words       =  Helper.amountTowords(amount_for_convertion)
			amount_in_words       = amount_in_words.title()
			if amount == "Free" :
				amount = "Free"
			else:
				amount = "Rs."+amount+"/-"
			update_data = {
					'amount_with_commas':amount_with_commas,
					'amount_in_words':amount_in_words

			}
			receipt_data.update(update_data)

			m_data    = {'mail_content': mailData['mail_content'],'receipt_data': receipt_data,'conf': conf}
			mail_content = Helper.convert_html_for_mail_screen(m_data)
			html_data    = render_template('email/all_receipt_email_v1.html',mail_content=mail_content,conf=conf)
			htmls        = html_data.replace("\n", "")
			html.append(htmls)
		html_datas   = str(html).replace("['", " ").replace("']", " ").replace(",", "").replace("' '", "")
		html_tmp     = render_template('email/all_receipt_mail.html',html=html_datas) 
		return html_tmp
	else :
		return "False"

@app.route('/<int:conf_id>/<conf_key>/view_all_confirmation_delegate_mail', methods = ["GET", "POST"])
def ViewAllConfirmationDelegateMail(conf_id,conf_key):
	conf            = UserModel().get_confUserModel(conf_id,conf_key)
	now             = datetime.now()
	dt_string       = now.strftime('%Y-%m-%d %H:%M:%S')
	template_name   = "confirmation_mail"
	mailData        = UserModel().get_mail_template(template_name,conf_id)
	html            = []
	is_view         = 1 
	delegate_datas   = BOModel().all_usp_del_get_delegates(conf_id)
	if int(is_view) == 1 :
		for delegate in delegate_datas :
			m_data    = {'mail_content': mailData['mail_content'],'delegate': delegate,'conf': conf}
			mail_content = Helper.convert_html_for_mail_screen(m_data)
			html_data    = render_template('email/all_confirmation_email_v1.html',mail_content=mail_content,conf=conf)
			htmls        = html_data.replace("\n", "")
			html.append(htmls)
		html_datas   = str(html).replace("['", " ").replace("']", " ").replace(",", "").replace("' '", "")
		html_tmp     = render_template('email/all_confirmation_mail.html',html=html_datas) 
		return html_tmp
	else :
		return "False"
	

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists